From cb88c5d900e0c718185889a140807dbe8686703b Mon Sep 17 00:00:00 2001 From: David Schleef Date: Thu, 5 May 2011 19:30:23 -0700 Subject: [PATCH] x86insn: separate out opcode prefix --- orc/orccpuinsn.h | 1 + orc/orcx86insn.c | 517 ++++++++++++++++++++++++++----------------------------- 2 files changed, 245 insertions(+), 273 deletions(-) diff --git a/orc/orccpuinsn.h b/orc/orccpuinsn.h index 1ea3f97..6a8dea8 100644 --- a/orc/orccpuinsn.h +++ b/orc/orccpuinsn.h @@ -26,6 +26,7 @@ struct _OrcSysOpcode { char name[16]; int type; int flags; + orc_uint8 prefix; orc_uint32 code; int code2; }; diff --git a/orc/orcx86insn.c b/orc/orcx86insn.c index 0b73618..ca969f5 100644 --- a/orc/orcx86insn.c +++ b/orc/orcx86insn.c @@ -10,242 +10,242 @@ static const OrcSysOpcode orc_x86_opcodes[] = { - { "punpcklbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f60 }, - { "punpcklwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f61 }, - { "punpckldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f62 }, - { "packsswb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f63 }, - { "pcmpgtb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f64 }, - { "pcmpgtw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f65 }, - { "pcmpgtd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f66 }, - { "packuswb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f67 }, - { "punpckhbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f68 }, - { "punpckhwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f69 }, - { "punpckhdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f6a }, - { "packssdw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f6b }, - { "punpcklqdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f6c }, - { "punpckhqdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f6d }, - { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f6f }, - { "psraw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe1 }, - { "psrlw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd1 }, - { "psllw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff1 }, - { "psrad", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe2 }, - { "psrld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd2 }, - { "pslld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff2 }, - { "psrlq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd3 }, - { "psllq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff3 }, - { "psrldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f73 }, - { "pslldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f73 }, - { "psrlq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd3 }, - { "pcmpeqb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f74 }, - { "pcmpeqw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f75 }, - { "pcmpeqd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f76 }, - { "paddq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd4 }, - { "pmullw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd5 }, - { "psubusb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd8 }, - { "psubusw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fd9 }, - { "pminub", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fda }, - { "pand", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fdb }, - { "paddusb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fdc }, - { "paddusw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fdd }, - { "pmaxub", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fde }, - { "pandn", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fdf }, - { "pavgb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe0 }, - { "pavgw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe3 }, - { "pmulhuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe4 }, - { "pmulhw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe5 }, - { "psubsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe8 }, - { "psubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe9 }, - { "pminsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fea }, - { "por", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660feb }, - { "paddsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fec }, - { "paddsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fed }, - { "pmaxsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fee }, - { "pxor", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fef }, - { "pmuludq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff4 }, - { "pmaddwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff5 }, - { "psadbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff6 }, - { "psubb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff8 }, - { "psubw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ff9 }, - { "psubd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ffa }, - { "psubq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ffb }, - { "paddb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ffc }, - { "paddw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ffd }, - { "paddd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660ffe }, - { "pshufb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3800 }, - { "phaddw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3801 }, - { "phaddd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3802 }, - { "phaddsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3803 }, - { "pmaddubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3804 }, - { "phsubw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3805 }, - { "phsubd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3806 }, - { "phsubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3807 }, - { "psignb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3808 }, - { "psignw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3809 }, - { "psignd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f380a }, - { "pmulhrsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f380b }, - { "pabsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f381c }, - { "pabsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f381d }, - { "pabsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f381e }, - { "pmovsxbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3820 }, - { "pmovsxbd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3821 }, - { "pmovsxbq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3822 }, - { "pmovsxwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3823 }, - { "pmovsxwq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3824 }, - { "pmovsxdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3825 }, - { "pmuldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3828 }, - { "pcmpeqq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3829 }, - { "packusdw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f382b }, - { "pmovzxbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3830 }, - { "pmovzxbd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3831 }, - { "pmovzxbq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3832 }, - { "pmovzxwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3833 }, - { "pmovzxwq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3834 }, - { "pmovzxdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3835 }, - { "pmulld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3840 }, - { "phminposuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3841 }, - { "pminsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3838 }, - { "pminsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3839 }, - { "pminuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f383a }, - { "pminud", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f383b }, - { "pmaxsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f383c }, - { "pmaxsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f383d }, - { "pmaxuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f383e }, - { "pmaxud", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f383f }, - { "pcmpgtq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f3837 }, - { "addps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f58 }, - { "subps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f5c }, - { "mulps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f59 }, - { "divps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f5e }, - { "sqrtps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f51 }, - { "addpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f58 }, - { "subpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f5c }, - { "mulpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f59 }, - { "divpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f5e }, - { "sqrtpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f51 }, - { "cmpeqps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x0fc2, 0 }, - { "cmpeqpd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x660fc2, 0 }, - { "cmpltps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x0fc2, 1 }, - { "cmpltpd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x660fc2, 1 }, - { "cmpleps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x0fc2, 2 }, - { "cmplepd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x660fc2, 2 }, - { "cvttps2dq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf30f5b }, - { "cvttpd2dq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660fe6 }, - { "cvtdq2ps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f5b }, - { "cvtdq2pd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf30fe6 }, - { "cvtps2pd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f5a }, - { "cvtpd2ps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f5a }, - { "minps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f5d }, - { "minpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f5d }, - { "maxps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f5f }, - { "maxpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f5f }, - { "psraw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f71, 4 }, - { "psrlw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f71, 2 }, - { "psllw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f71, 6 }, - { "psrad", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f72, 4 }, - { "psrld", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f72, 2 }, - { "pslld", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f72, 6 }, - { "psrlq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f73, 2 }, - { "psllq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f73, 6 }, - { "psrldq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f73, 3 }, - { "pslldq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x660f73, 7 }, - { "pshufd", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0x660f70 }, - { "pshuflw", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0xf20f70 }, - { "pshufhw", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0xf30f70 }, - { "palignr", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0x660f3a0f }, - { "pinsrw", ORC_X86_INSN_TYPE_IMM8_REGM_MMX, 0, 0x660fc4 }, - { "movd", ORC_X86_INSN_TYPE_REGM_MMX, 0, 0x660f6e }, - { "movq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf30f7e }, - { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x660f6f }, - { "movdqu", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf30f6f }, - { "movhps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x0f16 }, - { "pextrw", ORC_X86_INSN_TYPE_IMM8_MMX_REG_REV, 0, 0x660f3a15 }, - { "movd", ORC_X86_INSN_TYPE_MMX_REGM_REV, 0, 0x660f7e }, - { "movq", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x660fd6 }, - { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x660f7f }, - { "movdqu", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0xf30f7f }, - { "movntdq", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x660fe7 }, - { "ldmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x0fae, 2 }, - { "stmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x0fae, 3 }, - { "add", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 0 }, - { "add", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 0 }, - { "add", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x03 }, - { "add", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x01 }, - { "or", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 1 }, - { "or", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 1 }, - { "or", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x0b }, - { "or", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x09 }, - { "adc", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 2 }, - { "adc", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 2 }, - { "adc", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x13 }, - { "adc", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x11 }, - { "sbb", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 3 }, - { "sbb", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 3 }, - { "sbb", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x1b }, - { "sbb", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x19 }, - { "and", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 4 }, - { "and", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 4 }, - { "and", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x23 }, - { "and", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x21 }, - { "sub", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 5 }, - { "sub", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 5 }, - { "sub", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x2b }, - { "sub", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x29 }, - { "xor", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 6 }, - { "xor", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 6 }, - { "xor", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x33 }, - { "xor", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x31 }, - { "cmp", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x83, 7 }, - { "cmp", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x81, 7 }, - { "cmp", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x3b }, - { "cmp", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x39 }, - { "jo", ORC_X86_INSN_TYPE_BRANCH, 0, 0x70 }, - { "jno", ORC_X86_INSN_TYPE_BRANCH, 0, 0x71 }, - { "jc", ORC_X86_INSN_TYPE_BRANCH, 0, 0x72 }, - { "jnc", ORC_X86_INSN_TYPE_BRANCH, 0, 0x73 }, - { "jz", ORC_X86_INSN_TYPE_BRANCH, 0, 0x74 }, - { "jnz", ORC_X86_INSN_TYPE_BRANCH, 0, 0x75 }, - { "jbe", ORC_X86_INSN_TYPE_BRANCH, 0, 0x76 }, - { "ja", ORC_X86_INSN_TYPE_BRANCH, 0, 0x77 }, - { "js", ORC_X86_INSN_TYPE_BRANCH, 0, 0x78 }, - { "jns", ORC_X86_INSN_TYPE_BRANCH, 0, 0x79 }, - { "jp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x7a }, - { "jnp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x7b }, - { "jl", ORC_X86_INSN_TYPE_BRANCH, 0, 0x7c }, - { "jge", ORC_X86_INSN_TYPE_BRANCH, 0, 0x7d }, - { "jle", ORC_X86_INSN_TYPE_BRANCH, 0, 0x7e }, - { "jg", ORC_X86_INSN_TYPE_BRANCH, 0, 0x7f }, - { "jmp", ORC_X86_INSN_TYPE_BRANCH, 0, 0xeb }, - { "", ORC_X86_INSN_TYPE_LABEL, 0, 0x00 }, - { "ret", ORC_X86_INSN_TYPE_NONE, 0, 0xc3 }, - { "retq", ORC_X86_INSN_TYPE_NONE, 0, 0xc3 }, - { "emms", ORC_X86_INSN_TYPE_NONE, 0, 0x0f77 }, - { "rdtsc", ORC_X86_INSN_TYPE_NONE, 0, 0x0f31 }, - { "nop", ORC_X86_INSN_TYPE_NONE, 0, 0x90 }, - { "rep movsb", ORC_X86_INSN_TYPE_NONE, 0, 0xf3a4 }, - { "rep movsw", ORC_X86_INSN_TYPE_NONE, 0, 0x66f3a5 }, - { "rep movsl", ORC_X86_INSN_TYPE_NONE, 0, 0xf3a5 }, - { "push", ORC_X86_INSN_TYPE_STACK, 0, 0x50 }, - { "pop", ORC_X86_INSN_TYPE_STACK, 0, 0x58 }, - { "movzx", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x0fb6 }, - { "movw", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x668b }, - { "movl", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x8b }, - { "mov", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x8b }, - { "mov", ORC_X86_INSN_TYPE_IMM32_REGM_MOV, 0, 0xb8 }, - { "movb", ORC_X86_INSN_TYPE_REG8_REGM, 0, 0x88 }, - { "movw", ORC_X86_INSN_TYPE_REG16_REGM, 0, 0x6689 }, - { "movl", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x89 }, - { "mov", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x89 }, - { "test", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x85 }, - { "testl", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0xf7, 0 }, - { "leal", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x8d }, - { "leaq", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x8d }, - { "imul", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x0faf }, - { "imul", ORC_X86_INSN_TYPE_REGM, 0, 0xf7, 5 }, - { "incl", ORC_X86_INSN_TYPE_REGM, 0, 0xff, 0 }, - { "decl", ORC_X86_INSN_TYPE_REGM, 0, 0xff, 1 }, - { "sar", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0xc1, 7 }, - { "sar", ORC_X86_INSN_TYPE_REGM, 0, 0xd1, 7 }, - { "and", ORC_X86_INSN_TYPE_IMM32_A, 0, 0x25, 4 }, + { "punpcklbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f60 }, + { "punpcklwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f61 }, + { "punpckldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f62 }, + { "packsswb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f63 }, + { "pcmpgtb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f64 }, + { "pcmpgtw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f65 }, + { "pcmpgtd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f66 }, + { "packuswb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f67 }, + { "punpckhbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f68 }, + { "punpckhwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f69 }, + { "punpckhdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f6a }, + { "packssdw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f6b }, + { "punpcklqdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f6c }, + { "punpckhqdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f6d }, + { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f6f }, + { "psraw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe1 }, + { "psrlw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd1 }, + { "psllw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff1 }, + { "psrad", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe2 }, + { "psrld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd2 }, + { "pslld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff2 }, + { "psrlq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd3 }, + { "psllq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff3 }, + { "psrldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f73 }, + { "pslldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f73 }, + { "psrlq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd3 }, + { "pcmpeqb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f74 }, + { "pcmpeqw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f75 }, + { "pcmpeqd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f76 }, + { "paddq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd4 }, + { "pmullw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd5 }, + { "psubusb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd8 }, + { "psubusw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fd9 }, + { "pminub", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fda }, + { "pand", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fdb }, + { "paddusb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fdc }, + { "paddusw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fdd }, + { "pmaxub", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fde }, + { "pandn", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fdf }, + { "pavgb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe0 }, + { "pavgw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe3 }, + { "pmulhuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe4 }, + { "pmulhw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe5 }, + { "psubsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe8 }, + { "psubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe9 }, + { "pminsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fea }, + { "por", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0feb }, + { "paddsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fec }, + { "paddsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fed }, + { "pmaxsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fee }, + { "pxor", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fef }, + { "pmuludq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff4 }, + { "pmaddwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff5 }, + { "psadbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff6 }, + { "psubb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff8 }, + { "psubw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ff9 }, + { "psubd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ffa }, + { "psubq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ffb }, + { "paddb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ffc }, + { "paddw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ffd }, + { "paddd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0ffe }, + { "pshufb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3800 }, + { "phaddw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3801 }, + { "phaddd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3802 }, + { "phaddsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3803 }, + { "pmaddubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3804 }, + { "phsubw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3805 }, + { "phsubd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3806 }, + { "phsubsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3807 }, + { "psignb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3808 }, + { "psignw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3809 }, + { "psignd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f380a }, + { "pmulhrsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f380b }, + { "pabsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f381c }, + { "pabsw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f381d }, + { "pabsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f381e }, + { "pmovsxbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3820 }, + { "pmovsxbd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3821 }, + { "pmovsxbq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3822 }, + { "pmovsxwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3823 }, + { "pmovsxwq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3824 }, + { "pmovsxdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3825 }, + { "pmuldq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3828 }, + { "pcmpeqq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3829 }, + { "packusdw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f382b }, + { "pmovzxbw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3830 }, + { "pmovzxbd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3831 }, + { "pmovzxbq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3832 }, + { "pmovzxwd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3833 }, + { "pmovzxwq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3834 }, + { "pmovzxdq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3835 }, + { "pmulld", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3840 }, + { "phminposuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3841 }, + { "pminsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3838 }, + { "pminsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3839 }, + { "pminuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f383a }, + { "pminud", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f383b }, + { "pmaxsb", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f383c }, + { "pmaxsd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f383d }, + { "pmaxuw", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f383e }, + { "pmaxud", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f383f }, + { "pcmpgtq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f3837 }, + { "addps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f58 }, + { "subps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5c }, + { "mulps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f59 }, + { "divps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5e }, + { "sqrtps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f51 }, + { "addpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f58 }, + { "subpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5c }, + { "mulpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f59 }, + { "divpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5e }, + { "sqrtpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f51 }, + { "cmpeqps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x00, 0x0fc2, 0 }, + { "cmpeqpd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x66, 0x0fc2, 0 }, + { "cmpltps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x00, 0x0fc2, 1 }, + { "cmpltpd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x66, 0x0fc2, 1 }, + { "cmpleps", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x00, 0x0fc2, 2 }, + { "cmplepd", ORC_X86_INSN_TYPE_SSEM_SSE, 0, 0x66, 0x0fc2, 2 }, + { "cvttps2dq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0f5b }, + { "cvttpd2dq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0fe6 }, + { "cvtdq2ps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5b }, + { "cvtdq2pd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0fe6 }, + { "cvtps2pd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5a }, + { "cvtpd2ps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5a }, + { "minps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5d }, + { "minpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5d }, + { "maxps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f5f }, + { "maxpd", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f5f }, + { "psraw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f71, 4 }, + { "psrlw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f71, 2 }, + { "psllw", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f71, 6 }, + { "psrad", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f72, 4 }, + { "psrld", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f72, 2 }, + { "pslld", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f72, 6 }, + { "psrlq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f73, 2 }, + { "psllq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f73, 6 }, + { "psrldq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f73, 3 }, + { "pslldq", ORC_X86_INSN_TYPE_IMM8_MMX_SHIFT, 0, 0x66, 0x0f73, 7 }, + { "pshufd", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0x66, 0x0f70 }, + { "pshuflw", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0xf2, 0x0f70 }, + { "pshufhw", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0xf3, 0x0f70 }, + { "palignr", ORC_X86_INSN_TYPE_IMM8_MMXM_MMX, 0, 0x66, 0x0f3a0f }, + { "pinsrw", ORC_X86_INSN_TYPE_IMM8_REGM_MMX, 0, 0x66, 0x0fc4 }, + { "movd", ORC_X86_INSN_TYPE_REGM_MMX, 0, 0x66, 0x0f6e }, + { "movq", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0f7e }, + { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x66, 0x0f6f }, + { "movdqu", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0xf3, 0x0f6f }, + { "movhps", ORC_X86_INSN_TYPE_MMXM_MMX, 0, 0x00, 0x0f16 }, + { "pextrw", ORC_X86_INSN_TYPE_IMM8_MMX_REG_REV, 0, 0x66, 0x0f3a15 }, + { "movd", ORC_X86_INSN_TYPE_MMX_REGM_REV, 0, 0x66, 0x0f7e }, + { "movq", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x66, 0x0fd6 }, + { "movdqa", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x66, 0x0f7f }, + { "movdqu", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0xf3, 0x0f7f }, + { "movntdq", ORC_X86_INSN_TYPE_MMXM_MMX_REV, 0, 0x66, 0x0fe7 }, + { "ldmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x00, 0x0fae, 2 }, + { "stmxcsr", ORC_X86_INSN_TYPE_MEM, 0, 0x00, 0x0fae, 3 }, + { "add", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 0 }, + { "add", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 0 }, + { "add", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x03 }, + { "add", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x01 }, + { "or", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 1 }, + { "or", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 1 }, + { "or", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x0b }, + { "or", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x09 }, + { "adc", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 2 }, + { "adc", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 2 }, + { "adc", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x13 }, + { "adc", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x11 }, + { "sbb", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 3 }, + { "sbb", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 3 }, + { "sbb", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x1b }, + { "sbb", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x19 }, + { "and", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 4 }, + { "and", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 4 }, + { "and", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x23 }, + { "and", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x21 }, + { "sub", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 5 }, + { "sub", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 5 }, + { "sub", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x2b }, + { "sub", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x29 }, + { "xor", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 6 }, + { "xor", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 6 }, + { "xor", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x33 }, + { "xor", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x31 }, + { "cmp", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0x83, 7 }, + { "cmp", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0x81, 7 }, + { "cmp", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x3b }, + { "cmp", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x39 }, + { "jo", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x70 }, + { "jno", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x71 }, + { "jc", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x72 }, + { "jnc", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x73 }, + { "jz", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x74 }, + { "jnz", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x75 }, + { "jbe", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x76 }, + { "ja", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x77 }, + { "js", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x78 }, + { "jns", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x79 }, + { "jp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7a }, + { "jnp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7b }, + { "jl", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7c }, + { "jge", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7d }, + { "jle", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7e }, + { "jg", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0x7f }, + { "jmp", ORC_X86_INSN_TYPE_BRANCH, 0, 0x00, 0xeb }, + { "", ORC_X86_INSN_TYPE_LABEL, 0, 0x00, 0x00 }, + { "ret", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0xc3 }, + { "retq", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0xc3 }, + { "emms", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0x0f77 }, + { "rdtsc", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0x0f31 }, + { "nop", ORC_X86_INSN_TYPE_NONE, 0, 0x00, 0x90 }, + { "rep movsb", ORC_X86_INSN_TYPE_NONE, 0, 0xf3, 0xa4 }, + { "rep movsw", ORC_X86_INSN_TYPE_NONE, 0, 0x66, 0xf3a5 }, + { "rep movsl", ORC_X86_INSN_TYPE_NONE, 0, 0xf3, 0xa5 }, + { "push", ORC_X86_INSN_TYPE_STACK, 0, 0x00, 0x50 }, + { "pop", ORC_X86_INSN_TYPE_STACK, 0, 0x00, 0x58 }, + { "movzx", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x0fb6 }, + { "movw", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x66, 0x8b }, + { "movl", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8b }, + { "mov", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8b }, + { "mov", ORC_X86_INSN_TYPE_IMM32_REGM_MOV, 0, 0x00, 0xb8 }, + { "movb", ORC_X86_INSN_TYPE_REG8_REGM, 0, 0x00, 0x88 }, + { "movw", ORC_X86_INSN_TYPE_REG16_REGM, 0, 0x66, 0x89 }, + { "movl", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x89 }, + { "mov", ORC_X86_INSN_TYPE_REG_REGM, 0, 0x00, 0x89 }, + { "test", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x85 }, + { "testl", ORC_X86_INSN_TYPE_IMM32_REGM, 0, 0x00, 0xf7, 0 }, + { "leal", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8d }, + { "leaq", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x8d }, + { "imul", ORC_X86_INSN_TYPE_REGM_REG, 0, 0x00, 0x0faf }, + { "imul", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xf7, 5 }, + { "incl", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xff, 0 }, + { "decl", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xff, 1 }, + { "sar", ORC_X86_INSN_TYPE_IMM8_REGM, 0, 0x00, 0xc1, 7 }, + { "sar", ORC_X86_INSN_TYPE_REGM, 0, 0x00, 0xd1, 7 }, + { "and", ORC_X86_INSN_TYPE_IMM32_A, 0, 0x00, 0x25, 4 }, }; static void @@ -254,46 +254,17 @@ output_opcode (OrcCompiler *p, const OrcSysOpcode *opcode, int size, { ORC_ASSERT(opcode->code != 0); - if (opcode->code & 0xff000000) { - if ((opcode->code & 0xff000000) == 0x66000000 || - (opcode->code & 0xff000000) == 0xf3000000 || - (opcode->code & 0xff000000) == 0xf2000000) { - *p->codeptr++ = (opcode->code >> 24) & 0xff; - orc_x86_emit_rex (p, size, dest, 0, src); - } else { - *p->codeptr++ = (opcode->code >> 24) & 0xff; - orc_x86_emit_rex (p, size, dest, 0, src); - } + if (opcode->prefix != 0) { + *p->codeptr++ = opcode->prefix; + } + orc_x86_emit_rex (p, size, dest, 0, src); + if (opcode->code & 0xff0000) { *p->codeptr++ = (opcode->code >> 16) & 0xff; + } + if (opcode->code & 0xff00) { *p->codeptr++ = (opcode->code >> 8) & 0xff; - *p->codeptr++ = (opcode->code >> 0) & 0xff; - } else if (opcode->code & 0xff0000) { - if ((opcode->code & 0xff0000) == 0x660000 || - (opcode->code & 0xff0000) == 0xf30000 || - (opcode->code & 0xff0000) == 0xf20000) { - *p->codeptr++ = (opcode->code >> 16) & 0xff; - orc_x86_emit_rex (p, size, dest, 0, src); - } else { - orc_x86_emit_rex (p, size, dest, 0, src); - *p->codeptr++ = (opcode->code >> 16) & 0xff; - } - *p->codeptr++ = (opcode->code >> 8) & 0xff; - *p->codeptr++ = (opcode->code >> 0) & 0xff; - } else if (opcode->code & 0xff00) { - if ((opcode->code & 0xff00) == 0x6600 || - (opcode->code & 0xff00) == 0xf300 || - (opcode->code & 0xff00) == 0xf200) { - *p->codeptr++ = (opcode->code >> 8) & 0xff; - orc_x86_emit_rex (p, size, dest, 0, src); - } else { - orc_x86_emit_rex (p, size, dest, 0, src); - *p->codeptr++ = (opcode->code >> 8) & 0xff; - } - *p->codeptr++ = (opcode->code >> 0) & 0xff; - } else { - orc_x86_emit_rex (p, size, dest, 0, src); - *p->codeptr++ = (opcode->code >> 0) & 0xff; } + *p->codeptr++ = (opcode->code >> 0) & 0xff; } void -- 2.7.4