我希望 gcc 的自动矢量化(即不是内部函数(使用 ssse3 操作码 pshufb 将 0xPQ 转换为 64 位值 0xPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQPQ但是,即使我可以看到 gcc 输出 pshufb 操作码用于其他用途(因此编译器肯定能够输出它(,我也无法计算出为这种特殊情况触发它所需的一系列 C 指令。
有什么建议吗?谢谢!
我怀疑pshufb
将是最有效的解决方案,除非您打算在xmm
寄存器的下部获得结果。如果这样做,请提供实际使用示例。
如果你写这样的东西:
long long foo(char x)
{
long long ret;
std::memset(&ret, x, sizeof ret);
return ret;
}
gcc 和 clang 基本上都只是将x
乘以0x0101010101010101
这与pshufb
一样快(假设您在寄存器中已经有了该值(。但是,使用imul
,您已经在通用寄存器中获得了结果(并且不需要额外的movq
(。
Godbolt 编译结果:https://godbolt.org/z/dTvcsM(-msse3
没有区别,其他编译选项也没有区别,只要它至少是-O1
(。