MMX指令集系列之二----移位运算和乘法指令
4. 數據移位指令
? 4.1 16位并行左移指令
? ?psllw MM,MM/m64
? ?psllw MM,imm8
? ?把目的寄存器按字由源存儲器(或imm8 立即數)指定位數邏輯左移,移出的位丟失.
? ?低字移出的位不會移入高字.
? ?例:
? ?當MM0 = 0xffff ?ffff ffff ?ffff, 執行psllw MM0,1
? ?則MM0 = 0xfffe fffe fffe fffe
?
? 4.2 16位并行邏輯右移指令
? psrlw MM,MM/m64
? psrlw MM,imm8
? 把目的寄存器按字由源存儲器(或imm8 立即數)指定位數邏輯右移,移出的位丟失.
? 高字移出的位不會移入低字.
? 例:
? 當MM0 = 0xffff ?ffff ?ffff ?ffff, 執行psrlw MM0,1
? 則MM0 = 0x7fff 7fff 7fff 7fff
?
4.3 32位并行左移指令
? pslld MM,MM/m64
? pslld MM,MM imm8
? 把目的寄存器按雙字由源存儲器(或imm8 立即數)指定位數邏輯左移,移出的位丟失.
? 低雙字移出的位不會移入高雙字.
? 例:
? 當MM0 = 0xffffffff ?ffffffff, 執行 pslld MM0,1
? 則MM0 = 0xfffffffe fffffffe
?
4.4 32位并行邏輯右移指令
?psrld MM,MM/m64
?psrld MM,imm8
?
? 把目的寄存器按雙字由源存儲器(或imm8 立即數)指定位數邏輯右移,移出的位丟失.
? 高雙字移出的位不會移入低雙字.
? 例:
? 當 MM0 = 0xffffffff ?ffffffff, 執行psrld MM0,1
? 則 MM0 = 0x7fffffff 7fffffff
4.5 64位數據邏輯左移和邏輯右移
? psllq?MM,imm8
??psrlq?MM,imm8
4.6 16位并行算術右移和32位并行算術右移
??psraw?MM,imm8
??psrad?MM,imm8
??
5. 乘法指令
???pmullw MM,MM/m64
? ?并行16位按字相乘, 取結果低16位, 放入目的寄存器的對應字.??
? 例:
? 當 MM0 == ?0x0000 0000 0002 acfe
? ? ?MM1 == ?0x0000 0000 0009 cef3, 執行 pmullw,
? ? 則MM0 = ?0x0000 0000 0012 991a
? ? 2 * 9 = 18,18 = 0000 0012h,取低16位 0012 為結果.
? ? 0x0acfe == -21250,0xcef3 == -12557,-21250*-12557 = 266836250 = 0x 0fe7 991a,取低16位 991a 為結果.
? ?pmulhw MM,MM/m64
? ?并行16位按字相乘, 取結果高16位, 放入目的寄存器的對應字.
? 例:
? 當MM0 == ?0x0000 0000 0002 acfe
? ? MM1 == ?0x0000 0000 0009 cef3, 執行 pmulhw,
? ? 則MM0 = 0x0000 0000 0000 0fe7
? ? 2 * 9 = 18,18 = 0000 0012h,取高16位 0000 為結果.
? ? 0x0acfe == -21250,0xcef3 == -12557,-21250*-12557 = 266836250 = 0x 0fe7 991a,取高16位 0fe7 為結果.
pmaddwd MM,MM/m64
按字對齊有符號向量點乘.
? ? ? ? ? ? ? ? ? ?高32位 | 低32位
目的寄存器: a0| a1 | a2 | a3
源寄存器: ? b0| b1 | b2 | b3
目的寄存器結果: ?a0*b0+a1*b1 | a2*b2+a3*b3
?
小結:
? 1. 移位指令按照16位或32位進行并行移位.也可以直接操作整個64位數。
? 2. 右移指令分為邏輯右移和算術右移。左移指令沒有算術左移一說。
? 3. 只有三種乘法指令,并行乘法的數據單位都是16位有符號數。
?
?
轉載于:https://www.cnblogs.com/celerychen/archive/2013/04/23/3588232.html
總結
以上是生活随笔為你收集整理的MMX指令集系列之二----移位运算和乘法指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是MMX?
- 下一篇: SIMD——MMX指令的溢出处理