使用SSE将8位整数除以4(或移位)

mih*_*iho 5 c++ x86 sse simd intrinsics

如何使用SSE内在函数将16个8位整数除以4(或将它们向右移2)?

Pau*_*l R 5

不幸的是,8位元素没有SSE移位指令.如果元素是8位无符号,则可以使用16位移位并屏蔽掉不需要的高位,例如

v = _mm_srli_epi16(v, 2);
v = _mm_and_si128(v, _mm_set1_epi8(0x3f));
Run Code Online (Sandbox Code Playgroud)

对于8位有符号元素,它有点小巧,但仍然可能,虽然可能更容易解压缩到16位,进行移位,然后打包回8位.

  • 谢谢,我自己写了一个伪造epi8的宏解决了这个问题:```#define _mm_srli_epi8(mm, Imm) _mm_and_si128(_mm_set1_epi8(0xFF >> Imm), _mm_srli_epi32(mm, Imm))``` (2认同)