X86 按相反顺序加载整数的SSE2指令

X86 按相反顺序加载整数的SSE2指令,x86,sse,simd,sse2,X86,Sse,Simd,Sse2,是否有任何SSE2指令以相反顺序从int缓冲区加载128位int向量寄存器?编辑:(以下是针对单精度浮点标量的指令,保留在此处以防万一) 最接近的(也是最方便的)是\u mm\u loader\u ps固有的。请注意,地址必须是16字节对齐的 尽管这一内在特性转化为多于指令(MOVAPS+shuffling)。在正常加载后,反转32位int元素非常容易: uuu m128i v=mm_uload_usi128(buff);//MOVDQA v=_mm_shuffle_epi32(v,_mm_sh

是否有任何SSE2指令以相反顺序从
int
缓冲区加载128位
int
向量寄存器?

编辑:(以下是针对单精度浮点标量的指令,保留在此处以防万一)

最接近的(也是最方便的)是
\u mm\u loader\u ps
固有的。请注意,地址必须是16字节对齐的


尽管这一内在特性转化为多于指令
MOVAPS
+shuffling)。

在正常加载后,反转32位
int
元素非常容易:

uuu m128i v=mm_uload_usi128(buff);//MOVDQA
v=_mm_shuffle_epi32(v,_mm_shuffle(0,1,2,3));//PSHUFD-掩码=00 01 10 11=0x1b
您可以对16位
short
元素执行相同的操作,但需要更多说明:

uuu m128i v=mm_uload_usi128(buff);//MOVDQA
v=_mm_shuffle_epi32(v,_mm_shuffle(0,1,2,3));//PSHUFD-掩码=00 01 10 11=0x1b
v=_mm_shufleo_epi16(v,_mm_shufle(2,3,0,1));//PSHUFLW-掩码=10 11 00 01=0xb1
v=_-mm_-shuflehi_-epi16(v,_-mm_-shufle(2,3,0,1));//PSHUFHW-掩码=10 11 00 01=0xb1
请注意,如果SSSE3可用,您可以使用较少的指令来执行此操作:

const\uuuum128i vm=\umm\usetr\uepi8(14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1);
//初始化与PSHUFB一起使用的向量掩码
//注意:在任何处理循环之外执行一次
...
__m128i v=_mm_load_si128(buff);//MOVDQA
v=_mm_shuffle_epi8(v,vm);//PSHUFB

感谢您的回复,但此指令以相反顺序加载四个单精度浮点值。我正在寻找相同的整数运算,但我猜不支持。是的,我没有注意到您在谈论整数值(应该重新阅读您的标题)。Paul R答案是您需要的。是的。只是好奇,相同的操作可以用短值完成吗?谢谢Paul。您的逻辑工作正常。但是我不理解第二个参数“0x1B”的用法。它是某种面具吗?另一个疑问是..是否有可能对短路进行相同的操作?我添加了第二个加载和反转短路的示例。“英特尔文档”中介绍了掩码,但我添加了注释来说明它是如何构造的。除非SSSE3不可用,否则我会使用PSHUFB来反转短路向量。好的-我在上面添加了一个
PSHUFB
示例,用于反转向量中16位整数的顺序。谢谢。_mm\u shuffle\u epi8现在对我来说似乎有意义。我是英特尔内部编程的新手(尽管我曾经使用过NEON intrinsic),起初我觉得SSE中没有直接的指令来完成某些功能。但现在看来,大多数操作都可以通过提供的内部指令集和正确的逻辑实现:-)