2017-01-09 127 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。 –