使用 __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 模式转换为可移植的内在模式?

__builtin_clz返回输入零的错误值

为啥我在 IA32_LSTAR MSR 上使用内核调试器在 64 位 Windows 上为 SYSCALL 设置断点时会出现 DoubleFault? (KVASCODE 部分)

x86 MSR 名称的 IA32 与 MSR 前缀

有没有办法将 8bitX32 ymm 寄存器右/左洗牌 N 个位置(c++)

为啥 __builtins__ 既是模块又是字典