使用__builtin_ ia32 shufps将向量移位32位?

时间:2012-04-04 23:11:54

标签: c vectorization simd shift

这是该功能的原型:

v4si __builtin_ia32_shufps (v4si, v4si, int)

在某些网站上,我发现它们在int字段中只有十六进制,看起来很喜欢将高位和低位分开,但我想要的是逻辑32位移位。

X3 X2 X1 X0 shifted by 32 bits to get X2 X1 X0 0

使用2个v4si矢量的另一个例子:

X7 X6 X5 X4 | X3 X2 X1 X0, where each X is a 32 bit and what I want for a shift is the 
same a logical shift, but with each vector element. So:
X7 X6 X5 X4 | X3 X2 X1 X0 << 2 = X5 X4 X3 X2 | X1 X0  0  0

shufps是否有正确的命令来执行此操作?

1 个答案:

答案 0 :(得分:2)

用两个向量看你的例子,我认为你可能正在寻找的是_mm_alignr_epi8 (PALIGNR)。这适用于任意数量的字节的任意一对向量的移位,因此您需要将shift参数乘以sizeof(int),例如

v = _mm_alignr_epi8(v0, v1, 2 * sizeof(int));

请注意,此指令仅在SSSE3及更高版本中可用,这意味着自2005年以来几乎所有的英特尔CPU。