不带AVX2的32位整数的SSE整数2 ^ n的2的幂

Vor*_*ico 4 c++ x86 sse simd intrinsics

我不能找到用于计算SSE指令2^n用于向量__m128i的32位整数。

是否存在执行以下伪代码的指令或函数?

__m128i power_of_two(__m128i b) {
    __m128 r;
    for (int i = 0; i < 4; i++)
        r[i] = 1 << b[i];
    return r;
}
Run Code Online (Sandbox Code Playgroud)

_mm_sll_epi32指令仅计算r[i] = a[i] << b[0]

har*_*old 7

AVX2之前没有单个指令,但是即使使用SSE2,也存在一种技巧,即通过使用整数算术生成指数字段,然后将其从浮点数转换为整数,来滥用浮点格式来产生2的幂。可能会有更快的选择。

__m128i power_of_two(__m128i b) {
    __m128i exp = _mm_add_epi32(b, _mm_set1_epi32(127));
    __m128 f = _mm_castsi128_ps(_mm_slli_epi32(exp, 23));
    return _mm_cvtps_epi32(f);
}
Run Code Online (Sandbox Code Playgroud)