From: Peter Johnson Date: Thu, 5 Jul 2001 02:53:35 +0000 (-0000) Subject: Completely reorder instructions to match that in GNU binutils X-Git-Tag: v0.1.0~419 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1b4a70ee428fb0bd1896cbf74d0119d4fd7ec73c;p=yasm Completely reorder instructions to match that in GNU binutils /include/opcode/i386.h, used for the GAS assembler. This also helped find some missing instructions and CPU field errors, not all of which have been added/corrected yet. svn path=/trunk/yasm/; revision=92 --- diff --git a/src/instrs.dat b/src/instrs.dat index 0cb812f4..af789a4c 100644 --- a/src/instrs.dat +++ b/src/instrs.dat @@ -1,4 +1,4 @@ -; $Id: instrs.dat,v 1.17 2001/07/04 21:28:22 peter Exp $ +; $Id: instrs.dat,v 1.18 2001/07/05 02:53:35 peter Exp $ ; List of valid instruction/operand combinations ; ; Copyright (C) 2001 Peter Johnson @@ -47,9 +47,9 @@ ; See the parser file for a list of possible operand values and their meanings. ; gen_instr.pl translates this list into lexer and parser code. ; -; Instructions are listed in the order given by the "IA-32 Intel Architecture -; Software Developer's Manual, Volume 2: Instruction Set Reference." Order -; #245471. +; Instructions are listed in the same order as that in GNU binutils +; /include/opcode/i386.h, used for the GAS assembler. See +; . ; ; TODO: ; Finish instructions (may require changing parser code). @@ -58,8 +58,6 @@ ; Doublecheck AMD and Cyrix instructions. ; Doublecheck the segreg mov instructions. ; -; !Grp Operands OpSize Opcode EffAddr Imm CPU -; ; Instruction Groupings (to shorten parser code). ; The $0.1, $0.2, and $0.3 will get replaced with the parameters given for ; the instruction using the group during lexing & parsing. These parameters @@ -87,7 +85,191 @@ ; inst { yylval.groupdata.d1=0xparm1; return GRPNAME; } ; (and additional yylval.groupdata.d#=0xparm#; if needed) ; -; Arithmetic instructions: +; KEY +; +; !Grp Operands OpSize Opcode EffAddr Imm CPU +; Inst Operands OpSize Opcode EffAddr Imm CPU +; Inst!Grp Parameters CPU #0 CPU #1 +; +; Groupings used throughout +; +; One byte opcode instructions with no operands: +!onebyte nil nil $0.1 nil nil #0 +!onebyte16 nil 16 $0.1 nil nil 8086 +!onebyte32 nil 32 $0.1 nil nil 386 +; Two byte opcode instructions with no operands: +!twobyte nil nil $0.1,$0.2 nil nil #0 +; Three byte opcode instructions with no operands: +!threebyte nil nil $0.1,$0.2,$0.3 nil nil #0 +; One byte opcode instructions with general memory operand: +!onebytemem mem nil $0.1 $1,$0.2 nil #0 +; Two byte opcode instructions with general memory operand: +!twobytemem mem nil $0.1,$0.2 $1,$0.3 nil #0 +; +; Move instructions +; +; opcode arbitrarily picked for next 3 (could be 8A/8B instead of 88/89). +mov reg8,reg8 nil 88 $1r,$2 nil 8086 +mov reg16,reg16 16 89 $1r,$2 nil 8086 +mov reg32,reg32 32 89 $1r,$2 nil 386 +mov mem,reg8 nil 88 $1,$2 nil 8086 +mov mem8x,reg8 nil 88 $1,$2 nil 8086 +mov mem,reg16 16 89 $1,$2 nil 8086 +mov mem16x,reg16 16 89 $1,$2 nil 8086 +mov mem,reg32 32 89 $1,$2 nil 386 +mov mem32x,reg32 32 89 $1,$2 nil 386 +mov reg8,mem8 nil 8A $2,$1 nil 8086 +mov reg16,mem16 16 8B $2,$1 nil 8086 +mov reg32,mem32 32 8B $2,$1 nil 386 +mov mem,segreg nil 8C $1,$2 nil 8086 +mov reg16,segreg 16 8C $1r,$2 nil 8086 +mov mem16x,segreg 16 8C $1,$2 nil 8086 +mov reg32,segreg 32 8C $1r,$2 nil 386 +mov mem32x,segreg 32 8C $1,$2 nil 386 +mov segreg,mem nil 8E $2,$1 nil 8086 +mov segreg,rm16x nil 8E $2,$1 nil 8086 +mov segreg,rm32x nil 8E $2,$1 nil 386 +;mov REG_AL,memoff8 +;mov REG_AX,memoff16 +;mov REG_EAX,memoff32 +;mov memoff8,REG_AL +;mov memoff16,REG_AX +;mov memoff32,REG_EAX +mov reg8,imm8 nil B0+$1 nil $2,8 8086 +mov reg16,imm16 16 B8+$1 nil $2,16 8086 +mov reg32,imm32 32 B8+$1 nil $2,32 386 +mov mem8x,imm8 nil C6 $1,0 $2,8 8086 +mov mem,imm8x nil C6 $1,0 $2,8 8086 +mov mem16x,imm16 16 C7 $1,0 $2,16 8086 +mov mem,imm16x 16 C7 $1,0 $2,16 8086 +mov mem32x,imm32 32 C7 $1,0 $2,32 8086 +mov mem,imm32x 32 C7 $1,0 $2,32 8086 +mov CRREG_NOTCR4,reg32 nil 0F,22 $2r,$1 nil 386,PRIV +mov CR4,reg32 nil 0F,22 $2r,$1 nil P5,PRIV +mov reg32,CRREG_NOTCR4 nil 0F,20 $1r,$2 nil 386,PRIV +mov reg32,CR4 nil 0F,20 $1r,$2 nil P5,PRIV +mov reg32,DRREG nil 0F,21 $1r,$2 nil 386,PRIV +mov DRREG,reg32 nil 0F,23 $2r,$1 nil 386,PRIV +; +; Move with sign/zero extend +; +!movszx reg16,rm8 16 0F,$0.1 $2,$1 nil 386 +!movszx reg32,rm8x 32 0F,$0.1 $2,$1 nil 386 +!movszx reg32,rm16x nil 0F,$0.1+1 $2,$1 nil 386 +movsx!movszx BE +movzx!movszx B6 +; +; Push instructions +; +push mem16x 16 FF $1,6 nil 8086 +push mem32x 32 FF $1,6 nil 386 +push reg16 16 50+$1 nil nil 8086 +push reg32 32 50+$1 nil nil 386 +push imm8x nil 6A nil $1,8 8086 +push imm16x 16 68 nil $1,16 8086 +push imm32x 32 68 nil $1,32 386 +push REG_CS nil 0E nil nil 8086 +push REG_SS nil 16 nil nil 8086 +push REG_DS nil 1E nil nil 8086 +push REG_ES nil 06 nil nil 8086 +push REG_FS nil 0F,A0 nil nil 386 +push REG_GS nil 0F,A8 nil nil 386 +pusha!onebyte 60 8086 +pushad!onebyte32 60 +pushaw!onebyte16 60 +; +; Pop instructions +; +pop mem16x 16 8F $1,0 nil 8086 +pop mem32x 32 8F $1,0 nil 386 +pop reg16 16 58+$1 nil nil 8086 +pop reg32 32 58+$1 nil nil 386 +pop REG_DS nil 1F nil nil 8086 +pop REG_ES nil 07 nil nil 8086 +pop REG_SS nil 17 nil nil 8086 +pop REG_FS nil 0F,A1 nil nil 386 +pop REG_GS nil 0F,A9 nil nil 386 +popa!onebyte 61 8086 +popad!onebyte32 61 +popaw!onebyte16 61 +; +; Exchange instructions +; +;xchg REG_AX,reg16 16 90+$2 nil nil 8086 +;xchg reg16,REG_AX 16 90+$1 nil nil 8086 +;xchg REG_EAX,reg32 32 90+$2 nil nil 386 +;xchg reg32,REG_EAX 32 90+$1 nil nil 386 +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +xchg reg8,reg8 nil 86 $1r,$2 nil 8086 +xchg mem,reg8 nil 86 $1,$2 nil 8086 +xchg mem8x,reg8 nil 86 $1,$2 nil 8086 +xchg reg8,mem8 nil 86 $2,$1 nil 8086 +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +xchg reg16,reg16 16 87 $1r,$2 nil 8086 +xchg mem,reg16 16 87 $1,$2 nil 8086 +xchg mem16x,reg16 16 87 $1,$2 nil 8086 +xchg reg16,mem16 16 87 $2,$1 nil 8086 +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +xchg reg32,reg32 32 87 $1r,$2 nil 386 +xchg mem,reg32 32 87 $1,$2 nil 386 +xchg mem32x,reg32 32 87 $1,$2 nil 386 +xchg reg32,mem32 32 87 $2,$1 nil 386 +; +; In/out from ports +; +in REG_AL,imm8 nil E4 nil $2,8 8086 +in REG_AX,imm8 16 E5 nil $2,8 8086 +in REG_EAX,imm8 32 E5 nil $2,8 386 +in REG_AL,REG_DX nil EC nil nil 8086 +in REG_AX,REG_DX 16 ED nil nil 8086 +in REG_EAX,REG_DX 32 ED nil nil 386 +out imm8,REG_AL nil E6 nil $1,8 8086 +out imm8,REG_AX 16 E7 nil $1,8 8086 +out imm8,REG_EAX 32 E7 nil $1,8 386 +out REG_DX,REG_AL nil EE nil nil 8086 +out REG_DX,REG_AX 16 EF nil nil 8086 +out REG_DX,REG_EAX 32 EF nil nil 386 +; +; Load effective address +; +lea reg16,mem16 16 8D $2,$1 nil 8086 +lea reg32,mem32 32 8D $2,$1 nil 386 +; +; Load segment registers from memory +; +lds reg16,mem 16 C5 $2,$1 nil 8086 +lds reg32,mem 32 C5 $2,$1 nil 386 +lss reg16,mem 16 0F,B2 $2,$1 nil 386 +lss reg32,mem 32 0F,B2 $2,$1 nil 386 +les reg16,mem 16 C4 $2,$1 nil 8086 +les reg32,mem 32 C4 $2,$1 nil 386 +lfs reg16,mem 16 0F,B4 $2,$1 nil 386 +lfs reg32,mem 32 0F,B4 $2,$1 nil 386 +lgs reg16,mem 16 0F,B5 $2,$1 nil 386 +lgs reg32,mem 32 0F,B5 $2,$1 nil 386 +; +; Flags register instructions +; +clc!onebyte F8 8086 +cld!onebyte FC 8086 +cli!onebyte FA 8086 +clts!twobyte 0F,06 286,PRIV +cmc!onebyte F5 8086 +lahf!onebyte 9F 8086 +sahf!onebyte 9E 8086 +pushf!onebyte 9C 8086 +pushfd!onebyte32 9C +pushfw!onebyte16 9C +popf!onebyte 9D 8086 +popfd!onebyte32 9D +popfw!onebyte16 9D +stc!onebyte F9 8086 +std!onebyte FD 8086 +sti!onebyte FB 8086 +; +; Arithmetic +; +; General arithmetic !arith REG_AL,imm8 nil $0.1+4 nil $2,8 8086 !arith REG_AX,imm16 16 $0.1+5 nil $2,16 8086 !arith REG_EAX,imm32 32 $0.1+5 nil $2,32 386 @@ -119,119 +301,101 @@ !arith reg8,mem8 nil $0.1+2 $2,$1 nil 8086 !arith reg16,mem16 16 $0.1+3 $2,$1 nil 8086 !arith reg32,mem32 32 $0.1+3 $2,$1 nil 386 -; -; Bit Test (BT/BTC/BTR/BTS) group: -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -!bittest reg16,reg16 16 0F,$0.1 $1r,$2 nil 386 -!bittest mem,reg16 16 0F,$0.1 $1,$2 nil 386 -!bittest mem16x,reg16 16 0F,$0.1 $1,$2 nil 386 -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -!bittest reg32,reg32 32 0F,$0.1 $1r,$2 nil 386 -!bittest mem,reg32 32 0F,$0.1 $1,$2 nil 386 -!bittest mem32x,reg32 32 0F,$0.1 $1,$2 nil 386 -!bittest reg16,imm8 16 0F,BA $1r,$0.2 $2,8 386 -!bittest mem16x,imm8 16 0F,BA $1,$0.2 $2,8 386 -!bittest reg32,imm8 32 0F,BA $1r,$0.2 $2,8 386 -!bittest mem32x,imm8 32 0F,BA $1,$0.2 $2,8 386 -; -; BSF/BSR: -!bsfr reg16,rm16 16 0F,BC+$0.1 $2,$1 nil 386 -!bsfr reg32,rm32 32 0F,BC+$0.1 $2,$1 nil 386 -; -; CMPXCHG/XADD: -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -!cmpxchgxadd reg8,reg8 nil 0F,$0.1 $1r,$2 nil 486 -!cmpxchgxadd mem,reg8 nil 0F,$0.1 $1,$2 nil 486 -!cmpxchgxadd mem8x,reg8 nil 0F,$0.1 $1,$2 nil 486 -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -!cmpxchgxadd reg16,reg16 16 0F,$0.1+1 $1r,$2 nil 486 -!cmpxchgxadd mem,reg16 16 0F,$0.1+1 $1,$2 nil 486 -!cmpxchgxadd mem16x,reg16 16 0F,$0.1+1 $1,$2 nil 486 -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -!cmpxchgxadd reg32,reg32 32 0F,$0.1+1 $1r,$2 nil 486 -!cmpxchgxadd mem,reg32 32 0F,$0.1+1 $1,$2 nil 486 -!cmpxchgxadd mem32x,reg32 32 0F,$0.1+1 $1,$2 nil 486 -; -; Cyrix MMX instructions: -!cyrixmmx MMXREG,rm64 nil 0F,$0.1 $2,$1 nil P5,MMX,CYRIX -; -; Cyrix System Manaagement Mode instructions: -!cyrixsmm mem80 nil 0F,$0.1 $1,0 nil 486,CYRIX,SMM -; -; FPU reversible arithmetic instructions (with TO): -!farith mem32x nil D8 $1,$0.1 nil 8086,FPU -!farith mem64x nil DC $1,$0.1 nil 8086,FPU -!farith fpureg nil D8,$0.2+$1 nil nil 8086,FPU -!farith ST0,ST0 nil D8,$0.2 nil nil 8086,FPU -!farith ST0,FPUREG_NOTST0 nil D8,$0.2+$2 nil nil 8086,FPU -!farith TO fpureg nil DC,$0.3+$1 nil nil 8086,FPU -!farith FPUREG_NOTST0,ST0 nil DC,$0.3+$1 nil nil 8086,FPU -!farithp fpureg nil DE,$0.1+$1 nil nil 8086,FPU -!farithp fpureg,ST0 nil DE,$0.1+$1 nil nil 8086,FPU -; -; FPU compare group 1 (FCOM/FCOMP): -!fcomg mem32x nil D8 $1,$0.1 nil 8086,FPU -!fcomg mem64x nil DC $1,$0.1 nil 8086,FPU -!fcomg fpureg nil D8,$0.2+$1 nil nil 8086,FPU -!fcomg ST0,fpureg nil D8,$0.2+$2 nil nil 8086,FPU -; -; FPU compare group 2 (FCOMI/FCOMIP/FUCOMI/FUCOMIP/FUCOM/FUCOMP): -!fcomg2 fpureg nil $0.1,$0.2+$1 nil nil 8086,FPU -!fcomg2 ST0,fpureg nil $0.1,$0.2+$2 nil nil 8086,FPU -; -; FPU integer arithmetic instructions: -!fiarith mem32x nil DA $1,$0.1 nil 8086,FPU -!fiarith mem16x nil DE $1,$0.1 nil 8086,FPU -; -; "F6" opcode group (DIV/IDIV/MUL/NEG/NOT): -!groupf6 rm8x nil F6 $1,$0.1 nil 8086 -!groupf6 rm16x 16 F7 $1,$0.1 nil 8086 -!groupf6 rm32x 32 F7 $1,$0.1 nil 386 -; -; INC/DEC: +; INC/DEC !incdec rm8x nil FE $1,$0.1 nil 8086 !incdec mem16x 16 FF $1,$0.1 nil 8086 !incdec mem32x 32 FF $1,$0.1 nil 386 !incdec reg16 16 $0.2+$1 nil nil 8086 !incdec reg32 32 $0.2+$1 nil nil 386 -; -; Extension moves (MOVSX/MOVZX): -!movszx reg16,rm8 16 0F,$0.1 $2,$1 nil 386 -!movszx reg32,rm8x 32 0F,$0.1 $2,$1 nil 386 -!movszx reg32,rm16x nil 0F,$0.1+1 $2,$1 nil 386 -; -; AMD 3DNow! general instructions: -!now3d MMXREG,rm64 nil 0F,0F $2,$1 $0.1,8 #0,3DNOW,AMD -; -; One byte opcode instructions with no operands: -!onebyte nil nil $0.1 nil nil #0 -!onebyte16 nil 16 $0.1 nil nil 8086 -!onebyte32 nil 32 $0.1 nil nil 386 -; -; One byte opcode instructions with general memory operand: -!onebytemem mem nil $0.1 $1,$0.2 nil #0 -; -; 286 rm16 protected mode group (LLDT/LTR/STR/VERR/VERW): -!prot286 rm16 nil 0F,00 $1,$0.1 nil 286,PROT,#0 -; -; MMX/SSE2 shifts (PSLLW/PSLLD/PSLLQ/PSRAW/PSRAD/PSRLW/PSRLD/PSRLQ): -!pshift MMXREG,rm64 nil 0F,$0.1 $2,$1 nil P5,MMX -!pshift XMMREG,rm128 nil 66,0F,$0.1 $2,$1 nil P4,SSE2 -!pshift MMXREG,imm8 nil 0F,$0.2 $1r,$0.3 $2,8 P5,MMX -!pshift XMMREG,imm8 nil 66,0F,$0.2 $1r,$0.3 $2,8 P4,SSE2 -; -; Shift instructions (RCL/RCR/ROL/ROR/SAL/SAR/SHL/SHR): -!shift rm8x,ONE nil D0 $1,$0.1 nil 8086 -!shift rm8x,REG_CL nil D2 $1,$0.1 nil 8086 -!shift rm8x,imm8 nil C0 $1,$0.1 $2,8 186 -!shift rm16x,ONE 16 D1 $1,$0.1 nil 8086 +; "F6" opcodes (DIV/IDIV/MUL/NEG/NOT): +!groupf6 rm8x nil F6 $1,$0.1 nil 8086 +!groupf6 rm16x 16 F7 $1,$0.1 nil 8086 +!groupf6 rm32x 32 F7 $1,$0.1 nil 386 +add!arith 00,0 +inc!incdec 0,40 +sub!arith 28,5 +dec!incdec 1,48 +sbb!arith 18,3 +cmp!arith 38,7 +test REG_AL,imm8 nil A8 nil $2,8 8086 +test REG_AX,imm16 16 A9 nil $2,16 8086 +test REG_EAX,imm32 32 A9 nil $2,32 386 +test reg8,imm8 nil F6 $1r,0 $2,8 8086 +test mem8x,imm nil F6 $1,0 $2,8 8086 +test mem,imm8x nil F6 $1,0 $2,8 8086 +test reg16,imm16 16 F7 $1r,0 $2,16 8086 +test mem16x,imm 16 F7 $1,0 $2,16 8086 +test mem,imm16x 16 F7 $1,0 $2,16 8086 +test reg32,imm32 32 F7 $1r,0 $2,32 386 +test mem32x,imm 32 F7 $1,0 $2,32 386 +test mem,imm32x 32 F7 $1,0 $2,32 386 +; arbitrary encoding for next 3, picked $1r,$2 instead of $2r,$1 +test reg8,reg8 nil 84 $1r,$2 nil 8086 +test reg16,reg16 16 85 $1r,$2 nil 8086 +test reg32,reg32 32 85 $1r,$2 nil 386 +test mem,reg8 nil 84 $1,$2 nil 8086 +test mem8x,reg8 nil 84 $1,$2 nil 8086 +test mem,reg16 16 85 $1,$2 nil 8086 +test mem16x,reg16 16 85 $1,$2 nil 8086 +test mem,reg32 32 85 $1,$2 nil 386 +test mem32x,reg32 32 85 $1,$2 nil 386 +test reg8,mem8 nil 84 $2,$1 nil 8086 +test reg16,mem16 16 85 $2,$1 nil 8086 +test reg32,mem32 32 85 $2,$1 nil 386 +and!arith 20,4 +or!arith 08,1 +xor!arith 30,6 +adc!arith 10,2 +neg!groupf6 3 +not!groupf6 2 +aaa!onebyte 37 8086 +aas!onebyte 3F 8086 +daa!onebyte 27 8086 +das!onebyte 2F 8086 +aad nil nil D5,0A nil nil 8086 +aad imm8 nil D5 nil $1,8 8086 +aam nil nil D4,0A nil nil 8086 +aam imm8 nil D4 nil $1,8 8086 +; +; Conversion instructions +; +cbw!onebyte16 98 +cwde!onebyte32 98 +cwd!onebyte16 99 +cdq!onebyte32 99 +; +; Multiplication and division +; +mul!groupf6 4 +imul rm8x nil F6 $1,5 nil 8086 +imul rm16x 16 F7 $1,5 nil 8086 +imul rm32x 32 F7 $1,5 nil 386 +imul reg16,rm16 16 0F,AF $2,$1 nil 386 +imul reg32,rm32 32 0F,AF $2,$1 nil 386 +imul reg16,rm16,imm8x 16 6B $2,$1 $3,8s 186 +imul reg32,rm32,imm8x 32 6B $2,$1 $3,8s 386 +imul reg16,imm8x 16 6B $1r,$1 $2,8s 186 +imul reg32,imm8x 32 6B $1r,$1 $2,8s 386 +imul reg16,rm16,imm16 16 69 $2,$1 $3,16s 186 +imul reg32,rm32,imm32 32 69 $2,$1 $3,32s 386 +imul reg16,imm16 16 69 $1r,$1 $2,16s 186 +imul reg32,imm32 32 69 $1r,$1 $2,32s 386 +div!groupf6 6 +idiv!groupf6 7 +; +; Shifts +; +; Standard +!shift rm8x,ONE nil D0 $1,$0.1 nil 8086 +!shift rm8x,REG_CL nil D2 $1,$0.1 nil 8086 +!shift rm8x,imm8 nil C0 $1,$0.1 $2,8 186 +!shift rm16x,ONE 16 D1 $1,$0.1 nil 8086 !shift rm16x,REG_CL 16 D3 $1,$0.1 nil 8086 !shift rm16x,imm8 16 C1 $1,$0.1 $2,8 186 !shift rm32x,ONE 32 D1 $1,$0.1 nil 386 !shift rm32x,REG_CL 32 D3 $1,$0.1 nil 386 !shift rm32x,imm8 32 C1 $1,$0.1 $2,8 386 -; -; Doubleword shifts (SHLD/SHRD): +; Doubleword ; arbitrary encoding, picked $1r,$2 instead of $2r,$1 !shlrd reg16,reg16,imm8 16 0F,$0.1 $1r,$2 $3,8 386 !shlrd mem,reg16,imm8 16 0F,$0.1 $1,$2 $3,8 386 @@ -248,165 +412,203 @@ !shlrd reg32,reg32,REG_CL 32 0F,$0.1+1 $1r,$2 nil 386 !shlrd mem,reg32,REG_CL 32 0F,$0.1+1 $1,$2 nil 386 !shlrd mem32x,reg32,REG_CL 32 0F,$0.1+1 $1,$2 nil 386 +rol!shift 0 +ror!shift 1 +rcl!shift 2 +rcr!shift 3 +sal!shift 4 +shl!shift 4 +shr!shift 5 +sar!shift 7 +shld!shlrd A4 +shrd!shlrd AC ; -; SSE/SSE2 standard variations: -!sse2pd XMMREG,rm128 nil 66,0F,$0.1 $2,$1 nil P4,SSE2 -!sseps XMMREG,rm128 nil 0F,$0.1 $2,$1 nil #0 -!sse2sd XMMREG,rm128 nil F2,0F,$0.1 $2,$1 nil P4,SSE2 -!sse2ss XMMREG,rm128 nil F3,0F,$0.1 $2,$1 nil P4,SSE2 +; Control transfer instructions (unconditional) ; -; SSE/SSE2 standard variations, with immediate: -!sse2pdimm XMMREG,rm128,imm8 nil 66,0F,$0.1 $2,$1 $3,8 P4,SSE2 -!ssepsimm XMMREG,rm128,imm8 nil 0F,$0.1 $2,$1 $3,8 KATMAI,SSE +; call +; jmp +:ret retn +retn nil nil C3 nil nil 8086 +retf nil nil CB nil nil 8086 +retn imm16 nil C2 nil $1,16 8086 +retf imm16 nil CA nil $1,16 8086 +enter imm16,imm8 nil C8 $1i,16 $2,8 186 +leave!onebyte C9 186 ; -; SSE/SSE2 and MMX shared instructions: -!mmxsse MMXREG,rm64 nil 0F,$0.1 $2,$1 nil #0,MMX -!mmxsse XMMREG,rm128 nil 66,0F,$0.1 $2,$1 nil #1 +; Conditional jumps ; -; Two byte opcode instructions with no operands: -!twobyte nil nil $0.1,$0.2 nil nil #0 +; jcc +; jcxz +; jecxz ; -; Two byte opcode instructions with general memory operand: -!twobytemem mem nil $0.1,$0.2 $1,$0.3 nil #0 +; Loop instructions ; -; Three byte opcode instructions with no operands: -!threebyte nil nil $0.1,$0.2,$0.3 nil nil #0 +; loop +; loopcc: +;:loope loopz +;loopz imm1632 nil E1 nil $1r,8s 8086 +;loopz imm1632,REG_CX 16 E1 nil $1r,8s 8086 +;loopz imm1632,REG_ECX 32 E1 nil $1r,8s 386 +;:loopne loopnz +;loopnz imm1632 nil E1 nil $1r,8s 8086 +;loopnz imm1632,REG_CX 16 E1 nil $1r,8s 8086 +;loopnz imm1632,REG_ECX 32 E1 nil $1r,8s 386 ; +; Set byte on flag instructions ; -; Instruction Lines: -; Inst Operands OpSize Opcode EffAddr Imm CPU -; *or* -; Inst!Group Parameters CPU #0 -aaa!onebyte 37 8086 -aad nil nil D5,0A nil nil 8086 -aad imm8 nil D5 nil $1,8 8086 -aam nil nil D4,0A nil nil 8086 -aam imm8 nil D4 nil $1,8 8086 -aas!onebyte 3F 8086 -adc!arith 10,2 -add!arith 00,0 -addpd!sse2pd 58 -addps!sseps 58 KATMAI,SSE -addsd!sse2sd 58 -addss!sse2ss 58 -and!arith 20,4 -andpd!sse2pd 54 -andps!sseps 54 P4,SSE2 -andnpd!sse2pd 55 -andnps!sseps 55 P4,SSE2 -arpl rm16,reg16 nil 63 $1,$2 nil 286,PROT -bound reg16,mem16 16 62 $2,$1 nil 186 -bound reg32,mem32 32 62 $2,$1 nil 386 +; setcc +; +; String instructions +; +; NOTE: cmpsd,movsd can't go to !onebyte32 group because of other variations +cmppd!sse2pdimm C2 +cmpps!ssepsimm C2 +cmpsb!onebyte A6 8086 +cmpsw!onebyte16 A7 +cmpsd nil 32 A7 nil nil 386 +insb!onebyte 6C 8086 +insw!onebyte16 6D +insd!onebyte32 6D +outsb!onebyte 6E 8086 +outsw!onebyte16 6F +outsd!onebyte32 6F +lodsb!onebyte AC 8086 +lodsw!onebyte16 AD +lodsd!onebyte32 AD +movsb!onebyte A4 8086 +movsw!onebyte16 A5 +movsd nil 32 A5 nil nil 386 +scasb!onebyte AE 8086 +scasw!onebyte16 AF +scasd!onebyte32 AF +stosb!onebyte AA 8086 +stosw!onebyte16 AB +stosd!onebyte32 AB +xlat!onebyte D7 8086 +xlatb!onebyte D7 8086 +; +; Bit manipulation +; +; Bit tests +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +!bittest reg16,reg16 16 0F,$0.1 $1r,$2 nil 386 +!bittest mem,reg16 16 0F,$0.1 $1,$2 nil 386 +!bittest mem16x,reg16 16 0F,$0.1 $1,$2 nil 386 +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +!bittest reg32,reg32 32 0F,$0.1 $1r,$2 nil 386 +!bittest mem,reg32 32 0F,$0.1 $1,$2 nil 386 +!bittest mem32x,reg32 32 0F,$0.1 $1,$2 nil 386 +!bittest reg16,imm8 16 0F,BA $1r,$0.2 $2,8 386 +!bittest mem16x,imm8 16 0F,BA $1,$0.2 $2,8 386 +!bittest reg32,imm8 32 0F,BA $1r,$0.2 $2,8 386 +!bittest mem32x,imm8 32 0F,BA $1,$0.2 $2,8 386 +; Bit scans +!bsfr reg16,rm16 16 0F,BC+$0.1 $2,$1 nil 386 +!bsfr reg32,rm32 32 0F,BC+$0.1 $2,$1 nil 386 bsf!bsfr 0 bsr!bsfr 1 -bswap reg32 32 0F,C8+$1 nil nil 486 bt!bittest A3,4 btc!bittest BB,7 btr!bittest B3,6 bts!bittest AB,5 -; call -cbw!onebyte16 98 -cwde!onebyte32 98 -clc!onebyte F8 8086 -cld!onebyte FC 8086 -clflush mem8 nil 0F,AE $1,7 nil KATMAI -cli!onebyte FA 8086 -clts!twobyte 0F,06 286,PRIV -cmc!onebyte F5 8086 -; cmov -cmp!arith 38,7 -cmppd!sse2pdimm C2 -cmpps!ssepsimm C2 -cmpsb!onebyte A6 8086 -cmpsw!onebyte16 A7 -cmpsd nil 32 A7 nil nil 386 -cmpsd XMMREG,rm128,imm8 nil F2,0F,C2 $2,$1 $3,8 P4,SSE2 -cmpss XMMREG,rm128,imm8 nil F3,0F,C2 $2,$1 $3,8 P4,SSE2 -cmpxchg!cmpxchgxadd B0 -cmpxchg8b mem64 nil 0F,C7 $1,1 nil P5 -comisd!sse2pd 2F -comiss!sseps 2F KATMAI,SSE -cpuid!twobyte 0F,A2 P5 -cvtdq2pd!sse2ss E6 -cvtdq2ps!sseps 5B P4,SSE2 -cvtpd2dq!sse2sd E6 -cvtpd2pi!sse2pd 2D -cvtpd2ps!sse2pd 5A -cvtpi2pd!sse2pd 2A -cvtpi2ps!sseps 2A P4,SSE2 -cvtps2dq!sse2pd 5B -cvtps2pd!sseps 5A P4,SSE2 -cvtps2pi!sseps 2D P4,SSE2 -cvtsd2si!sse2sd 2D -cvtsd2ss!sse2sd 5A -cvtsi2sd!sse2sd 2A -cvtsi2ss!sse2ss 2A -cvtss2sd!sse2ss 5A -cvtss2si!sse2ss 2D -cvttpd2pi!sse2pd 2C -cvttpd2dq!sse2pd E6 -cvttps2dq!sse2ss 5B -cvttps2pi!sseps 2C P4,SSE2 -cvttsd2si!sse2sd 2C -cvttss2si!sse2ss 2C -cwd!onebyte16 99 -cdq!onebyte32 99 -daa!onebyte 27 8086 -das!onebyte 2F 8086 -dec!incdec 1,48 -div!groupf6 6 -divpd!sse2pd 5E -divps!sseps 5E KATMAI,SSE -divsd!sse2sd 5E -divss!sse2ss 5E -emms!twobyte 0F,77 P5,MMX -enter imm16,imm8 nil C8 $1i,16 $2,8 186 -f2xm1!twobyte D9,F0 8086,FPU -fabs!twobyte D9,E1 8086,FPU -fadd!farith 0,C0,C0 -faddp!farithp C0 -fiadd!fiarith 0 -fbld mem80 nil DF $1,4 nil 8086,FPU -fbstp mem80 nil DF $1,6 nil 8086,FPU -fchs!twobyte D9,E0 8086,FPU -fclex!threebyte 9B,DB,E2 8086,FPU -fnclex!twobyte DB,E2 8086,FPU -; fcmov -fcom!fcomg 2,D0 -fcomp!fcomg 3,D8 -fcompp!twobyte DE,D9 8086,FPU -fcomi!fcomg2 DB,F0 -fcomip!fcomg2 DF,F0 -fucomi!fcomg2 DB,E8 -fucomip!fcomg2 DF,E8 -fcos!twobyte D9,FF 8086,FPU -fdecstp!twobyte D9,F6 8086,FPU -fdiv!farith 6,F0,F8 -fdivp!farithp F8 -fidiv!fiarith 6 -fdivr!farith 7,F8,F0 -fdivrp!farithp F0 -fidivr!fiarith 7 -ffree fpureg nil DD,C0+$1 nil nil 8086,FPU -ficom mem16x nil DE $1,2 nil 8086,FPU -ficom mem32x nil DA $1,2 nil 8086,FPU -ficomp mem16x nil DE $1,3 nil 8086,FPU -ficomp mem32x nil DA $1,3 nil 8086,FPU +; +; Interrupts and operating system instructions +; +int imm8 nil CD nil $1,8 8086 +int3!onebyte CC 8086 +int03!onebyte CC 8086 +into!onebyte CE 8086 +iret!onebyte CF 8086 +iretw!onebyte16 CF +iretd!onebyte32 CF +rsm!twobyte 0F,AA P5,SMM +bound reg16,mem16 16 62 $2,$1 nil 186 +bound reg32,mem32 32 62 $2,$1 nil 386 +hlt!onebyte F4 8086,PRIV +nop!onebyte 90 8086 +; +; Protection control +; +; 286 rm16 protected mode group (LLDT/LTR/STR/VERR/VERW): +!prot286 rm16 nil 0F,00 $1,$0.1 nil 286,PROT,#0 +arpl rm16,reg16 nil 63 $1,$2 nil 286,PROT +lar reg16,rm16 16 0F,02 $2,$1 nil 286,PROT +lar reg32,rm32 32 0F,02 $2,$1 nil 386,PROT +lgdt!twobytemem 0F,01,2 286,PRIV +lidt!twobytemem 0F,01,3 286,PRIV +lldt!prot286 2 PRIV +lmsw rm16 nil 0F,01 $1,6 nil 286,PRIV +lsl reg16,rm16 16 0F,03 $2,$1 nil 286,PROT +lsl reg32,rm32 32 0F,03 $2,$1 nil 286,PROT +ltr!prot286 3 PRIV +sgdt!twobytemem 0F,01,0 286 +sidt!twobytemem 0F,01,1 286 +sldt mem1632 nil 0F,00 $1,0 nil 286 +sldt reg16 16 0F,00 $1r,0 nil 286 +sldt reg32 32 0F,00 $1r,0 nil 386 +smsw mem1632 nil 0F,01 $1,4 nil 286 +smsw reg16 16 0F,01 $1r,4 nil 286 +smsw reg32 32 0F,01 $1r,4 nil 386 +str!prot286 1 +verr!prot286 4 +verw!prot286 5 +; +; Floating point instructions +; +; Load +fld mem32x nil D9 $1,0 nil 8086,FPU +fld mem64x nil DD $1,0 nil 8086,FPU +fld mem80x nil DB $1,5 nil 8086,FPU +fld fpureg nil D9,C0+$1 nil nil 8086,FPU fild mem16x nil DF $1,0 nil 8086,FPU fild mem32x nil DB $1,0 nil 8086,FPU fild mem64x nil DF $1,5 nil 8086,FPU -fincstp!twobyte D9,F7 8086,FPU -finit!threebyte 9B,DB,E3 8086,FPU -fninit!twobyte DB,E3 8086,FPU +fbld mem80 nil DF $1,4 nil 8086,FPU +; Store +fst mem32x nil D9 $1,2 nil 8086,FPU +fst mem64x nil DD $1,2 nil 8086,FPU +fst fpureg nil DD,D0+$1 nil nil 8086,FPU fist mem16x nil DF $1,2 nil 8086,FPU fist mem32x nil DB $1,2 nil 8086,FPU +; Store (with pop) +fstp mem32x nil D9 $1,3 nil 8086,FPU +fstp mem64x nil DD $1,3 nil 8086,FPU +fstp mem80x nil DB $1,7 nil 8086,FPU +fstp fpureg nil DD,D8+$1 nil nil 8086,FPU fistp mem16x nil DF $1,3 nil 8086,FPU fistp mem32x nil DB $1,3 nil 8086,FPU fistp mem64x nil DF $1,7 nil 8086,FPU -fld mem32x nil D9 $1,0 nil 8086,FPU -fld mem64x nil DD $1,0 nil 8086,FPU -fld mem80x nil DB $1,5 nil 8086,FPU -fld fpureg nil D9,C0+$1 nil nil 8086,FPU +fbstp mem80 nil DF $1,6 nil 8086,FPU +; Exchange (with ST0) +fxch fpureg nil D9,C8+$1 nil nil 8086,FPU +fxch ST0,ST0 nil D9,C8 nil nil 8086,FPU +fxch ST0,FPUREG_NOTST0 nil D9,C8+$2 nil nil 8086,FPU +fxch FPUREG_NOTST0,ST0 nil D9,C8+$1 nil nil 8086,FPU +fxch nil nil D9,C9 nil nil 8086,FPU +; Comparisons +!fcomg mem32x nil D8 $1,$0.1 nil 8086,FPU +!fcomg mem64x nil DC $1,$0.1 nil 8086,FPU +!fcomg fpureg nil D8,$0.2+$1 nil nil 8086,FPU +!fcomg ST0,fpureg nil D8,$0.2+$2 nil nil 8086,FPU +; Extended comparisons +!fcomg2 fpureg nil $0.1,$0.2+$1 nil nil #0,FPU +!fcomg2 ST0,fpureg nil $0.1,$0.2+$2 nil nil #0,FPU +; Comparison (without pop) +fcom!fcomg 2,D0 +ficom mem16x nil DE $1,2 nil 8086,FPU +ficom mem32x nil DA $1,2 nil 8086,FPU +; Comparison (with pop) +fcomp!fcomg 3,D8 +ficomp mem16x nil DE $1,3 nil 8086,FPU +ficomp mem32x nil DA $1,3 nil 8086,FPU +fcompp!twobyte DE,D9 8086,FPU +; Unordered comparison (with pop) +fucom!fcomg2 DD,E0 +fucomp!fcomg2 DD,E8 +fucompp!twobyte DA,E9 286,FPU +ftst!twobyte D9,E4 8086,FPU +fxam!twobyte D9,E5 8086,FPU +; Load constants into ST0 fld1!twobyte D9,E8 8086,FPU fldl2t!twobyte D9,E9 8086,FPU fldl2e!twobyte D9,EA 8086,FPU @@ -414,227 +616,156 @@ fldpi!twobyte D9,EB 8086,FPU fldlg2!twobyte D9,EC 8086,FPU fldln2!twobyte D9,ED 8086,FPU fldz!twobyte D9,EE 8086,FPU -fldcw mem16 nil D9 $1,5 nil 8086,FPU -fldenv!onebytemem D9,4 8086,FPU +; Arithmetic +!farith mem32x nil D8 $1,$0.1 nil 8086,FPU +!farith mem64x nil DC $1,$0.1 nil 8086,FPU +!farith fpureg nil D8,$0.2+$1 nil nil 8086,FPU +!farith ST0,ST0 nil D8,$0.2 nil nil 8086,FPU +!farith ST0,FPUREG_NOTST0 nil D8,$0.2+$2 nil nil 8086,FPU +!farith TO fpureg nil DC,$0.3+$1 nil nil 8086,FPU +!farith FPUREG_NOTST0,ST0 nil DC,$0.3+$1 nil nil 8086,FPU +!farithp fpureg nil DE,$0.1+$1 nil nil 8086,FPU +!farithp fpureg,ST0 nil DE,$0.1+$1 nil nil 8086,FPU +!fiarith mem32x nil DA $1,$0.1 nil 8086,FPU +!fiarith mem16x nil DE $1,$0.1 nil 8086,FPU +fadd!farith 0,C0,C0 +faddp!farithp C0 +fiadd!fiarith 0 +fsub!farith 4,E0,E8 +fisub!fiarith 4 +fsubp!farithp E8 +fsubr!farith 5,E8,E0 +fisubr!fiarith 5 +fsubrp!farithp E0 +; Multiply fmul!farith 1,C8,C8 -fmulp!farithp C8 fimul!fiarith 1 -fnop!twobyte D9,D0 8086,FPU +fmulp!farithp C8 +; Divide +fdiv!farith 6,F0,F8 +fidiv!fiarith 6 +fdivp!farithp F8 +fdivr!farith 7,F8,F0 +fidivr!fiarith 7 +fdivrp!farithp F0 +; Other arithmetic +f2xm1!twobyte D9,F0 8086,FPU +fyl2x!twobyte D9,F1 8086,FPU +fptan!twobyte D9,F2 8086,FPU fpatan!twobyte D9,F3 8086,FPU +fxtract!twobyte D9,F4 8086,FPU +fprem1!twobyte D9,F5 286,FPU +fdecstp!twobyte D9,F6 8086,FPU +fincstp!twobyte D9,F7 8086,FPU fprem!twobyte D9,F8 8086,FPU -fprem1!twobyte D9,F5 8086,FPU -fptan!twobyte D9,F2 8086,FPU +fyl2xp1!twobyte D9,F9 8086,FPU +fsqrt!twobyte D9,FA 8086,FPU +fsincos!twobyte D9,FB 286,FPU frndint!twobyte D9,FC 8086,FPU -frstor!onebytemem DD,4 8086,FPU -fsave!twobytemem 9B,DD,6 8086,FPU -fnsave!onebytemem DD,6 8086,FPU fscale!twobyte D9,FD 8086,FPU -fsin!twobyte D9,FE 8086,FPU -fsincos!twobyte D9,FB 8086,FPU -fsqrt!twobyte D9,FA 8086,FPU -fst mem32x nil D9 $1,2 nil 8086,FPU -fst mem64x nil DD $1,2 nil 8086,FPU -fst fpureg nil DD,D0+$1 nil nil 8086,FPU -fstp mem32x nil D9 $1,3 nil 8086,FPU -fstp mem64x nil DD $1,3 nil 8086,FPU -fstp mem80x nil DB $1,7 nil 8086,FPU -fstp fpureg nil DD,D8+$1 nil nil 8086,FPU -fstcw mem16 nil 9B,D9 $1,7 nil 8086,FPU +fsin!twobyte D9,FE 286,FPU +fcos!twobyte D9,FF 286,FPU +fchs!twobyte D9,E0 8086,FPU +fabs!twobyte D9,E1 8086,FPU +; Processor control +fninit!twobyte DB,E3 8086,FPU +finit!threebyte 9B,DB,E3 8086,FPU +fldcw mem16 nil D9 $1,5 nil 8086,FPU fnstcw mem16 nil D9 $1,7 nil 8086,FPU -fstenv!twobytemem 9B,D9,6 8086,FPU -fnstenv!onebytemem D9,6 8086,FPU -fstsw mem16 nil 9B,DD $1,7 nil 8086,FPU -fstsw REG_AX nil 9B,DF,E0 nil nil 8086,FPU +fstcw mem16 nil 9B,D9 $1,7 nil 8086,FPU fnstsw mem16 nil DD $1,7 nil 8086,FPU fnstsw REG_AX nil DF,E0 nil nil 8086,FPU -fsub!farith 4,E0,E8 -fsubp!farithp E8 -fisub!fiarith 4 -fsubr!farith 5,E8,E0 -fsubrp!farithp E0 -fisubr!fiarith 5 -ftst!twobyte D9,E4 8086,FPU -fucom!fcomg2 DD,E0 -fucomp!fcomg2 DD,E8 -fucompp!twobyte DA,E9 8086,FPU -fxam!twobyte D9,E5 8086,FPU -fxch fpureg nil D9,C8+$1 nil nil 8086,FPU -fxch ST0,ST0 nil D9,C8 nil nil 8086,FPU -fxch ST0,FPUREG_NOTST0 nil D9,C8+$2 nil nil 8086,FPU -fxch FPUREG_NOTST0,ST0 nil D9,C8+$1 nil nil 8086,FPU -fxch nil nil D9,C9 nil nil 8086,FPU -fxrstor!twobytemem 0F,AE,1 P6,SSE,FPU -fxsave!twobytemem 0F,AE,0 P6,SSE,FPU -fxtract!twobyte D9,F4 8086,FPU -fyl2x!twobyte D9,F1 8086,FPU -fyl2xp1!twobyte D9,F9 8086,FPU -hlt!onebyte F4 8086,PRIV -idiv!groupf6 7 -imul rm8x nil F6 $1,5 nil 8086 -imul rm16x 16 F7 $1,5 nil 8086 -imul rm32x 32 F7 $1,5 nil 386 -imul reg16,rm16 16 0F,AF $2,$1 nil 386 -imul reg32,rm32 32 0F,AF $2,$1 nil 386 -imul reg16,rm16,imm8x 16 6B $2,$1 $3,8s 186 -imul reg32,rm32,imm8x 32 6B $2,$1 $3,8s 386 -imul reg16,imm8x 16 6B $1r,$1 $2,8s 186 -imul reg32,imm8x 32 6B $1r,$1 $2,8s 386 -imul reg16,rm16,imm16 16 69 $2,$1 $3,16s 186 -imul reg32,rm32,imm32 32 69 $2,$1 $3,32s 386 -imul reg16,imm16 16 69 $1r,$1 $2,16s 186 -imul reg32,imm32 32 69 $1r,$1 $2,32s 386 -in REG_AL,imm8 nil E4 nil $2,8 8086 -in REG_AX,imm8 16 E5 nil $2,8 8086 -in REG_EAX,imm8 32 E5 nil $2,8 386 -in REG_AL,REG_DX nil EC nil nil 8086 -in REG_AX,REG_DX 16 ED nil nil 8086 -in REG_EAX,REG_DX 32 ED nil nil 386 -inc!incdec 0,40 -insb!onebyte 6C 8086 -insw!onebyte16 6D -insd!onebyte32 6D -int3!onebyte CC 8086 -int03!onebyte CC 8086 -int imm8 nil CD nil $1,8 8086 -into!onebyte CE 8086 -invd!twobyte 0F,08 486,PRIV -invlpg!twobytemem 0F,01,7 486,PRIV -iret!onebyte CF 8086 -iretw!onebyte16 CF -iretd!onebyte32 CF -; jcc -; jmp -lahf!onebyte 9F 8086 -lar reg16,rm16 16 0F,02 $2,$1 nil 286,PROT -lar reg32,rm32 32 0F,02 $2,$1 nil 386,PROT -ldmxcsr mem32 nil 0F,AE $1,2 nil KATMAI,SSE -lds reg16,mem 16 C5 $2,$1 nil 8086 -lds reg32,mem 32 C5 $2,$1 nil 386 -lss reg16,mem 16 0F,B2 $2,$1 nil 386 -lss reg32,mem 32 0F,B2 $2,$1 nil 386 -les reg16,mem 16 C4 $2,$1 nil 8086 -les reg32,mem 32 C4 $2,$1 nil 386 -lfs reg16,mem 16 0F,B4 $2,$1 nil 386 -lfs reg32,mem 32 0F,B4 $2,$1 nil 386 -lgs reg16,mem 16 0F,B5 $2,$1 nil 386 -lgs reg32,mem 32 0F,B5 $2,$1 nil 386 -lea reg16,mem16 16 8D $2,$1 nil 8086 -lea reg32,mem32 32 8D $2,$1 nil 386 -leave!onebyte C9 186 -lfence!threebyte 0F,AE,E8 KATMAI -lgdt!twobytemem 0F,01,2 286,PRIV -lidt!twobytemem 0F,01,3 286,PRIV -lldt!prot286 2 PRIV -lmsw rm16 nil 0F,01 $1,6 nil 286,PRIV -lodsb!onebyte AC 8086 -lodsw!onebyte16 AD -lodsd!onebyte32 AD -; loop -; loopcc: -;:loope loopz -;loopz imm1632 nil E1 nil $1r,8s 8086 -;loopz imm1632,REG_CX 16 E1 nil $1r,8s 8086 -;loopz imm1632,REG_ECX 32 E1 nil $1r,8s 386 -;:loopne loopnz -;loopnz imm1632 nil E1 nil $1r,8s 8086 -;loopnz imm1632,REG_CX 16 E1 nil $1r,8s 8086 -;loopnz imm1632,REG_ECX 32 E1 nil $1r,8s 386 -lsl reg16,rm16 16 0F,03 $2,$1 nil 286,PROT -lsl reg32,rm32 32 0F,03 $2,$1 nil 286,PROT -ltr!prot286 3 PRIV -maskmovdqu XMMREG,XMMREG nil 66,0F,F7 $2r,$1 nil P4,SSE2 -maskmovq MMXREG,MMXREG nil 0F,F7 $2r,$1 nil KATMAI,MMX -maxpd!sse2pd 5F -maxps!sseps 5F KATMAI,SSE -maxsd!sse2sd 5F -maxss!sse2ss 5F -mfence!threebyte 0F,AE,F0 KATMAI -minpd!sse2pd 5D -minps!sseps 5D KATMAI,SSE -minsd!sse2sd 5D -minss!sse2ss 5D -; opcode arbitrarily picked for next 3 (could be 8A/8B instead of 88/89). -mov reg8,reg8 nil 88 $1r,$2 nil 8086 -mov reg16,reg16 16 89 $1r,$2 nil 8086 -mov reg32,reg32 32 89 $1r,$2 nil 386 -mov mem,reg8 nil 88 $1,$2 nil 8086 -mov mem8x,reg8 nil 88 $1,$2 nil 8086 -mov mem,reg16 16 89 $1,$2 nil 8086 -mov mem16x,reg16 16 89 $1,$2 nil 8086 -mov mem,reg32 32 89 $1,$2 nil 386 -mov mem32x,reg32 32 89 $1,$2 nil 386 -mov reg8,mem8 nil 8A $2,$1 nil 8086 -mov reg16,mem16 16 8B $2,$1 nil 8086 -mov reg32,mem32 32 8B $2,$1 nil 386 -mov mem,segreg nil 8C $1,$2 nil 8086 -mov reg16,segreg 16 8C $1r,$2 nil 8086 -mov mem16x,segreg 16 8C $1,$2 nil 8086 -mov reg32,segreg 32 8C $1r,$2 nil 386 -mov mem32x,segreg 32 8C $1,$2 nil 386 -mov segreg,mem nil 8E $2,$1 nil 8086 -mov segreg,rm16x nil 8E $2,$1 nil 8086 -mov segreg,rm32x nil 8E $2,$1 nil 386 -;mov REG_AL,memoff8 -;mov REG_AX,memoff16 -;mov REG_EAX,memoff32 -;mov memoff8,REG_AL -;mov memoff16,REG_AX -;mov memoff32,REG_EAX -mov reg8,imm8 nil B0+$1 nil $2,8 8086 -mov reg16,imm16 16 B8+$1 nil $2,16 8086 -mov reg32,imm32 32 B8+$1 nil $2,32 386 -mov mem8x,imm8 nil C6 $1,0 $2,8 8086 -mov mem,imm8x nil C6 $1,0 $2,8 8086 -mov mem16x,imm16 16 C7 $1,0 $2,16 8086 -mov mem,imm16x 16 C7 $1,0 $2,16 8086 -mov mem32x,imm32 32 C7 $1,0 $2,32 8086 -mov mem,imm32x 32 C7 $1,0 $2,32 8086 -mov CRREG_NOTCR4,reg32 nil 0F,22 $2r,$1 nil 386,PRIV -mov CR4,reg32 nil 0F,22 $2r,$1 nil P5,PRIV -mov reg32,CRREG_NOTCR4 nil 0F,20 $1r,$2 nil 386,PRIV -mov reg32,CR4 nil 0F,20 $1r,$2 nil P5,PRIV -mov reg32,DRREG nil 0F,21 $1r,$2 nil 386,PRIV -mov DRREG,reg32 nil 0F,23 $2r,$1 nil 386,PRIV -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movapd XMMREG,XMMREG nil 66,0F,28 $2r,$1 nil P4,SSE2 -movapd XMMREG,mem128 nil 66,0F,28 $2,$1 nil P4,SSE2 -movapd mem128,XMMREG nil 66,0F,29 $1,$2 nil P4,SSE2 -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movaps XMMREG,XMMREG nil 0F,28 $2r,$1 nil KATMAI,SSE -movaps XMMREG,mem128 nil 0F,28 $2,$1 nil KATMAI,SSE -movaps mem128,XMMREG nil 0F,29 $1,$2 nil KATMAI,SSE +fstsw mem16 nil 9B,DD $1,7 nil 8086,FPU +fstsw REG_AX nil 9B,DF,E0 nil nil 8086,FPU +fnclex!twobyte DB,E2 8086,FPU +fclex!threebyte 9B,DB,E2 8086,FPU +fnstenv!onebytemem D9,6 8086,FPU +fstenv!twobytemem 9B,D9,6 8086,FPU +fldenv!onebytemem D9,4 8086,FPU +fnsave!onebytemem DD,6 8086,FPU +fsave!twobytemem 9B,DD,6 8086,FPU +frstor!onebytemem DD,4 8086,FPU +ffree fpureg nil DD,C0+$1 nil nil 8086,FPU +; ffreep +fnop!twobyte D9,D0 8086,FPU +fwait!onebyte 9B 8086,FPU +; +; Prefixes (should the others be here too? should wait be a prefix?) +; +wait!onebyte 9B 8086 +; +; 486 extensions +; +; Compare & exchange, exchange & add +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +!cmpxchgxadd reg8,reg8 nil 0F,$0.1 $1r,$2 nil 486 +!cmpxchgxadd mem,reg8 nil 0F,$0.1 $1,$2 nil 486 +!cmpxchgxadd mem8x,reg8 nil 0F,$0.1 $1,$2 nil 486 +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +!cmpxchgxadd reg16,reg16 16 0F,$0.1+1 $1r,$2 nil 486 +!cmpxchgxadd mem,reg16 16 0F,$0.1+1 $1,$2 nil 486 +!cmpxchgxadd mem16x,reg16 16 0F,$0.1+1 $1,$2 nil 486 +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +!cmpxchgxadd reg32,reg32 32 0F,$0.1+1 $1r,$2 nil 486 +!cmpxchgxadd mem,reg32 32 0F,$0.1+1 $1,$2 nil 486 +!cmpxchgxadd mem32x,reg32 32 0F,$0.1+1 $1,$2 nil 486 +bswap reg32 32 0F,C8+$1 nil nil 486 +xadd!cmpxchgxadd C0 +cmpxchg!cmpxchgxadd B0 +invd!twobyte 0F,08 486,PRIV +wbinvd!twobyte 0F,09 486,PRIV +invlpg!twobytemem 0F,01,7 486,PRIV +; +; 586 and late 486 extensions +; +cpuid!twobyte 0F,A2 P5 +; +; Pentium extensions +; +wrmsr!twobyte 0F,30 P5,PRIV +rdtsc!twobyte 0F,31 P5 +rdmsr!twobyte 0F,32 P5,PRIV +cmpxchg8b mem64 nil 0F,C7 $1,1 nil P5 +; +; Pentium II/Pentium Pro extensions +; +sysenter!twobyte 0F,34 P6 +sysexit!twobyte 0F,35 P6,PRIV +fxsave!twobytemem 0F,AE,0 P6,FPU +fxrstor!twobytemem 0F,AE,1 P6,FPU +rdpmc!twobyte 0F,33 P6 +ud2!twobyte 0F,0B 286 +; cmov +; fcmov +fcomi!fcomg2 DB,F0 P6 +fucomi!fcomg2 DB,E8 P6 +fcomip!fcomg2 DF,F0 P6 +fucomip!fcomg2 DF,E8 P6 +; +; Pentium4 extensions +; +movnti mem32,reg32 nil 0F,C3 $1,$2 nil P4 +clflush mem8 nil 0F,AE $1,7 nil KATMAI +lfence!threebyte 0F,AE,E8 KATMAI +mfence!threebyte 0F,AE,F0 KATMAI +pause!twobyte F3,90 P4 +; +; MMX/SSE2 instructions +; +; General +!mmxsse MMXREG,rm64 nil 0F,$0.1 $2,$1 nil #0,MMX +!mmxsse XMMREG,rm128 nil 66,0F,$0.1 $2,$1 nil #1 +; Shifts +!pshift MMXREG,rm64 nil 0F,$0.1 $2,$1 nil P5,MMX +!pshift XMMREG,rm128 nil 66,0F,$0.1 $2,$1 nil P4,SSE2 +!pshift MMXREG,imm8 nil 0F,$0.2 $1r,$0.3 $2,8 P5,MMX +!pshift XMMREG,imm8 nil 66,0F,$0.2 $1r,$0.3 $2,8 P4,SSE2 +emms!twobyte 0F,77 P5,MMX movd MMXREG,rm32 nil 0F,6E $2,$1 nil P5,MMX movd rm32,MMXREG nil 0F,7E $1,$2 nil P5,MMX movd XMMREG,rm32 nil 66,0F,6E $2,$1 nil P4,SSE2 movd rm32,XMMREG nil 66,0F,7E $1,$2 nil P4,SSE2 ; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movdqa XMMREG,XMMREG nil 66,0F,6F $2r,$1 nil P4,SSE2 -movdqa XMMREG,mem128 nil 66,0F,6F $2,$1 nil P4,SSE2 -movdqa mem128,XMMREG nil 66,0F,7F $1,$2 nil P4,SSE2 -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movdqu XMMREG,XMMREG nil F3,0F,6F $2r,$1 nil P4,SSE2 -movdqu XMMREG,mem128 nil F3,0F,6F $2,$1 nil P4,SSE2 -movdqu mem128,XMMREG nil F3,0F,7F $1,$2 nil P4,SSE2 -; TODO: not sure if this encoding (movdq2q) is correct -movdq2q MMXREG,XMMREG nil F2,0F,D6 $1r,$2 nil P4,SSE2 -movhlps XMMREG,XMMREG nil 0F,12 $2r,$1 nil KATMAI,SSE -movhpd XMMREG,mem64 nil 66,0F,16 $2,$1 nil P4,SSE2 -movhpd mem64,XMMREG nil 66,0F,17 $1,$2 nil P4,SSE2 -movhps XMMREG,mem64 nil 0F,16 $2,$1 nil KATMAI,SSE -movhps mem64,XMMREG nil 0F,17 $1,$2 nil KATMAI,SSE -movlhps XMMREG,XMMREG nil 0F,16 $2r,$1 nil KATMAI,SSE -movlpd XMMREG,mem64 nil 66,0F,12 $2,$1 nil P4,SSE2 -movlpd mem64,XMMREG nil 66,0F,13 $1,$2 nil P4,SSE2 -movlps XMMREG,mem64 nil 0F,12 $2,$1 nil KATMAI,SSE -movlps mem64,XMMREG nil 0F,13 $1,$2 nil KATMAI,SSE -movmskpd reg32,XMMREG nil 66,0F,50 $1r,$2 nil P4,SSE2 -movmskps reg32,XMMREG nil 0F,50 $1r,$2 nil KATMAI,SSE -movntdq mem128,XMMREG nil 66,0F,E7 $1,$2 nil P4,SSE2 -movnti mem32,reg32 nil 0F,C3 $1,$2 nil P4 -movntpd mem128,XMMREG nil 66,0F,2B $1,$2 nil P4,SSE2 -movntps mem128,XMMREG nil 0F,2B $1,$2 nil KATMAI,SSE -movntq mem64,MMXREG nil 0F,E7 $1,$2 nil KATMAI,MMX -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 movq MMXREG,MMXREG nil 0F,6F $2r,$1 nil P5,MMX movq MMXREG,mem64 nil 0F,6F $2,$1 nil P5,MMX movq mem64,MMXREG nil 0F,7F $1,$2 nil P5,MMX @@ -642,51 +773,8 @@ movq mem64,MMXREG nil 0F,7F $1,$2 nil P5,MMX movq XMMREG,XMMREG nil F3,0F,7E $2r,$1 nil P4,SSE2 movq XMMREG,mem64 nil F3,0F,7E $2,$1 nil P4,SSE2 movq mem64,XMMREG nil 66,0F,D6 $1,$2 nil P4,SSE2 -; TODO: not sure if this encoding (movq2dq) is correct -movq2dq XMMREG,MMXREG nil F3,0F,D6 $1r,$2 nil P4,SSE2 -movsb!onebyte A4 8086 -movsw!onebyte16 A5 -movsd nil 32 A5 nil nil 386 -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movsd XMMREG,XMMREG nil F2,0F,10 $2r,$1 nil P4,SSE2 -movsd XMMREG,mem64 nil F2,0F,10 $2,$1 nil P4,SSE2 -movsd mem64,XMMREG nil F2,0F,11 $1,$2 nil P4,SSE2 -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movss XMMREG,XMMREG nil F3,0F,10 $2r,$1 nil P4,SSE2 -movss XMMREG,mem64 nil F3,0F,10 $2,$1 nil P4,SSE2 -movss mem64,XMMREG nil F3,0F,11 $1,$2 nil P4,SSE2 -movsx!movszx BE -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movupd XMMREG,XMMREG nil 66,0F,10 $2r,$1 nil P4,SSE2 -movupd XMMREG,mem64 nil 66,0F,10 $2,$1 nil P4,SSE2 -movupd mem64,XMMREG nil 66,0F,11 $1,$2 nil P4,SSE2 -; arbitrary encoding, picked $2r,$1 instead of $1r,$2 -movups XMMREG,XMMREG nil 0F,10 $2r,$1 nil P4,SSE2 -movups XMMREG,mem64 nil 0F,10 $2,$1 nil P4,SSE2 -movups mem64,XMMREG nil 0F,11 $1,$2 nil P4,SSE2 -movzx!movszx B6 -mul!groupf6 4 -mulpd!sse2pd 59 -mulps!sseps 59 KATMAI,SSE -mulsd!sse2sd 59 -mulss!sse2ss 59 -neg!groupf6 3 -nop!onebyte 90 8086 -not!groupf6 2 -or!arith 08,1 -orpd!sse2pd 56 -orps!sseps 56 KATMAI,SSE -out imm8,REG_AL nil E6 nil $1,8 8086 -out imm8,REG_AX 16 E7 nil $1,8 8086 -out imm8,REG_EAX 32 E7 nil $1,8 386 -out REG_DX,REG_AL nil EE nil nil 8086 -out REG_DX,REG_AX 16 EF nil nil 8086 -out REG_DX,REG_EAX 32 EF nil nil 386 -outsb!onebyte 6E 8086 -outsw!onebyte16 6F -outsd!onebyte32 6F -packsswb!mmxsse 63 P5 P4,SSE2 packssdw!mmxsse 6B P5 P4,SSE2 +packsswb!mmxsse 63 P5 P4,SSE2 packuswb!mmxsse 67 P5 P4,SSE2 paddb!mmxsse FC P5 P4,SSE2 paddw!mmxsse FD P5 P4,SSE2 @@ -698,64 +786,21 @@ paddusb!mmxsse DC P5 P4,SSE2 paddusw!mmxsse DD P5 P4,SSE2 pand!mmxsse DB P5 P4,SSE2 pandn!mmxsse DF P5 P4,SSE2 -pause!twobyte F3,90 P4 -pavgb!mmxsse E0 KATMAI P4,SSE2 -pavgw!mmxsse E3 KATMAI P4,SSE2 pcmpeqb!mmxsse 74 P5 P4,SSE2 pcmpeqw!mmxsse 75 P5 P4,SSE2 pcmpeqd!mmxsse 76 P5 P4,SSE2 pcmpgtb!mmxsse 64 P5 P4,SSE2 pcmpgtw!mmxsse 65 P5 P4,SSE2 pcmpgtd!mmxsse 66 P5 P4,SSE2 -pextrw reg32,MMXREG,imm8 nil 0F,C5 $1r,$2 $3,8 KATMAI,MMX -pextrw reg32,XMMREG,imm8 nil 66,0F,C5 $1r,$2 $3,8 P4,SSE2 -pinsrw MMXREG,reg32,imm8 nil 0F,C4 $2r,$1 $3,8 KATMAI,MMX -pinsrw MMXREG,rm16,imm8 nil 0F,C4 $2,$1 $3,8 KATMAI,MMX -pinsrw XMMREG,reg32,imm8 nil 66,0F,C4 $2r,$1 $3,8 P4,SSE2 -pinsrw XMMREG,rm16,imm8 nil 66,0F,C4 $2,$1 $3,8 P4,SSE2 pmaddwd!mmxsse F5 P5 P4,SSE2 -pmaxsw!mmxsse EE KATMAI P4,SSE2 -pmaxub!mmxsse DE KATMAI P4,SSE2 -pminsw!mmxsse EA KATMAI P4,SSE2 -pminub!mmxsse DA KATMAI P4,SSE2 -pmovmskb reg32,MMXREG nil 0F,D7 $1r,$2 nil KATMAI,MMX -pmovmskb reg32,XMMREG nil 66,0F,D7 $1r,$2 nil P4,SSE2 -pmulhuw!mmxsse E4 KATMAI P4,SSE2 pmulhw!mmxsse E5 P5 P4,SSE2 pmullw!mmxsse D5 P5 P4,SSE2 -pmuludq!mmxsse F4 P4 P4,SSE2 -pop mem16x 16 8F $1,0 nil 8086 -pop mem32x 32 8F $1,0 nil 386 -pop reg16 16 58+$1 nil nil 8086 -pop reg32 32 58+$1 nil nil 386 -pop REG_DS nil 1F nil nil 8086 -pop REG_ES nil 07 nil nil 8086 -pop REG_SS nil 17 nil nil 8086 -pop REG_FS nil 0F,A1 nil nil 386 -pop REG_GS nil 0F,A9 nil nil 386 -popa!onebyte 61 8086 -popad!onebyte32 61 -popaw!onebyte16 61 -popf!onebyte 9D 8086 -popfd!onebyte32 9D -popfw!onebyte16 9D -por!mmxsse EB P5 KATMAI,SSE -prefetcht0!twobytemem 0F,18,1 KATMAI -prefetcht1!twobytemem 0F,18,2 KATMAI -prefetcht2!twobytemem 0F,18,3 KATMAI -prefetchnta!twobytemem 0F,18,0 KATMAI -psadbw!mmxsse F6 KATMAI KATMAI,SSE -pshufd!sse2pdimm 70 -pshufhw XMMREG,rm128,imm8 nil F3,0F,70 $2,$1 $3,8 P4,SSE2 -pshuflw XMMREG,rm128,imm8 nil F2,0F,70 $2,$1 $3,8 P4,SSE2 -pshufw MMXREG,rm64,imm8 nil 0F,70 $2,$1 $3,8 KATMAI,MMX -pslldq XMMREG,imm8 nil 66,0F,73 $1r,7 $2,8 P4,SSE2 +por!mmxsse EB P5 P4,SSE2 psllw!pshift F1,71,6 pslld!pshift F2,72,6 psllq!pshift F3,73,6 psraw!pshift E1,71,4 psrad!pshift E2,72,4 -psrldq XMMREG,imm8 nil 66,0F,73 $1r,3 $2,8 P4,SSE2 psrlw!pshift D1,71,2 psrld!pshift D2,72,2 psrlq!pshift D3,73,2 @@ -772,202 +817,223 @@ psubusw!mmxsse D9 P5 P4,SSE2 punpckhbw!mmxsse 68 P5 P4,SSE2 punpckhwd!mmxsse 69 P5 P4,SSE2 punpckhdq!mmxsse 6A P5 P4,SSE2 -punpckhqdq!sse2pd 6D punpcklbw!mmxsse 60 P5 P4,SSE2 punpcklwd!mmxsse 61 P5 P4,SSE2 punpckldq!mmxsse 62 P5 P4,SSE2 -punpcklqdq!sse2pd 6C -push mem16x 16 FF $1,6 nil 8086 -push mem32x 32 FF $1,6 nil 386 -push reg16 16 50+$1 nil nil 8086 -push reg32 32 50+$1 nil nil 386 -push imm8x nil 6A nil $1,8 8086 -push imm16x 16 68 nil $1,16 8086 -push imm32x 32 68 nil $1,32 386 -push REG_CS nil 0E nil nil 8086 -push REG_SS nil 16 nil nil 8086 -push REG_DS nil 1E nil nil 8086 -push REG_ES nil 06 nil nil 8086 -push REG_FS nil 0F,A0 nil nil 386 -push REG_GS nil 0F,A8 nil nil 386 -pusha!onebyte 60 8086 -pushad!onebyte32 60 -pushaw!onebyte16 60 -pushf!onebyte 9C 8086 -pushfd!onebyte32 9C -pushfw!onebyte16 9C pxor!mmxsse EF P5 P4,SSE2 -rcl!shift 2 -rcr!shift 3 -rol!shift 0 -ror!shift 1 +; +; PIII (Katmai) new instructions / SIMD instructions +; +!sseps XMMREG,rm128 nil 0F,$0.1 $2,$1 nil #0 +!sse2ss XMMREG,rm128 nil F3,0F,$0.1 $2,$1 nil P4,SSE2 +addps!sseps 58 KATMAI,SSE +addss!sse2ss 58 +andnps!sseps 55 KATMAI,SSE +andps!sseps 54 KATMAI,SSE +; cmpeqps +; cmpeqss +; cmpleps +; cmpless +; cmpltps +; cmpltss +; cmpneqps +; cmpneqss +; cmpnleps +; cmpnless +; cmpnltps +; cmpordps +; cmpordss +; cmpunordps +; cmpunordss +; cmpps +cmpss XMMREG,rm128,imm8 nil F3,0F,C2 $2,$1 $3,8 P4,SSE2 +comiss!sseps 2F KATMAI,SSE +cvtpi2ps!sseps 2A KATMAI,SSE +cvtps2pi!sseps 2D KATMAI,SSE +cvtsi2ss!sse2ss 2A +cvtss2si!sse2ss 2D +cvttps2pi!sseps 2C KATMAI,SSE +cvttss2si!sse2ss 2C +divps!sseps 5E KATMAI,SSE +divss!sse2ss 5E +ldmxcsr mem32 nil 0F,AE $1,2 nil KATMAI,SSE +maskmovq MMXREG,MMXREG nil 0F,F7 $2r,$1 nil KATMAI,SSE +maxps!sseps 5F KATMAI,SSE +maxss!sse2ss 5F +minps!sseps 5D KATMAI,SSE +minss!sse2ss 5D +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movaps XMMREG,XMMREG nil 0F,28 $2r,$1 nil KATMAI,SSE +movaps XMMREG,mem128 nil 0F,28 $2,$1 nil KATMAI,SSE +movaps mem128,XMMREG nil 0F,29 $1,$2 nil KATMAI,SSE +movhlps XMMREG,XMMREG nil 0F,12 $2r,$1 nil KATMAI,SSE +movhps XMMREG,mem64 nil 0F,16 $2,$1 nil KATMAI,SSE +movhps mem64,XMMREG nil 0F,17 $1,$2 nil KATMAI,SSE +movlhps XMMREG,XMMREG nil 0F,16 $2r,$1 nil KATMAI,SSE +movlps XMMREG,mem64 nil 0F,12 $2,$1 nil KATMAI,SSE +movlps mem64,XMMREG nil 0F,13 $1,$2 nil KATMAI,SSE +movmskps reg32,XMMREG nil 0F,50 $1r,$2 nil KATMAI,SSE +movntps mem128,XMMREG nil 0F,2B $1,$2 nil KATMAI,SSE +movntq mem64,MMXREG nil 0F,E7 $1,$2 nil KATMAI,SSE +movntdq mem128,XMMREG nil 66,0F,E7 $1,$2 nil P4,SSE2 +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movss XMMREG,XMMREG nil F3,0F,10 $2r,$1 nil KATMAI,SSE +movss XMMREG,mem64 nil F3,0F,10 $2,$1 nil KATMAI,SSE +movss mem64,XMMREG nil F3,0F,11 $1,$2 nil KATMAI,SSE +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movups XMMREG,XMMREG nil 0F,10 $2r,$1 nil KATMAI,SSE +movups XMMREG,mem64 nil 0F,10 $2,$1 nil KATMAI,SSE +movups mem64,XMMREG nil 0F,11 $1,$2 nil KATMAI,SSE +mulps!sseps 59 KATMAI,SSE +mulss!sse2ss 59 +orps!sseps 56 KATMAI,SSE +pavgb!mmxsse E0 KATMAI P4,SSE2 +pavgw!mmxsse E3 KATMAI P4,SSE2 +pextrw reg32,MMXREG,imm8 nil 0F,C5 $1r,$2 $3,8 KATMAI,SSE +pextrw reg32,XMMREG,imm8 nil 66,0F,C5 $1r,$2 $3,8 P4,SSE2 +pinsrw MMXREG,reg32,imm8 nil 0F,C4 $2r,$1 $3,8 KATMAI,SSE +pinsrw MMXREG,rm16,imm8 nil 0F,C4 $2,$1 $3,8 KATMAI,SSE +pinsrw XMMREG,reg32,imm8 nil 66,0F,C4 $2r,$1 $3,8 P4,SSE2 +pinsrw XMMREG,rm16,imm8 nil 66,0F,C4 $2,$1 $3,8 P4,SSE2 +pmaxsw!mmxsse EE KATMAI P4,SSE2 +pmaxub!mmxsse DE KATMAI P4,SSE2 +pminsw!mmxsse EA KATMAI P4,SSE2 +pminub!mmxsse DA KATMAI P4,SSE2 +pmovmskb reg32,MMXREG nil 0F,D7 $1r,$2 nil KATMAI,SSE +pmovmskb reg32,XMMREG nil 66,0F,D7 $1r,$2 nil P4,SSE2 +pmulhuw!mmxsse E4 KATMAI P4,SSE2 +prefetchnta!twobytemem 0F,18,0 KATMAI +prefetcht0!twobytemem 0F,18,1 KATMAI +prefetcht1!twobytemem 0F,18,2 KATMAI +prefetcht2!twobytemem 0F,18,3 KATMAI +psadbw!mmxsse F6 KATMAI KATMAI,SSE +pshufw MMXREG,rm64,imm8 nil 0F,70 $2,$1 $3,8 KATMAI,SSE rcpps!sseps 53 KATMAI,SSE rcpss!sse2ss 53 -rdmsr!twobyte 0F,32 P5,PRIV -rdpmc!twobyte 0F,33 P6 -rdtsc!twobyte 0F,31 P5 -:ret retn -retn nil nil C3 nil nil 8086 -retf nil nil CB nil nil 8086 -retn imm16 nil C2 nil $1,16 8086 -retf imm16 nil CA nil $1,16 8086 -rsm nil nil 0F,AA nil nil P5,SMM rsqrtps!sseps 52 KATMAI,SSE rsqrtss!sse2ss 52 -sahf!onebyte 9E 8086 -sal!shift 4 -sar!shift 7 -shl!shift 4 -shr!shift 5 -sbb!arith 18,3 -scasb!onebyte AE 8086 -scasw!onebyte16 AF -scasd!onebyte32 AF -; setcc sfence!threebyte 0F,AE,F8 KATMAI -sgdt!twobytemem 0F,01,0 286 -sidt!twobytemem 0F,01,1 286 -shld!shlrd A4 -shrd!shlrd AC -shufpd!sse2pdimm C6 shufps!ssepsimm C6 -sldt mem1632 nil 0F,00 $1,0 nil 286 -sldt reg16 16 0F,00 $1r,0 nil 286 -sldt reg32 32 0F,00 $1r,0 nil 386 -smsw mem1632 nil 0F,01 $1,4 nil 286 -smsw reg16 16 0F,01 $1r,4 nil 286 -smsw reg32 32 0F,01 $1r,4 nil 386 -sqrtpd!sse2pd 51 -sqrtps!sseps 51 KATMAI,SSE -sqrtsd!sse2sd 51 -sqrtss!sse2ss 51 -stc!onebyte F9 8086 -std!onebyte FD 8086 -sti!onebyte FB 8086 +sqrtps!sseps 51 KATMAI,SSE +sqrtss!sse2ss 51 stmxcsr mem32 nil 0F,AE $1,3 nil KATMAI,SSE -stosb!onebyte AA 8086 -stosw!onebyte16 AB -stosd!onebyte32 AB -str!prot286 1 -sub!arith 28,5 -subpd!sse2pd 5C subps!sseps 5C KATMAI,SSE -subsd!sse2sd 5C subss!sse2ss 5C -sysenter!twobyte 0F,34 P6 -sysexit!twobyte 0F,35 P6,PRIV -test REG_AL,imm8 nil A8 nil $2,8 8086 -test REG_AX,imm16 16 A9 nil $2,16 8086 -test REG_EAX,imm32 32 A9 nil $2,32 386 -test reg8,imm8 nil F6 $1r,0 $2,8 8086 -test mem8x,imm nil F6 $1,0 $2,8 8086 -test mem,imm8x nil F6 $1,0 $2,8 8086 -test reg16,imm16 16 F7 $1r,0 $2,16 8086 -test mem16x,imm 16 F7 $1,0 $2,16 8086 -test mem,imm16x 16 F7 $1,0 $2,16 8086 -test reg32,imm32 32 F7 $1r,0 $2,32 386 -test mem32x,imm 32 F7 $1,0 $2,32 386 -test mem,imm32x 32 F7 $1,0 $2,32 386 -; arbitrary encoding for next 3, picked $1r,$2 instead of $2r,$1 -test reg8,reg8 nil 84 $1r,$2 nil 8086 -test reg16,reg16 16 85 $1r,$2 nil 8086 -test reg32,reg32 32 85 $1r,$2 nil 386 -test mem,reg8 nil 84 $1,$2 nil 8086 -test mem8x,reg8 nil 84 $1,$2 nil 8086 -test mem,reg16 16 85 $1,$2 nil 8086 -test mem16x,reg16 16 85 $1,$2 nil 8086 -test mem,reg32 32 85 $1,$2 nil 386 -test mem32x,reg32 32 85 $1,$2 nil 386 -test reg8,mem8 nil 84 $2,$1 nil 8086 -test reg16,mem16 16 85 $2,$1 nil 8086 -test reg32,mem32 32 85 $2,$1 nil 386 -ucomisd!sse2sd 2E ucomiss!sse2ss 2E -ud2!twobyte 0F,0B 286 -unpckhpd!sse2pd 15 unpckhps!sseps 15 KATMAI,SSE -unpcklpd!sse2pd 14 unpcklps!sseps 14 KATMAI,SSE -verr!prot286 4 -verw!prot286 5 -wait!onebyte 9B 8086 -fwait!onebyte 9B 8086,FPU -wbinvd!twobyte 0F,09 486,PRIV -wrmsr!twobyte 0F,30 P5,PRIV -xadd!cmpxchgxadd C0 -;xchg REG_AX,reg16 16 90+$2 nil nil 8086 -;xchg reg16,REG_AX 16 90+$1 nil nil 8086 -;xchg REG_EAX,reg32 32 90+$2 nil nil 386 -;xchg reg32,REG_EAX 32 90+$1 nil nil 386 -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -xchg reg8,reg8 nil 86 $1r,$2 nil 8086 -xchg mem,reg8 nil 86 $1,$2 nil 8086 -xchg mem8x,reg8 nil 86 $1,$2 nil 8086 -xchg reg8,mem8 nil 86 $2,$1 nil 8086 -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -xchg reg16,reg16 16 87 $1r,$2 nil 8086 -xchg mem,reg16 16 87 $1,$2 nil 8086 -xchg mem16x,reg16 16 87 $1,$2 nil 8086 -xchg reg16,mem16 16 87 $2,$1 nil 8086 -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -xchg reg32,reg32 32 87 $1r,$2 nil 386 -xchg mem,reg32 32 87 $1,$2 nil 386 -xchg mem32x,reg32 32 87 $1,$2 nil 386 -xchg reg32,mem32 32 87 $2,$1 nil 386 -xlat!onebyte D7 8086 -xlatb!onebyte D7 8086 -xor!arith 30,6 -xorpd!sse2pd 57 xorps!sseps 57 KATMAI,SSE ; -; Obsolete/Undocumented Instructions +; SSE2 instructions ; -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -cmpxchg486 reg8,reg8 nil 0F,A6 $1r,$2 nil 486,UNDOC -cmpxchg486 mem,reg8 nil 0F,A6 $1,$2 nil 486,UNDOC -cmpxchg486 mem8x,reg8 nil 0F,A6 $1,$2 nil 486,UNDOC -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -cmpxchg486 reg16,reg16 16 0F,A7 $1r,$2 nil 486,UNDOC -cmpxchg486 mem,reg16 16 0F,A7 $1,$2 nil 486,UNDOC -cmpxchg486 mem16x,reg16 16 0F,A7 $1,$2 nil 486,UNDOC -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -cmpxchg486 reg32,reg32 32 0F,A7 $1r,$2 nil 486,UNDOC -cmpxchg486 mem,reg32 32 0F,A7 $1,$2 nil 486,UNDOC -cmpxchg486 mem32x,reg32 32 0F,A7 $1,$2 nil 486,UNDOC -ffreep fpureg nil DF,C0+$1 nil nil P6,FPU,UNDOC -fsetpm!twobyte DB,E4 286,FPU,OBS -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -ibts reg16,reg16 16 0F,A7 $1r,$2 nil 386,UNDOC,OBS -ibts mem,reg16 16 0F,A7 $1,$2 nil 386,UNDOC,OBS -ibts mem16x,reg16 16 0F,A7 $1,$2 nil 386,UNDOC,OBS -; arbitrary encoding, picked $1r,$2 instead of $2r,$1 -ibts reg32,reg32 32 0F,A7 $1r,$2 nil 386,UNDOC,OBS -ibts mem,reg32 32 0F,A7 $1,$2 nil 386,UNDOC,OBS -ibts mem32x,reg32 32 0F,A7 $1,$2 nil 386,UNDOC,OBS -loadall!twobyte 0F,07 386,UNDOC -loadall286!twobyte 0F,05 286,UNDOC -;pop REG_CS nil 0F nil nil 8086,UNDOC,OBS -salc!onebyte D6 8086,UNDOC -smi!onebyte F1 386,UNDOC -ud1!twobyte 0F,B9 286,UNDOC -; opcode arbitrarily picked for next 3 (could be 12/13 instead of 10/11). -umov reg8,reg8 nil 0F,10 $1r,$2 nil 386,UNDOC -umov reg16,reg16 16 0F,11 $1r,$2 nil 386,UNDOC -umov reg32,reg32 32 0F,11 $1r,$2 nil 386,UNDOC -umov mem,reg8 nil 0F,10 $1,$2 nil 386,UNDOC -umov mem8x,reg8 nil 0F,10 $1,$2 nil 386,UNDOC -umov mem,reg16 16 0F,11 $1,$2 nil 386,UNDOC -umov mem16x,reg16 16 0F,11 $1,$2 nil 386,UNDOC -umov mem,reg32 32 0F,11 $1,$2 nil 386,UNDOC -umov mem32x,reg32 32 0F,11 $1,$2 nil 386,UNDOC -umov reg8,mem8 nil 0F,12 $2,$1 nil 386,UNDOC -umov reg16,mem16 16 0F,13 $2,$1 nil 386,UNDOC -umov reg32,mem32 32 0F,13 $2,$1 nil 386,UNDOC -xbts reg16,mem16 16 0F,A6 $2,$1 nil 386,UNDOC,OBS -xbts reg32,mem32 32 0F,A6 $2,$1 nil 386,UNDOC,OBS +; Standard +!sse2pd XMMREG,rm128 nil 66,0F,$0.1 $2,$1 nil P4,SSE2 +!sse2sd XMMREG,rm128 nil F2,0F,$0.1 $2,$1 nil P4,SSE2 +; With immediate +!sse2pdimm XMMREG,rm128,imm8 nil 66,0F,$0.1 $2,$1 $3,8 P4,SSE2 +!ssepsimm XMMREG,rm128,imm8 nil 0F,$0.1 $2,$1 $3,8 KATMAI,SSE +addpd!sse2pd 58 +addsd!sse2sd 58 +andnpd!sse2pd 55 +andpd!sse2pd 54 +; cmpeqpd +; cmpeqsd +; cmplepd +; cmplesd +; cmpltpd +; cmpltsd +; cmpneqpd +; cmpneqps +; cmpnlepd +; cmpnlesd +; cmpnltpd +; cmpnltsd +; cmpordpd +; cmpordsd +; cmpunordpd +; cmpunordsd +; cmppd +cmpsd XMMREG,rm128,imm8 nil F2,0F,C2 $2,$1 $3,8 P4,SSE2 +comisd!sse2pd 2F +cvtpi2pd!sse2pd 2A +cvtsi2sd!sse2sd 2A +divpd!sse2pd 5E +divsd!sse2sd 5E +maxpd!sse2pd 5F +maxsd!sse2sd 5F +minpd!sse2pd 5D +minsd!sse2sd 5D +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movapd XMMREG,XMMREG nil 66,0F,28 $2r,$1 nil P4,SSE2 +movapd XMMREG,mem128 nil 66,0F,28 $2,$1 nil P4,SSE2 +movapd mem128,XMMREG nil 66,0F,29 $1,$2 nil P4,SSE2 +movhpd XMMREG,mem64 nil 66,0F,16 $2,$1 nil P4,SSE2 +movhpd mem64,XMMREG nil 66,0F,17 $1,$2 nil P4,SSE2 +movlpd XMMREG,mem64 nil 66,0F,12 $2,$1 nil P4,SSE2 +movlpd mem64,XMMREG nil 66,0F,13 $1,$2 nil P4,SSE2 +movmskpd reg32,XMMREG nil 66,0F,50 $1r,$2 nil P4,SSE2 +movntpd mem128,XMMREG nil 66,0F,2B $1,$2 nil P4,SSE2 +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movsd XMMREG,XMMREG nil F2,0F,10 $2r,$1 nil P4,SSE2 +movsd XMMREG,mem64 nil F2,0F,10 $2,$1 nil P4,SSE2 +movsd mem64,XMMREG nil F2,0F,11 $1,$2 nil P4,SSE2 +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movupd XMMREG,XMMREG nil 66,0F,10 $2r,$1 nil P4,SSE2 +movupd XMMREG,mem64 nil 66,0F,10 $2,$1 nil P4,SSE2 +movupd mem64,XMMREG nil 66,0F,11 $1,$2 nil P4,SSE2 +mulpd!sse2pd 59 +mulsd!sse2sd 59 +orpd!sse2pd 56 +shufpd!sse2pdimm C6 +sqrtpd!sse2pd 51 +sqrtsd!sse2sd 51 +subpd!sse2pd 5C +subsd!sse2sd 5C +ucomisd!sse2sd 2E +unpckhpd!sse2pd 15 +unpcklpd!sse2pd 14 +xorpd!sse2pd 57 +cvtdq2pd!sse2ss E6 +cvtpd2dq!sse2sd E6 +cvtdq2ps!sseps 5B P4,SSE2 +cvtpd2pi!sse2pd 2D +cvtpd2ps!sse2pd 5A +cvtps2pd!sseps 5A P4,SSE2 +cvtps2dq!sse2pd 5B +cvtsd2si!sse2sd 2D +cvtsd2ss!sse2sd 5A +cvtss2sd!sse2ss 5A +cvttpd2pi!sse2pd 2C +cvttsd2si!sse2sd 2C +cvttpd2dq!sse2pd E6 +cvttps2dq!sse2ss 5B +maskmovdqu XMMREG,XMMREG nil 66,0F,F7 $2r,$1 nil P4,SSE2 +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movdqa XMMREG,XMMREG nil 66,0F,6F $2r,$1 nil P4,SSE2 +movdqa XMMREG,mem128 nil 66,0F,6F $2,$1 nil P4,SSE2 +movdqa mem128,XMMREG nil 66,0F,7F $1,$2 nil P4,SSE2 +; arbitrary encoding, picked $2r,$1 instead of $1r,$2 +movdqu XMMREG,XMMREG nil F3,0F,6F $2r,$1 nil P4,SSE2 +movdqu XMMREG,mem128 nil F3,0F,6F $2,$1 nil P4,SSE2 +movdqu mem128,XMMREG nil F3,0F,7F $1,$2 nil P4,SSE2 +; TODO: not sure if this encoding (movdq2q) is correct +movdq2q MMXREG,XMMREG nil F2,0F,D6 $1r,$2 nil P4,SSE2 +; TODO: not sure if this encoding (movq2dq) is correct +movq2dq XMMREG,MMXREG nil F3,0F,D6 $1r,$2 nil P4,SSE2 +pmuludq!mmxsse F4 P4 P4,SSE2 +pshufd!sse2pdimm 70 +pshufhw XMMREG,rm128,imm8 nil F3,0F,70 $2,$1 $3,8 P4,SSE2 +pshuflw XMMREG,rm128,imm8 nil F2,0F,70 $2,$1 $3,8 P4,SSE2 +pslldq XMMREG,imm8 nil 66,0F,73 $1r,7 $2,8 P4,SSE2 +psrldq XMMREG,imm8 nil 66,0F,73 $1r,3 $2,8 P4,SSE2 +punpckhqdq!sse2pd 6D +punpcklqdq!sse2pd 6C ; -; AMD 3DNow! Instructions +; AMD 3DNow! instructions ; +!now3d MMXREG,rm64 nil 0F,0F $2,$1 $0.1,8 #0,3DNOW,AMD +prefetch!twobytemem 0F,0D,0 P5,3DNOW,AMD +prefetchw!twobytemem 0F,0D,1 P5,3DNOW,AMD femms!twobyte 0F,0E P5,3DNOW,AMD pavgusb!now3d BF P5 pf2id!now3d 1D P5 @@ -992,17 +1058,17 @@ pfsubr!now3d AA P5 pi2fd!now3d 0D P5 pi2fw!now3d 0C ATHLON pmulhrwa!now3d B7 P5 -prefetch!twobytemem 0F,0D,0 P5,3DNOW,AMD -prefetchw!twobytemem 0F,0D,1 P5,3DNOW,AMD pswapd!now3d BB ATHLON ; -; Other AMD Instructions +; AMD extensions ; syscall!twobyte 0F,05 P6,AMD sysret!twobyte 0F,07 P6,PRIV,AMD +; swapgs ; -; Cyrix Instructions +; Cyrix MMX instructions ; +!cyrixmmx MMXREG,rm64 nil 0F,$0.1 $2,$1 nil P5,MMX,CYRIX paddsiw!cyrixmmx 51 paveb!cyrixmmx 50 pdistib!cyrixmmx 54 @@ -1015,13 +1081,63 @@ pmvlzb!cyrixmmx 5B pmvnzb!cyrixmmx 5A pmvzb!cyrixmmx 58 psubsiw!cyrixmmx 55 +; +; Cyrix extensions +; +!cyrixsmm mem80 nil 0F,$0.1 $1,0 nil 486,CYRIX,SMM rdshr!twobyte 0F,36 P6,CYRIX,SMM rsdc segreg,mem80 nil 0F,79 $2,$1 nil 486,CYRIX,SMM rsldt!cyrixsmm 7B rsts!cyrixsmm 7D -smint!twobyte 0F,38 P6,CYRIX -smintold!twobyte 0F,7E 486,CYRIX,OBS svdc mem80,segreg nil 0F,78 $1,$2 nil 486,CYRIX,SMM svldt!cyrixsmm 7A svts!cyrixsmm 7C +smint!twobyte 0F,38 P6,CYRIX +smintold!twobyte 0F,7E 486,CYRIX,OBS wrshr!twobyte 0F,37 P6,CYRIX,SMM +; +; Obsolete/Undocumented Instructions +; +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +cmpxchg486 reg8,reg8 nil 0F,A6 $1r,$2 nil 486,UNDOC +cmpxchg486 mem,reg8 nil 0F,A6 $1,$2 nil 486,UNDOC +cmpxchg486 mem8x,reg8 nil 0F,A6 $1,$2 nil 486,UNDOC +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +cmpxchg486 reg16,reg16 16 0F,A7 $1r,$2 nil 486,UNDOC +cmpxchg486 mem,reg16 16 0F,A7 $1,$2 nil 486,UNDOC +cmpxchg486 mem16x,reg16 16 0F,A7 $1,$2 nil 486,UNDOC +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +cmpxchg486 reg32,reg32 32 0F,A7 $1r,$2 nil 486,UNDOC +cmpxchg486 mem,reg32 32 0F,A7 $1,$2 nil 486,UNDOC +cmpxchg486 mem32x,reg32 32 0F,A7 $1,$2 nil 486,UNDOC +ffreep fpureg nil DF,C0+$1 nil nil P6,FPU,UNDOC +fsetpm!twobyte DB,E4 286,FPU,OBS +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +ibts reg16,reg16 16 0F,A7 $1r,$2 nil 386,UNDOC,OBS +ibts mem,reg16 16 0F,A7 $1,$2 nil 386,UNDOC,OBS +ibts mem16x,reg16 16 0F,A7 $1,$2 nil 386,UNDOC,OBS +; arbitrary encoding, picked $1r,$2 instead of $2r,$1 +ibts reg32,reg32 32 0F,A7 $1r,$2 nil 386,UNDOC,OBS +ibts mem,reg32 32 0F,A7 $1,$2 nil 386,UNDOC,OBS +ibts mem32x,reg32 32 0F,A7 $1,$2 nil 386,UNDOC,OBS +loadall!twobyte 0F,07 386,UNDOC +loadall286!twobyte 0F,05 286,UNDOC +;pop REG_CS nil 0F nil nil 8086,UNDOC,OBS +salc!onebyte D6 8086,UNDOC +smi!onebyte F1 386,UNDOC +ud1!twobyte 0F,B9 286,UNDOC +; opcode arbitrarily picked for next 3 (could be 12/13 instead of 10/11). +umov reg8,reg8 nil 0F,10 $1r,$2 nil 386,UNDOC +umov reg16,reg16 16 0F,11 $1r,$2 nil 386,UNDOC +umov reg32,reg32 32 0F,11 $1r,$2 nil 386,UNDOC +umov mem,reg8 nil 0F,10 $1,$2 nil 386,UNDOC +umov mem8x,reg8 nil 0F,10 $1,$2 nil 386,UNDOC +umov mem,reg16 16 0F,11 $1,$2 nil 386,UNDOC +umov mem16x,reg16 16 0F,11 $1,$2 nil 386,UNDOC +umov mem,reg32 32 0F,11 $1,$2 nil 386,UNDOC +umov mem32x,reg32 32 0F,11 $1,$2 nil 386,UNDOC +umov reg8,mem8 nil 0F,12 $2,$1 nil 386,UNDOC +umov reg16,mem16 16 0F,13 $2,$1 nil 386,UNDOC +umov reg32,mem32 32 0F,13 $2,$1 nil 386,UNDOC +xbts reg16,mem16 16 0F,A6 $2,$1 nil 386,UNDOC,OBS +xbts reg32,mem32 32 0F,A6 $2,$1 nil 386,UNDOC,OBS