First off consider writing your own version of the memcpy() routine to substitute for the library call. You could then experiment with the code to see how changing the types of memory pointers affects the performance.
Secondly you can instrument that routine with a port bit set at the begin and port bit clear at the end. You can the use an oscilloscope to measure the actual time spent in the routine. It seems highly likely that there is something else going on than just the time spent inside the memcpy() routine.
Take a look at the 8051 compiler that you are using. There is a huge difference in performance between a certain free compiler and one of the more widely used commercial compilers. Also not all compilers support multiple data pointers or some #pragma may be needed to turn on their usage.