C++ 使用SSE2 movemask自动矢量化字节到gcc位图

C++ 使用SSE2 movemask自动矢量化字节到gcc位图,c++,gcc,sse,simd,auto-vectorization,C++,Gcc,Sse,Simd,Auto Vectorization,通过正确构造的C/C++代码,可以提示gcc自行生成高效的SIMD汇编程序,而无需使用内部函数,例如 我正在尝试为movemask操作(/*\u movemask\u epi8系列)实现类似的效果,但迄今为止没有成功 我能想到的最简单的代码是: #include <cstdint> alignas(128) int8_t arr[32]; uint32_t foo() { uint32_t rv = 0; for (int it = 0; it < 32;

通过正确构造的C/C++代码,可以提示gcc自行生成高效的SIMD汇编程序,而无需使用内部函数,例如

我正在尝试为movemask操作(/*\u movemask\u 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;
}
#包括
alignas(128)int8_t arr[32];
uint32_t foo()
{
uint32_t rv=0;
for(int it=0;it<32;++it)
{

rv |=(arr[it]<0)我在gcc或clang中没有使用无符号右移而不是比较来提取MSB,或者..或者将计数减少到16,因此它只需要找到XMM版本。此外,一些代码生成器对于gcc和clang来说非常可怕和笨拙。如果缺少
pm,则将变量计数移位解包为32位整数是有意义的ovmskb
,但这是一团乱麻。我不确定您的目标是什么。如果您明确希望获得movemask指令,请使用内部指令。如果您有可以从使用movemask中获益的非人工代码,请向编译器维护人员发出功能请求。