2015-10-20 157 views
0

我想使用使用SSE指令的memcpy函数。我在网上找到了这个文件(ftp://ftp.acer.at/gpl/AS9100/GPL_AS9100/xine-lib/src/xine-utils/memcpy.c)。这是我有这个问题的部分代码:使用SSE指令的Memcpy

__asm__ __volatile__ (
    "prefetchnta 320(%0)\n" 
    "prefetchnta 352(%0)\n" 
    "movups (%0), %%xmm0\n" 
    "movups 16(%0), %%xmm1\n" 
    "movups 32(%0), %%xmm2\n" 
    "movups 48(%0), %%xmm3\n" 
    "movntps %%xmm0, (%1)\n" 
    "movntps %%xmm1, 16(%1)\n" 
    "movntps %%xmm2, 32(%1)\n" 
    "movntps %%xmm3, 48(%1)\n" 
    :: "r" (from), "r" (to) : "memory"); 
    ((const unsigned char *)from)+=64; 
    ((unsigned char *)to)+=64; 

从和对void *指针和在最后两行,我必须继续这样的错误:

error: lvalue required as left operand of assignment 

如果可能的话,请帮助我。

感谢

+0

顺便说一句,你是从C源代码复制,但你在C或C++模式编译? –

+0

非临时存储仅适用于复制大内存大小。经验法则是使用它们的内存大小超过最后一级缓存的一半(通常是L3)。 [但自从常春藤桥你应该使用'REP MOVS'而不是非临时商店](http://stackoverflow.com/a/26256216/2542702)。在任何情况下,编写自己的通用优化memcpy函数都很复杂。 –

回答

3
(*(const unsigned char **)&from) 

是你正在寻找的左值。

但它可能是更优化友好写

from = ((const unsigned char *)from) + 64; 

从而避免了需要内存溢出的地址的运营商。

另一种方法是只是参数转换成局部变量与函数入口的权利类型,并且再也不会去碰函数的参数。

+0

感谢兄弟....你钉了它:D – user3687068