没有 AVX2 的 32 位整数的 SSE 整数 2^n 次幂

SSE integer 2^n powers of 2 for 32-bit integers without AVX2

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

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

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

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

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);
}