没有 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);
}
我找不到用于为 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);
}