MMX指令集(詳解)

EMMS
MMX狀態置空:
將FP特徵字置空(全1),使後續浮點指令可以使用浮點寄存器,其他MMX指令自動置FP爲全0.本指令應在所有MMX例程結束和調用可含有FP指令的例程時使用,以清除MMX狀態.
MOVD mm,r/m32
MOVD r/m32,mm
轉移32位數據:
將32位數據從整型寄存器/內存移到MMX寄存器,和反向移動.MOVD不能在MMX寄存器之間,內存之間及整型寄存器之間移動數據.目標操作數爲MMX寄存器時,32位源操作數寫入目標寄存器的低32位.目標寄存器"0擴展"爲64位.源操作數爲MMX寄存器時,該寄存器的低32位被寫入目標操作數.
MOVQ mm,r/m64
MOVQ r.m64,mm
轉移64位數據:
將64位數據從整型寄存器/內存移到MMX寄存器,和反向移動.目標操作數和源操作數可爲MMX寄存器,64位內存操作數.但MOVQ不能在內存和內存之間進行數據轉移.

PACKSSWB mm,mm/m64
PACKSSDW mm,mm/m64

有符號飽和方式數據成組:
將MMX寄存器和MMX寄存器/內存單元中的有符號字組變成MMX寄存器的有符號字節組.和將MMX寄存器和MMX寄存器/內存單元中的有符號雙字組變成MMX寄存器的有符號字組.
(注1)
PACKUSWB mm,mm/m64 無符號飽和方式數據成組
將MMX寄存器和MMX寄存器/內存單元中的有符號字組變成MMX寄存器的無符號字節組
.(注1)

PADDB mm,mm/m64
PADDW mm,mm/m64
PADDD mm,mm/m64

環繞方式數據組相加:
環繞方式將MMX寄存器/內存單元中的字節組(字組,雙字組)相加到MMX寄存器中
(注1)

PADDSB mm,mm/m64
PADDSW mm,mm/m64

飽和方式有符號數據組相加:
按飽和方式將MMX寄存器/內存單元中的有符號字節組(字組)相加到MMX寄存器中的有符號字節組(字組)數據
.(注1)

PADDUSB mm,mm/m64
PADDUSW mm,mm/m64

飽和方式無符號數據組相加:
按飽和方式將MMX寄存器/內存單元中的無符號字節組(字組)相加到MMX寄存器中的無符號字節組(字組)數據.(注1)

PAND mm,mm/m64

逐位邏輯與:
將MMX寄存器/內存單元中的64位數據進行與操作,結果存於MMX寄存器中.

PANDN mm,mm/m64

逐位邏輯與非:
將MMX寄存器中的64位值取反,再將取反後的MMX寄存器與MMX寄存器/內存單元中的64位數據進行與操作,結果存於MMX寄存器中.

PCMPEQB mm,mm/m64
PCMPEQW mm,mm/m64
PCMPEQD mm,mm/m64

成組數據的相等比較:
將MMX寄存器與MMX寄存器/內存單元中的字節組(字組,雙字組)數據進行相等比較.
該指令將目標操作數和源操作數的相應數據元素進行比較,相等則目標寄存器的對應數據元素被置爲全1,否則置爲全0.
eg:PCMPEQE mm,mm/m64
mm ? ? 00000000000000111 0111000111000111
mm/m64 ? ? 11111110000001100 0111000111000111
結果mm ? ? 00000000000000000 1111111111111111

PCMPGTB mm,mm/m64
PCMPGTW mm,mm/m64
PCMPGTD mm,mm/m64

成組數據的相等比較:
將MMX寄存器與MMX寄存器/內存單元中的字節組(字組,雙字組)數據進行大於比較.
該指令將目標操作數和源操作數的相應數據元素進行比較,大於則目標寄存器的對應數據元素被置爲全1,否則置爲全0.(參考上一條)
PMADDWD mm,mm/m64 數據組(字組)的乘加:
將MMX寄存器與MMX寄存器/內存單元中的字組數據相乘,然後將32位結果逐對相加並作爲雙字存於MMX寄存器中.

