2011-07-27 94 views
2

有誰知道如何使用MMX寄存器從16位字擴展到32位字?我想從存儲在MMX寄存器中的兩個16位字中獲得兩個32位符號擴展字。沒有SSE4指令允許。MMX符號擴展

問候

回答

5

你可以做一個左移(PSLLD),然後被算術右移(PSRAD),例如使用內部函數:

v = _mm_srai_pi32(_mm_slli_pi32(v, 16), 16); 

(這是假設你已經在每個32位字的低半的16位值。)

+0

+1如果他們不是在正確的位置,你可能首先需要'_mm_unpacklo_pi16(v,ZERO)'('PUNPCKLWD')。注意Paul R的答案是使用MSVC的編譯器內在函數,GCC有類似的東西(http://gcc.gnu.org/onlinedocs/gcc/X86-Built_002din-Functions.html)。 – user786653

+0

謝謝 - 我已經編輯了這個問題,以澄清示例中內部函數的使用。請注意,MMX/SSE內在函數與MSVC,gcc,ICC等幾乎完全相同。 –

+0

我在尋找的是做shl(mult(var1,var2),1)其中'mult'乘以var1和var2和'shl '轉移左乘法結果。結果必須飽和,即:mult(-32768,-32768)= 2147483647。我雖然關於製作mult(sing_extesion(var1),shl(sign_extension(var2))),但我剛剛發現不存在MMX mult()飽和版本。你知道任何其他方式來得到它嗎? – LooPer