Created
January 20, 2014 10:19
-
-
Save progschj/8517847 to your computer and use it in GitHub Desktop.
WiP x64 instruction encoding
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| typedef enum mnemonic_enum_t { | |
| UNKNOWN=0, | |
| ADC=1, | |
| ADD, | |
| AND, | |
| BSF, | |
| BSR, | |
| BSWAP, | |
| BT, | |
| BTC, | |
| BTR, | |
| BTS, | |
| CALL, | |
| CBW, | |
| CWDE, | |
| CDQE, | |
| CWD, | |
| CDQ, | |
| CQO, | |
| CLC, | |
| CLD, | |
| CLFLUSH, | |
| CMC, | |
| CMOVO, | |
| CMOVNO, | |
| CMOVB, | |
| CMOVC, | |
| CMOVNAE, | |
| CMOVNB, | |
| CMOVNC, | |
| CMOVAE, | |
| CMOVZ, | |
| CMOVE, | |
| CMOVNZ, | |
| CMOVNE, | |
| CMOVBE, | |
| CMOVNA, | |
| CMOVNBE, | |
| CMOVA, | |
| CMOVS, | |
| CMOVNS, | |
| CMOVP, | |
| CMOVPE, | |
| CMOVNP, | |
| CMOVPO, | |
| CMOVL, | |
| CMOVNGE, | |
| CMOVNL, | |
| CMOVGE, | |
| CMOVLE, | |
| CMOVNG, | |
| CMOVNLE, | |
| CMOVG, | |
| CMP, | |
| CMPSB, | |
| CMPSW, | |
| CMPSD, | |
| CMPSQ, | |
| CMPXCHG, | |
| /* | |
| CMPXCHG8B, | |
| CMPXCHG16B, | |
| */ | |
| CPUID, | |
| DEC, | |
| DIV, | |
| ENTER, | |
| IDIV, | |
| IMUL, | |
| INC, | |
| INT, | |
| INTO, | |
| JO, | |
| JNO, | |
| JB, | |
| JC, | |
| JNAE, | |
| JNB, | |
| JNC, | |
| JAE, | |
| JZ, | |
| JE, | |
| JNZ, | |
| JNE, | |
| JBE, | |
| JNA, | |
| JNBE, | |
| JA, | |
| JS, | |
| JNS, | |
| JP, | |
| JPE, | |
| JNP, | |
| JPO, | |
| JL, | |
| JNGE, | |
| JNL, | |
| JGE, | |
| JLE, | |
| JNG, | |
| JNLE, | |
| JG, | |
| JRCXZ, | |
| JMP, | |
| LAHF, | |
| LEA, | |
| LEAVE, | |
| LFENCE, | |
| LODSB, | |
| LODSW, | |
| LODSD, | |
| LODSQ, | |
| LOOP, | |
| LOOPE, | |
| LOOPZ, | |
| LOOPNE, | |
| LOOPNZ, | |
| LZCNT, | |
| MFENCE, | |
| MOV, | |
| MOVBE, | |
| MOVD, | |
| MOVQ = MOVD, | |
| MOVMSKPD, | |
| MOVMSKPS, | |
| MOVNTI, | |
| MOVSB, | |
| MOVSW, | |
| MOVSD, | |
| MOVSQ, | |
| MOVSX, | |
| MOVSXD, | |
| MOVZX, | |
| MUL, | |
| NEG, | |
| NOP, | |
| NOT, | |
| OR, | |
| PAUSE, | |
| POP, | |
| POPCNT, | |
| POPF, | |
| PREFETCH, | |
| PREFETCHW, | |
| PREFETCHNTA, | |
| PREFETCH0, | |
| PREFETCH1, | |
| PREFETCH2, | |
| PUSH, | |
| PUSHF, | |
| RCL, | |
| RCR, | |
| RET, | |
| ROL, | |
| ROR, | |
| SAHF, | |
| SAL, | |
| SHL = SAL, | |
| SAR, | |
| SBB, | |
| SCASB, | |
| SCASW, | |
| SCASD, | |
| SCASQ, | |
| SETO, | |
| SETNO, | |
| SETB, | |
| SETC, | |
| SETNAE, | |
| SETNB, | |
| SETNC, | |
| SETAE, | |
| SETZ, | |
| SETE, | |
| SETNZ, | |
| SETNE, | |
| SETBE, | |
| SETNA, | |
| SETNBE, | |
| SETA, | |
| SETS, | |
| SETNS, | |
| SETP, | |
| SETPE, | |
| SETNP, | |
| SETPO, | |
| SETL, | |
| SETNGE, | |
| SETNL, | |
| SETGE, | |
| SETLE, | |
| SETNG, | |
| SETNLE, | |
| SETG, | |
| SFENCE, | |
| SHLD, | |
| SHR, | |
| SHRD, | |
| STC, | |
| STD, | |
| STOSB, | |
| STOSW, | |
| STOSD, | |
| STOSQ, | |
| SUB, | |
| TEST, | |
| TZCNT, | |
| XADD, | |
| XCHG, | |
| XLAT, | |
| XOR, | |
| RDTSC, | |
| ADDPD, | |
| ADDPS, | |
| ADDSD, | |
| ADDSS, | |
| ADDSUBPD, | |
| ADDSUBPS, | |
| ANDNPD, | |
| ANDNPS, | |
| ANDPD, | |
| ANDPS, | |
| BLENDPD, | |
| BLENDPS, | |
| BLENDVPD, | |
| BLENDVPS, | |
| CMPPD, | |
| CMPPS, | |
| //CMPSD, //this already exists | |
| CMPSS, | |
| COMISD, | |
| COMISS, | |
| CVTDQ2PD, | |
| CVTDQ2PS, | |
| CVTPD2DQ, | |
| CVTPD2PS, | |
| CVTPS2DQ, | |
| CVTPS2PD, | |
| CVTSD2SI, | |
| CVTSD2SS, | |
| CVTSI2SD, | |
| CVTSI2SS, | |
| CVTSS2SD, | |
| CVTSS2SI, | |
| CVTTPD2DQ, | |
| CVTTPS2DQ, | |
| CVTTSD2SI, | |
| CVTTSS2SI, | |
| DIVPD, | |
| DIVPS, | |
| DIVSD, | |
| DIVSS, | |
| DPPD, | |
| DPPS, | |
| EXTRACTPS, | |
| EXTRQ, | |
| HADDPD, | |
| HADDPS, | |
| HSUBPD, | |
| HSUBPS, | |
| INSERTPS, | |
| INSERTQ, | |
| LDDQU, | |
| LDMXCSR, | |
| MASKMOVDQU, | |
| MAXPD, | |
| MAXPS, | |
| MAXSD, | |
| MAXSS, | |
| MINPD, | |
| MINPS, | |
| MINSD, | |
| MINSS, | |
| MOVAPD, | |
| MOVAPS, | |
| MOVDDUP, | |
| MOVDQA, | |
| MOVDQU, | |
| MOVHLPS, | |
| MOVHPD, | |
| MOVHPS, | |
| MOVLHPS, | |
| MOVLPD, | |
| MOVLPS, | |
| MOVNTDQ, | |
| MOVNTDQA, | |
| MOVNTPD, | |
| MOVNTPS, | |
| MOVNTSD, | |
| MOVNTSS, | |
| MOVSHDUP, | |
| MOVSLDUP, | |
| MOVSS, | |
| MOVUPD, | |
| MOVUPS, | |
| MPSADBW, | |
| MULPD, | |
| MULPS, | |
| MULSD, | |
| MULSS, | |
| ORPD, | |
| ORPS, | |
| PABSB, | |
| PABSW, | |
| PABSD, | |
| PACKSSDW, | |
| PACKSSWB, | |
| PACKUSDW, | |
| PACKUSWB, | |
| PADDB, | |
| PADDW, | |
| PADDD, | |
| PADDQ, | |
| PADDSB, | |
| PADDSW, | |
| PADDUSB, | |
| PADDUSW, | |
| PALIGNR, | |
| PAND, | |
| PANDN, | |
| PAVGB, | |
| PAVGW, | |
| PBLENDVB, | |
| PBLENDW, | |
| PCLMULQDQ, | |
| PCMPEQB, | |
| PCMPEQD, | |
| PCMPEQW, | |
| PCMPEQQ, | |
| PCMPESTRI, | |
| PCMPESTRM, | |
| PCMPGTB, | |
| PCMPGTD, | |
| PCMPGTW, | |
| PCMPGTQ, | |
| PCMPISTRI, | |
| PCMPISTRM, | |
| PEXTRB, | |
| PEXTRW, | |
| PEXTRD, | |
| PEXTRQ, | |
| PHADDD, | |
| PHADDSW, | |
| PHADDW, | |
| PHMINPOSUW, | |
| PHSUBD, | |
| PHSUBSW, | |
| PHSUBW, | |
| PINSRB, | |
| PINSRW, | |
| PINSRD, | |
| PINSRQ, | |
| PMADDUBSW, | |
| PMADDWD, | |
| PMAXSB, | |
| PMAXSD, | |
| PMAXSW, | |
| PMAXSUB, | |
| PMAXSUD, | |
| PMAXSUW, | |
| PMINSB, | |
| PMINSD, | |
| PMINSW, | |
| PMINUB, | |
| PMINUD, | |
| PMINUW, | |
| PMOVMSKB, | |
| PMOVSXBD, | |
| PMOVSXBQ, | |
| PMOVSXBW, | |
| PMOVSXDQ, | |
| PMOVSXWD, | |
| PMOVSXWQ, | |
| PMOVZXBD, | |
| PMOVZXBQ, | |
| PMOVZXBW, | |
| PMOVZXDQ, | |
| PMOVZXWD, | |
| PMOVZXWQ, | |
| PMULDQ, | |
| PMULHRSW, | |
| PMULHUW, | |
| PMULHW, | |
| PMULLD, | |
| PMULLW, | |
| PMULUDQ, | |
| POR, | |
| PSADBW, | |
| PSHUFB, | |
| PSHUFD, | |
| PSHUFLW, | |
| PSIGNB, | |
| PSIGND, | |
| PSIGNW, | |
| PSLLD, | |
| PSLLDQ, | |
| PSLLQ, | |
| PSLLW, | |
| PSRAD, | |
| PSRAW, | |
| PSRLD, | |
| PSRLDQ, | |
| PSRLQ, | |
| PSRLW, | |
| PSUBB, | |
| PSUBD, | |
| PSUBW, | |
| PSUBQ, | |
| PSUBSW, | |
| PSUBUSB, | |
| PSUBUSW, | |
| PTEST, | |
| PUNPCKHBW, | |
| PUNPCKHDQ, | |
| PUNPCKHQDQ, | |
| PUNPCKHWD, | |
| PUNPCKLBW, | |
| PUNPCKLDQ, | |
| PUNPCKLQDQ, | |
| PUNPCKLWD, | |
| PXOR, | |
| RCPPS, | |
| RCPSS, | |
| ROUNDPD, | |
| ROUNDPS, | |
| ROUNDSD, | |
| ROUNDSS, | |
| RSQRTPS, | |
| RSQRTSS, | |
| SHUFPD, | |
| SHUFPS, | |
| SQRTPD, | |
| SQRTPS, | |
| SQRTSD, | |
| SQRTSS, | |
| SUBPD, | |
| SUBPS, | |
| SUBSD, | |
| SUBSS, | |
| UCOMISD, | |
| UCOMISS, | |
| MAX_MNEMONIC | |
| } mnemonic_t; | |
| typedef struct opcode_info_t { | |
| mnemonic_t mnemonic; | |
| optype_t operand1; | |
| optype_t operand2; | |
| optype_t operand3; | |
| optype_t opcode; | |
| unsigned char modrm; | |
| unsigned char norex; | |
| } opcode_info; | |
| opcode_info instructions[] = { | |
| {ADC, EXACT_AL, IMM8, 0, 0x14, ' ', 0}, | |
| {ADC, EXACT_AX, IMM16, 0, 0x15, ' ', 0}, | |
| {ADC, EXACT_EAX, IMM32, 0, 0x15, ' ', 0}, | |
| {ADC, EXACT_RAX, IMM32, 0, 0x15, ' ', 0}, | |
| {ADC, RM8, IMM8, 0, 0x80, '2', 0}, | |
| {ADC, RM16, IMM16, 0, 0x81, '2', 0}, | |
| {ADC, RM32, IMM32, 0, 0x81, '2', 0}, | |
| {ADC, RM64, IMM32, 0, 0x81, '2', 0}, | |
| {ADC, RM16, IMM8, 0, 0x83, '2', 0}, | |
| {ADC, RM32, IMM8, 0, 0x83, '2', 0}, | |
| {ADC, RM64, IMM8, 0, 0x83, '2', 0}, | |
| {ADC, REG8, RM8, 0, 0x12, 'r', 0}, | |
| {ADC, REG16, RM16, 0, 0x13, 'r', 0}, | |
| {ADC, REG32, RM32, 0, 0x13, 'r', 0}, | |
| {ADC, REG64, RM64, 0, 0x13, 'r', 0}, | |
| {ADC, RM8, REG8, 0, 0x10, 'r', 0}, | |
| {ADC, RM16, REG16, 0, 0x11, 'r', 0}, | |
| {ADC, RM32, REG32, 0, 0x11, 'r', 0}, | |
| {ADC, RM64, REG64, 0, 0x11, 'r', 0}, | |
| {ADD, EXACT_AL, IMM8, 0, 0x04, ' ', 0}, | |
| {ADD, EXACT_AX, IMM16, 0, 0x05, ' ', 0}, | |
| {ADD, EXACT_EAX, IMM32, 0, 0x05, ' ', 0}, | |
| {ADD, EXACT_RAX, IMM32, 0, 0x05, ' ', 0}, | |
| {ADD, RM8, IMM8, 0, 0x80, '0', 0}, | |
| {ADD, RM16, IMM16, 0, 0x81, '0', 0}, | |
| {ADD, RM32, IMM32, 0, 0x81, '0', 0}, | |
| {ADD, RM64, IMM32, 0, 0x81, '0', 0}, | |
| {ADD, RM16, IMM8, 0, 0x83, '0', 0}, | |
| {ADD, RM32, IMM8, 0, 0x83, '0', 0}, | |
| {ADD, RM64, IMM8, 0, 0x83, '0', 0}, | |
| {ADD, REG8, RM8, 0, 0x02, 'r', 0}, | |
| {ADD, REG16, RM16, 0, 0x03, 'r', 0}, | |
| {ADD, REG32, RM32, 0, 0x03, 'r', 0}, | |
| {ADD, REG64, RM64, 0, 0x03, 'r', 0}, | |
| {ADD, RM8, REG8, 0, 0x00, 'r', 0}, | |
| {ADD, RM16, REG16, 0, 0x01, 'r', 0}, | |
| {ADD, RM32, REG32, 0, 0x01, 'r', 0}, | |
| {ADD, RM64, REG64, 0, 0x01, 'r', 0}, | |
| {AND, EXACT_AL, IMM8, 0, 0x24, ' ', 0}, | |
| {AND, EXACT_AX, IMM16, 0, 0x25, ' ', 0}, | |
| {AND, EXACT_EAX, IMM32, 0, 0x25, ' ', 0}, | |
| {AND, EXACT_RAX, IMM32, 0, 0x25, ' ', 0}, | |
| {AND, RM8, IMM8, 0, 0x80, '4', 0}, | |
| {AND, RM16, IMM16, 0, 0x81, '4', 0}, | |
| {AND, RM32, IMM32, 0, 0x81, '4', 0}, | |
| {AND, RM64, IMM32, 0, 0x81, '4', 0}, | |
| {AND, RM16, IMM8, 0, 0x83, '4', 0}, | |
| {AND, RM32, IMM8, 0, 0x83, '4', 0}, | |
| {AND, RM64, IMM8, 0, 0x83, '4', 0}, | |
| {AND, REG8, RM8, 0, 0x22, 'r', 0}, | |
| {AND, REG16, RM16, 0, 0x23, 'r', 0}, | |
| {AND, REG32, RM32, 0, 0x23, 'r', 0}, | |
| {AND, REG64, RM64, 0, 0x23, 'r', 0}, | |
| {AND, RM8, REG8, 0, 0x20, 'r', 0}, | |
| {AND, RM16, REG16, 0, 0x21, 'r', 0}, | |
| {AND, RM32, REG32, 0, 0x21, 'r', 0}, | |
| {AND, RM64, REG64, 0, 0x21, 'r', 0}, | |
| {BSF, REG16, RM16, 0, 0xBC0F, 'r', 0}, | |
| {BSF, REG32, RM32, 0, 0xBC0F, 'r', 0}, | |
| {BSF, REG64, RM64, 0, 0xBC0F, 'r', 0}, | |
| {BSR, REG16, RM16, 0, 0xBD0F, 'r', 0}, | |
| {BSR, REG32, RM32, 0, 0xBD0F, 'r', 0}, | |
| {BSR, REG64, RM64, 0, 0xBD0F, 'r', 0}, | |
| {BSWAP, REG32, 0, 0, 0xC80F, '+', 0}, | |
| {BSWAP, REG64, 0, 0, 0xC80F, '+', 0}, | |
| {BT, RM16, REG16, 0, 0xA30F, 'r', 0}, | |
| {BT, RM32, REG32, 0, 0xA30F, 'r', 0}, | |
| {BT, RM64, REG64, 0, 0xA30F, 'r', 0}, | |
| {BT, RM16, IMM8, 0, 0xBA0F, '4', 0}, | |
| {BT, RM32, IMM8, 0, 0xBA0F, '4', 0}, | |
| {BT, RM64, IMM8, 0, 0xBA0F, '4', 0}, | |
| {BTC, RM16, REG16, 0, 0xBB0F, 'r', 0}, | |
| {BTC, RM32, REG32, 0, 0xBB0F, 'r', 0}, | |
| {BTC, RM64, REG64, 0, 0xBB0F, 'r', 0}, | |
| {BTC, RM16, IMM8, 0, 0xBA0F, '7', 0}, | |
| {BTC, RM32, IMM8, 0, 0xBA0F, '7', 0}, | |
| {BTC, RM64, IMM8, 0, 0xBA0F, '7', 0}, | |
| {BTR, RM16, REG16, 0, 0xB30F, 'r', 0}, | |
| {BTR, RM32, REG32, 0, 0xB30F, 'r', 0}, | |
| {BTR, RM64, REG64, 0, 0xB30F, 'r', 0}, | |
| {BTR, RM16, IMM8, 0, 0xBA0F, '6', 0}, | |
| {BTR, RM32, IMM8, 0, 0xBA0F, '6', 0}, | |
| {BTR, RM64, IMM8, 0, 0xBA0F, '6', 0}, | |
| {BTS, RM16, REG16, 0, 0xAB0F, 'r', 0}, | |
| {BTS, RM32, REG32, 0, 0xAB0F, 'r', 0}, | |
| {BTS, RM64, REG64, 0, 0xAB0F, 'r', 0}, | |
| {BTS, RM16, IMM8, 0, 0xBA0F, '5', 0}, | |
| {BTS, RM32, IMM8, 0, 0xBA0F, '5', 0}, | |
| {BTS, RM64, IMM8, 0, 0xBA0F, '5', 0}, | |
| {CALL, REL16OFF, 0, 0, 0xE8, ' ', 0}, | |
| {CALL, REL32OFF, 0, 0, 0xE8, ' ', 0}, | |
| {CALL, RM16, 0, 0, 0xFF, '2', NO_REX}, | |
| {CALL, RM64, 0, 0, 0xFF, '2', NO_REX}, | |
| {CBW, 0, 0, 0, 0x9866, ' ', 0}, | |
| {CWDE, 0, 0, 0, 0x98, ' ', 0}, | |
| {CDQE, 0, 0, 0, 0x9848, ' ', 0}, | |
| {CWD, 0, 0, 0, 0x9966, ' ', 0}, | |
| {CDQ, 0, 0, 0, 0x99, ' ', 0}, | |
| {CQO, 0, 0, 0, 0x9948, ' ', 0}, | |
| {CLC, 0, 0, 0, 0xF8, ' ', 0}, | |
| {CLD, 0, 0, 0, 0xFC, ' ', 0}, | |
| {CLFLUSH, MEM8, 0, 0, 0xAE0F, '7', 0}, | |
| {CMC, 0, 0, 0, 0xF5, ' ', 0}, | |
| {CMOVO, REG16, RM16, 0, 0x400F, 'r', 0}, | |
| {CMOVO, REG32, RM32, 0, 0x400F, 'r', 0}, | |
| {CMOVO, REG64, RM64, 0, 0x400F, 'r', 0}, | |
| {CMOVNO, REG16, RM16, 0, 0x410F, 'r', 0}, | |
| {CMOVNO, REG32, RM32, 0, 0x410F, 'r', 0}, | |
| {CMOVNO, REG64, RM64, 0, 0x410F, 'r', 0}, | |
| {CMOVB, REG16, RM16, 0, 0x420F, 'r', 0}, | |
| {CMOVB, REG32, RM32, 0, 0x420F, 'r', 0}, | |
| {CMOVB, REG64, RM64, 0, 0x420F, 'r', 0}, | |
| {CMOVC, REG16, RM16, 0, 0x420F, 'r', 0}, | |
| {CMOVC, REG32, RM32, 0, 0x420F, 'r', 0}, | |
| {CMOVC, REG64, RM64, 0, 0x420F, 'r', 0}, | |
| {CMOVNAE, REG16, RM16, 0, 0x420F, 'r', 0}, | |
| {CMOVNAE, REG32, RM32, 0, 0x420F, 'r', 0}, | |
| {CMOVNAE, REG64, RM64, 0, 0x420F, 'r', 0}, | |
| {CMOVNB, REG16, RM16, 0, 0x430F, 'r', 0}, | |
| {CMOVNB, REG32, RM32, 0, 0x430F, 'r', 0}, | |
| {CMOVNB, REG64, RM64, 0, 0x430F, 'r', 0}, | |
| {CMOVNC, REG16, RM16, 0, 0x430F, 'r', 0}, | |
| {CMOVNC, REG32, RM32, 0, 0x430F, 'r', 0}, | |
| {CMOVNC, REG64, RM64, 0, 0x430F, 'r', 0}, | |
| {CMOVAE, REG16, RM16, 0, 0x430F, 'r', 0}, | |
| {CMOVAE, REG32, RM32, 0, 0x430F, 'r', 0}, | |
| {CMOVAE, REG64, RM64, 0, 0x430F, 'r', 0}, | |
| {CMOVZ, REG16, RM16, 0, 0x440F, 'r', 0}, | |
| {CMOVZ, REG32, RM32, 0, 0x440F, 'r', 0}, | |
| {CMOVZ, REG64, RM64, 0, 0x440F, 'r', 0}, | |
| {CMOVE, REG16, RM16, 0, 0x440F, 'r', 0}, | |
| {CMOVE, REG32, RM32, 0, 0x440F, 'r', 0}, | |
| {CMOVE, REG64, RM64, 0, 0x440F, 'r', 0}, | |
| {CMOVNZ, REG16, RM16, 0, 0x450F, 'r', 0}, | |
| {CMOVNZ, REG32, RM32, 0, 0x450F, 'r', 0}, | |
| {CMOVNZ, REG64, RM64, 0, 0x450F, 'r', 0}, | |
| {CMOVNE, REG16, RM16, 0, 0x450F, 'r', 0}, | |
| {CMOVNE, REG32, RM32, 0, 0x450F, 'r', 0}, | |
| {CMOVNE, REG64, RM64, 0, 0x450F, 'r', 0}, | |
| {CMOVBE, REG16, RM16, 0, 0x460F, 'r', 0}, | |
| {CMOVBE, REG32, RM32, 0, 0x460F, 'r', 0}, | |
| {CMOVBE, REG64, RM64, 0, 0x460F, 'r', 0}, | |
| {CMOVNA, REG16, RM16, 0, 0x460F, 'r', 0}, | |
| {CMOVNA, REG32, RM32, 0, 0x460F, 'r', 0}, | |
| {CMOVNA, REG64, RM64, 0, 0x460F, 'r', 0}, | |
| {CMOVNBE, REG16, RM16, 0, 0x470F, 'r', 0}, | |
| {CMOVNBE, REG32, RM32, 0, 0x470F, 'r', 0}, | |
| {CMOVNBE, REG64, RM64, 0, 0x470F, 'r', 0}, | |
| {CMOVA, REG16, RM16, 0, 0x470F, 'r', 0}, | |
| {CMOVA, REG32, RM32, 0, 0x470F, 'r', 0}, | |
| {CMOVA, REG64, RM64, 0, 0x470F, 'r', 0}, | |
| {CMOVS, REG16, RM16, 0, 0x480F, 'r', 0}, | |
| {CMOVS, REG32, RM32, 0, 0x480F, 'r', 0}, | |
| {CMOVS, REG64, RM64, 0, 0x480F, 'r', 0}, | |
| {CMOVNS, REG16, RM16, 0, 0x490F, 'r', 0}, | |
| {CMOVNS, REG32, RM32, 0, 0x490F, 'r', 0}, | |
| {CMOVNS, REG64, RM64, 0, 0x490F, 'r', 0}, | |
| {CMOVP, REG16, RM16, 0, 0x4A0F, 'r', 0}, | |
| {CMOVP, REG32, RM32, 0, 0x4A0F, 'r', 0}, | |
| {CMOVP, REG64, RM64, 0, 0x4A0F, 'r', 0}, | |
| {CMOVPE, REG16, RM16, 0, 0x4A0F, 'r', 0}, | |
| {CMOVPE, REG32, RM32, 0, 0x4A0F, 'r', 0}, | |
| {CMOVPE, REG64, RM64, 0, 0x4A0F, 'r', 0}, | |
| {CMOVNP, REG16, RM16, 0, 0x4B0F, 'r', 0}, | |
| {CMOVNP, REG32, RM32, 0, 0x4B0F, 'r', 0}, | |
| {CMOVNP, REG64, RM64, 0, 0x4B0F, 'r', 0}, | |
| {CMOVPO, REG16, RM16, 0, 0x4B0F, 'r', 0}, | |
| {CMOVPO, REG32, RM32, 0, 0x4B0F, 'r', 0}, | |
| {CMOVPO, REG64, RM64, 0, 0x4B0F, 'r', 0}, | |
| {CMOVL, REG16, RM16, 0, 0x4C0F, 'r', 0}, | |
| {CMOVL, REG32, RM32, 0, 0x4C0F, 'r', 0}, | |
| {CMOVL, REG64, RM64, 0, 0x4C0F, 'r', 0}, | |
| {CMOVNGE, REG16, RM16, 0, 0x4C0F, 'r', 0}, | |
| {CMOVNGE, REG32, RM32, 0, 0x4C0F, 'r', 0}, | |
| {CMOVNGE, REG64, RM64, 0, 0x4C0F, 'r', 0}, | |
| {CMOVNL, REG16, RM16, 0, 0x4D0F, 'r', 0}, | |
| {CMOVNL, REG32, RM32, 0, 0x4D0F, 'r', 0}, | |
| {CMOVNL, REG64, RM64, 0, 0x4D0F, 'r', 0}, | |
| {CMOVGE, REG16, RM16, 0, 0x4D0F, 'r', 0}, | |
| {CMOVGE, REG32, RM32, 0, 0x4D0F, 'r', 0}, | |
| {CMOVGE, REG64, RM64, 0, 0x4D0F, 'r', 0}, | |
| {CMOVLE, REG16, RM16, 0, 0x4E0F, 'r', 0}, | |
| {CMOVLE, REG32, RM32, 0, 0x4E0F, 'r', 0}, | |
| {CMOVLE, REG64, RM64, 0, 0x4E0F, 'r', 0}, | |
| {CMOVNG, REG16, RM16, 0, 0x4E0F, 'r', 0}, | |
| {CMOVNG, REG32, RM32, 0, 0x4E0F, 'r', 0}, | |
| {CMOVNG, REG64, RM64, 0, 0x4E0F, 'r', 0}, | |
| {CMOVNLE, REG16, RM16, 0, 0x4F0F, 'r', 0}, | |
| {CMOVNLE, REG32, RM32, 0, 0x4F0F, 'r', 0}, | |
| {CMOVNLE, REG64, RM64, 0, 0x4F0F, 'r', 0}, | |
| {CMOVG, REG16, RM16, 0, 0x4F0F, 'r', 0}, | |
| {CMOVG, REG32, RM32, 0, 0x4F0F, 'r', 0}, | |
| {CMOVG, REG64, RM64, 0, 0x4F0F, 'r', 0}, | |
| {CMP, EXACT_AL, IMM8, 0, 0x3C, ' ', 0}, | |
| {CMP, EXACT_AX, IMM16, 0, 0x3D, ' ', 0}, | |
| {CMP, EXACT_EAX, IMM32, 0, 0x3D, ' ', 0}, | |
| {CMP, EXACT_RAX, IMM32, 0, 0x3D, ' ', 0}, | |
| {CMP, RM8, IMM8, 0, 0x80, '7', 0}, | |
| {CMP, RM16, IMM16, 0, 0x81, '7', 0}, | |
| {CMP, RM32, IMM32, 0, 0x81, '7', 0}, | |
| {CMP, RM64, IMM32, 0, 0x81, '7', 0}, | |
| {CMP, RM16, IMM8, 0, 0x83, '7', 0}, | |
| {CMP, RM32, IMM8, 0, 0x83, '7', 0}, | |
| {CMP, RM64, IMM8, 0, 0x83, '7', 0}, | |
| {CMP, REG8, RM8, 0, 0x3A, 'r', 0}, | |
| {CMP, REG16, RM16, 0, 0x3B, 'r', 0}, | |
| {CMP, REG32, RM32, 0, 0x3B, 'r', 0}, | |
| {CMP, REG64, RM64, 0, 0x3B, 'r', 0}, | |
| {CMP, RM8, REG8, 0, 0x38, 'r', 0}, | |
| {CMP, RM16, REG16, 0, 0x39, 'r', 0}, | |
| {CMP, RM32, REG32, 0, 0x39, 'r', 0}, | |
| {CMP, RM64, REG64, 0, 0x39, 'r', 0}, | |
| {CMPSB, 0, 0, 0, 0xA6, ' ', 0}, | |
| {CMPSW, 0, 0, 0, 0xA766, ' ', 0}, | |
| {CMPSD, 0, 0, 0, 0xA7, ' ', 0}, | |
| {CMPSQ, 0, 0, 0, 0xA748, ' ', 0}, | |
| {CMPXCHG, RM8, REG8, 0, 0xB00F, 'r', 0}, | |
| {CMPXCHG, RM16, REG16, 0, 0xB10F, 'r', 0}, | |
| {CMPXCHG, RM32, REG32, 0, 0xB10F, 'r', 0}, | |
| {CMPXCHG, RM64, REG64, 0, 0xB10F, 'r', 0}, | |
| /* | |
| {CMPXCHG8B, MEM64, 0, 0, 0xC70F, '1', 0}, | |
| {CMPXCHG16B, MEM128, 0, 0, 0xC70F, '1', 0}, | |
| */ | |
| {CPUID, 0, 0, 0, 0xA20F, ' ', 0}, | |
| {DEC, RM8, 0, 0, 0xFE, '1', 0}, | |
| {DEC, RM16, 0, 0, 0xFF, '1', 0}, | |
| {DEC, RM32, 0, 0, 0xFF, '1', 0}, | |
| {DEC, RM64, 0, 0, 0xFF, '1', 0}, | |
| {DIV, RM8, 0, 0, 0xF6, '6', 0}, | |
| {DIV, RM16, 0, 0, 0xF7, '6', 0}, | |
| {DIV, RM32, 0, 0, 0xF7, '6', 0}, | |
| {DIV, RM64, 0, 0, 0xF7, '6', 0}, | |
| {ENTER, IMM16, IMM8, 0, 0xC8, ' ', 0}, | |
| {IDIV, RM8, 0, 0, 0xF6, '7', 0}, | |
| {IDIV, RM16, 0, 0, 0xF7, '7', 0}, | |
| {IDIV, RM32, 0, 0, 0xF7, '7', 0}, | |
| {IDIV, RM64, 0, 0, 0xF7, '7', 0}, | |
| {IMUL, RM8, 0, 0, 0xF6, '5', 0}, | |
| {IMUL, RM16, 0, 0, 0xF7, '5', 0}, | |
| {IMUL, RM32, 0, 0, 0xF7, '5', 0}, | |
| {IMUL, RM64, 0, 0, 0xF7, '5', 0}, | |
| {IMUL, REG16, RM16, 0, 0xAF0F, 'r', 0}, | |
| {IMUL, REG32, RM32, 0, 0xAF0F, 'r', 0}, | |
| {IMUL, REG64, RM64, 0, 0xAF0F, 'r', 0}, | |
| {IMUL, REG16, RM16, IMM8, 0x6B, 'r', 0}, | |
| {IMUL, REG32, RM32, IMM8, 0x6B, 'r', 0}, | |
| {IMUL, REG64, RM64, IMM8, 0x6B, 'r', 0}, | |
| {IMUL, REG16, RM16, IMM16, 0x69, 'r', 0}, | |
| {IMUL, REG32, RM32, IMM32, 0x69, 'r', 0}, | |
| {IMUL, REG64, RM64, IMM32, 0x69, 'r', 0}, | |
| {INC, RM8, 0, 0, 0xFE, '0', 0}, | |
| {INC, RM16, 0, 0, 0xFF, '0', 0}, | |
| {INC, RM32, 0, 0, 0xFF, '0', 0}, | |
| {INC, RM64, 0, 0, 0xFF, '0', 0}, | |
| {INT, IMM8, 0, 0, 0xCD, ' ', 0}, | |
| {INTO, 0, 0, 0, 0xCE, ' ', 0}, | |
| {JO, REL16OFF, 0, 0, 0x800F, ' ', 0}, | |
| {JO, REL32OFF, 0, 0, 0x800F, ' ', 0}, | |
| {JNO, REL16OFF, 0, 0, 0x810F, ' ', 0}, | |
| {JNO, REL32OFF, 0, 0, 0x810F, ' ', 0}, | |
| {JB, REL16OFF, 0, 0, 0x820F, ' ', 0}, | |
| {JB, REL32OFF, 0, 0, 0x820F, ' ', 0}, | |
| {JC, REL16OFF, 0, 0, 0x820F, ' ', 0}, | |
| {JC, REL32OFF, 0, 0, 0x820F, ' ', 0}, | |
| {JNAE, REL16OFF, 0, 0, 0x820F, ' ', 0}, | |
| {JNAE, REL32OFF, 0, 0, 0x820F, ' ', 0}, | |
| {JNB, REL16OFF, 0, 0, 0x830F, ' ', 0}, | |
| {JNB, REL32OFF, 0, 0, 0x830F, ' ', 0}, | |
| {JNC, REL16OFF, 0, 0, 0x830F, ' ', 0}, | |
| {JNC, REL32OFF, 0, 0, 0x830F, ' ', 0}, | |
| {JAE, REL16OFF, 0, 0, 0x830F, ' ', 0}, | |
| {JAE, REL32OFF, 0, 0, 0x830F, ' ', 0}, | |
| {JZ, REL16OFF, 0, 0, 0x840F, ' ', 0}, | |
| {JZ, REL32OFF, 0, 0, 0x840F, ' ', 0}, | |
| {JE, REL16OFF, 0, 0, 0x840F, ' ', 0}, | |
| {JE, REL32OFF, 0, 0, 0x840F, ' ', 0}, | |
| {JNZ, REL16OFF, 0, 0, 0x850F, ' ', 0}, | |
| {JNZ, REL32OFF, 0, 0, 0x850F, ' ', 0}, | |
| {JNE, REL16OFF, 0, 0, 0x850F, ' ', 0}, | |
| {JNE, REL32OFF, 0, 0, 0x850F, ' ', 0}, | |
| {JBE, REL16OFF, 0, 0, 0x860F, ' ', 0}, | |
| {JBE, REL32OFF, 0, 0, 0x860F, ' ', 0}, | |
| {JNA, REL16OFF, 0, 0, 0x860F, ' ', 0}, | |
| {JNA, REL32OFF, 0, 0, 0x860F, ' ', 0}, | |
| {JNBE, REL16OFF, 0, 0, 0x870F, ' ', 0}, | |
| {JNBE, REL32OFF, 0, 0, 0x870F, ' ', 0}, | |
| {JA, REL16OFF, 0, 0, 0x870F, ' ', 0}, | |
| {JA, REL32OFF, 0, 0, 0x870F, ' ', 0}, | |
| {JS, REL16OFF, 0, 0, 0x880F, ' ', 0}, | |
| {JS, REL32OFF, 0, 0, 0x880F, ' ', 0}, | |
| {JNS, REL16OFF, 0, 0, 0x890F, ' ', 0}, | |
| {JNS, REL32OFF, 0, 0, 0x890F, ' ', 0}, | |
| {JP, REL16OFF, 0, 0, 0x8A0F, ' ', 0}, | |
| {JP, REL32OFF, 0, 0, 0x8A0F, ' ', 0}, | |
| {JPE, REL16OFF, 0, 0, 0x8A0F, ' ', 0}, | |
| {JPE, REL32OFF, 0, 0, 0x8A0F, ' ', 0}, | |
| {JNP, REL16OFF, 0, 0, 0x8B0F, ' ', 0}, | |
| {JNP, REL32OFF, 0, 0, 0x8B0F, ' ', 0}, | |
| {JPO, REL16OFF, 0, 0, 0x8B0F, ' ', 0}, | |
| {JPO, REL32OFF, 0, 0, 0x8B0F, ' ', 0}, | |
| {JL, REL16OFF, 0, 0, 0x8C0F, ' ', 0}, | |
| {JL, REL32OFF, 0, 0, 0x8C0F, ' ', 0}, | |
| {JNGE, REL16OFF, 0, 0, 0x8C0F, ' ', 0}, | |
| {JNGE, REL32OFF, 0, 0, 0x8C0F, ' ', 0}, | |
| {JNL, REL16OFF, 0, 0, 0x8D0F, ' ', 0}, | |
| {JNL, REL32OFF, 0, 0, 0x8D0F, ' ', 0}, | |
| {JGE, REL16OFF, 0, 0, 0x8D0F, ' ', 0}, | |
| {JGE, REL32OFF, 0, 0, 0x8D0F, ' ', 0}, | |
| {JLE, REL16OFF, 0, 0, 0x8E0F, ' ', 0}, | |
| {JLE, REL32OFF, 0, 0, 0x8E0F, ' ', 0}, | |
| {JNG, REL16OFF, 0, 0, 0x8E0F, ' ', 0}, | |
| {JNG, REL32OFF, 0, 0, 0x8E0F, ' ', 0}, | |
| {JNLE, REL16OFF, 0, 0, 0x8F0F, ' ', 0}, | |
| {JNLE, REL32OFF, 0, 0, 0x8F0F, ' ', 0}, | |
| {JG, REL16OFF, 0, 0, 0x8F0F, ' ', 0}, | |
| {JG, REL32OFF, 0, 0, 0x8F0F, ' ', 0}, | |
| {JO, REL8OFF, 0, 0, 0x70, ' ', 0}, | |
| {JNO, REL8OFF, 0, 0, 0x71, ' ', 0}, | |
| {JB, REL8OFF, 0, 0, 0x72, ' ', 0}, | |
| {JC, REL8OFF, 0, 0, 0x72, ' ', 0}, | |
| {JNAE, REL8OFF, 0, 0, 0x72, ' ', 0}, | |
| {JNB, REL8OFF, 0, 0, 0x73, ' ', 0}, | |
| {JNC, REL8OFF, 0, 0, 0x73, ' ', 0}, | |
| {JAE, REL8OFF, 0, 0, 0x73, ' ', 0}, | |
| {JZ, REL8OFF, 0, 0, 0x74, ' ', 0}, | |
| {JE, REL8OFF, 0, 0, 0x74, ' ', 0}, | |
| {JNZ, REL8OFF, 0, 0, 0x75, ' ', 0}, | |
| {JNE, REL8OFF, 0, 0, 0x75, ' ', 0}, | |
| {JBE, REL8OFF, 0, 0, 0x76, ' ', 0}, | |
| {JNA, REL8OFF, 0, 0, 0x76, ' ', 0}, | |
| {JNBE, REL8OFF, 0, 0, 0x77, ' ', 0}, | |
| {JA, REL8OFF, 0, 0, 0x77, ' ', 0}, | |
| {JS, REL8OFF, 0, 0, 0x78, ' ', 0}, | |
| {JNS, REL8OFF, 0, 0, 0x79, ' ', 0}, | |
| {JP, REL8OFF, 0, 0, 0x7A, ' ', 0}, | |
| {JPE, REL8OFF, 0, 0, 0x7A, ' ', 0}, | |
| {JNP, REL8OFF, 0, 0, 0x7B, ' ', 0}, | |
| {JPO, REL8OFF, 0, 0, 0x7B, ' ', 0}, | |
| {JL, REL8OFF, 0, 0, 0x7C, ' ', 0}, | |
| {JNGE, REL8OFF, 0, 0, 0x7C, ' ', 0}, | |
| {JNL, REL8OFF, 0, 0, 0x7D, ' ', 0}, | |
| {JGE, REL8OFF, 0, 0, 0x7D, ' ', 0}, | |
| {JLE, REL8OFF, 0, 0, 0x7E, ' ', 0}, | |
| {JNG, REL8OFF, 0, 0, 0x7E, ' ', 0}, | |
| {JNLE, REL8OFF, 0, 0, 0x7F, ' ', 0}, | |
| {JG, REL8OFF, 0, 0, 0x7F, ' ', 0}, | |
| {JRCXZ, REL8OFF, 0, 0, 0xE3, ' ', 0}, | |
| {JMP, REL8OFF, 0, 0, 0xEB, ' ', 0}, | |
| {JMP, REL16OFF, 0, 0, 0xE9, ' ', 0}, | |
| {JMP, REL32OFF, 0, 0, 0xE9, ' ', 0}, | |
| {JMP, RM16, 0, 0, 0xFF, '4', NO_REX}, | |
| {JMP, RM32, 0, 0, 0xFF, '4', NO_REX}, | |
| {JMP, RM64, 0, 0, 0xFF, '4', NO_REX}, | |
| {LAHF, 0, 0, 0, 0x9F, ' ', 0}, | |
| {LEA, REG16, MEM16, 0, 0x8D, 'r', 0}, | |
| {LEA, REG32, MEM32, 0, 0x8D, 'r', 0}, | |
| {LEA, REG64, MEM64, 0, 0x8D, 'r', 0}, | |
| {LEAVE, 0, 0, 0, 0xC9, ' ', 0}, | |
| {LFENCE, 0, 0, 0, 0xE8AE0F, ' ', 0}, | |
| {LODSB, 0, 0, 0, 0xAC, ' ', 0}, | |
| {LODSW, 0, 0, 0, 0xAD66, ' ', 0}, | |
| {LODSD, 0, 0, 0, 0xAD, ' ', 0}, | |
| {LODSQ, 0, 0, 0, 0xAD48, ' ', 0}, | |
| {LOOP, REL8OFF, 0, 0, 0xE2, ' ', 0}, | |
| {LOOPE, REL8OFF, 0, 0, 0xE1, ' ', 0}, | |
| {LOOPZ, REL8OFF, 0, 0, 0xE1, ' ', 0}, | |
| {LOOPNE, REL8OFF, 0, 0, 0xE0, ' ', 0}, | |
| {LOOPNZ, REL8OFF, 0, 0, 0xE0, ' ', 0}, | |
| {LZCNT, REG16, RM16, 0, 0xBD0FF3, 'r', 0}, | |
| {LZCNT, REG32, RM32, 0, 0xBD0FF3, 'r', 0}, | |
| {LZCNT, REG64, RM64, 0, 0xBD0FF3, 'r', 0}, | |
| {MFENCE, 0, 0, 0, 0xF0AE0F, ' ', 0}, | |
| {MOV, RM8, REG8, 0, 0x88, 'r', 0}, | |
| {MOV, RM16, REG16, 0, 0x89, 'r', 0}, | |
| {MOV, RM32, REG32, 0, 0x89, 'r', 0}, | |
| {MOV, RM64, REG64, 0, 0x89, 'r', 0}, | |
| {MOV, REG8, RM8, 0, 0x8A, 'r', 0}, | |
| {MOV, REG16, RM16, 0, 0x8B, 'r', 0}, | |
| {MOV, REG32, RM32, 0, 0x8B, 'r', 0}, | |
| {MOV, REG64, RM64, 0, 0x8B, 'r', 0}, | |
| {MOV, EXACT_AL, MOFFSET8, 0, 0xA0, ' ', 0}, | |
| {MOV, EXACT_AX, MOFFSET16, 0, 0xA1, ' ', 0}, | |
| {MOV, EXACT_EAX, MOFFSET32, 0, 0xA1, ' ', 0}, | |
| {MOV, EXACT_RAX, MOFFSET64, 0, 0xA1, ' ', 0}, | |
| {MOV, MOFFSET8, EXACT_AL, 0, 0xA2, ' ', 0}, | |
| {MOV, MOFFSET16, EXACT_AX, 0, 0xA3, ' ', 0}, | |
| {MOV, MOFFSET32, EXACT_EAX, 0, 0xA3, ' ', 0}, | |
| {MOV, MOFFSET64, EXACT_RAX, 0, 0xA3, ' ', 0}, | |
| {MOV, REG8, IMM8, 0, 0xB0, '+', 0}, | |
| {MOV, REG16, IMM16, 0, 0xB8, '+', 0}, | |
| {MOV, REG32, IMM32, 0, 0xB8, '+', 0}, | |
| {MOV, REG64, IMM64, 0, 0xB8, '+', 0}, | |
| {MOV, RM8, IMM8, 0, 0xC6, '0', 0}, | |
| {MOV, RM16, IMM16, 0, 0xC7, '0', 0}, | |
| {MOV, RM32, IMM32, 0, 0xC7, '0', 0}, | |
| {MOV, RM64, IMM32, 0, 0xC7, '0', 0}, | |
| {MOVBE, REG16, MEM16, 0, 0xF0380F, 'r', 0}, | |
| {MOVBE, REG32, MEM32, 0, 0xF0380F, 'r', 0}, | |
| {MOVBE, REG64, MEM64, 0, 0xF0380F, 'r', 0}, | |
| {MOVBE, MEM16, REG16, 0, 0xF1380F, 'r', 0}, | |
| {MOVBE, MEM32, REG32, 0, 0xF1380F, 'r', 0}, | |
| {MOVBE, MEM64, REG64, 0, 0xF1380F, 'r', 0}, | |
| {MOVD, XMM0, RM32, 0, 0x6E0F66, 'r', 0}, | |
| {MOVQ, XMM0, RM64, 0, 0x6E0F66, 'r', 0}, | |
| {MOVD, RM32, XMM0, 0, 0x7E0F66, 'r', 0}, | |
| {MOVQ, RM64, XMM0, 0, 0x7E0F66, 'r', 0}, | |
| {MOVMSKPD, REG32, XMM0, 0, 0x500F66, 'r', 0}, | |
| {MOVMSKPS, REG32, XMM0, 0, 0x500F, 'r', 0}, | |
| {MOVNTI, MEM32, REG32, 0, 0xC30F, 'r', 0}, | |
| {MOVNTI, MEM64, REG64, 0, 0xC30F, 'r', 0}, | |
| {MOVSB, 0, 0, 0, 0xA4, ' ', 0}, | |
| {MOVSW, 0, 0, 0, 0xA5, ' ', 0}, | |
| {MOVSD, 0, 0, 0, 0xA5, ' ', 0}, | |
| {MOVSQ, 0, 0, 0, 0xA5, ' ', 0}, | |
| {MOVSX, REG16, RM8, 0, 0xBE0F, 'r', 0}, | |
| {MOVSX, REG32, RM8, 0, 0xBE0F, 'r', 0}, | |
| {MOVSX, REG64, RM8, 0, 0xBE0F, 'r', 0}, | |
| //~ {MOVSX, REG32, RM16, 0, 0xBF0F, 'r', 0}, | |
| //~ {MOVSX, REG64, RM16, 0, 0xBF0F, 'r', 0}, | |
| {MOVSXD, REG64, RM32, 0, 0x63, 'r', 0}, | |
| {MOVZX, REG16, RM8, 0, 0xB60F, 'r', 0}, | |
| {MOVZX, REG32, RM8, 0, 0xB60F, 'r', 0}, | |
| {MOVZX, REG64, RM8, 0, 0xB60F, 'r', 0}, | |
| {MUL, RM8, 0, 0, 0xF6, '4', 0}, | |
| {MUL, RM16, 0, 0, 0xF7, '4', 0}, | |
| {MUL, RM32, 0, 0, 0xF7, '4', 0}, | |
| {MUL, RM64, 0, 0, 0xF7, '4', 0}, | |
| {MUL, RM64, 0, 0, 0xF7, '4', 0}, | |
| {NEG, RM8, 0, 0, 0xF6, '3', 0}, | |
| {NEG, RM16, 0, 0, 0xF7, '3', 0}, | |
| {NEG, RM32, 0, 0, 0xF7, '3', 0}, | |
| {NEG, RM64, 0, 0, 0xF7, '3', 0}, | |
| {NOP, 0, 0, 0, 0x90, ' ', 0}, | |
| {NOT, RM8, 0, 0, 0xF6, '2', 0}, | |
| {NOT, RM16, 0, 0, 0xF7, '2', 0}, | |
| {NOT, RM32, 0, 0, 0xF7, '2', 0}, | |
| {NOT, RM64, 0, 0, 0xF7, '2', 0}, | |
| {OR, EXACT_AL, IMM8, 0, 0x0C, ' ', 0}, | |
| {OR, EXACT_AX, IMM16, 0, 0x0D, ' ', 0}, | |
| {OR, EXACT_EAX, IMM32, 0, 0x0D, ' ', 0}, | |
| {OR, EXACT_RAX, IMM32, 0, 0x0D, ' ', 0}, | |
| {OR, RM8, IMM8, 0, 0x80, '1', 0}, | |
| {OR, RM16, IMM16, 0, 0x81, '1', 0}, | |
| {OR, RM32, IMM32, 0, 0x81, '1', 0}, | |
| {OR, RM64, IMM32, 0, 0x81, '1', 0}, | |
| {OR, RM16, IMM8, 0, 0x83, '1', 0}, | |
| {OR, RM32, IMM8, 0, 0x83, '1', 0}, | |
| {OR, RM64, IMM8, 0, 0x83, '1', 0}, | |
| {OR, REG8, RM8, 0, 0x0A, 'r', 0}, | |
| {OR, REG16, RM16, 0, 0x0B, 'r', 0}, | |
| {OR, REG32, RM32, 0, 0x0B, 'r', 0}, | |
| {OR, REG64, RM64, 0, 0x0B, 'r', 0}, | |
| {OR, RM8, REG8, 0, 0x08, 'r', 0}, | |
| {OR, RM16, REG16, 0, 0x09, 'r', 0}, | |
| {OR, RM32, REG32, 0, 0x09, 'r', 0}, | |
| {OR, RM64, REG64, 0, 0x09, 'r', 0}, | |
| {PAUSE, 0, 0, 0, 0x90F3, ' ', 0}, | |
| {POP, REG16, 0, 0, 0x58, '+', NO_REX}, | |
| {POP, REG64, 0, 0, 0x58, '+', NO_REX}, | |
| {POP, RM16, 0, 0, 0x8F, '0', NO_REX}, | |
| {POP, RM64, 0, 0, 0x8F, '0', NO_REX}, | |
| {POPCNT, REG16, RM16, 0, 0xB80FF3, 'r', 0}, | |
| {POPCNT, REG32, RM32, 0, 0xB80FF3, 'r', 0}, | |
| {POPCNT, REG64, RM64, 0, 0xB80FF3, 'r', 0}, | |
| {POPF, 0, 0, 0, 0x9D, ' ', 0}, | |
| {PREFETCH, MEM8, 0, 0, 0x0D0F, '0', 0}, | |
| {PREFETCHW, MEM8, 0, 0, 0x0D0F, '1', 0}, | |
| {PREFETCHNTA, MEM8, 0, 0, 0x180F, '0', 0}, | |
| {PREFETCH0, MEM8, 0, 0, 0x180F, '1', 0}, | |
| {PREFETCH1, MEM8, 0, 0, 0x180F, '2', 0}, | |
| {PREFETCH2, MEM8, 0, 0, 0x180F, '3', 0}, | |
| {PUSH, REG16, 0, 0, 0x50, '+', NO_REX}, | |
| {PUSH, REG64, 0, 0, 0x50, '+', NO_REX}, | |
| {PUSH, RM16, 0, 0, 0xFF, '6', NO_REX}, | |
| {PUSH, RM64, 0, 0, 0xFF, '6', NO_REX}, | |
| {PUSH, IMM8, 0, 0, 0x6A, ' ', NO_REX}, | |
| {PUSH, IMM16, 0, 0, 0x68, ' ', NO_REX}, | |
| {PUSH, IMM32, 0, 0, 0x68, ' ', NO_REX}, | |
| {PUSHF, 0, 0, 0, 0x9C, ' ', 0}, | |
| {RCL, RM8, 0, 0, 0xD0, '2', 0}, | |
| {RCL, RM8, 0, 0, 0xD2, '2', 0}, | |
| {RCL, RM8, IMM8, 0, 0xC0, '2', 0}, | |
| {RCL, RM16, 0, 0, 0xD1, '2', 0}, | |
| {RCL, RM16, 0, 0, 0xD3, '2', 0}, | |
| {RCL, RM16, IMM8, 0, 0xC1, '2', 0}, | |
| {RCL, RM32, 0, 0, 0xD1, '2', 0}, | |
| {RCL, RM32, 0, 0, 0xD3, '2', 0}, | |
| {RCL, RM32, IMM8, 0, 0xC1, '2', 0}, | |
| {RCL, RM64, 0, 0, 0xD1, '2', 0}, | |
| {RCL, RM64, 0, 0, 0xD3, '2', 0}, | |
| {RCL, RM64, IMM8, 0, 0xC1, '2', 0}, | |
| {RCR, RM8, 0, 0, 0xD0, '3', 0}, | |
| {RCR, RM8, 0, 0, 0xD2, '3', 0}, | |
| {RCR, RM8, IMM8, 0, 0xC0, '3', 0}, | |
| {RCR, RM16, 0, 0, 0xD1, '3', 0}, | |
| {RCR, RM16, 0, 0, 0xD3, '3', 0}, | |
| {RCR, RM16, IMM8, 0, 0xC1, '3', 0}, | |
| {RCR, RM32, 0, 0, 0xD1, '3', 0}, | |
| {RCR, RM32, 0, 0, 0xD3, '3', 0}, | |
| {RCR, RM32, IMM8, 0, 0xC1, '3', 0}, | |
| {RCR, RM64, 0, 0, 0xD1, '3', 0}, | |
| {RCR, RM64, 0, 0, 0xD3, '3', 0}, | |
| {RCR, RM64, IMM8, 0, 0xC1, '3', 0}, | |
| {RET, IMM16, 0, 0, 0xC2, ' ', 0}, | |
| {RET, 0, 0, 0, 0xC3, ' ', 0}, | |
| {ROL, RM8, 0, 0, 0xD0, '0', 0}, | |
| {ROL, RM8, 0, 0, 0xD2, '0', 0}, | |
| {ROL, RM8, IMM8, 0, 0xC0, '0', 0}, | |
| {ROL, RM16, 0, 0, 0xD1, '0', 0}, | |
| {ROL, RM16, 0, 0, 0xD3, '0', 0}, | |
| {ROL, RM16, IMM8, 0, 0xC1, '0', 0}, | |
| {ROL, RM32, 0, 0, 0xD1, '0', 0}, | |
| {ROL, RM32, 0, 0, 0xD3, '0', 0}, | |
| {ROL, RM32, IMM8, 0, 0xC1, '0', 0}, | |
| {ROL, RM64, 0, 0, 0xD1, '0', 0}, | |
| {ROL, RM64, 0, 0, 0xD3, '0', 0}, | |
| {ROL, RM64, IMM8, 0, 0xC1, '0', 0}, | |
| {ROR, RM8, 0, 0, 0xD0, '1', 0}, | |
| {ROR, RM8, 0, 0, 0xD2, '1', 0}, | |
| {ROR, RM8, IMM8, 0, 0xC0, '1', 0}, | |
| {ROR, RM16, 0, 0, 0xD1, '1', 0}, | |
| {ROR, RM16, 0, 0, 0xD3, '1', 0}, | |
| {ROR, RM16, IMM8, 0, 0xC1, '1', 0}, | |
| {ROR, RM32, 0, 0, 0xD1, '1', 0}, | |
| {ROR, RM32, 0, 0, 0xD3, '1', 0}, | |
| {ROR, RM32, IMM8, 0, 0xC1, '1', 0}, | |
| {ROR, RM64, 0, 0, 0xD1, '1', 0}, | |
| {ROR, RM64, 0, 0, 0xD3, '1', 0}, | |
| {ROR, RM64, IMM8, 0, 0xC1, '1', 0}, | |
| {SAHF, 0, 0, 0, 0x9E, ' ', 0}, | |
| {SHL, RM8, 0, 0, 0xD0, '4', 0}, | |
| {SHL, RM8, 0, 0, 0xD2, '4', 0}, | |
| {SHL, RM8, IMM8, 0, 0xC0, '4', 0}, | |
| {SHL, RM16, 0, 0, 0xD1, '4', 0}, | |
| {SHL, RM16, 0, 0, 0xD3, '4', 0}, | |
| {SHL, RM16, IMM8, 0, 0xC1, '4', 0}, | |
| {SHL, RM32, 0, 0, 0xD1, '4', 0}, | |
| {SHL, RM32, 0, 0, 0xD3, '4', 0}, | |
| {SHL, RM32, IMM8, 0, 0xC1, '4', 0}, | |
| {SHL, RM64, 0, 0, 0xD1, '4', 0}, | |
| {SHL, RM64, 0, 0, 0xD3, '4', 0}, | |
| {SHL, RM64, IMM8, 0, 0xC1, '4', 0}, | |
| {SAR, RM8, 0, 0, 0xD0, '7', 0}, | |
| {SAR, RM8, 0, 0, 0xD2, '7', 0}, | |
| {SAR, RM8, IMM8, 0, 0xC0, '7', 0}, | |
| {SAR, RM16, 0, 0, 0xD1, '7', 0}, | |
| {SAR, RM16, 0, 0, 0xD3, '7', 0}, | |
| {SAR, RM16, IMM8, 0, 0xC1, '7', 0}, | |
| {SAR, RM32, 0, 0, 0xD1, '7', 0}, | |
| {SAR, RM32, 0, 0, 0xD3, '7', 0}, | |
| {SAR, RM32, IMM8, 0, 0xC1, '7', 0}, | |
| {SAR, RM64, 0, 0, 0xD1, '7', 0}, | |
| {SAR, RM64, 0, 0, 0xD3, '7', 0}, | |
| {SAR, RM64, IMM8, 0, 0xC1, '7', 0}, | |
| {SBB, EXACT_AL, IMM8, 0, 0x1C, ' ', 0}, | |
| {SBB, EXACT_AX, IMM16, 0, 0x1D, ' ', 0}, | |
| {SBB, EXACT_EAX, IMM32, 0, 0x1D, ' ', 0}, | |
| {SBB, EXACT_RAX, IMM32, 0, 0x1D, ' ', 0}, | |
| {SBB, RM8, IMM8, 0, 0x80, '3', 0}, | |
| {SBB, RM16, IMM16, 0, 0x81, '3', 0}, | |
| {SBB, RM32, IMM32, 0, 0x81, '3', 0}, | |
| {SBB, RM64, IMM32, 0, 0x81, '3', 0}, | |
| {SBB, RM16, IMM8, 0, 0x83, '3', 0}, | |
| {SBB, RM32, IMM8, 0, 0x83, '3', 0}, | |
| {SBB, RM64, IMM8, 0, 0x83, '3', 0}, | |
| {SBB, REG8, RM8, 0, 0x1A, 'r', 0}, | |
| {SBB, REG16, RM16, 0, 0x1B, 'r', 0}, | |
| {SBB, REG32, RM32, 0, 0x1B, 'r', 0}, | |
| {SBB, REG64, RM64, 0, 0x1B, 'r', 0}, | |
| {SBB, RM8, REG8, 0, 0x18, 'r', 0}, | |
| {SBB, RM16, REG16, 0, 0x19, 'r', 0}, | |
| {SBB, RM32, REG32, 0, 0x19, 'r', 0}, | |
| {SBB, RM64, REG64, 0, 0x19, 'r', 0}, | |
| {SCASB, 0, 0, 0, 0xAE, ' ', 0}, | |
| {SCASW, 0, 0, 0, 0xAF66, ' ', 0}, | |
| {SCASD, 0, 0, 0, 0xAF, ' ', 0}, | |
| {SCASQ, 0, 0, 0, 0xAF48, ' ', 0}, | |
| {SETO, RM8, 0, 0, 0x900F, '0', 0}, | |
| {SETNO, RM8, 0, 0, 0x910F, '0', 0}, | |
| {SETB, RM8, 0, 0, 0x920F, '0', 0}, | |
| {SETC, RM8, 0, 0, 0x920F, '0', 0}, | |
| {SETNAE, RM8, 0, 0, 0x920F, '0', 0}, | |
| {SETNB, RM8, 0, 0, 0x930F, '0', 0}, | |
| {SETNC, RM8, 0, 0, 0x930F, '0', 0}, | |
| {SETAE, RM8, 0, 0, 0x930F, '0', 0}, | |
| {SETZ, RM8, 0, 0, 0x940F, '0', 0}, | |
| {SETE, RM8, 0, 0, 0x940F, '0', 0}, | |
| {SETNZ, RM8, 0, 0, 0x950F, '0', 0}, | |
| {SETNE, RM8, 0, 0, 0x950F, '0', 0}, | |
| {SETBE, RM8, 0, 0, 0x960F, '0', 0}, | |
| {SETNA, RM8, 0, 0, 0x960F, '0', 0}, | |
| {SETNBE, RM8, 0, 0, 0x970F, '0', 0}, | |
| {SETA, RM8, 0, 0, 0x970F, '0', 0}, | |
| {SETS, RM8, 0, 0, 0x980F, '0', 0}, | |
| {SETNS, RM8, 0, 0, 0x990F, '0', 0}, | |
| {SETP, RM8, 0, 0, 0x9A0F, '0', 0}, | |
| {SETPE, RM8, 0, 0, 0x9A0F, '0', 0}, | |
| {SETNP, RM8, 0, 0, 0x9B0F, '0', 0}, | |
| {SETPO, RM8, 0, 0, 0x9B0F, '0', 0}, | |
| {SETL, RM8, 0, 0, 0x9C0F, '0', 0}, | |
| {SETNGE, RM8, 0, 0, 0x9C0F, '0', 0}, | |
| {SETNL, RM8, 0, 0, 0x9D0F, '0', 0}, | |
| {SETGE, RM8, 0, 0, 0x9D0F, '0', 0}, | |
| {SETLE, RM8, 0, 0, 0x9E0F, '0', 0}, | |
| {SETNG, RM8, 0, 0, 0x9E0F, '0', 0}, | |
| {SETNLE, RM8, 0, 0, 0x9F0F, '0', 0}, | |
| {SETG, RM8, 0, 0, 0x9F0F, '0', 0}, | |
| {SFENCE, 0, 0, 0, 0xF8AE0F, ' ', 0}, | |
| {SHLD, RM16, REG16, IMM8, 0xA40F, 'r', 0}, | |
| {SHLD, RM16, REG16, 0, 0xA50F, 'r', 0}, | |
| {SHLD, RM32, REG32, IMM8, 0xA40F, 'r', 0}, | |
| {SHLD, RM32, REG32, 0, 0xA50F, 'r', 0}, | |
| {SHLD, RM64, REG64, IMM8, 0xA40F, 'r', 0}, | |
| {SHLD, RM64, REG64, 0, 0xA50F, 'r', 0}, | |
| {SHR, RM8, 0, 0, 0xD0, '5', 0}, | |
| {SHR, RM8, 0, 0, 0xD2, '5', 0}, | |
| {SHR, RM8, IMM8, 0, 0xC0, '5', 0}, | |
| {SHR, RM16, 0, 0, 0xD1, '5', 0}, | |
| {SHR, RM16, 0, 0, 0xD3, '5', 0}, | |
| {SHR, RM16, IMM8, 0, 0xC1, '5', 0}, | |
| {SHR, RM32, 0, 0, 0xD1, '5', 0}, | |
| {SHR, RM32, 0, 0, 0xD3, '5', 0}, | |
| {SHR, RM32, IMM8, 0, 0xC1, '5', 0}, | |
| {SHR, RM64, 0, 0, 0xD1, '5', 0}, | |
| {SHR, RM64, 0, 0, 0xD3, '5', 0}, | |
| {SHR, RM64, IMM8, 0, 0xC1, '5', 0}, | |
| {SHRD, RM16, REG16, IMM8, 0xAC0F, 'r', 0}, | |
| {SHRD, RM16, REG16, 0, 0xAD0F, 'r', 0}, | |
| {SHRD, RM32, REG32, IMM8, 0xAC0F, 'r', 0}, | |
| {SHRD, RM32, REG32, 0, 0xAD0F, 'r', 0}, | |
| {SHRD, RM64, REG64, IMM8, 0xAC0F, 'r', 0}, | |
| {SHRD, RM64, REG64, 0, 0xAD0F, 'r', 0}, | |
| {STC, 0, 0, 0, 0xF9, ' ', 0}, | |
| {STD, 0, 0, 0, 0xFD, ' ', 0}, | |
| {STOSB, 0, 0, 0, 0xAA, ' ', 0}, | |
| {STOSW, 0, 0, 0, 0xAB66, ' ', 0}, | |
| {STOSD, 0, 0, 0, 0xAB, ' ', 0}, | |
| {STOSQ, 0, 0, 0, 0xAB48, ' ', 0}, | |
| {SUB, EXACT_AL, IMM8, 0, 0x2C, ' ', 0}, | |
| {SUB, EXACT_AX, IMM16, 0, 0x2D, ' ', 0}, | |
| {SUB, EXACT_EAX, IMM32, 0, 0x2D, ' ', 0}, | |
| {SUB, EXACT_RAX, IMM32, 0, 0x2D, ' ', 0}, | |
| {SUB, RM8, IMM8, 0, 0x80, '5', 0}, | |
| {SUB, RM16, IMM16, 0, 0x81, '5', 0}, | |
| {SUB, RM32, IMM32, 0, 0x81, '5', 0}, | |
| {SUB, RM64, IMM32, 0, 0x81, '5', 0}, | |
| {SUB, RM16, IMM8, 0, 0x83, '5', 0}, | |
| {SUB, RM32, IMM8, 0, 0x83, '5', 0}, | |
| {SUB, RM64, IMM8, 0, 0x83, '5', 0}, | |
| {SUB, REG8, RM8, 0, 0x2A, 'r', 0}, | |
| {SUB, REG16, RM16, 0, 0x2B, 'r', 0}, | |
| {SUB, REG32, RM32, 0, 0x2B, 'r', 0}, | |
| {SUB, REG64, RM64, 0, 0x2B, 'r', 0}, | |
| {SUB, RM8, REG8, 0, 0x28, 'r', 0}, | |
| {SUB, RM16, REG16, 0, 0x29, 'r', 0}, | |
| {SUB, RM32, REG32, 0, 0x29, 'r', 0}, | |
| {SUB, RM64, REG64, 0, 0x29, 'r', 0}, | |
| {TEST, EXACT_AL, IMM8, 0, 0xA8, ' ', 0}, | |
| {TEST, EXACT_AX, IMM16, 0, 0xA9, ' ', 0}, | |
| {TEST, EXACT_EAX, IMM32, 0, 0xA9, ' ', 0}, | |
| {TEST, EXACT_RAX, IMM32, 0, 0xA9, ' ', 0}, | |
| {TEST, RM8, IMM8, 0, 0xF6, '0', 0}, | |
| {TEST, RM16, IMM16, 0, 0xF7, '0', 0}, | |
| {TEST, RM32, IMM32, 0, 0xF7, '0', 0}, | |
| {TEST, RM64, IMM32, 0, 0xF7, '0', 0}, | |
| {TEST, RM8, REG8, 0, 0x84, 'r', 0}, | |
| {TEST, RM16, REG16, 0, 0x85, 'r', 0}, | |
| {TEST, RM32, REG32, 0, 0x85, 'r', 0}, | |
| {TEST, RM64, REG32, 0, 0x85, 'r', 0}, | |
| {TZCNT, REG16, RM16, 0, 0xBC0FF3, 'r', 0}, | |
| {TZCNT, REG32, RM32, 0, 0xBC0FF3, 'r', 0}, | |
| {TZCNT, REG64, RM64, 0, 0xBC0FF3, 'r', 0}, | |
| {XADD, RM8, REG8, 0, 0xC00F, 'r', 0}, | |
| {XADD, RM16, REG16, 0, 0xC10F, 'r', 0}, | |
| {XADD, RM32, REG32, 0, 0xC10F, 'r', 0}, | |
| {XADD, RM64, REG64, 0, 0xC10F, 'r', 0}, | |
| {XCHG, EXACT_AX, REG16, 0, 0x90, '+', 0}, | |
| {XCHG, REG16, EXACT_AX, 0, 0x90, '+', 0}, | |
| {XCHG, EXACT_EAX, REG32, 0, 0x90, '+', 0}, | |
| {XCHG, REG32, EXACT_EAX, 0, 0x90, '+', 0}, | |
| {XCHG, EXACT_RAX, REG64, 0, 0x90, '+', 0}, | |
| {XCHG, REG64, EXACT_RAX, 0, 0x90, '+', 0}, | |
| {XCHG, RM8 , REG8 , 0, 0x86, 'r', 0}, | |
| {XCHG, RM16 , REG16, 0, 0x87, 'r', 0}, | |
| {XCHG, RM32 , REG32, 0, 0x87, 'r', 0}, | |
| {XCHG, RM64 , REG64, 0, 0x87, 'r', 0}, | |
| {XCHG, REG8 , RM8 , 0, 0x86, 'r', 0}, | |
| {XCHG, REG16 , RM16, 0, 0x87, 'r', 0}, | |
| {XCHG, REG32 , RM32, 0, 0x87, 'r', 0}, | |
| {XCHG, REG64 , RM64, 0, 0x87, 'r', 0}, | |
| {XLAT, 0, 0, 0, 0xD7, ' ', 0}, | |
| {XOR, EXACT_AL, IMM8, 0, 0x34, ' ', 0}, | |
| {XOR, EXACT_AX, IMM16, 0, 0x35, ' ', 0}, | |
| {XOR, EXACT_EAX, IMM32, 0, 0x35, ' ', 0}, | |
| {XOR, EXACT_RAX, IMM32, 0, 0x35, ' ', 0}, | |
| {XOR, RM8, IMM8, 0, 0x80, '6', 0}, | |
| {XOR, RM16, IMM16, 0, 0x81, '6', 0}, | |
| {XOR, RM32, IMM32, 0, 0x81, '6', 0}, | |
| {XOR, RM64, IMM32, 0, 0x81, '6', 0}, | |
| {XOR, RM16, IMM8, 0, 0x83, '6', 0}, | |
| {XOR, RM32, IMM8, 0, 0x83, '6', 0}, | |
| {XOR, RM64, IMM8, 0, 0x83, '6', 0}, | |
| {XOR, REG8, RM8, 0, 0x32, 'r', 0}, | |
| {XOR, REG16, RM16, 0, 0x33, 'r', 0}, | |
| {XOR, REG32, RM32, 0, 0x33, 'r', 0}, | |
| {XOR, REG64, RM64, 0, 0x33, 'r', 0}, | |
| {XOR, RM8, REG8, 0, 0x30, 'r', 0}, | |
| {XOR, RM16, REG16, 0, 0x31, 'r', 0}, | |
| {XOR, RM32, REG32, 0, 0x31, 'r', 0}, | |
| {XOR, RM64, REG64, 0, 0x31, 'r', 0}, | |
| {RDTSC, 0, 0, 0, 0x310F, ' ', 0}, | |
| {ADDPD, XMM0, RM128, 0, 0x580F66, 'r', 0}, | |
| {ADDPS, XMM0, RM128, 0, 0x580F, 'r', 0}, | |
| {ADDSD, XMM0, RM128, 0, 0x580FF2, 'r', 0}, | |
| {ADDSS, XMM0, RM128, 0, 0x580FF3, 'r', 0}, | |
| {ADDSUBPD, XMM0, RM128, 0, 0xD00F66, 'r', 0}, | |
| {ADDSUBPS, XMM0, RM128, 0, 0xD00FF2, 'r', 0}, | |
| {ANDNPD, XMM0, RM128, 0, 0x550F66, 'r', 0}, | |
| {ANDNPS, XMM0, RM128, 0, 0x550F, 'r', 0}, | |
| {ANDPD, XMM0, RM128, 0, 0x540F66, 'r', 0}, | |
| {ANDPS, XMM0, RM128, 0, 0x540F, 'r', 0}, | |
| {BLENDPD, XMM0, RM128, IMM8, 0x0D3A0F66u, 'r', 0}, | |
| {BLENDPS, XMM0, RM128, IMM8, 0x0C3A0F66u, 'r', 0}, | |
| {BLENDVPD, XMM0, RM128, 0, 0x15380F66, 'r', 0}, | |
| {BLENDVPS, XMM0, RM128, 0, 0x14380F66, 'r', 0}, | |
| {CMPPD, XMM0, RM128, IMM8, 0xC20F66, 'r', 0}, | |
| {CMPPS, XMM0, RM128, IMM8, 0xC20F, 'r', 0}, | |
| {CMPSD, XMM0, RM128, IMM8, 0xC20FF2, 'r', 0}, | |
| {CMPSS, XMM0, RM128, IMM8, 0xC20FF3, 'r', 0}, | |
| {COMISD, XMM0, RM128, 0, 0x2F0F66, 'r', 0}, | |
| {COMISS, XMM0, RM128, 0, 0x2F0F, 'r', 0}, | |
| {CVTDQ2PD, XMM0, RM128, 0, 0xE60FF3, 'r', 0}, | |
| {CVTDQ2PS, XMM0, RM128, 0, 0x5B0F, 'r', 0}, | |
| {CVTPD2DQ, XMM0, RM128, 0, 0xE60FF2, 'r', 0}, | |
| {CVTPD2PS, XMM0, RM128, 0, 0x5A0F66, 'r', 0}, | |
| {CVTPS2DQ, XMM0, RM128, 0, 0x5B0F66, 'r', 0}, | |
| {CVTPS2PD, XMM0, RM128, 0, 0x5A0F, 'r', 0}, | |
| {CVTSD2SI, REG32, RM128, 0, 0x2D0FF2, 'r', 0}, | |
| {CVTSD2SI, REG64, RM128, 0, 0x2D0FF2, 'r', 0}, | |
| {CVTSD2SS, XMM0, RM128, 0, 0x5A0FF2, 'r', 0}, | |
| {CVTSI2SD, XMM0, RM32, 0, 0x2A0FF2, 'r', 0}, | |
| {CVTSI2SD, XMM0, RM64, 0, 0x2A0FF2, 'r', 0}, | |
| {CVTSI2SS, XMM0, RM32, 0, 0x2A0FF3, 'r', 0}, | |
| {CVTSI2SS, XMM0, RM64, 0, 0x2A0FF3, 'r', 0}, | |
| {CVTSS2SD, XMM0, RM128, 0, 0x5A0FF3, 'r', 0}, | |
| {CVTSS2SI, REG32, RM128, 0, 0x2D0FF3, 'r', 0}, | |
| {CVTSS2SI, REG64, RM128, 0, 0x2D0FF3, 'r', 0}, | |
| {CVTTPD2DQ, XMM0, RM128, 0, 0xE60F66, 'r', 0}, | |
| {CVTTPS2DQ, XMM0, RM128, 0, 0x5B0FF3, 'r', 0}, | |
| {CVTTSD2SI, REG32, RM128, 0, 0x2C0FF2, 'r', 0}, | |
| {CVTTSD2SI, REG64, RM128, 0, 0x2C0FF2, 'r', 0}, | |
| {CVTTSS2SI, REG32, RM128, 0, 0x2C0FF3, 'r', 0}, | |
| {CVTTSS2SI, REG64, RM128, 0, 0x2C0FF3, 'r', 0}, | |
| {DIVPD, XMM0, RM128, 0, 0x5E0F66, 'r', 0}, | |
| {DIVPS, XMM0, RM128, 0, 0x5E0F, 'r', 0}, | |
| {DIVSD, XMM0, RM128, 0, 0x5E0FF2, 'r', 0}, | |
| {DIVSS, XMM0, RM128, 0, 0x5E0FF3, 'r', 0}, | |
| {DPPD, XMM0, RM128, IMM8, 0x413A0F66u, 'r', 0}, | |
| {DPPS, XMM0, RM128, IMM8, 0x403A0F66u, 'r', 0}, | |
| {EXTRACTPS, RM32, XMM0, IMM8, 0x173A0F66u, 'r', 0}, | |
| {EXTRQ, XMM0, IMM8, IMM8, 0x780F66, '0', 0}, | |
| {EXTRQ, XMM0, XMM0, 0, 0x790F66, 'r', 0}, | |
| {HADDPD, XMM0, RM128, 0, 0x7C0F66, 'r', 0}, | |
| {HADDPS, XMM0, RM128, 0, 0x7C0FF2, 'r', 0}, | |
| {HSUBPD, XMM0, RM128, 0, 0x7D0F66, 'r', 0}, | |
| {HSUBPS, XMM0, RM128, 0, 0x7D0FF2, 'r', 0}, | |
| {INSERTPS, XMM0, RM128, IMM8, 0x213A0F66u, 'r', 0}, | |
| {INSERTQ, XMM0, XMM0, IMM8, 0x780FF2, 'r', 0}, | |
| {INSERTQ, XMM0, XMM0, 0, 0x790FF2, 'r', 0}, | |
| {LDDQU, XMM0, RM128, 0, 0xF00FF2, 'r', 0}, | |
| {MASKMOVDQU, XMM0, XMM0, 0, 0xF70F66, 'r', 0}, | |
| {MAXPD, XMM0, RM128, 0, 0x5F0F66, 'r', 0}, | |
| {MAXPS, XMM0, RM128, 0, 0x5F0F, 'r', 0}, | |
| {MAXSD, XMM0, RM128, 0, 0x5F0FF2, 'r', 0}, | |
| {MAXSS, XMM0, RM128, 0, 0x5F0FF3, 'r', 0}, | |
| {MINPD, XMM0, RM128, 0, 0x5D0F66, 'r', 0}, | |
| {MINPS, XMM0, RM128, 0, 0x5D0F, 'r', 0}, | |
| {MINSD, XMM0, RM128, 0, 0x5D0FF2, 'r', 0}, | |
| {MINSS, XMM0, RM128, 0, 0x5D0FF3, 'r', 0}, | |
| {MOVAPD, XMM0, RM128, 0, 0x280F66, 'r', 0}, | |
| {MOVAPD, RM128, XMM0, 0, 0x290F66, 'r', 0}, | |
| {MOVAPS, XMM0, RM128, 0, 0x280F66, 'r', 0}, | |
| {MOVAPS, RM128, XMM0, 0, 0x290F66, 'r', 0}, | |
| {MOVDDUP, XMM0, RM128, 0, 0x120FF2, 'r', 0}, | |
| {MOVDQA, XMM0, RM128, 0, 0x6F0F66, 'r', 0}, | |
| {MOVDQA, RM128, XMM0, 0, 0x7F0F66, 'r', 0}, | |
| {MOVDQU, XMM0, RM128, 0, 0x6F0FF3, 'r', 0}, | |
| {MOVDQU, RM128, XMM0, 0, 0x7F0FF3, 'r', 0}, | |
| {MOVHLPS, XMM0, XMM0, 0, 0x120F, 'r', 0}, | |
| {MOVHPD, XMM0, MEM64, 0, 0x160F66, 'r', 0}, | |
| {MOVHPD, MEM64, XMM0, 0, 0x170F66, 'r', 0}, | |
| {MOVHPS, XMM0, MEM64, 0, 0x160F, 'r', 0}, | |
| {MOVHPS, MEM64, XMM0, 0, 0x170F, 'r', 0}, | |
| {MOVLHPS, XMM0, XMM0, 0, 0x160F, 'r', 0}, | |
| {MOVLPD, XMM0, MEM64, 0, 0x120F66, 'r', 0}, | |
| {MOVHPD, MEM64, XMM0, 0, 0x130F66, 'r', 0}, | |
| {MOVLPS, XMM0, MEM64, 0, 0x120F, 'r', 0}, | |
| {MOVLPS, MEM64, XMM0, 0, 0x130F, 'r', 0}, | |
| {MOVNTDQ, MEM128, XMM0, 0, 0xE70F66, 'r', 0}, | |
| {MOVNTDQA, MEM128, XMM0, 0, 0x2A380F66u, 'r', 0}, | |
| {MOVNTPD, MEM128, XMM0, 0, 0x2B0F66, 'r', 0}, | |
| {MOVNTPS, MEM128, XMM0, 0, 0x2B0F, 'r', 0}, | |
| {MOVNTSD, MEM128, XMM0, 0, 0x2B0FF2, 'r', 0}, | |
| {MOVNTSS, MEM128, XMM0, 0, 0x2B0FF3, 'r', 0}, | |
| {MOVSD, XMM0, RM128, 0, 0x100FF2, 'r', 0}, | |
| {MOVSD, RM128, XMM0, 0, 0x110FF2, 'r', 0}, | |
| {MOVSHDUP, XMM0, RM128, 0, 0x160FF3, 'r', 0}, | |
| {MOVSLDUP, XMM0, RM128, 0, 0x120FF3, 'r', 0}, | |
| {MOVSS, XMM0, RM128, 0, 0x100FF3, 'r', 0}, | |
| {MOVSS, RM128, XMM0, 0, 0x110FF3, 'r', 0}, | |
| {MOVUPD, XMM0, RM128, 0, 0x100F66, 'r', 0}, | |
| {MOVUPD, RM128, XMM0, 0, 0x110F66, 'r', 0}, | |
| {MOVUPS, XMM0, RM128, 0, 0x100F, 'r', 0}, | |
| {MOVUPS, RM128, XMM0, 0, 0x110F, 'r', 0}, | |
| {MPSADBW, XMM0, RM128, IMM8, 0x423A0F66u, 'r', 0}, | |
| {MULPD, XMM0, RM128, 0, 0x590F66, 'r', 0}, | |
| {MULPS, XMM0, RM128, 0, 0x590F, 'r', 0}, | |
| {MULSD, XMM0, RM128, 0, 0x590FF2, 'r', 0}, | |
| {MULSS, XMM0, RM128, 0, 0x590FF3, 'r', 0}, | |
| {ORPD, XMM0, RM128, 0, 0x560F66, 'r', 0}, | |
| {ORPS, XMM0, RM128, 0, 0x560F, 'r', 0}, | |
| {PABSB, XMM0, RM128, 0, 0x1C380F, 'r', 0}, | |
| {PABSW, XMM0, RM128, 0, 0x1D380F, 'r', 0}, | |
| {PABSD, XMM0, RM128, 0, 0x1E380F, 'r', 0}, | |
| {PACKSSDW, XMM0, RM128, 0, 0x6B0F66, 'r', 0}, | |
| {PACKSSWB, XMM0, RM128, 0, 0x630F66, 'r', 0}, | |
| {PACKUSDW, XMM0, RM128, 0, 0x2B380F66u, 'r', 0}, | |
| {PACKUSWB, XMM0, RM128, 0, 0x670F66, 'r', 0}, | |
| {PADDB, XMM0, RM128, 0, 0xFC0F66, 'r', 0}, | |
| {PADDW, XMM0, RM128, 0, 0xFD0F66, 'r', 0}, | |
| {PADDD, XMM0, RM128, 0, 0xFE0F66, 'r', 0}, | |
| {PADDQ, XMM0, RM128, 0, 0xD40F66, 'r', 0}, | |
| {PADDSB, XMM0, RM128, 0, 0xEC0F66, 'r', 0}, | |
| {PADDSW, XMM0, RM128, 0, 0xED0F66, 'r', 0}, | |
| {PADDUSB, XMM0, RM128, 0, 0xDC0F66, 'r', 0}, | |
| {PADDUSW, XMM0, RM128, 0, 0xDD0F66, 'r', 0}, | |
| {PALIGNR, XMM0, RM128, IMM8, 0x0F3A0F66u, 'r', 0}, | |
| {PAND, XMM0, RM128, 0, 0xDB0F66u, 'r', 0}, | |
| {PANDN, XMM0, RM128, 0, 0xDF0F66u, 'r', 0}, | |
| {PAVGB, XMM0, RM128, 0, 0xE00F66u, 'r', 0}, | |
| {PAVGW, XMM0, RM128, 0, 0xE30F66u, 'r', 0}, | |
| {PBLENDVB, XMM0, RM128, 0, 0x10380F66u, 'r', 0}, | |
| {PBLENDW, XMM0, RM128, IMM8, 0x0E3A0F66u, 'r', 0}, | |
| {PCLMULQDQ, XMM0, RM128, IMM8, 0x443A0F66u, 'r', 0}, | |
| {PCMPEQB, XMM0, RM128, 0, 0x740F66u, 'r', 0}, | |
| {PCMPEQD, XMM0, RM128, 0, 0x760F66u, 'r', 0}, | |
| {PCMPEQW, XMM0, RM128, 0, 0x750F66u, 'r', 0}, | |
| {PCMPEQQ, XMM0, RM128, 0, 0x29380F66u, 'r', 0}, | |
| {PCMPESTRI, XMM0, RM128, IMM8, 0x613A0F66u, 'r', 0}, | |
| {PCMPESTRM, XMM0, RM128, IMM8, 0x603A0F66u, 'r', 0}, | |
| {PCMPGTB, XMM0, RM128, 0, 0x640F66u, 'r', 0}, | |
| {PCMPGTD, XMM0, RM128, 0, 0x660F66u, 'r', 0}, | |
| {PCMPGTW, XMM0, RM128, 0, 0x650F66u, 'r', 0}, | |
| {PCMPGTQ, XMM0, RM128, 0, 0x37380F66u, 'r', 0}, | |
| {PCMPISTRI, XMM0, RM128, IMM8, 0x633A0F66u, 'r', 0}, | |
| {PCMPISTRM, XMM0, RM128, IMM8, 0x623A0F66u, 'r', 0}, | |
| {PEXTRB, RM8, XMM0, IMM8, 0x143A0F66u, 'r', 0}, | |
| {PEXTRW, RM16, XMM0, IMM8, 0x153A0F66u, 'r', 0}, | |
| {PEXTRD, RM32, XMM0, IMM8, 0x163A0F66u, 'r', 0}, | |
| {PEXTRQ, RM64, XMM0, IMM8, 0x163A0F66u, 'r', 0}, | |
| {PHADDD, XMM0, RM128, 0, 0x02380F66u, 'r', 0}, | |
| {PHADDSW, XMM0, RM128, 0, 0x03380F66u, 'r', 0}, | |
| {PHADDW, XMM0, RM128, 0, 0x01380F66u, 'r', 0}, | |
| {PHMINPOSUW, XMM0, RM128, 0, 0x41380F66u, 'r', 0}, | |
| {PHSUBD, XMM0, RM128, 0, 0x06380F66u, 'r', 0}, | |
| {PHSUBSW, XMM0, RM128, 0, 0x07380F66u, 'r', 0}, | |
| {PHSUBW, XMM0, RM128, 0, 0x05380F66u, 'r', 0}, | |
| {PINSRB, XMM0, RM8, IMM8, 0x203A0F66u, 'r', 0}, | |
| {PINSRW, XMM0, RM16, IMM8, 0xC40F66u, 'r', 0}, | |
| {PINSRD, XMM0, RM32, IMM8, 0x223A0F66u, 'r', 0}, | |
| {PINSRQ, XMM0, RM64, IMM8, 0x223A0F66u, 'r', 0}, | |
| {PMADDUBSW, XMM0, RM128, 0, 0x04380F66u, 'r', 0}, | |
| {PMADDWD, XMM0, RM128, 0, 0xF50F66u, 'r', 0}, | |
| {PMAXSB, XMM0, RM128, 0, 0x3C380F66u, 'r', 0}, | |
| {PMAXSD, XMM0, RM128, 0, 0x3D380F66u, 'r', 0}, | |
| {PMAXSW, XMM0, RM128, 0, 0xEE0F66u, 'r', 0}, | |
| {PMAXSUB, XMM0, RM128, 0, 0xDE0F66u, 'r', 0}, | |
| {PMAXSUD, XMM0, RM128, 0, 0x3F380F66u, 'r', 0}, | |
| {PMAXSUW, XMM0, RM128, 0, 0x3E0F66u, 'r', 0}, | |
| {PMINSB, XMM0, RM128, 0, 0x38380F66u, 'r', 0}, | |
| {PMINSD, XMM0, RM128, 0, 0x39380F66u, 'r', 0}, | |
| {PMINSW, XMM0, RM128, 0, 0xEA0F66u, 'r', 0}, | |
| {PMINUB, XMM0, RM128, 0, 0xDA0F66u, 'r', 0}, | |
| {PMINUD, XMM0, RM128, 0, 0x3B380F66u, 'r', 0}, | |
| {PMINUW, XMM0, RM128, 0, 0x3A380F66u, 'r', 0}, | |
| {PMOVMSKB, REG32, XMM0, 0, 0xD70F66u, 'r', 0}, | |
| {PMOVSXBD, XMM0, RM128, 0, 0x21380F66u, 'r', 0}, | |
| {PMOVSXBQ, XMM0, RM128, 0, 0x22380F66u, 'r', 0}, | |
| {PMOVSXBW, XMM0, RM128, 0, 0x20380F66u, 'r', 0}, | |
| {PMOVSXDQ, XMM0, RM128, 0, 0x25380F66u, 'r', 0}, | |
| {PMOVSXWD, XMM0, RM128, 0, 0x23380F66u, 'r', 0}, | |
| {PMOVSXWQ, XMM0, RM128, 0, 0x24380F66u, 'r', 0}, | |
| {PMOVZXBD, XMM0, RM128, 0, 0x31380F66u, 'r', 0}, | |
| {PMOVZXBQ, XMM0, RM128, 0, 0x32380F66u, 'r', 0}, | |
| {PMOVZXBW, XMM0, RM128, 0, 0x30380F66u, 'r', 0}, | |
| {PMOVZXDQ, XMM0, RM128, 0, 0x35380F66u, 'r', 0}, | |
| {PMOVZXWD, XMM0, RM128, 0, 0x33380F66u, 'r', 0}, | |
| {PMOVZXWQ, XMM0, RM128, 0, 0x34380F66u, 'r', 0}, | |
| {PMULDQ, XMM0, RM128, 0, 0x28380F66u, 'r', 0}, | |
| {PMULHRSW, XMM0, RM128, 0, 0x0B380F66u, 'r', 0}, | |
| {PMULHUW, XMM0, RM128, 0, 0xE40F66u, 'r', 0}, | |
| {PMULHW, XMM0, RM128, 0, 0xE50F66u, 'r', 0}, | |
| {PMULLD, XMM0, RM128, 0, 0x40380F66u, 'r', 0}, | |
| {PMULLW, XMM0, RM128, 0, 0xD50F66u, 'r', 0}, | |
| {PMULUDQ, XMM0, RM128, 0, 0xF40F66u, 'r', 0}, | |
| {POR, XMM0, RM128, 0, 0xEB0F66u, 'r', 0}, | |
| {PSADBW, XMM0, RM128, 0, 0xF60F66u, 'r', 0}, | |
| {PSHUFB, XMM0, RM128, 0, 0x00380F66u, 'r', 0}, | |
| {PSHUFD, XMM0, RM128, IMM8, 0x700F66u, 'r', 0}, | |
| {PSHUFD, XMM0, RM128, IMM8, 0x700F66u, 'r', 0}, | |
| {PSHUFLW, XMM0, RM128, IMM8, 0x700FF2u, 'r', 0}, | |
| {PSIGNB, XMM0, RM128, 0, 0x08380F66u, 'r', 0}, | |
| {PSIGND, XMM0, RM128, 0, 0x0A380F66u, 'r', 0}, | |
| {PSIGNW, XMM0, RM128, 0, 0x09380F66u, 'r', 0}, | |
| {PSLLD, XMM0, RM128, 0, 0xF20F66u, 'r', 0}, | |
| {PSLLD, XMM0, IMM8, 0, 0x720F66u, '6', 0}, | |
| {PSLLDQ, XMM0, IMM8, 0, 0x730F66u, '7', 0}, | |
| {PSLLQ, XMM0, RM128, 0, 0xF30F66u, 'r', 0}, | |
| {PSLLQ, XMM0, IMM8, 0, 0x730F66u, '6', 0}, | |
| {PSLLW, XMM0, RM128, 0, 0xF10F66u, 'r', 0}, | |
| {PSLLW, XMM0, IMM8, 0, 0x710F66u, '6', 0}, | |
| {PSRAD, XMM0, RM128, 0, 0xE20F66u, 'r', 0}, | |
| {PSRAD, XMM0, IMM8, 0, 0x720F66u, '4', 0}, | |
| {PSRAW, XMM0, RM128, 0, 0xE10F66u, 'r', 0}, | |
| {PSRAW, XMM0, IMM8, 0, 0x710F66u, '4', 0}, | |
| {PSRLD, XMM0, RM128, 0, 0xD20F66u, 'r', 0}, | |
| {PSRLD, XMM0, IMM8, 0, 0x720F66u, '2', 0}, | |
| {PSRLDQ, XMM0, IMM8, 0, 0x730F66u, '3', 0}, | |
| {PSRLQ, XMM0, RM128, 0, 0xD30F66u, 'r', 0}, | |
| {PSRLQ, XMM0, IMM8, 0, 0x730F66u, '2', 0}, | |
| {PSRLW, XMM0, RM128, 0, 0xD10F66u, 'r', 0}, | |
| {PSRLW, XMM0, IMM8, 0, 0x710F66u, '2', 0}, | |
| {PSUBB, XMM0, RM128, 0, 0xF80F66u, 'r', 0}, | |
| {PSUBD, XMM0, RM128, 0, 0xFA0F66u, 'r', 0}, | |
| {PSUBW, XMM0, RM128, 0, 0xF90F66u, 'r', 0}, | |
| {PSUBQ, XMM0, RM128, 0, 0xFB0F66u, 'r', 0}, | |
| {PSUBSW, XMM0, RM128, 0, 0xE90F66u, 'r', 0}, | |
| {PSUBUSB, XMM0, RM128, 0, 0xD80F66u, 'r', 0}, | |
| {PSUBUSW, XMM0, RM128, 0, 0xD90F66u, 'r', 0}, | |
| {PTEST, XMM0, RM128, 0, 0x17380F66u, 'r', 0}, | |
| {PUNPCKHBW, XMM0, RM128, 0, 0x680F66u, 'r', 0}, | |
| {PUNPCKHDQ, XMM0, RM128, 0, 0x6A0F66u, 'r', 0}, | |
| {PUNPCKHQDQ, XMM0, RM128, 0, 0x6D0F66u, 'r', 0}, | |
| {PUNPCKHWD, XMM0, RM128, 0, 0x690F66u, 'r', 0}, | |
| {PUNPCKLBW, XMM0, RM128, 0, 0x600F66u, 'r', 0}, | |
| {PUNPCKLDQ, XMM0, RM128, 0, 0x620F66u, 'r', 0}, | |
| {PUNPCKLQDQ, XMM0, RM128, 0, 0x6C0F66u, 'r', 0}, | |
| {PUNPCKLWD, XMM0, RM128, 0, 0x610F66u, 'r', 0}, | |
| {PXOR, XMM0, RM128, 0, 0xEF0F66u, 'r', 0}, | |
| {RCPPS, XMM0, RM128, 0, 0x530Fu, 'r', 0}, | |
| {RCPSS, XMM0, RM128, 0, 0x530FF3u, 'r', 0}, | |
| {ROUNDPD, XMM0, RM128, IMM8, 0x093A0F66u, 'r', 0}, | |
| {ROUNDPS, XMM0, RM128, IMM8, 0x083A0F66u, 'r', 0}, | |
| {ROUNDSD, XMM0, RM128, IMM8, 0x0B3A0F66u, 'r', 0}, | |
| {ROUNDSS, XMM0, RM128, IMM8, 0x0A3A0F66u, 'r', 0}, | |
| {RSQRTPS, XMM0, RM128, 0, 0x520Fu, 'r', 0}, | |
| {RSQRTSS, XMM0, RM128, 0, 0x520FF3u, 'r', 0}, | |
| {SHUFPD, XMM0, RM128, IMM8, 0xC60F66u, 'r', 0}, | |
| {SHUFPS, XMM0, RM128, IMM8, 0xC60Fu, 'r', 0}, | |
| {SQRTPD, XMM0, RM128, 0, 0x510F66u, 'r', 0}, | |
| {SQRTPS, XMM0, RM128, 0, 0x510Fu, 'r', 0}, | |
| {SQRTSD, XMM0, RM128, 0, 0x510FF2u, 'r', 0}, | |
| {SQRTSS, XMM0, RM128, 0, 0x510FF3u, 'r', 0}, | |
| {SUBPD, XMM0, RM128, 0, 0x5C0F66u, 'r', 0}, | |
| {SUBPS, XMM0, RM128, 0, 0x5C0Fu, 'r', 0}, | |
| {SUBSD, XMM0, RM128, 0, 0x5C0FF2u, 'r', 0}, | |
| {SUBSS, XMM0, RM128, 0, 0x5C0FF3u, 'r', 0}, | |
| {UCOMISD, XMM0, RM128, 0, 0x2E0F66u, 'r', 0}, | |
| {UCOMISS, XMM0, RM128, 0, 0x2E0Fu, 'r', 0}, | |
| {UNKNOWN, 0, 0, 0, 0, ' ', 0}, | |
| }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #define _GNU_SOURCE | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <stdarg.h> | |
| #include <stdint.h> | |
| #include <sys/mman.h> | |
| typedef struct assembler_t { | |
| uint8_t *buffer; | |
| size_t position, size; | |
| } assembler; | |
| void assembler_init(assembler *as, size_t size) { | |
| as->size = size; | |
| as->position = 0; | |
| as->buffer = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | |
| } | |
| void assembler_finalize(assembler *as) { | |
| mprotect(as->buffer, as->size, PROT_EXEC | PROT_READ); | |
| } | |
| void assembler_free(assembler *as) { | |
| munmap(as->buffer, as->size); | |
| } | |
| int put_byte(assembler *as, uint8_t value) { | |
| if(as->position<as->size) { | |
| as->buffer[as->position++] = value; | |
| return 1; | |
| } else { | |
| return 0; | |
| } | |
| } | |
| uint8_t* get_pos_ptr(assembler *as) { | |
| return as->buffer + as->position; | |
| } | |
| int put_word(assembler *as, uint16_t value) { | |
| return put_byte(as, value&0xFFu) && put_byte(as, (value>>8u)&0xFFu); | |
| } | |
| int put_dword(assembler *as, uint32_t value) { | |
| return put_byte(as, value&0xFFu) && | |
| put_byte(as, (value>>8u)&0xFFu) && | |
| put_byte(as, (value>>16u)&0xFFu) && | |
| put_byte(as, (value>>24u)&0xFFu); | |
| } | |
| int put_qword(assembler *as, uint64_t value) { | |
| return put_byte(as, value&0xFFu) && | |
| put_byte(as, (value>>8u)&0xFFu) && | |
| put_byte(as, (value>>16u)&0xFFu) && | |
| put_byte(as, (value>>24u)&0xFFu) && | |
| put_byte(as, (value>>32u)&0xFFu) && | |
| put_byte(as, (value>>40u)&0xFFu) && | |
| put_byte(as, (value>>48u)&0xFFu) && | |
| put_byte(as, (value>>56u)&0xFFu); | |
| } | |
| typedef uint64_t optype_t; | |
| typedef struct { | |
| optype_t type; | |
| union { | |
| uint8_t immediate8; | |
| uint16_t immediate16; | |
| uint32_t immediate32; | |
| uint64_t immediate64; | |
| int8_t rel8off; | |
| int16_t rel16off; | |
| int32_t rel32off; | |
| uint64_t moffset; | |
| struct { | |
| uint8_t size_override; | |
| uint8_t rex; | |
| uint8_t modrm; | |
| uint8_t sib; | |
| union { | |
| int8_t disp8; | |
| int32_t disp32; | |
| } disp; | |
| } memory; | |
| } data; | |
| uint8_t **position; | |
| } opspec_t; | |
| // type 3 bits | |
| #define REG 0x01ull | |
| #define MEM 0x02ull | |
| #define RM 0x03ull | |
| #define IMM 0x04ull | |
| #define MOFFSET 0x05ull | |
| #define RELOFF 0x06ull | |
| #define RELOFF 0x06ull | |
| // width 3 bits | |
| #define BIT8 (0x01ull<<3ull) | |
| #define BIT16 (0x02ull<<3ull) | |
| #define BIT32 (0x03ull<<3ull) | |
| #define BIT64 (0x04ull<<3ull) | |
| #define BIT128 (0x05ull<<3ull) | |
| #define BIT256 (0x06ull<<3ull) | |
| // require exact register match | |
| #define EXACT_FLAG (0x01ull<<7ull) | |
| #define REG8 (REG | BIT8) | |
| #define REG16 (REG | BIT16) | |
| #define REG32 (REG | BIT32) | |
| #define REG64 (REG | BIT64) | |
| #define XMM0 (REG | BIT128) | |
| #define YMM0 (REG | BIT256) | |
| #define MEM8 (MEM | BIT8) | |
| #define MEM16 (MEM | BIT16) | |
| #define MEM32 (MEM | BIT32) | |
| #define MEM64 (MEM | BIT64) | |
| #define MEM128 (MEM | BIT128) | |
| #define MEM256 (MEM | BIT256) | |
| #define RM8 (RM | BIT8) | |
| #define RM16 (RM | BIT16) | |
| #define RM32 (RM | BIT32) | |
| #define RM64 (RM | BIT64) | |
| #define RM128 (RM | BIT128) | |
| #define IMM8 (IMM | BIT8) | |
| #define IMM16 (IMM | BIT16) | |
| #define IMM32 (IMM | BIT32) | |
| #define IMM64 (IMM | BIT64) | |
| #define MOFFSET8 (MOFFSET | BIT8) | |
| #define MOFFSET16 (MOFFSET | BIT16) | |
| #define MOFFSET32 (MOFFSET | BIT32) | |
| #define MOFFSET64 (MOFFSET | BIT64) | |
| #define REL8OFF (RELOFF | BIT8) | |
| #define REL16OFF (RELOFF | BIT16) | |
| #define REL32OFF (RELOFF | BIT32) | |
| #define REL64OFF (RELOFF | BIT64) | |
| opspec_t make_reg(optype_t type) { | |
| opspec_t result; | |
| result.type = type; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t IMMEDIATE8(uint8_t value) { | |
| opspec_t result; | |
| result.type = IMM8; | |
| result.data.immediate8 = value; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t IMMEDIATE16(uint16_t value) { | |
| opspec_t result; | |
| result.type = IMM16; | |
| result.data.immediate16 = value; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t IMMEDIATE32(uint32_t value) { | |
| opspec_t result; | |
| result.type = IMM32; | |
| result.data.immediate32 = value; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t IMMEDIATE64(uint64_t value) { | |
| opspec_t result; | |
| result.type = IMM64; | |
| result.data.immediate64 = value; | |
| result.position = NULL; | |
| return result; | |
| } | |
| #define Rb(i) make_reg(REG8 | i<<16ull) | |
| #define Rw(i) make_reg(REG16 | i<<16ull) | |
| #define Rd(i) make_reg(REG32 | i<<16ull) | |
| #define Rq(i) make_reg(REG64 | i<<16ull) | |
| #define XMM(i) make_reg(XMM0 | i<<16ull) | |
| #define RAX make_reg(REG64 | 0x00ull<<16ull) | |
| #define RCX make_reg(REG64 | 0x01ull<<16ull) | |
| #define RDX make_reg(REG64 | 0x02ull<<16ull) | |
| #define RBX make_reg(REG64 | 0x03ull<<16ull) | |
| #define RSP make_reg(REG64 | 0x04ull<<16ull) | |
| #define RBP make_reg(REG64 | 0x05ull<<16ull) | |
| #define RSI make_reg(REG64 | 0x06ull<<16ull) | |
| #define RDI make_reg(REG64 | 0x07ull<<16ull) | |
| #define EAX make_reg(REG32 | 0x00ull<<16ull) | |
| #define ECX make_reg(REG32 | 0x01ull<<16ull) | |
| #define EDX make_reg(REG32 | 0x02ull<<16ull) | |
| #define EBX make_reg(REG32 | 0x03ull<<16ull) | |
| #define ESP make_reg(REG32 | 0x04ull<<16ull) | |
| #define EBP make_reg(REG32 | 0x05ull<<16ull) | |
| #define ESI make_reg(REG32 | 0x06ull<<16ull) | |
| #define EDI make_reg(REG32 | 0x07ull<<16ull) | |
| #define AX make_reg(REG16 | 0x00ull<<16ull) | |
| #define CX make_reg(REG16 | 0x01ull<<16ull) | |
| #define DX make_reg(REG16 | 0x02ull<<16ull) | |
| #define BX make_reg(REG16 | 0x03ull<<16ull) | |
| #define SP make_reg(REG16 | 0x04ull<<16ull) | |
| #define BP make_reg(REG16 | 0x05ull<<16ull) | |
| #define SI make_reg(REG16 | 0x06ull<<16ull) | |
| #define DI make_reg(REG16 | 0x07ull<<16ull) | |
| #define AL make_reg(REG8 | 0x00ull<<16ull) | |
| #define CL make_reg(REG8 | 0x01ull<<16ull) | |
| #define DL make_reg(REG8 | 0x02ull<<16ull) | |
| #define BL make_reg(REG8 | 0x03ull<<16ull) | |
| #define AH make_reg(REG8 | 0x04ull<<16ull) | |
| #define CH make_reg(REG8 | 0x05ull<<16ull) | |
| #define DH make_reg(REG8 | 0x06ull<<16ull) | |
| #define BH make_reg(REG8 | 0x07ull<<16ull) | |
| #define EXACT_AL (REG8 | EXACT_FLAG) | |
| #define EXACT_AX (REG16 | EXACT_FLAG) | |
| #define EXACT_EAX (REG32 | EXACT_FLAG) | |
| #define EXACT_RAX (REG64 | EXACT_FLAG) | |
| #define OP_TYPE(op) (op & 7ull) | |
| #define OP_WIDTH(op) (op & (7ull<<3ull)) | |
| #define OP_TYPE_WIDTH(op) (op & 63ull) | |
| #define REGISTER_INDEX(op) (op >> 16ull) | |
| #define IS_EXACT(op) (op & EXACT_FLAG) | |
| #define NO_REX 0xFFu | |
| opspec_t MEMORY_INDEX_impl(optype_t type, uint8_t scale, optype_t index, optype_t base, int32_t disp) { | |
| opspec_t result; | |
| optype_t regidx = REGISTER_INDEX(index); | |
| optype_t regbase = REGISTER_INDEX(base); | |
| scale = ((scale&10u)?1u:0u)+((scale&12u)?2u:0u); | |
| result.type = type; | |
| result.data.memory.size_override = OP_WIDTH(index)==BIT32?0x67u:0x00; | |
| result.data.memory.rex = (regidx&8u) >> 2u | (regbase&8u) >> 3u; | |
| result.data.memory.modrm = 0x04; | |
| if((disp == (int8_t)disp && disp != 0) || (regidx&7u) == 5u) { | |
| result.data.memory.disp.disp8 = disp; | |
| result.data.memory.modrm |= 0x40u; | |
| } else if(disp != 0) { | |
| result.data.memory.disp.disp32 = disp; | |
| result.data.memory.modrm |= 0x80u; | |
| } | |
| result.data.memory.sib = scale<<6u | (regidx&7u)<<3u | (regbase&7u); | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t MEMORY_INDEX(optype_t type, uint8_t scale, opspec_t index, opspec_t base, int32_t disp) { | |
| return MEMORY_INDEX_impl(type, scale, index.type, base.type, disp); | |
| } | |
| opspec_t MEMORY(optype_t type, opspec_t reg, int32_t disp) { | |
| opspec_t result; | |
| optype_t regidx = REGISTER_INDEX(reg.type); | |
| if(regidx == 4u) { | |
| return MEMORY_INDEX_impl(type, 1, reg.type, reg.type, disp); | |
| } else if(regidx == 12u) { | |
| return MEMORY_INDEX_impl(type, 1, reg.type&(~0x80000ull), reg.type, disp); | |
| } else if(reg.type == 0) { | |
| result = MEMORY_INDEX_impl(type, 1, REG64 | 0x04ull<<16ull, REG64 | 0x05ull<<16ull, disp); | |
| result.data.memory.modrm = 4u; | |
| return result; | |
| } | |
| result.type = type; | |
| result.data.memory.size_override = OP_WIDTH(reg.type)==BIT32?0x67u:0x00; | |
| result.data.memory.rex = (regidx&8u) >> 3u; | |
| result.data.memory.modrm = (regidx&7u); | |
| if((disp == (int8_t)disp && disp != 0) || (regidx&7u) == 5u) { | |
| result.data.memory.disp.disp8 = disp; | |
| result.data.memory.modrm |= 0x40u; | |
| } else if(disp != 0) { | |
| result.data.memory.disp.disp32 = disp; | |
| result.data.memory.modrm |= 0x80u; | |
| } | |
| result.data.memory.sib = 0u; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t DISP(optype_t type, int32_t disp) { | |
| opspec_t result; | |
| result.type = type; | |
| result.data.memory.rex = 0; | |
| result.data.memory.modrm = 4u; | |
| result.data.memory.sib = 4u<<3u | 5u; | |
| result.data.memory.disp.disp32 = disp; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t DISP_RIP(optype_t type, int32_t disp) { | |
| opspec_t result; | |
| result.type = type; | |
| result.data.memory.rex = 0; | |
| result.data.memory.modrm = 5u; | |
| result.data.memory.sib = 0; | |
| result.data.memory.disp.disp32 = disp; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t MOFF(optype_t type, uint64_t offset) { | |
| opspec_t result; | |
| result.type = type; | |
| result.data.moffset = offset; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t REL8(int8_t offset) { | |
| opspec_t result; | |
| result.type = REL8OFF; | |
| result.data.rel8off = offset; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t REL16(int16_t offset) { | |
| opspec_t result; | |
| result.type = REL16OFF; | |
| result.data.rel16off = offset; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t REL32(int32_t offset) { | |
| opspec_t result; | |
| result.type = REL32OFF; | |
| result.data.rel32off = offset; | |
| result.position = NULL; | |
| return result; | |
| } | |
| opspec_t REL(int32_t offset) { | |
| if(offset == (int8_t)offset) { | |
| return REL8(offset); | |
| } else if(offset == (int16_t)offset) { | |
| return REL16(offset); | |
| } else { | |
| return REL32(offset); | |
| } | |
| } | |
| opspec_t MOFF8(uint64_t offset) { | |
| return MOFF(MOFFSET8, offset); | |
| } | |
| opspec_t MOFF16(uint64_t offset) { | |
| return MOFF(MOFFSET16, offset); | |
| } | |
| opspec_t MOFF32(uint64_t offset) { | |
| return MOFF(MOFFSET32, offset); | |
| } | |
| opspec_t MOFF64(uint64_t offset) { | |
| return MOFF(MOFFSET64, offset); | |
| } | |
| opspec_t MEMORY8(opspec_t reg, int32_t disp) { | |
| return MEMORY(MEM8, reg, disp); | |
| } | |
| opspec_t MEMORY16(opspec_t reg, int32_t disp) { | |
| return MEMORY(MEM16, reg, disp); | |
| } | |
| opspec_t MEMORY32(opspec_t reg, int32_t disp) { | |
| return MEMORY(MEM32, reg, disp); | |
| } | |
| opspec_t MEMORY64(opspec_t reg, int32_t disp) { | |
| return MEMORY(MEM64, reg, disp); | |
| } | |
| opspec_t MEMORY128(opspec_t reg, int32_t disp) { | |
| return MEMORY(MEM128, reg, disp); | |
| } | |
| opspec_t MEMORY_INDEX8(uint8_t scale, opspec_t index, opspec_t base, int32_t disp) { | |
| return MEMORY_INDEX(MEM8, scale, index, base, disp); | |
| } | |
| opspec_t MEMORY_INDEX16(uint8_t scale, opspec_t index, opspec_t base, int32_t disp) { | |
| return MEMORY_INDEX(MEM16, scale, index, base, disp); | |
| } | |
| opspec_t MEMORY_INDEX32(uint8_t scale, opspec_t index, opspec_t base, int32_t disp) { | |
| return MEMORY_INDEX(MEM32, scale, index, base, disp); | |
| } | |
| opspec_t MEMORY_INDEX64(uint8_t scale, opspec_t index, opspec_t base, int32_t disp) { | |
| return MEMORY_INDEX(MEM64, scale, index, base, disp); | |
| } | |
| opspec_t MEMORY_INDEX128(uint8_t scale, opspec_t index, opspec_t base, int32_t disp) { | |
| return MEMORY_INDEX(MEM128, scale, index, base, disp); | |
| } | |
| uint8_t calc_modrm_modrm(opspec_t op) { | |
| if(OP_TYPE(op.type) == REG) { | |
| return 0xC0u | (REGISTER_INDEX(op.type)&7u); | |
| } else { | |
| return op.data.memory.modrm; | |
| } | |
| } | |
| uint8_t calc_modrm_reg(opspec_t op) { | |
| return (REGISTER_INDEX(op.type)&7u) << 3u; | |
| } | |
| uint8_t calc_modrm_modrm_rex(opspec_t op) { | |
| if((op.type == 0) || (op.type & IMM)) { | |
| return 0u; | |
| } | |
| if(OP_TYPE(op.type) == REG) { | |
| return (REGISTER_INDEX(op.type)&8u)>>3u; | |
| } else { | |
| return op.data.memory.rex; | |
| } | |
| } | |
| uint8_t calc_modrm_reg_rex(opspec_t op) { | |
| if((op.type == 0) || (op.type & IMM)) { | |
| return 0u; | |
| } | |
| return (REGISTER_INDEX(op.type)&8u)>>1u; | |
| } | |
| #include "instruction_table.h" | |
| int type_width_match(optype_t a, optype_t b) { | |
| if(OP_WIDTH(a) != OP_WIDTH(b)) { | |
| return 0; | |
| } | |
| if((a & IMM) || (b & IMM)) { | |
| return a == b; | |
| } else { | |
| return OP_TYPE(a & b); | |
| } | |
| } | |
| int operand_match(optype_t a, optype_t b) { | |
| if(!(a && b)) { | |
| return a == b; | |
| } | |
| if(type_width_match(a, b)) { | |
| if(IS_EXACT(a) || IS_EXACT(b)) { | |
| return REGISTER_INDEX(a) == REGISTER_INDEX(b); | |
| }else { | |
| return 1; | |
| } | |
| } else { | |
| return 0; | |
| } | |
| } | |
| int find_instruction(mnemonic_t mnemonic, opspec_t op1, opspec_t op2, opspec_t op3) { | |
| for(int i = 0;instructions[i].mnemonic != UNKNOWN;++i) { | |
| if( | |
| instructions[i].mnemonic == mnemonic && | |
| operand_match(instructions[i].operand1, op1.type) && | |
| operand_match(instructions[i].operand2, op2.type) && | |
| operand_match(instructions[i].operand3, op3.type) | |
| ) { | |
| return i; | |
| } | |
| } | |
| return -1; | |
| } | |
| int put_immediate(assembler *as, opspec_t op) { | |
| if(op.position) { | |
| *op.position = get_pos_ptr(as); | |
| } | |
| if(op.type & IMM) { | |
| switch(OP_TYPE_WIDTH(op.type)) { | |
| case IMM8: return put_byte(as, op.data.immediate8); | |
| case IMM16: return put_word(as, op.data.immediate16); | |
| case IMM32: return put_dword(as, op.data.immediate32); | |
| case IMM64: return put_qword(as, op.data.immediate64); | |
| case MOFFSET8: | |
| case MOFFSET16: | |
| case MOFFSET32: | |
| case MOFFSET64: return put_qword(as, op.data.moffset); | |
| case REL8OFF: return put_byte(as, op.data.rel8off); | |
| case REL16OFF: return put_word(as, op.data.rel16off); | |
| case REL32OFF: return put_dword(as, op.data.rel32off); | |
| default: return 0; | |
| } | |
| } else if((OP_TYPE(op.type) == MEM)) { | |
| if(op.data.memory.modrm>>6u == 1u) { | |
| put_byte(as, op.data.memory.disp.disp8); | |
| } else if(op.data.memory.modrm>>6u == 2u) { | |
| put_dword(as, op.data.memory.disp.disp32); | |
| } else if(op.data.memory.modrm == 5 || | |
| (op.data.memory.modrm == 4 && op.data.memory.sib == (4u<<3u | 5u))) { | |
| put_dword(as, op.data.memory.disp.disp32); | |
| } | |
| } | |
| return 0; | |
| } | |
| int put_mandatory_prefixes(assembler *as, optype_t *opcode) { | |
| for(;;) { | |
| switch(*opcode&0xFFu) { | |
| case 0x66u: | |
| case 0x67u: | |
| case 0xF3u: | |
| case 0xF2u: break; | |
| default: return 1; | |
| } | |
| if(!put_byte(as, *opcode)) return 0; | |
| *opcode>>=8u; | |
| } | |
| } | |
| int put_sib(assembler *as, opspec_t op) { | |
| if(OP_TYPE(op.type) == MEM && (op.data.memory.modrm&7u) == 4u) { | |
| if(!put_byte(as, op.data.memory.sib)) return 0; | |
| } | |
| return 1; | |
| } | |
| int put_opcode(assembler *as, optype_t opcode, optype_t addition) { | |
| if((opcode&0xFFu) == 0x0Fu) { | |
| if(!put_byte(as, opcode)) return 0; | |
| opcode>>=8u; | |
| if((opcode&0xFFu) == 0x0Fu || (opcode&0xFFu) == 0x38u || (opcode&0xFFu) == 0x3Au) { | |
| if(!put_byte(as, opcode)) return 0; | |
| opcode>>=8u; | |
| } | |
| } | |
| if(!put_byte(as, opcode+addition)) return 0; | |
| return 1; | |
| } | |
| int put_op_fun(assembler *as, mnemonic_t mnemonic, opspec_t op1, opspec_t op2, opspec_t op3, ...) { | |
| int idx = find_instruction(mnemonic, op1, op2, op3); | |
| // exit if no fitting instruction is found | |
| if(idx<0) { | |
| return 0; | |
| } | |
| // if the first two operands are a Register RM pair make sure RM | |
| // is in operand 1 | |
| if((OP_TYPE(instructions[idx].operand1) == REG) && (OP_TYPE(instructions[idx].operand2) == RM)) { | |
| opspec_t tmp = op1; op1 = op2; op2 = tmp; | |
| } | |
| optype_t opcode = instructions[idx].opcode; | |
| // write out any mandatory prefixes included in the opcode | |
| put_mandatory_prefixes(as, &opcode); | |
| // 16bit operand size override | |
| if(OP_WIDTH(op1.type)==BIT16 || OP_WIDTH(op2.type)==BIT16) { | |
| put_byte(as, 0x66u); | |
| } | |
| if(OP_TYPE(op1.type)==MEM && op1.data.memory.size_override) { | |
| put_byte(as, op1.data.memory.size_override); | |
| } | |
| uint8_t rex = 0; | |
| if(instructions[idx].norex !=NO_REX && (OP_WIDTH(op1.type)==BIT64 || OP_WIDTH(op2.type)==BIT64)) { | |
| rex |= 0x08u; | |
| } | |
| rex |= calc_modrm_modrm_rex(op1) | calc_modrm_reg_rex(op2); | |
| if(rex) put_byte(as, 0x40u | rex); | |
| switch(instructions[idx].modrm) { | |
| case 'r': | |
| put_opcode(as, opcode, 0); | |
| put_byte(as, calc_modrm_modrm(op1) | calc_modrm_reg(op2)); | |
| put_sib(as, op1); | |
| break; | |
| case '0': case '1': case '2': case '3': | |
| case '4': case '5': case '6': case '7': | |
| put_opcode(as, opcode, 0); | |
| put_byte(as, calc_modrm_modrm(op1) | (instructions[idx].modrm-'0')<<3); | |
| put_sib(as, op1); | |
| break; | |
| case '+': | |
| put_opcode(as, opcode, REGISTER_INDEX(op1.type)&7u); | |
| break; | |
| case ' ': | |
| put_opcode(as, opcode, 0); | |
| break; | |
| } | |
| put_immediate(as, op1); | |
| put_immediate(as, op2); | |
| put_immediate(as, op3); | |
| return 1; | |
| } | |
| #define put_op(...) put_op_fun(__VA_ARGS__,make_reg(0),make_reg(0),make_reg(0)) | |
| int main(void) { | |
| assembler as; | |
| assembler_init(&as, 4096); | |
| put_op(&as, PUSH, RBP); | |
| put_op(&as, PUSH, RBX); | |
| put_op(&as, PUSH, Rq(11)); | |
| put_op(&as, PUSH, Rq(15)); | |
| put_op(&as, MOV, EAX, IMMEDIATE32(42)); | |
| put_op(&as, POP, Rq(15)); | |
| put_op(&as, POP, Rq(11)); | |
| put_op(&as, POP, RBX); | |
| put_op(&as, POP, RBP); | |
| put_op(&as, RET); | |
| put_op(&as, CMPPD, XMM(1), MEMORY128(RAX, 0), IMMEDIATE8(0)); | |
| put_op(&as, CMPPS, XMM(1), MEMORY128(RAX, 0), IMMEDIATE8(0)); | |
| put_op(&as, CMPSD, XMM(1), MEMORY128(RAX, 0), IMMEDIATE8(0)); | |
| put_op(&as, CMPSS, XMM(1), MEMORY128(RAX, 0), IMMEDIATE8(0)); | |
| put_op(&as, COMISD, XMM(1), MEMORY128(RAX, 0)); | |
| put_op(&as, COMISS, XMM(1), MEMORY128(RAX, 0)); | |
| put_op(&as, BLENDPD, XMM(1), XMM(13), IMMEDIATE8(0)); | |
| put_op(&as, BLENDPS, XMM(1), XMM(13), IMMEDIATE8(0)); | |
| put_op(&as, CVTSD2SI, EAX, XMM(13)); | |
| put_op(&as, CVTSD2SI, RAX, XMM(13)); | |
| put_op(&as, CVTSI2SD, XMM(13), EAX); | |
| put_op(&as, CVTSI2SD, XMM(13), RAX); | |
| put_op(&as, DIVPS, XMM(13), XMM(9)); | |
| put_op(&as, EXTRACTPS, ECX, XMM(9), IMMEDIATE8(0)); | |
| put_op(&as, PACKSSDW, XMM(13), XMM(9)); | |
| put_op(&as, PACKSSWB, XMM(13), XMM(9)); | |
| put_op(&as, PACKUSDW, XMM(13), XMM(9)); | |
| put_op(&as, PACKUSWB, XMM(13), XMM(9)); | |
| put_op(&as, PADDB, XMM(13), XMM(9)); | |
| put_op(&as, PADDW, XMM(13), XMM(9)); | |
| put_op(&as, PADDD, XMM(13), XMM(9)); | |
| put_op(&as, PADDQ, XMM(13), XMM(9)); | |
| put_op(&as, PADDSB, XMM(13), XMM(9)); | |
| put_op(&as, PADDSW, XMM(13), XMM(9)); | |
| put_op(&as, PADDUSB, XMM(13), XMM(9)); | |
| put_op(&as, PADDUSW, XMM(13), XMM(9)); | |
| put_op(&as, PINSRB, XMM(9), AL, IMMEDIATE8(0)); | |
| put_op(&as, PINSRW, XMM(9), AX, IMMEDIATE8(0)); | |
| put_op(&as, PINSRD, XMM(9), EAX, IMMEDIATE8(0)); | |
| put_op(&as, PINSRQ, XMM(9), RAX, IMMEDIATE8(0)); | |
| put_op(&as, PSHUFB, XMM(9), XMM(10)); | |
| assembler_finalize(&as); | |
| int (*func)() = (int(*)())as.buffer; | |
| printf("%d\n", func()); | |
| FILE *fp = fopen("out.bin", "wb"); | |
| fwrite(as.buffer, 1, as.position, fp); | |
| fclose(fp); | |
| system("ndisasm -b 64 out.bin"); | |
| assembler_free(&as); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment