2

使用正确构造的 C/C++ 代码,可以提示 gcc 自行生成高效的 SIMD 汇编程序,而无需使用内在函数,例如https://locklessinc.com/articles/vectorize/

我正在尝试为 movemask 操作(PMOVMSKB / *_movemask_epi8 系列)实现类似的效果,但到目前为止还没有成功。

我能想到的最简单的代码:

#include <cstdint>

alignas(128) int8_t arr[32];

uint32_t foo()
{
    uint32_t rv = 0;

    for (int it = 0; it < 32; ++it)
    {
        rv |= (arr[it] < 0) << it;
    }

    return rv;
}

导致装配无法使用移动掩码指令:https ://godbolt.org/z/3XimYc

有没有人知道是否有办法在不显式使用内在函数的情况下使用 gcc 做到这一点?

我还没有查看 MD 文件和 gcc 中的相关实现(https://github.com/gcc-mirror/gcc/tree/master/gcc/config/i386)。

4

0 回答 0