SSE 整数 2^n 的 2 次方,对于没有 AVX2 的 32 位整数

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

本文关键字:整数 AVX2 于没 次方 SSE      更新时间:2023-10-16

我找不到用于2^n计算 32 位整数向量__m128i的 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);
}