使用 SSE 指令的 Memcpy
Memcpy using SSE instructions
我正在尝试使用 SSE 指令使用 memcpy 函数。我在互联网上找到了这个文件 (ftp://ftp.acer.at/gpl/AS9100/GPL_AS9100/xine-lib/src/xine-utils/memcpy.c)。这是我遇到问题的代码部分:
__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;
from 和 to 是 void * pointers and 在最后两行,我遇到了这个错误:
error: lvalue required as left operand of assignment
如果可以,请帮助我。
谢谢
(*(const unsigned char **)&from)
是您要查找的左值。
但这样写可能对优化器更友好
from = ((const unsigned char *)from) + 64;
这避免了需要内存溢出的寻址运算符。
另一种方法是在进入函数时将参数转换为具有正确类型的局部变量,并且永远不要再接触函数参数。
我正在尝试使用 SSE 指令使用 memcpy 函数。我在互联网上找到了这个文件 (ftp://ftp.acer.at/gpl/AS9100/GPL_AS9100/xine-lib/src/xine-utils/memcpy.c)。这是我遇到问题的代码部分:
__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;
from 和 to 是 void * pointers and 在最后两行,我遇到了这个错误:
error: lvalue required as left operand of assignment
如果可以,请帮助我。
谢谢
(*(const unsigned char **)&from)
是您要查找的左值。
但这样写可能对优化器更友好
from = ((const unsigned char *)from) + 64;
这避免了需要内存溢出的寻址运算符。
另一种方法是在进入函数时将参数转换为具有正确类型的局部变量,并且永远不要再接触函数参数。