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位有符號數。