使用正确构造的 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)。