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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章