eg:PMADDWD mm,mm/m64
mm ? ? 0111000111000111 0111000111000111
操作 * * * *
mm,mm/m64 ? ? 1000000000000000 0000010000000000
操作 /_____+____/ /______+_____/
mm ? ? 1100100011100011 1001110000000000

PMULHW mm,mm/m64

成組數據(字組)的乘後取高位:
將MMX寄存器與MMX寄存器/內存單元中的有符號字組數據相乘,然後將結果的高16位存入MMX寄存器.
eg:PMULHW mm,mm/m64

mm ? ? 0111000111000111 0111000111000111
操作 * * * *
mm/m64 ? ? 1000000000000000 0000010000000000
操作 High Order High Order High Order High Order
mm ? ? 1100011100011100 0000000111000111

PMULLW mm,mm/m64

成組數據(字組)的乘後取低位:
將MMX寄存器與MMX寄存器/內存單元中的有符號字組數據相乘,然後將結果的低16位存入MMX寄存器.(參考上一條)
POR mm,mm/m64 逐位邏輯或:
將MMX寄存器/內存單元中的64位數據進行或操作,結果存於MMX寄存器中.

PSLLW mm,mm/m64
PSLLD mm,mm/m64
PSLLQ mm,mm/m64
PSLLW mm,imm8
PSLLD mm,imm8
PSLLQ mm,imm8

成組數據的邏輯左移:
將MMX寄存器中的字(雙字,四字)數據按MMX寄存器/內存單元指定的個數左移,低位移入0.
將MMX寄存器中的字(雙字,四字)數據按8位立即數指定的個數左移,低位移入0.
PSRAW mm,mm/m64
PSRAD mm,mm/m64
PSRAW mm,imm8
PSRAD mm,imm8
成組數據的算術右移:
將MMX寄存器中的字(雙字)數據按MMX寄存器/內存單元指定的個數右移,移動中保持符號位.
將MMX寄存器中的字(雙字)數據按8位立即數指定的個數右移,移動中保持符號位.
PSRLW mm,mm/m64
PSRLD mm,mm/m64
PSRLQ mm,mm/m64

PSRLW mm,imm8
PSRLD mm,imm8
PSRLQ mm,imm8
成組數據的邏輯右移:
將MMX寄存器中的字(雙字)數據按MMX寄存器/內存單元指定的個數右移,移出位用0填充.
將MMX寄存器中的字(雙字)數據按8位立即數指定的個數右移,移出位用0填充.
PSUBB mm,mm/m64
PSUBW mm,mm/m64
PSUBD mm,mm/m64
環繞方式成組數據相減:
從MMX寄存器中按字節(字,雙字)減去MMX寄存器/內存單元中的字節(字,雙字)組.(注1)

PSUBSB mm,mm/m64
PSUBSW mm,mm/m64

飽和方式有符號成組數據相減:
從MMX寄存器中的有符號成組字節(字)組數據減去MMX寄存器/內存單元中的有符號字節(字)組數據.(注1)
PSUBUSB mm,mm/m64
PSUBUSW mm,mm/m64
飽和方式有符號成組數據相減:
從MMX寄存器中的無符號成組字節(字)組數據減去MMX寄存器/內存單元中的無符號字節(字)組數據.(注1)
PUNPCKHBW mm,mm/m64
PUNPCKHWD mm,mm/m64
PUNPCKHDQ mm,mm/m64
高位成組數據分解:
此指令交替取出源操作數和目標操作數的數據元素的高半部分,寫入目標操作數中,數據元素的低半部分被忽略.
eg:PUNPCKHBW mm,mm/m64

PUNPCKLBW mm,mm/m64
PUNPCKLWD mm,mm/m64
PUNPCKLDQ mm,mm/m64
低位成組數據分解:
此指令交替取出源操作數和目標操作數的數據元素的低半部分,寫入目標操作數中,數據元素的高半部分被忽略.(參考上一條)
PXOR mm,mm/m64 逐位邏輯異或:
將MMX寄存器/內存單元中的64位數據進行異或操作,結果存於MMX寄存器中.
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章