我需要使用哪些 C 指令来让 gcc 的 x86-64 自动矢量化器输出 pshufb 操作码?



我希望 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(。

最新更新