Clear upper bytes of __m128i
How do I clear the 16 - i upper bytes of a __m128i?
I've tried this; it works, but I'm wondering if there is a better
(shorter, faster) way:
int i = ... // 0 < i < 16
__m128i x = ...
__m128i mask = _mm_set_epi8(
0,
(i > 14) ? 0xFF : 0,
(i > 13) ? 0xFF : 0,
(i > 12) ? 0xFF : 0,
(i > 11) ? 0xFF : 0,
(i > 10) ? 0xFF : 0,
(i > 9) ? 0xFF : 0,
(i > 8) ? 0xFF : 0,
(i > 7) ? 0xFF : 0,
(i > 6) ? 0xFF : 0,
(i > 5) ? 0xFF : 0,
(i > 4) ? 0xFF : 0,
(i > 3) ? 0xFF : 0,
(i > 2) ? 0xFF : 0,
(i > 1) ? 0xFF : 0,
0xFF);
x = _mm_and_si128(x, mask);
No comments:
Post a Comment