使用 __builtin_ ia32 shufps 将向量移动 32 位?
Posted
技术标签:
【中文标题】使用 __builtin_ ia32 shufps 将向量移动 32 位?【英文标题】:Using __builtin_ia32_shufps to shift a vector by 32 bits? 【发布时间】:2012-04-04 23:11:53 【问题描述】:这是函数的原型:
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 是执行此操作的正确命令吗?
【问题讨论】:
我认为您的意思是“位”而不是“字节”。 正确我的意思是位,v4sf 是一个 128 位向量,分成逻辑 4 个 32 位向量。我认为* 您确定要对浮点数进行位移吗?因为v4sf
类型适用于 4 个 32 位浮点数。
是的,但如果它更容易被认为是整数,那么我可以重新定义这个问题。
【参考方案1】:
用两个向量查看您的示例,我认为您可能正在寻找的是_mm_alignr_epi8 (PALIGNR)。这适用于任意数量的字节对向量的任何移位,因此您需要将移位参数乘以sizeof(int)
,例如
v = _mm_alignr_epi8(v0, v1, 2 * sizeof(int));
请注意,此指令仅在 SSSE3 及更高版本中可用,这意味着自 2005 年以来几乎所有的 Intel CPU。
【讨论】:
以上是关于使用 __builtin_ ia32 shufps 将向量移动 32 位?的主要内容,如果未能解决你的问题,请参考以下文章
将 GCC 的 __builtin_ia32_pshufd 和 __v4si 模式转换为可移植的内在模式?
为啥我在 IA32_LSTAR MSR 上使用内核调试器在 64 位 Windows 上为 SYSCALL 设置断点时会出现 DoubleFault? (KVASCODE 部分)