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]
。
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)