2017-01-09 128 views
3

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

+3

我认为只是指定正确的-march或-mtune使它自动发生:https://godbolt.org/g/jxGyFd –

+1

首先,该工具对于像StackOverflow这样的Q&A页面非常棒。我立即给它加书签。而对于真正的答案内容,谢谢我看看程序集,如果编译器自动执行某些情况下,我应该能够从程序集中读出它。 – miho

+0

@RichardHodges我发现代码相当令人失望,但Clang做得很好。 – harold

回答

4

不幸的是,没有针对8位元素的SSE移位指令。如果元素是8位无符号的,那么你可以使用16位移位并掩盖不需要的高位,例如,

v = _mm_srli_epi16(v, 2); 
v = _mm_and_si128(v, _mm_set1_epi8(0x3f)); 

对于8位签署元素这是一个有点fiddlier,但还是可以的,虽然它可能只是更容易解压缩到16位,做变化,然后打包回8位。

+1

谢谢,刚刚通过编写一个伪造epi8的宏来解决它:'''#define _mm_srli_epi8(mm,Imm)_mm_and_si128(_mm_set1_epi8(0xFF >> Imm),_mm_srli_epi32(mm,Imm))''' – miho

+1

@miho:请注意,在此将其作为宏而不是内联函数进行编写并没有什么好处。 –

+1

@DietrichEpp:实际上,如果'_mm_srli_epi32'中的'Imm'不是一个常量(特别是在调试版本中),实际上有些编译器会抱怨,尽管你应该可以使用当前/最新版本的gcc ,铛,ICC。 –