x86insn: separate out opcode prefix
authorDavid Schleef <ds@schleef.org>
Fri, 6 May 2011 02:30:23 +0000 (19:30 -0700)
committerDavid Schleef <ds@schleef.org>
Thu, 12 May 2011 18:25:18 +0000 (11:25 -0700)
orc/orccpuinsn.h
orc/orcx86insn.c

index 1ea3f97..6a8dea8 100644 (file)
@@ -26,6 +26,7 @@ struct _OrcSysOpcode {
   char name[16];
   int type;
   int flags;
+  orc_uint8 prefix;
   orc_uint32 code;
   int code2;
 };
index 0b73618..ca969f5 100644 (file)
 
 
 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