2

我希望 gcc 的自动矢量化(即不是内在函数)使用 ssse3 操作码 pshufb 将 0xPQ 转换为 64 位值 0xPQPQPQPQPQPQPQPQ。但是,即使我可以看到 gcc 输出 pshufb 操作码用于其他用途(因此编译器肯定能够输出它),我无法计算出针对这种特殊情况触发它所需的一系列 C 指令。

有什么建议么?谢谢!

4

1 回答 1

3

我怀疑这将是最有效的解决方案,除非您打算将结果放在寄存器pshufb的下部。xmm如果您这样做,请提供一个实际使用示例。

如果你写这样的东西:

long long foo(char x)
{
    long long ret;
    std::memset(&ret, x, sizeof ret);
    return ret;
}

gcc 和 clang 本质上都只是乘以xwhich0x0101010101010101和 a 一样快pshufb(假设您已经在寄存器中有该值)。但是,imul您的结果已经在通用寄存器中(不需要额外movq的)。

Godbolt 编译结果:https ://godbolt.org/z/dTvcsM (-msse3没有区别,其他编译选项也没有,只要至少是-O1)。

于 2019-10-18T17:18:12.303 回答