I can't find an SSE instruction for computing 2^n
for a vector __m128i
of 32-bit integers.
Is there an instruction or function that does the following pseudocode?
__m128i power_of_two(__m128i b) {
__m128 r;
for (int i = 0; i < 4; i++)
r[i] = 1 << b[i];
return r;
}
The _mm_sll_epi32
instruction only computes r[i] = a[i] << b[0]
.
There is no single instruction pre-AVX2, but even with just SSE2 there is a trick that abuses the floating point format to generate powers of two by generating the exponent field with integer arithmetic and then converting that from a float to an integer. There may be faster options.
__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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With