将_m128(4个字a b c d)减少到一个单词的最佳方式(sse2)是什么? 我想要每个_m128组件的低部分:
int result = ( _m128.a & 0x000000ff ) << 24
| ( _m128.b & 0x000000ff ) << 16
| ( _m128.c & 0x000000ff ) << 8
| ( _m128.d & 0x000000ff ) << 0
有内在的吗?谢谢!
答案 0 :(得分:2)
仅供参考,sse3内在函数_mm_shuffle_epi8
完成工作:(在这种情况下使用掩码0x0004080c)
答案 1 :(得分:1)
SSE2答案需要多个指令:
unsigned benoit(__m128i x)
{
__m128i zero = _mm_setzero_si128(), mask = _mm_set1_epi32(255);
return _mm_cvtsi128_si32(
_mm_packus_epi16(
_mm_packus_epi16(
_mm_and_si128(x, mask), zero), zero));
}
以上为5个机器操作,给定%xmm1的输入和%rax的输出:
pxor %xmm0, %xmm0
pand MASK, %xmm1
packuswb %xmm0, %xmm1
packuswb %xmm0, %xmm1
movd %xmm1, %rax
如果你想看到SSE2的一些不寻常的用途,包括高速位矩阵转置,字符串搜索和bitonic(GPGPU风格)排序,你可能想查看我的博客Coding on the edges。
无论如何,希望有所帮助。