Intel体系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寄存器中.

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:3   其中:访客  3   博主  0

  1. bjwf 5

    厚厚,这个东东偶很精通.

  2. 没脾气2x 5

    老狼,帮我写个 mmx 程序吧。嘎

  3. dongdong 5

    好啊,很有建设性