gas/testsuite/
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
index 836cdf21efe63abf4ddaaa79eeb5958421eb3c2f..149bafb74e22f11024a928f51b4215c198854a60 100644 (file)
@@ -95,7 +95,7 @@ static void OP_Mwait (int, int);
 static void NOP_Fixup1 (int, int);
 static void NOP_Fixup2 (int, int);
 static void OP_3DNowSuffix (int, int);
-static void OP_SIMD_Suffix (int, int);
+static void CMP_Fixup (int, int);
 static void BadOp (void);
 static void REP_Fixup (int, int);
 static void CMPXCHG8B_Fixup (int, int);
@@ -236,6 +236,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define Md { OP_M, d_mode }
 #define Mp { OP_M, f_mode }            /* 32 or 48 bit memory operand for LDS, LES etc */
 #define Mq { OP_M, q_mode }
+#define Mx { OP_M, x_mode }
 #define Gb { OP_G, b_mode }
 #define Gv { OP_G, v_mode }
 #define Gd { OP_G, d_mode }
@@ -340,7 +341,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define EMCq { OP_EMC, q_mode }
 #define MXC { OP_MXC, 0 }
 #define OPSUF { OP_3DNowSuffix, 0 }
-#define OPSIMD { OP_SIMD_Suffix, 0 }
+#define CMP { CMP_Fixup, 0 }
 #define XMM0 { XMM_Fixup, 0 }
 
 /* Used handle "rep" prefix for string instructions.  */
@@ -361,225 +362,314 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define AFLAG 2
 #define DFLAG 1
 
-#define b_mode 1  /* byte operand */
-#define v_mode 2  /* operand size depends on prefixes */
-#define w_mode 3  /* word operand */
-#define d_mode 4  /* double word operand  */
-#define q_mode 5  /* quad word operand */
-#define t_mode 6  /* ten-byte operand */
-#define x_mode 7  /* 16-byte XMM operand */
-#define m_mode 8  /* d_mode in 32bit, q_mode in 64bit mode.  */
-#define cond_jump_mode 9
-#define loop_jcxz_mode 10
-#define dq_mode 11 /* operand size depends on REX prefixes.  */
-#define dqw_mode 12 /* registers like dq_mode, memory like w_mode.  */
-#define f_mode 13 /* 4- or 6-byte pointer operand */
-#define const_1_mode 14
-#define stack_v_mode 15 /* v_mode for stack-related opcodes.  */
-#define z_mode 16 /* non-quad operand size depends on prefixes */
-#define o_mode 17  /* 16-byte operand */
-#define dqb_mode 18 /* registers like dq_mode, memory like b_mode.  */
-#define dqd_mode 19 /* registers like dq_mode, memory like d_mode.  */
-
-/* Flags that are OR'ed into the bytemode field to pass extra information.  */
-#define DREX_OC1       0x4000  /* OC1 bit set */
-#define DREX_NO_OC0    0x2000  /* OC0 bit not used */
-#define DREX_MASK      0x6000  /* mask to delete */
-
-#define es_reg 100
-#define cs_reg 101
-#define ss_reg 102
-#define ds_reg 103
-#define fs_reg 104
-#define gs_reg 105
-
-#define eAX_reg 108
-#define eCX_reg 109
-#define eDX_reg 110
-#define eBX_reg 111
-#define eSP_reg 112
-#define eBP_reg 113
-#define eSI_reg 114
-#define eDI_reg 115
-
-#define al_reg 116
-#define cl_reg 117
-#define dl_reg 118
-#define bl_reg 119
-#define ah_reg 120
-#define ch_reg 121
-#define dh_reg 122
-#define bh_reg 123
-
-#define ax_reg 124
-#define cx_reg 125
-#define dx_reg 126
-#define bx_reg 127
-#define sp_reg 128
-#define bp_reg 129
-#define si_reg 130
-#define di_reg 131
-
-#define rAX_reg 132
-#define rCX_reg 133
-#define rDX_reg 134
-#define rBX_reg 135
-#define rSP_reg 136
-#define rBP_reg 137
-#define rSI_reg 138
-#define rDI_reg 139
-
-#define z_mode_ax_reg 149
-#define indir_dx_reg 150
-
-#define FLOATCODE 1
-#define USE_GROUPS 2
-#define USE_PREFIX_TABLE 3
-#define USE_X86_64_TABLE 4
-#define USE_3BYTE_TABLE 5
-#define USE_OPC_EXT_TABLE 6
-#define USE_OPC_EXT_RM_TABLE 7
-
-#define FLOAT    NULL, { { NULL, FLOATCODE } }
+/* byte operand */
+#define b_mode                 1
+/* operand size depends on prefixes */
+#define v_mode                 (b_mode + 1)
+/* word operand */
+#define w_mode                 (v_mode + 1)
+/* double word operand  */
+#define d_mode                 (w_mode + 1)
+/* quad word operand */
+#define q_mode                 (d_mode + 1)
+/* ten-byte operand */
+#define t_mode                 (q_mode + 1)
+/* 16-byte XMM operand */
+#define x_mode                 (t_mode + 1)
+/* d_mode in 32bit, q_mode in 64bit mode.  */
+#define m_mode                 (x_mode + 1)
+#define cond_jump_mode         (m_mode + 1)
+#define loop_jcxz_mode         (cond_jump_mode + 1)
+/* operand size depends on REX prefixes.  */
+#define dq_mode                        (loop_jcxz_mode + 1)
+/* registers like dq_mode, memory like w_mode.  */
+#define dqw_mode               (dq_mode + 1)
+/* 4- or 6-byte pointer operand */
+#define f_mode                 (dqw_mode + 1)
+#define const_1_mode           (f_mode + 1)
+/* v_mode for stack-related opcodes.  */
+#define stack_v_mode           (const_1_mode + 1)
+/* non-quad operand size depends on prefixes */
+#define z_mode                 (stack_v_mode + 1)
+/* 16-byte operand */
+#define o_mode                 (z_mode + 1)
+/* registers like dq_mode, memory like b_mode.  */
+#define dqb_mode               (o_mode + 1)
+/* registers like dq_mode, memory like d_mode.  */
+#define dqd_mode               (dqb_mode + 1)
+
+#define es_reg                 (dqd_mode + 1)
+#define cs_reg                 (es_reg + 1)
+#define ss_reg                 (cs_reg + 1)
+#define ds_reg                 (ss_reg + 1)
+#define fs_reg                 (ds_reg + 1)
+#define gs_reg                 (fs_reg + 1)
+
+#define eAX_reg                        (gs_reg + 1)
+#define eCX_reg                        (eAX_reg + 1)
+#define eDX_reg                        (eCX_reg + 1)
+#define eBX_reg                        (eDX_reg + 1)
+#define eSP_reg                        (eBX_reg + 1)
+#define eBP_reg                        (eSP_reg + 1)
+#define eSI_reg                        (eBP_reg + 1)
+#define eDI_reg                        (eSI_reg + 1)
+
+#define al_reg                 (eDI_reg + 1)
+#define cl_reg                 (al_reg + 1)
+#define dl_reg                 (cl_reg + 1)
+#define bl_reg                 (dl_reg + 1)
+#define ah_reg                 (bl_reg + 1)
+#define ch_reg                 (ah_reg + 1)
+#define dh_reg                 (ch_reg + 1)
+#define bh_reg                 (dh_reg + 1)
+
+#define ax_reg                 (bh_reg + 1)
+#define cx_reg                 (ax_reg + 1)
+#define dx_reg                 (cx_reg + 1)
+#define bx_reg                 (dx_reg + 1)
+#define sp_reg                 (bx_reg + 1)
+#define bp_reg                 (sp_reg + 1)
+#define si_reg                 (bp_reg + 1)
+#define di_reg                 (si_reg + 1)
+
+#define rAX_reg                        (di_reg + 1)
+#define rCX_reg                        (rAX_reg + 1)
+#define rDX_reg                        (rCX_reg + 1)
+#define rBX_reg                        (rDX_reg + 1)
+#define rSP_reg                        (rBX_reg + 1)
+#define rBP_reg                        (rSP_reg + 1)
+#define rSI_reg                        (rBP_reg + 1)
+#define rDI_reg                        (rSI_reg + 1)
+
+#define z_mode_ax_reg          (rDI_reg + 1)
+#define indir_dx_reg           (z_mode_ax_reg + 1)
+
+#define MAX_BYTEMODE   indir_dx_reg
+
+/* Flags that are OR'ed into the bytemode field to pass extra
+   information.  */
+#define DREX_OC1               0x10000 /* OC1 bit set */
+#define DREX_NO_OC0            0x20000 /* OC0 bit not used */
+#define DREX_MASK              0x40000 /* mask to delete */
+
+#if MAX_BYTEMODE >= DREX_OC1
+#error MAX_BYTEMODE must be less than DREX_OC1
+#endif
+
+#define FLOATCODE              1
+#define USE_REG_TABLE          (FLOATCODE + 1)
+#define USE_MOD_TABLE          (USE_REG_TABLE + 1)
+#define USE_RM_TABLE           (USE_MOD_TABLE + 1)
+#define USE_PREFIX_TABLE       (USE_RM_TABLE + 1)
+#define USE_X86_64_TABLE       (USE_PREFIX_TABLE + 1)
+#define USE_3BYTE_TABLE                (USE_X86_64_TABLE + 1)
+
+#define FLOAT                  NULL, { { NULL, FLOATCODE } }
 
 #define DIS386(T, I)           NULL, { { NULL, (T)}, { NULL,  (I) } }
-#define GRP(I)                 DIS386 (USE_GROUPS, (I))
-#define PREGRP(I)              DIS386 (USE_PREFIX_TABLE, (I))
+#define REG_TABLE(I)           DIS386 (USE_REG_TABLE, (I))
+#define MOD_TABLE(I)           DIS386 (USE_MOD_TABLE, (I))
+#define RM_TABLE(I)            DIS386 (USE_RM_TABLE, (I))
+#define PREFIX_TABLE(I)                DIS386 (USE_PREFIX_TABLE, (I))
 #define X86_64_TABLE(I)                DIS386 (USE_X86_64_TABLE, (I))
 #define THREE_BYTE_TABLE(I)    DIS386 (USE_3BYTE_TABLE, (I))
-#define OPC_EXT_TABLE(I)       DIS386 (USE_OPC_EXT_TABLE, (I))
-#define OPC_EXT_RM_TABLE(I)    DIS386 (USE_OPC_EXT_RM_TABLE, (I))
-
-#define GRP_80                 0
-#define GRP_81                 (GRP_80 + 1)
-#define GRP_82                 (GRP_81 + 1)
-#define GRP_8F                 (GRP_82 + 1)
-#define GRP_C0                 (GRP_8F + 1)
-#define GRP_C1                 (GRP_C0 + 1)
-#define GRP_C6                 (GRP_C1 + 1)
-#define GRP_C7                 (GRP_C6 + 1)
-#define GRP_D0                 (GRP_C7 + 1)
-#define GRP_D1                 (GRP_D0 + 1)
-#define GRP_D2                 (GRP_D1 + 1)
-#define GRP_D3                 (GRP_D2 + 1)
-#define GRP_F6                 (GRP_D3 + 1)
-#define GRP_F7                 (GRP_F6 + 1)
-#define GRP_FE                 (GRP_F7 + 1)
-#define GRP_FF                 (GRP_FE + 1)
-#define GRP_0F00               (GRP_FF + 1)
-#define GRP_0F01               (GRP_0F00 + 1)
-#define GRP_0F0E               (GRP_0F01 + 1)
-#define GRP_0F18               (GRP_0F0E + 1)
-#define GRP_0F71               (GRP_0F18 + 1)
-#define GRP_0F72               (GRP_0F71 + 1)
-#define GRP_0F73               (GRP_0F72 + 1)
-#define GRP_0FA6               (GRP_0F73 + 1)
-#define GRP_0FA7               (GRP_0FA6 + 1)
-#define GRP_0FAE               (GRP_0FA7 + 1)
-#define GRP_0FBA               (GRP_0FAE + 1)
-#define GRP_0FC7               (GRP_0FBA + 1)
-
-#define PREGRP_90              0
-#define PREGRP_0F10            (PREGRP_90 + 1)
-#define PREGRP_0F11            (PREGRP_0F10 + 1)
-#define PREGRP_0F12            (PREGRP_0F11 + 1)
-#define PREGRP_0F16            (PREGRP_0F12 + 1)
-#define PREGRP_0F2A            (PREGRP_0F16 + 1)
-#define PREGRP_0F2B            (PREGRP_0F2A + 1)
-#define PREGRP_0F2C            (PREGRP_0F2B + 1)
-#define PREGRP_0F2D            (PREGRP_0F2C + 1)
-#define PREGRP_0F2E            (PREGRP_0F2D + 1)
-#define PREGRP_0F2F            (PREGRP_0F2E + 1)
-#define PREGRP_0F51            (PREGRP_0F2F + 1)
-#define PREGRP_0F52            (PREGRP_0F51 + 1)
-#define PREGRP_0F53            (PREGRP_0F52 + 1)
-#define PREGRP_0F58            (PREGRP_0F53 + 1)
-#define PREGRP_0F59            (PREGRP_0F58 + 1)
-#define PREGRP_0F5A            (PREGRP_0F59 + 1)
-#define PREGRP_0F5B            (PREGRP_0F5A + 1)
-#define PREGRP_0F5C            (PREGRP_0F5B + 1)
-#define PREGRP_0F5D            (PREGRP_0F5C + 1)
-#define PREGRP_0F5E            (PREGRP_0F5D + 1)
-#define PREGRP_0F5F            (PREGRP_0F5E + 1)
-#define PREGRP_0F60            (PREGRP_0F5F + 1)
-#define PREGRP_0F61            (PREGRP_0F60 + 1)
-#define PREGRP_0F62            (PREGRP_0F61 + 1)
-#define PREGRP_0F6C            (PREGRP_0F62 + 1)
-#define PREGRP_0F6D            (PREGRP_0F6C + 1)
-#define PREGRP_0F6F            (PREGRP_0F6D + 1)
-#define PREGRP_0F70            (PREGRP_0F6F + 1)
-#define PREGRP_0F78            (PREGRP_0F70 + 1)
-#define PREGRP_0F79            (PREGRP_0F78 + 1)
-#define PREGRP_0F7C            (PREGRP_0F79 + 1)
-#define PREGRP_0F7D            (PREGRP_0F7C + 1)
-#define PREGRP_0F7E            (PREGRP_0F7D + 1)
-#define PREGRP_0F7F            (PREGRP_0F7E + 1)
-#define PREGRP_0FB8            (PREGRP_0F7F + 1)
-#define PREGRP_0FBD            (PREGRP_0FB8 + 1)
-#define PREGRP_0FC2            (PREGRP_0FBD + 1)
-#define PREGRP_0FD0            (PREGRP_0FC2 + 1)
-#define PREGRP_0FD6            (PREGRP_0FD0 + 1)
-#define PREGRP_0FE6            (PREGRP_0FD6 + 1)
-#define PREGRP_0FE7            (PREGRP_0FE6 + 1)
-#define PREGRP_0FF0            (PREGRP_0FE7 + 1)
-#define PREGRP_0FF7            (PREGRP_0FF0 + 1)
-#define PREGRP_0F3810          (PREGRP_0FF7 + 1)
-#define PREGRP_0F3814          (PREGRP_0F3810 + 1)
-#define PREGRP_0F3815          (PREGRP_0F3814 + 1)
-#define PREGRP_0F3817          (PREGRP_0F3815 + 1)
-#define PREGRP_0F3820          (PREGRP_0F3817 + 1)
-#define PREGRP_0F3821          (PREGRP_0F3820 + 1)
-#define PREGRP_0F3822          (PREGRP_0F3821 + 1)
-#define PREGRP_0F3823          (PREGRP_0F3822 + 1)
-#define PREGRP_0F3824          (PREGRP_0F3823 + 1)
-#define PREGRP_0F3825          (PREGRP_0F3824 + 1)
-#define PREGRP_0F3828          (PREGRP_0F3825 + 1)
-#define PREGRP_0F3829          (PREGRP_0F3828 + 1)
-#define PREGRP_0F382A          (PREGRP_0F3829 + 1)
-#define PREGRP_0F382B          (PREGRP_0F382A + 1)
-#define PREGRP_0F3830          (PREGRP_0F382B + 1)
-#define PREGRP_0F3831          (PREGRP_0F3830 + 1)
-#define PREGRP_0F3832          (PREGRP_0F3831 + 1)
-#define PREGRP_0F3833          (PREGRP_0F3832 + 1)
-#define PREGRP_0F3834          (PREGRP_0F3833 + 1)
-#define PREGRP_0F3835          (PREGRP_0F3834 + 1)
-#define PREGRP_0F3837          (PREGRP_0F3835 + 1)
-#define PREGRP_0F3838          (PREGRP_0F3837 + 1)
-#define PREGRP_0F3839          (PREGRP_0F3838 + 1)
-#define PREGRP_0F383A          (PREGRP_0F3839 + 1)
-#define PREGRP_0F383B          (PREGRP_0F383A + 1)
-#define PREGRP_0F383C          (PREGRP_0F383B + 1)
-#define PREGRP_0F383D          (PREGRP_0F383C + 1)
-#define PREGRP_0F383E          (PREGRP_0F383D + 1)
-#define PREGRP_0F383F          (PREGRP_0F383E + 1)
-#define PREGRP_0F3840          (PREGRP_0F383F + 1)
-#define PREGRP_0F3841          (PREGRP_0F3840 + 1)
-#define PREGRP_0F38F0          (PREGRP_0F3841 + 1)
-#define PREGRP_0F38F1          (PREGRP_0F38F0 + 1)
-#define PREGRP_0F3A08          (PREGRP_0F38F1 + 1)
-#define PREGRP_0F3A09          (PREGRP_0F3A08 + 1)
-#define PREGRP_0F3A0A          (PREGRP_0F3A09 + 1)
-#define PREGRP_0F3A0B          (PREGRP_0F3A0A + 1)
-#define PREGRP_0F3A0C          (PREGRP_0F3A0B + 1)
-#define PREGRP_0F3A0D          (PREGRP_0F3A0C + 1)
-#define PREGRP_0F3A0E          (PREGRP_0F3A0D + 1)
-#define PREGRP_0F3A14          (PREGRP_0F3A0E + 1)
-#define PREGRP_0F3A15          (PREGRP_0F3A14 + 1)
-#define PREGRP_0F3A16          (PREGRP_0F3A15 + 1)
-#define PREGRP_0F3A17          (PREGRP_0F3A16 + 1)
-#define PREGRP_0F3A20          (PREGRP_0F3A17 + 1)
-#define PREGRP_0F3A21          (PREGRP_0F3A20 + 1)
-#define PREGRP_0F3A22          (PREGRP_0F3A21 + 1)
-#define PREGRP_0F3A40          (PREGRP_0F3A22 + 1)
-#define PREGRP_0F3A41          (PREGRP_0F3A40 + 1)
-#define PREGRP_0F3A42          (PREGRP_0F3A41 + 1)
-#define PREGRP_0F3A60          (PREGRP_0F3A42 + 1)
-#define PREGRP_0F3A61          (PREGRP_0F3A60 + 1)
-#define PREGRP_0F3A62          (PREGRP_0F3A61 + 1)
-#define PREGRP_0F3A63          (PREGRP_0F3A62 + 1)
-#define PREGRP_0F73_REG_3      (PREGRP_0F3A63 + 1)
-#define PREGRP_0F73_REG_7      (PREGRP_0F73_REG_3 + 1)
-#define PREGRP_0FC7_REG_6      (PREGRP_0F73_REG_7 + 1)
+
+#define REG_80                 0
+#define REG_81                 (REG_80 + 1)
+#define REG_82                 (REG_81 + 1)
+#define REG_8F                 (REG_82 + 1)
+#define REG_C0                 (REG_8F + 1)
+#define REG_C1                 (REG_C0 + 1)
+#define REG_C6                 (REG_C1 + 1)
+#define REG_C7                 (REG_C6 + 1)
+#define REG_D0                 (REG_C7 + 1)
+#define REG_D1                 (REG_D0 + 1)
+#define REG_D2                 (REG_D1 + 1)
+#define REG_D3                 (REG_D2 + 1)
+#define REG_F6                 (REG_D3 + 1)
+#define REG_F7                 (REG_F6 + 1)
+#define REG_FE                 (REG_F7 + 1)
+#define REG_FF                 (REG_FE + 1)
+#define REG_0F00               (REG_FF + 1)
+#define REG_0F01               (REG_0F00 + 1)
+#define REG_0F0D               (REG_0F01 + 1)
+#define REG_0F18               (REG_0F0D + 1)
+#define REG_0F71               (REG_0F18 + 1)
+#define REG_0F72               (REG_0F71 + 1)
+#define REG_0F73               (REG_0F72 + 1)
+#define REG_0FA6               (REG_0F73 + 1)
+#define REG_0FA7               (REG_0FA6 + 1)
+#define REG_0FAE               (REG_0FA7 + 1)
+#define REG_0FBA               (REG_0FAE + 1)
+#define REG_0FC7               (REG_0FBA + 1)
+
+#define MOD_8D                 0
+#define MOD_0F01_REG_0         (MOD_8D + 1)
+#define MOD_0F01_REG_1         (MOD_0F01_REG_0 + 1)
+#define MOD_0F01_REG_2         (MOD_0F01_REG_1 + 1)
+#define MOD_0F01_REG_3         (MOD_0F01_REG_2 + 1)
+#define MOD_0F01_REG_7         (MOD_0F01_REG_3 + 1)
+#define MOD_0F12_PREFIX_0      (MOD_0F01_REG_7 + 1)
+#define MOD_0F13               (MOD_0F12_PREFIX_0 + 1)
+#define MOD_0F16_PREFIX_0      (MOD_0F13 + 1)
+#define MOD_0F17               (MOD_0F16_PREFIX_0 + 1)
+#define MOD_0F18_REG_0         (MOD_0F17 + 1)
+#define MOD_0F18_REG_1         (MOD_0F18_REG_0 + 1)
+#define MOD_0F18_REG_2         (MOD_0F18_REG_1 + 1)
+#define MOD_0F18_REG_3         (MOD_0F18_REG_2 + 1)
+#define MOD_0F20               (MOD_0F18_REG_3 + 1)
+#define MOD_0F21               (MOD_0F20 + 1)
+#define MOD_0F22               (MOD_0F21 + 1)
+#define MOD_0F23               (MOD_0F22 + 1)
+#define MOD_0F24               (MOD_0F23 + 1)
+#define MOD_0F26               (MOD_0F24 + 1)
+#define MOD_0F2B_PREFIX_0      (MOD_0F26 + 1)
+#define MOD_0F2B_PREFIX_1      (MOD_0F2B_PREFIX_0 + 1)
+#define MOD_0F2B_PREFIX_2      (MOD_0F2B_PREFIX_1 + 1)
+#define MOD_0F2B_PREFIX_3      (MOD_0F2B_PREFIX_2 + 1)
+#define MOD_0F51               (MOD_0F2B_PREFIX_3 + 1)
+#define MOD_0F71_REG_2         (MOD_0F51 + 1)
+#define MOD_0F71_REG_4         (MOD_0F71_REG_2 + 1)
+#define MOD_0F71_REG_6         (MOD_0F71_REG_4 + 1)
+#define MOD_0F72_REG_2         (MOD_0F71_REG_6 + 1)
+#define MOD_0F72_REG_4         (MOD_0F72_REG_2 + 1)
+#define MOD_0F72_REG_6         (MOD_0F72_REG_4 + 1)
+#define MOD_0F73_REG_2         (MOD_0F72_REG_6 + 1)
+#define MOD_0F73_REG_3         (MOD_0F73_REG_2 + 1)
+#define MOD_0F73_REG_6         (MOD_0F73_REG_3 + 1)
+#define MOD_0F73_REG_7         (MOD_0F73_REG_6 + 1)
+#define MOD_0FAE_REG_0         (MOD_0F73_REG_7 + 1)
+#define MOD_0FAE_REG_1         (MOD_0FAE_REG_0 + 1)
+#define MOD_0FAE_REG_2         (MOD_0FAE_REG_1 + 1)
+#define MOD_0FAE_REG_3         (MOD_0FAE_REG_2 + 1)
+#define MOD_0FAE_REG_4         (MOD_0FAE_REG_3 + 1)
+#define MOD_0FAE_REG_5         (MOD_0FAE_REG_4 + 1)
+#define MOD_0FAE_REG_6         (MOD_0FAE_REG_5 + 1)
+#define MOD_0FAE_REG_7         (MOD_0FAE_REG_6 + 1)
+#define MOD_0FB2               (MOD_0FAE_REG_7 + 1)
+#define MOD_0FB4               (MOD_0FB2 + 1)
+#define MOD_0FB5               (MOD_0FB4 + 1)
+#define MOD_0FC7_REG_6         (MOD_0FB5 + 1)
+#define MOD_0FC7_REG_7         (MOD_0FC7_REG_6 + 1)
+#define MOD_0FD7               (MOD_0FC7_REG_7 + 1)
+#define MOD_0FE7_PREFIX_2      (MOD_0FD7 + 1)
+#define MOD_0FF0_PREFIX_3      (MOD_0FE7_PREFIX_2 + 1)
+#define MOD_0F382A_PREFIX_2    (MOD_0FF0_PREFIX_3 + 1)
+#define MOD_62_32BIT           (MOD_0F382A_PREFIX_2 + 1)
+#define MOD_C4_32BIT           (MOD_62_32BIT + 1)
+#define MOD_C5_32BIT           (MOD_C4_32BIT + 1)
+
+#define RM_0F01_REG_0          0
+#define RM_0F01_REG_1          (RM_0F01_REG_0 + 1)
+#define RM_0F01_REG_2          (RM_0F01_REG_1 + 1)
+#define RM_0F01_REG_3          (RM_0F01_REG_2 + 1)
+#define RM_0F01_REG_7          (RM_0F01_REG_3 + 1)
+#define RM_0FAE_REG_5          (RM_0F01_REG_7 + 1)
+#define RM_0FAE_REG_6          (RM_0FAE_REG_5 + 1)
+#define RM_0FAE_REG_7          (RM_0FAE_REG_6 + 1)
+
+#define PREFIX_90              0
+#define PREFIX_0F10            (PREFIX_90 + 1)
+#define PREFIX_0F11            (PREFIX_0F10 + 1)
+#define PREFIX_0F12            (PREFIX_0F11 + 1)
+#define PREFIX_0F16            (PREFIX_0F12 + 1)
+#define PREFIX_0F2A            (PREFIX_0F16 + 1)
+#define PREFIX_0F2B            (PREFIX_0F2A + 1)
+#define PREFIX_0F2C            (PREFIX_0F2B + 1)
+#define PREFIX_0F2D            (PREFIX_0F2C + 1)
+#define PREFIX_0F2E            (PREFIX_0F2D + 1)
+#define PREFIX_0F2F            (PREFIX_0F2E + 1)
+#define PREFIX_0F51            (PREFIX_0F2F + 1)
+#define PREFIX_0F52            (PREFIX_0F51 + 1)
+#define PREFIX_0F53            (PREFIX_0F52 + 1)
+#define PREFIX_0F58            (PREFIX_0F53 + 1)
+#define PREFIX_0F59            (PREFIX_0F58 + 1)
+#define PREFIX_0F5A            (PREFIX_0F59 + 1)
+#define PREFIX_0F5B            (PREFIX_0F5A + 1)
+#define PREFIX_0F5C            (PREFIX_0F5B + 1)
+#define PREFIX_0F5D            (PREFIX_0F5C + 1)
+#define PREFIX_0F5E            (PREFIX_0F5D + 1)
+#define PREFIX_0F5F            (PREFIX_0F5E + 1)
+#define PREFIX_0F60            (PREFIX_0F5F + 1)
+#define PREFIX_0F61            (PREFIX_0F60 + 1)
+#define PREFIX_0F62            (PREFIX_0F61 + 1)
+#define PREFIX_0F6C            (PREFIX_0F62 + 1)
+#define PREFIX_0F6D            (PREFIX_0F6C + 1)
+#define PREFIX_0F6F            (PREFIX_0F6D + 1)
+#define PREFIX_0F70            (PREFIX_0F6F + 1)
+#define PREFIX_0F73_REG_3      (PREFIX_0F70 + 1)
+#define PREFIX_0F73_REG_7      (PREFIX_0F73_REG_3 + 1)
+#define PREFIX_0F78            (PREFIX_0F73_REG_7 + 1)
+#define PREFIX_0F79            (PREFIX_0F78 + 1)
+#define PREFIX_0F7C            (PREFIX_0F79 + 1)
+#define PREFIX_0F7D            (PREFIX_0F7C + 1)
+#define PREFIX_0F7E            (PREFIX_0F7D + 1)
+#define PREFIX_0F7F            (PREFIX_0F7E + 1)
+#define PREFIX_0FB8            (PREFIX_0F7F + 1)
+#define PREFIX_0FBD            (PREFIX_0FB8 + 1)
+#define PREFIX_0FC2            (PREFIX_0FBD + 1)
+#define PREFIX_0FC3            (PREFIX_0FC2 + 1)
+#define PREFIX_0FC7_REG_6      (PREFIX_0FC3 + 1)
+#define PREFIX_0FD0            (PREFIX_0FC7_REG_6 + 1)
+#define PREFIX_0FD6            (PREFIX_0FD0 + 1)
+#define PREFIX_0FE6            (PREFIX_0FD6 + 1)
+#define PREFIX_0FE7            (PREFIX_0FE6 + 1)
+#define PREFIX_0FF0            (PREFIX_0FE7 + 1)
+#define PREFIX_0FF7            (PREFIX_0FF0 + 1)
+#define PREFIX_0F3810          (PREFIX_0FF7 + 1)
+#define PREFIX_0F3814          (PREFIX_0F3810 + 1)
+#define PREFIX_0F3815          (PREFIX_0F3814 + 1)
+#define PREFIX_0F3817          (PREFIX_0F3815 + 1)
+#define PREFIX_0F3820          (PREFIX_0F3817 + 1)
+#define PREFIX_0F3821          (PREFIX_0F3820 + 1)
+#define PREFIX_0F3822          (PREFIX_0F3821 + 1)
+#define PREFIX_0F3823          (PREFIX_0F3822 + 1)
+#define PREFIX_0F3824          (PREFIX_0F3823 + 1)
+#define PREFIX_0F3825          (PREFIX_0F3824 + 1)
+#define PREFIX_0F3828          (PREFIX_0F3825 + 1)
+#define PREFIX_0F3829          (PREFIX_0F3828 + 1)
+#define PREFIX_0F382A          (PREFIX_0F3829 + 1)
+#define PREFIX_0F382B          (PREFIX_0F382A + 1)
+#define PREFIX_0F3830          (PREFIX_0F382B + 1)
+#define PREFIX_0F3831          (PREFIX_0F3830 + 1)
+#define PREFIX_0F3832          (PREFIX_0F3831 + 1)
+#define PREFIX_0F3833          (PREFIX_0F3832 + 1)
+#define PREFIX_0F3834          (PREFIX_0F3833 + 1)
+#define PREFIX_0F3835          (PREFIX_0F3834 + 1)
+#define PREFIX_0F3837          (PREFIX_0F3835 + 1)
+#define PREFIX_0F3838          (PREFIX_0F3837 + 1)
+#define PREFIX_0F3839          (PREFIX_0F3838 + 1)
+#define PREFIX_0F383A          (PREFIX_0F3839 + 1)
+#define PREFIX_0F383B          (PREFIX_0F383A + 1)
+#define PREFIX_0F383C          (PREFIX_0F383B + 1)
+#define PREFIX_0F383D          (PREFIX_0F383C + 1)
+#define PREFIX_0F383E          (PREFIX_0F383D + 1)
+#define PREFIX_0F383F          (PREFIX_0F383E + 1)
+#define PREFIX_0F3840          (PREFIX_0F383F + 1)
+#define PREFIX_0F3841          (PREFIX_0F3840 + 1)
+#define PREFIX_0F38F0          (PREFIX_0F3841 + 1)
+#define PREFIX_0F38F1          (PREFIX_0F38F0 + 1)
+#define PREFIX_0F3A08          (PREFIX_0F38F1 + 1)
+#define PREFIX_0F3A09          (PREFIX_0F3A08 + 1)
+#define PREFIX_0F3A0A          (PREFIX_0F3A09 + 1)
+#define PREFIX_0F3A0B          (PREFIX_0F3A0A + 1)
+#define PREFIX_0F3A0C          (PREFIX_0F3A0B + 1)
+#define PREFIX_0F3A0D          (PREFIX_0F3A0C + 1)
+#define PREFIX_0F3A0E          (PREFIX_0F3A0D + 1)
+#define PREFIX_0F3A14          (PREFIX_0F3A0E + 1)
+#define PREFIX_0F3A15          (PREFIX_0F3A14 + 1)
+#define PREFIX_0F3A16          (PREFIX_0F3A15 + 1)
+#define PREFIX_0F3A17          (PREFIX_0F3A16 + 1)
+#define PREFIX_0F3A20          (PREFIX_0F3A17 + 1)
+#define PREFIX_0F3A21          (PREFIX_0F3A20 + 1)
+#define PREFIX_0F3A22          (PREFIX_0F3A21 + 1)
+#define PREFIX_0F3A40          (PREFIX_0F3A22 + 1)
+#define PREFIX_0F3A41          (PREFIX_0F3A40 + 1)
+#define PREFIX_0F3A42          (PREFIX_0F3A41 + 1)
+#define PREFIX_0F3A60          (PREFIX_0F3A42 + 1)
+#define PREFIX_0F3A61          (PREFIX_0F3A60 + 1)
+#define PREFIX_0F3A62          (PREFIX_0F3A61 + 1)
+#define PREFIX_0F3A63          (PREFIX_0F3A62 + 1)
 
 #define X86_64_06              0
 #define X86_64_07              (X86_64_06 + 1)
@@ -615,62 +705,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define THREE_BYTE_0F38                (THREE_BYTE_0F25 + 1)
 #define THREE_BYTE_0F3A                (THREE_BYTE_0F38 + 1)
 #define THREE_BYTE_0F7A                (THREE_BYTE_0F3A + 1)
-#define THREE_BYTE_0FBA                (THREE_BYTE_0F7A + 1)
-
-#define OPC_EXT_8D             0
-#define OPC_EXT_0F13           (OPC_EXT_8D + 1)
-#define OPC_EXT_0F17           (OPC_EXT_0F13 + 1)
-#define OPC_EXT_0F20           (OPC_EXT_0F17 + 1)
-#define OPC_EXT_0F21           (OPC_EXT_0F20 + 1)
-#define OPC_EXT_0F22           (OPC_EXT_0F21 + 1)
-#define OPC_EXT_0F23           (OPC_EXT_0F22 + 1)
-#define OPC_EXT_0F24           (OPC_EXT_0F23 + 1)
-#define OPC_EXT_0F26           (OPC_EXT_0F24 + 1)
-#define OPC_EXT_0FB2           (OPC_EXT_0F26 + 1)
-#define OPC_EXT_0FB4           (OPC_EXT_0FB2 + 1)
-#define OPC_EXT_0FB5           (OPC_EXT_0FB4 + 1)
-#define OPC_EXT_0F01_REG_0     (OPC_EXT_0FB5 + 1)
-#define OPC_EXT_0F01_REG_1     (OPC_EXT_0F01_REG_0 + 1)
-#define OPC_EXT_0F01_REG_2     (OPC_EXT_0F01_REG_1 + 1)
-#define OPC_EXT_0F01_REG_3     (OPC_EXT_0F01_REG_2 + 1)
-#define OPC_EXT_0F01_REG_7     (OPC_EXT_0F01_REG_3 + 1)
-#define OPC_EXT_0F18_REG_0     (OPC_EXT_0F01_REG_7 + 1)
-#define OPC_EXT_0F18_REG_1     (OPC_EXT_0F18_REG_0 + 1)
-#define OPC_EXT_0F18_REG_2     (OPC_EXT_0F18_REG_1 + 1)
-#define OPC_EXT_0F18_REG_3     (OPC_EXT_0F18_REG_2 + 1)
-#define OPC_EXT_0F71_REG_2     (OPC_EXT_0F18_REG_3 + 1)
-#define OPC_EXT_0F71_REG_4     (OPC_EXT_0F71_REG_2 + 1)
-#define OPC_EXT_0F71_REG_6     (OPC_EXT_0F71_REG_4 + 1)
-#define OPC_EXT_0F72_REG_2     (OPC_EXT_0F71_REG_6 + 1)
-#define OPC_EXT_0F72_REG_4     (OPC_EXT_0F72_REG_2 + 1)
-#define OPC_EXT_0F72_REG_6     (OPC_EXT_0F72_REG_4 + 1)
-#define OPC_EXT_0F73_REG_2     (OPC_EXT_0F72_REG_6 + 1)
-#define OPC_EXT_0F73_REG_3     (OPC_EXT_0F73_REG_2 + 1)
-#define OPC_EXT_0F73_REG_6     (OPC_EXT_0F73_REG_3 + 1)
-#define OPC_EXT_0F73_REG_7     (OPC_EXT_0F73_REG_6 + 1)
-#define OPC_EXT_0FAE_REG_0     (OPC_EXT_0F73_REG_7 + 1)
-#define OPC_EXT_0FAE_REG_1     (OPC_EXT_0FAE_REG_0 + 1)
-#define OPC_EXT_0FAE_REG_2     (OPC_EXT_0FAE_REG_1 + 1)
-#define OPC_EXT_0FAE_REG_3     (OPC_EXT_0FAE_REG_2 + 1)
-#define OPC_EXT_0FAE_REG_5     (OPC_EXT_0FAE_REG_3 + 1)
-#define OPC_EXT_0FAE_REG_6     (OPC_EXT_0FAE_REG_5 + 1)
-#define OPC_EXT_0FAE_REG_7     (OPC_EXT_0FAE_REG_6 + 1)
-#define OPC_EXT_0FC7_REG_6     (OPC_EXT_0FAE_REG_7 + 1)
-#define OPC_EXT_0FC7_REG_7     (OPC_EXT_0FC7_REG_6 + 1)
-#define OPC_EXT_0F12_PREFIX_0  (OPC_EXT_0FC7_REG_7 + 1)
-#define OPC_EXT_0F16_PREFIX_0  (OPC_EXT_0F12_PREFIX_0 + 1)
-#define OPC_EXT_0FF0_PREFIX_3  (OPC_EXT_0F16_PREFIX_0 + 1)
-#define OPC_EXT_62_32BIT       (OPC_EXT_0FF0_PREFIX_3 + 1)
-#define OPC_EXT_C4_32BIT       (OPC_EXT_62_32BIT + 1)
-#define OPC_EXT_C5_32BIT       (OPC_EXT_C4_32BIT + 1)
-
-#define OPC_EXT_RM_0F01_REG_0  0
-#define OPC_EXT_RM_0F01_REG_1  (OPC_EXT_RM_0F01_REG_0 + 1)
-#define OPC_EXT_RM_0F01_REG_3  (OPC_EXT_RM_0F01_REG_1 + 1)
-#define OPC_EXT_RM_0F01_REG_7  (OPC_EXT_RM_0F01_REG_3 + 1)
-#define OPC_EXT_RM_0FAE_REG_5  (OPC_EXT_RM_0F01_REG_7 + 1)
-#define OPC_EXT_RM_0FAE_REG_6  (OPC_EXT_RM_0FAE_REG_5 + 1)
-#define OPC_EXT_RM_0FAE_REG_7  (OPC_EXT_RM_0FAE_REG_6 + 1)
+#define THREE_BYTE_0F7B                (THREE_BYTE_0F7A + 1)
 
 typedef void (*op_rtn) (int bytemode, int sizeflag);
 
@@ -687,24 +722,25 @@ struct dis386 {
    'A' => print 'b' if no register operands or suffix_always is true
    'B' => print 'b' if suffix_always is true
    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
-   .      size prefix
+         size prefix
    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
-   .      suffix_always is true
+         suffix_always is true
    'E' => print 'e' if 32-bit form of jcxz
    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
    'H' => print ",pt" or ",pn" branch hint
    'I' => honor following macro letter even in Intel mode (implemented only
-   .      for some of the macro letters)
+         for some of the macro letters)
    'J' => print 'l'
    'K' => print 'd' or 'q' if rex prefix is present.
    'L' => print 'l' if suffix_always is true
+   'M' => print 'r' if intel_mnemonic is false.
    'N' => print 'n' if instruction has no wait "prefix"
    'O' => print 'd' or 'o' (or 'q' in Intel mode)
    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
-   .      or suffix_always is true.  print 'q' if rex prefix is present.
-   'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
-   .      is true
+         or suffix_always is true.  print 'q' if rex prefix is present.
+   'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
+         is true
    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
    'S' => print 'w', 'l' or 'q' if suffix_always is true
    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
@@ -712,8 +748,15 @@ struct dis386 {
    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
    'X' => print 's', 'd' depending on data16 prefix (for XMM)
-   'Y' => 'q' if instruction has an REX 64bit overwrite prefix
+   'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
+         suffix_always is true.
    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
+   '!' => change condition from true to false or from false to true.
+   '%' => add 1 upper case letter to the macro.
+
+   2 upper case letter macros:
+   'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
+          or suffix_always is true
 
    Many of the above letters print nothing in Intel mode.  See "putop"
    for the details.
@@ -867,10 +910,10 @@ static const struct dis386 dis386[] = {
   { "jleH",            { Jb, XX, cond_jump_flag } },
   { "jgH",             { Jb, XX, cond_jump_flag } },
   /* 80 */
-  { GRP (GRP_80) },
-  { GRP (GRP_81) },
+  { REG_TABLE (REG_80) },
+  { REG_TABLE (REG_81) },
   { "(bad)",           { XX } },
-  { GRP (GRP_82) },
+  { REG_TABLE (REG_82) },
   { "testB",           { Eb, Gb } },
   { "testS",           { Ev, Gv } },
   { "xchgB",           { Eb, Gb } },
@@ -881,11 +924,11 @@ static const struct dis386 dis386[] = {
   { "movB",            { Gb, Eb } },
   { "movS",            { Gv, Ev } },
   { "movD",            { Sv, Sw } },
-  { OPC_EXT_TABLE (OPC_EXT_8D) },
+  { MOD_TABLE (MOD_8D) },
   { "movD",            { Sw, Sv } },
-  { GRP (GRP_8F) },
+  { REG_TABLE (REG_8F) },
   /* 90 */
-  { PREGRP (PREGRP_90) },
+  { PREFIX_TABLE (PREFIX_90) },
   { "xchgS",           { RMeCX, eAX } },
   { "xchgS",           { RMeDX, eAX } },
   { "xchgS",           { RMeBX, eAX } },
@@ -939,14 +982,14 @@ static const struct dis386 dis386[] = {
   { "movS",            { RMeSI, Iv64 } },
   { "movS",            { RMeDI, Iv64 } },
   /* c0 */
-  { GRP (GRP_C0) },
-  { GRP (GRP_C1) },
+  { REG_TABLE (REG_C0) },
+  { REG_TABLE (REG_C1) },
   { "retT",            { Iw } },
   { "retT",            { XX } },
   { X86_64_TABLE (X86_64_C4) },
   { X86_64_TABLE (X86_64_C5) },
-  { GRP (GRP_C6) },
-  { GRP (GRP_C7) },
+  { REG_TABLE (REG_C6) },
+  { REG_TABLE (REG_C7) },
   /* c8 */
   { "enterT",          { Iw, Ib } },
   { "leaveT",          { XX } },
@@ -957,10 +1000,10 @@ static const struct dis386 dis386[] = {
   { X86_64_TABLE (X86_64_CE) },
   { "iretP",           { XX } },
   /* d0 */
-  { GRP (GRP_D0) },
-  { GRP (GRP_D1) },
-  { GRP (GRP_D2) },
-  { GRP (GRP_D3) },
+  { REG_TABLE (REG_D0) },
+  { REG_TABLE (REG_D1) },
+  { REG_TABLE (REG_D2) },
+  { REG_TABLE (REG_D3) },
   { X86_64_TABLE (X86_64_D4) },
   { X86_64_TABLE (X86_64_D5) },
   { "(bad)",           { XX } },
@@ -999,8 +1042,8 @@ static const struct dis386 dis386[] = {
   { "(bad)",           { XX } },       /* repz */
   { "hlt",             { XX } },
   { "cmc",             { XX } },
-  { GRP (GRP_F6) },
-  { GRP (GRP_F7) },
+  { REG_TABLE (REG_F6) },
+  { REG_TABLE (REG_F7) },
   /* f8 */
   { "clc",             { XX } },
   { "stc",             { XX } },
@@ -1008,14 +1051,14 @@ static const struct dis386 dis386[] = {
   { "sti",             { XX } },
   { "cld",             { XX } },
   { "std",             { XX } },
-  { GRP (GRP_FE) },
-  { GRP (GRP_FF) },
+  { REG_TABLE (REG_FE) },
+  { REG_TABLE (REG_FF) },
 };
 
 static const struct dis386 dis386_twobyte[] = {
   /* 00 */
-  { GRP (GRP_0F00 ) },
-  { GRP (GRP_0F01 ) },
+  { REG_TABLE (REG_0F00 ) },
+  { REG_TABLE (REG_0F01 ) },
   { "larS",            { Gv, Ew } },
   { "lslS",            { Gv, Ew } },
   { "(bad)",           { XX } },
@@ -1028,45 +1071,45 @@ static const struct dis386 dis386_twobyte[] = {
   { "(bad)",           { XX } },
   { "ud2a",            { XX } },
   { "(bad)",           { XX } },
-  { GRP (GRP_0F0E) },
+  { REG_TABLE (REG_0F0D) },
   { "femms",           { XX } },
   { "",                        { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
   /* 10 */
-  { PREGRP (PREGRP_0F10) },
-  { PREGRP (PREGRP_0F11) },
-  { PREGRP (PREGRP_0F12) },
-  { OPC_EXT_TABLE (OPC_EXT_0F13) },
-  { "unpcklpX",                { XM, EXq } },
-  { "unpckhpX",                { XM, EXq } },
-  { PREGRP (PREGRP_0F16) },
-  { OPC_EXT_TABLE (OPC_EXT_0F17) },
+  { PREFIX_TABLE (PREFIX_0F10) },
+  { PREFIX_TABLE (PREFIX_0F11) },
+  { PREFIX_TABLE (PREFIX_0F12) },
+  { MOD_TABLE (MOD_0F13) },
+  { "unpcklpX",                { XM, EXx } },
+  { "unpckhpX",                { XM, EXx } },
+  { PREFIX_TABLE (PREFIX_0F16) },
+  { MOD_TABLE (MOD_0F17) },
   /* 18 */
-  { GRP (GRP_0F18) },
-  { "(bad)",           { XX } },
-  { "(bad)",           { XX } },
-  { "(bad)",           { XX } },
-  { "(bad)",           { XX } },
-  { "(bad)",           { XX } },
-  { "(bad)",           { XX } },
+  { REG_TABLE (REG_0F18) },
+  { "nopQ",            { Ev } },
+  { "nopQ",            { Ev } },
+  { "nopQ",            { Ev } },
+  { "nopQ",            { Ev } },
+  { "nopQ",            { Ev } },
+  { "nopQ",            { Ev } },
   { "nopQ",            { Ev } },
   /* 20 */
-  { OPC_EXT_TABLE (OPC_EXT_0F20) },
-  { OPC_EXT_TABLE (OPC_EXT_0F21) },
-  { OPC_EXT_TABLE (OPC_EXT_0F22) },
-  { OPC_EXT_TABLE (OPC_EXT_0F23) },
-  { OPC_EXT_TABLE (OPC_EXT_0F24) },
+  { MOD_TABLE (MOD_0F20) },
+  { MOD_TABLE (MOD_0F21) },
+  { MOD_TABLE (MOD_0F22) },
+  { MOD_TABLE (MOD_0F23) },
+  { MOD_TABLE (MOD_0F24) },
   { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
-  { OPC_EXT_TABLE (OPC_EXT_0F26) },
+  { MOD_TABLE (MOD_0F26) },
   { "(bad)",           { XX } },
   /* 28 */
   { "movapX",          { XM, EXx } },
-  { "movapX",          { EXx,  XM } },
-  { PREGRP (PREGRP_0F2A) },
-  { PREGRP (PREGRP_0F2B) },
-  { PREGRP (PREGRP_0F2C) },
-  { PREGRP (PREGRP_0F2D) },
-  { PREGRP (PREGRP_0F2E) },
-  { PREGRP (PREGRP_0F2F) },
+  { "movapX",          { EXx, XM } },
+  { PREFIX_TABLE (PREFIX_0F2A) },
+  { PREFIX_TABLE (PREFIX_0F2B) },
+  { PREFIX_TABLE (PREFIX_0F2C) },
+  { PREFIX_TABLE (PREFIX_0F2D) },
+  { PREFIX_TABLE (PREFIX_0F2E) },
+  { PREFIX_TABLE (PREFIX_0F2F) },
   /* 30 */
   { "wrmsr",           { XX } },
   { "rdtsc",           { XX } },
@@ -1075,7 +1118,7 @@ static const struct dis386 dis386_twobyte[] = {
   { "sysenter",                { XX } },
   { "sysexit",         { XX } },
   { "(bad)",           { XX } },
-  { "(bad)",           { XX } },
+  { "getsec",          { XX } },
   /* 38 */
   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
   { "(bad)",           { XX } },
@@ -1104,27 +1147,27 @@ static const struct dis386 dis386_twobyte[] = {
   { "cmovle",          { Gv, Ev } },
   { "cmovg",           { Gv, Ev } },
   /* 50 */
-  { "movmskpX",                { Gdq, XS } },
-  { PREGRP (PREGRP_0F51) },
-  { PREGRP (PREGRP_0F52) },
-  { PREGRP (PREGRP_0F53) },
+  { MOD_TABLE (MOD_0F51) },
+  { PREFIX_TABLE (PREFIX_0F51) },
+  { PREFIX_TABLE (PREFIX_0F52) },
+  { PREFIX_TABLE (PREFIX_0F53) },
   { "andpX",           { XM, EXx } },
   { "andnpX",          { XM, EXx } },
   { "orpX",            { XM, EXx } },
   { "xorpX",           { XM, EXx } },
   /* 58 */
-  { PREGRP (PREGRP_0F58) },
-  { PREGRP (PREGRP_0F59) },
-  { PREGRP (PREGRP_0F5A) },
-  { PREGRP (PREGRP_0F5B) },
-  { PREGRP (PREGRP_0F5C) },
-  { PREGRP (PREGRP_0F5D) },
-  { PREGRP (PREGRP_0F5E) },
-  { PREGRP (PREGRP_0F5F) },
+  { PREFIX_TABLE (PREFIX_0F58) },
+  { PREFIX_TABLE (PREFIX_0F59) },
+  { PREFIX_TABLE (PREFIX_0F5A) },
+  { PREFIX_TABLE (PREFIX_0F5B) },
+  { PREFIX_TABLE (PREFIX_0F5C) },
+  { PREFIX_TABLE (PREFIX_0F5D) },
+  { PREFIX_TABLE (PREFIX_0F5E) },
+  { PREFIX_TABLE (PREFIX_0F5F) },
   /* 60 */
-  { PREGRP (PREGRP_0F60) },
-  { PREGRP (PREGRP_0F61) },
-  { PREGRP (PREGRP_0F62) },
+  { PREFIX_TABLE (PREFIX_0F60) },
+  { PREFIX_TABLE (PREFIX_0F61) },
+  { PREFIX_TABLE (PREFIX_0F62) },
   { "packsswb",                { MX, EM } },
   { "pcmpgtb",         { MX, EM } },
   { "pcmpgtw",         { MX, EM } },
@@ -1135,28 +1178,28 @@ static const struct dis386 dis386_twobyte[] = {
   { "punpckhwd",       { MX, EM } },
   { "punpckhdq",       { MX, EM } },
   { "packssdw",                { MX, EM } },
-  { PREGRP (PREGRP_0F6C) },
-  { PREGRP (PREGRP_0F6D) },
+  { PREFIX_TABLE (PREFIX_0F6C) },
+  { PREFIX_TABLE (PREFIX_0F6D) },
   { "movK",            { MX, Edq } },
-  { PREGRP (PREGRP_0F6F) },
+  { PREFIX_TABLE (PREFIX_0F6F) },
   /* 70 */
-  { PREGRP (PREGRP_0F70) },
-  { GRP (GRP_0F71) },
-  { GRP (GRP_0F72) },
-  { GRP (GRP_0F73) },
+  { PREFIX_TABLE (PREFIX_0F70) },
+  { REG_TABLE (REG_0F71) },
+  { REG_TABLE (REG_0F72) },
+  { REG_TABLE (REG_0F73) },
   { "pcmpeqb",         { MX, EM } },
   { "pcmpeqw",         { MX, EM } },
   { "pcmpeqd",         { MX, EM } },
   { "emms",            { XX } },
   /* 78 */
-  { PREGRP (PREGRP_0F78) },
-  { PREGRP (PREGRP_0F79) },
+  { PREFIX_TABLE (PREFIX_0F78) },
+  { PREFIX_TABLE (PREFIX_0F79) },
   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
-  { THREE_BYTE_TABLE (THREE_BYTE_0FBA) },
-  { PREGRP (PREGRP_0F7C) },
-  { PREGRP (PREGRP_0F7D) },
-  { PREGRP (PREGRP_0F7E) },
-  { PREGRP (PREGRP_0F7F) },
+  { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
+  { PREFIX_TABLE (PREFIX_0F7C) },
+  { PREFIX_TABLE (PREFIX_0F7D) },
+  { PREFIX_TABLE (PREFIX_0F7E) },
+  { PREFIX_TABLE (PREFIX_0F7F) },
   /* 80 */
   { "joH",             { Jv, XX, cond_jump_flag } },
   { "jnoH",            { Jv, XX, cond_jump_flag } },
@@ -1200,8 +1243,8 @@ static const struct dis386 dis386_twobyte[] = {
   { "btS",             { Ev, Gv } },
   { "shldS",           { Ev, Gv, Ib } },
   { "shldS",           { Ev, Gv, CL } },
-  { GRP (GRP_0FA6) },
-  { GRP (GRP_0FA7) },
+  { REG_TABLE (REG_0FA6) },
+  { REG_TABLE (REG_0FA7) },
   /* a8 */
   { "pushT",           { gs } },
   { "popT",            { gs } },
@@ -1209,35 +1252,35 @@ static const struct dis386 dis386_twobyte[] = {
   { "btsS",            { Ev, Gv } },
   { "shrdS",           { Ev, Gv, Ib } },
   { "shrdS",           { Ev, Gv, CL } },
-  { GRP (GRP_0FAE) },
+  { REG_TABLE (REG_0FAE) },
   { "imulS",           { Gv, Ev } },
   /* b0 */
   { "cmpxchgB",                { Eb, Gb } },
   { "cmpxchgS",                { Ev, Gv } },
-  { OPC_EXT_TABLE (OPC_EXT_0FB2) },
+  { MOD_TABLE (MOD_0FB2) },
   { "btrS",            { Ev, Gv } },
-  { OPC_EXT_TABLE (OPC_EXT_0FB4) },
-  { OPC_EXT_TABLE (OPC_EXT_0FB5) },
+  { MOD_TABLE (MOD_0FB4) },
+  { MOD_TABLE (MOD_0FB5) },
   { "movz{bR|x}",      { Gv, Eb } },
   { "movz{wR|x}",      { Gv, Ew } }, /* yes, there really is movzww ! */
   /* b8 */
-  { PREGRP (PREGRP_0FB8) },
+  { PREFIX_TABLE (PREFIX_0FB8) },
   { "ud2b",            { XX } },
-  { GRP (GRP_0FBA) },
+  { REG_TABLE (REG_0FBA) },
   { "btcS",            { Ev, Gv } },
   { "bsfS",            { Gv, Ev } },
-  { PREGRP (PREGRP_0FBD) },
+  { PREFIX_TABLE (PREFIX_0FBD) },
   { "movs{bR|x}",      { Gv, Eb } },
   { "movs{wR|x}",      { Gv, Ew } }, /* yes, there really is movsww ! */
   /* c0 */
   { "xaddB",           { Eb, Gb } },
   { "xaddS",           { Ev, Gv } },
-  { PREGRP (PREGRP_0FC2) },
-  { "movntiS",         { Ev, Gv } },
+  { PREFIX_TABLE (PREFIX_0FC2) },
+  { PREFIX_TABLE (PREFIX_0FC3) },
   { "pinsrw",          { MX, Edqw, Ib } },
   { "pextrw",          { Gdq, MS, Ib } },
   { "shufpX",          { XM, EXx, Ib } },
-  { GRP (GRP_0FC7) },
+  { REG_TABLE (REG_0FC7) },
   /* c8 */
   { "bswap",           { RMeAX } },
   { "bswap",           { RMeCX } },
@@ -1248,14 +1291,14 @@ static const struct dis386 dis386_twobyte[] = {
   { "bswap",           { RMeSI } },
   { "bswap",           { RMeDI } },
   /* d0 */
-  { PREGRP (PREGRP_0FD0) },
+  { PREFIX_TABLE (PREFIX_0FD0) },
   { "psrlw",           { MX, EM } },
   { "psrld",           { MX, EM } },
   { "psrlq",           { MX, EM } },
   { "paddq",           { MX, EM } },
   { "pmullw",          { MX, EM } },
-  { PREGRP (PREGRP_0FD6) },
-  { "pmovmskb",                { Gdq, MS } },
+  { PREFIX_TABLE (PREFIX_0FD6) },
+  { MOD_TABLE (MOD_0FD7) },
   /* d8 */
   { "psubusb",         { MX, EM } },
   { "psubusw",         { MX, EM } },
@@ -1272,8 +1315,8 @@ static const struct dis386 dis386_twobyte[] = {
   { "pavgw",           { MX, EM } },
   { "pmulhuw",         { MX, EM } },
   { "pmulhw",          { MX, EM } },
-  { PREGRP (PREGRP_0FE6) },
-  { PREGRP (PREGRP_0FE7) },
+  { PREFIX_TABLE (PREFIX_0FE6) },
+  { PREFIX_TABLE (PREFIX_0FE7) },
   /* e8 */
   { "psubsb",          { MX, EM } },
   { "psubsw",          { MX, EM } },
@@ -1284,14 +1327,14 @@ static const struct dis386 dis386_twobyte[] = {
   { "pmaxsw",          { MX, EM } },
   { "pxor",            { MX, EM } },
   /* f0 */
-  { PREGRP (PREGRP_0FF0) },
+  { PREFIX_TABLE (PREFIX_0FF0) },
   { "psllw",           { MX, EM } },
   { "pslld",           { MX, EM } },
   { "psllq",           { MX, EM } },
   { "pmuludq",         { MX, EM } },
   { "pmaddwd",         { MX, EM } },
   { "psadbw",          { MX, EM } },
-  { PREGRP (PREGRP_0FF7) },
+  { PREFIX_TABLE (PREFIX_0FF7) },
   /* f8 */
   { "psubb",           { MX, EM } },
   { "psubw",           { MX, EM } },
@@ -1330,7 +1373,7 @@ static const unsigned char twobyte_has_modrm[256] = {
   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   /*       -------------------------------        */
   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
-  /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
+  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
@@ -1441,8 +1484,8 @@ static const char *att_index16[] = {
   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
 };
 
-static const struct dis386 grps[][8] = {
-  /* GRP_80 */
+static const struct dis386 reg_table[][8] = {
+  /* REG_80 */
   {
     { "addA",  { Eb, Ib } },
     { "orA",   { Eb, Ib } },
@@ -1453,7 +1496,7 @@ static const struct dis386 grps[][8] = {
     { "xorA",  { Eb, Ib } },
     { "cmpA",  { Eb, Ib } },
   },
-  /* GRP_81 */
+  /* REG_81 */
   {
     { "addQ",  { Ev, Iv } },
     { "orQ",   { Ev, Iv } },
@@ -1464,7 +1507,7 @@ static const struct dis386 grps[][8] = {
     { "xorQ",  { Ev, Iv } },
     { "cmpQ",  { Ev, Iv } },
   },
-  /* GRP_82 */
+  /* REG_82 */
   {
     { "addQ",  { Ev, sIb } },
     { "orQ",   { Ev, sIb } },
@@ -1475,7 +1518,7 @@ static const struct dis386 grps[][8] = {
     { "xorQ",  { Ev, sIb } },
     { "cmpQ",  { Ev, sIb } },
   },
-  /* GRP_8F */
+  /* REG_8F */
   {
     { "popU",  { stackEv } },
     { "(bad)", { XX } },
@@ -1486,7 +1529,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
   },
-  /* GRP_C0 */
+  /* REG_C0 */
   {
     { "rolA",  { Eb, Ib } },
     { "rorA",  { Eb, Ib } },
@@ -1497,7 +1540,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "sarA",  { Eb, Ib } },
   },
-  /* GRP_C1 */
+  /* REG_C1 */
   {
     { "rolQ",  { Ev, Ib } },
     { "rorQ",  { Ev, Ib } },
@@ -1508,7 +1551,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "sarQ",  { Ev, Ib } },
   },
-  /* GRP_C6 */
+  /* REG_C6 */
   {
     { "movA",  { Eb, Ib } },
     { "(bad)", { XX } },
@@ -1519,7 +1562,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
   },
-  /* GRP_C7 */
+  /* REG_C7 */
   {
     { "movQ",  { Ev, Iv } },
     { "(bad)", { XX } },
@@ -1530,7 +1573,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "(bad)",  { XX } },
   },
-  /* GRP_D0 */
+  /* REG_D0 */
   {
     { "rolA",  { Eb, I1 } },
     { "rorA",  { Eb, I1 } },
@@ -1541,7 +1584,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "sarA",  { Eb, I1 } },
   },
-  /* GRP_D1 */
+  /* REG_D1 */
   {
     { "rolQ",  { Ev, I1 } },
     { "rorQ",  { Ev, I1 } },
@@ -1552,7 +1595,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "sarQ",  { Ev, I1 } },
   },
-  /* GRP_D2 */
+  /* REG_D2 */
   {
     { "rolA",  { Eb, CL } },
     { "rorA",  { Eb, CL } },
@@ -1563,7 +1606,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "sarA",  { Eb, CL } },
   },
-  /* GRP_D3 */
+  /* REG_D3 */
   {
     { "rolQ",  { Ev, CL } },
     { "rorQ",  { Ev, CL } },
@@ -1574,10 +1617,10 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "sarQ",  { Ev, CL } },
   },
-  /* GRP_F6 */
+  /* REG_F6 */
   {
     { "testA", { Eb, Ib } },
-    { "(bad)", { Eb } },
+    { "(bad)", { XX } },
     { "notA",  { Eb } },
     { "negA",  { Eb } },
     { "mulA",  { Eb } },       /* Don't print the implicit %al register,  */
@@ -1585,7 +1628,7 @@ static const struct dis386 grps[][8] = {
     { "divA",  { Eb } },       /* mul/imul opcodes.  Do the same for div  */
     { "idivA", { Eb } },       /* and idiv for consistency.               */
   },
-  /* GRP_F7 */
+  /* REG_F7 */
   {
     { "testQ", { Ev, Iv } },
     { "(bad)", { XX } },
@@ -1596,7 +1639,7 @@ static const struct dis386 grps[][8] = {
     { "divQ",  { Ev } },
     { "idivQ", { Ev } },
   },
-  /* GRP_FE */
+  /* REG_FE */
   {
     { "incA",  { Eb } },
     { "decA",  { Eb } },
@@ -1607,7 +1650,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
   },
-  /* GRP_FF */
+  /* REG_FF */
   {
     { "incQ",  { Ev } },
     { "decQ",  { Ev } },
@@ -1618,7 +1661,7 @@ static const struct dis386 grps[][8] = {
     { "pushU", { stackEv } },
     { "(bad)", { XX } },
   },
-  /* GRP_0F00 */
+  /* REG_0F00 */
   {
     { "sldtD", { Sv } },
     { "strD",  { Sv } },
@@ -1629,18 +1672,18 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
   },
-  /* GRP_0F01 */
+  /* REG_0F01 */
   {
-    { OPC_EXT_TABLE (OPC_EXT_0F01_REG_0) },
-    { OPC_EXT_TABLE (OPC_EXT_0F01_REG_1) },
-    { OPC_EXT_TABLE (OPC_EXT_0F01_REG_2) },
-    { OPC_EXT_TABLE (OPC_EXT_0F01_REG_3) },
+    { MOD_TABLE (MOD_0F01_REG_0) },
+    { MOD_TABLE (MOD_0F01_REG_1) },
+    { MOD_TABLE (MOD_0F01_REG_2) },
+    { MOD_TABLE (MOD_0F01_REG_3) },
     { "smswD", { Sv } },
     { "(bad)", { XX } },
     { "lmsw",  { Ew } },
-    { OPC_EXT_TABLE (OPC_EXT_0F01_REG_7) },
+    { MOD_TABLE (MOD_0F01_REG_7) },
   },
-  /* GRP_0F0E */
+  /* REG_0F0D */
   {
     { "prefetch",      { Eb } },
     { "prefetchw",     { Eb } },
@@ -1651,51 +1694,51 @@ static const struct dis386 grps[][8] = {
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
   },
-  /* GRP_0F18 */
+  /* REG_0F18 */
   {
-    { OPC_EXT_TABLE (OPC_EXT_0F18_REG_0) },
-    { OPC_EXT_TABLE (OPC_EXT_0F18_REG_1) },
-    { OPC_EXT_TABLE (OPC_EXT_0F18_REG_2) },
-    { OPC_EXT_TABLE (OPC_EXT_0F18_REG_3) },
+    { MOD_TABLE (MOD_0F18_REG_0) },
+    { MOD_TABLE (MOD_0F18_REG_1) },
+    { MOD_TABLE (MOD_0F18_REG_2) },
+    { MOD_TABLE (MOD_0F18_REG_3) },
     { "(bad)", { XX } },
     { "(bad)", { XX } },
     { "(bad)", { XX } },
     { "(bad)", { XX } },
   },
-  /* GRP_0F71 */
+  /* REG_0F71 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F71_REG_2) },
+    { MOD_TABLE (MOD_0F71_REG_2) },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F71_REG_4) },
+    { MOD_TABLE (MOD_0F71_REG_4) },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F71_REG_6) },
+    { MOD_TABLE (MOD_0F71_REG_6) },
     { "(bad)", { XX } },
   },
-  /* GRP_0F72 */
+  /* REG_0F72 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F72_REG_2) },
+    { MOD_TABLE (MOD_0F72_REG_2) },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F72_REG_4) },
+    { MOD_TABLE (MOD_0F72_REG_4) },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F72_REG_6) },
+    { MOD_TABLE (MOD_0F72_REG_6) },
     { "(bad)", { XX } },
   },
-  /* GRP_0F73 */
+  /* REG_0F73 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F73_REG_2) },
-    { OPC_EXT_TABLE (OPC_EXT_0F73_REG_3) },
+    { MOD_TABLE (MOD_0F73_REG_2) },
+    { MOD_TABLE (MOD_0F73_REG_3) },
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0F73_REG_6) },
-    { OPC_EXT_TABLE (OPC_EXT_0F73_REG_7) },
+    { MOD_TABLE (MOD_0F73_REG_6) },
+    { MOD_TABLE (MOD_0F73_REG_7) },
   },
-  /* GRP_0FA6 */
+  /* REG_0FA6 */
   {
     { "montmul",       { { OP_0f07, 0 } } },
     { "xsha1",         { { OP_0f07, 0 } } },
@@ -1706,7 +1749,7 @@ static const struct dis386 grps[][8] = {
     { "(bad)",         { { OP_0f07, 0 } } },
     { "(bad)",         { { OP_0f07, 0 } } },
   },
-  /* GRP_0FA7 */
+  /* REG_0FA7 */
   {
     { "xstore-rng",    { { OP_0f07, 0 } } },
     { "xcrypt-ecb",    { { OP_0f07, 0 } } },
@@ -1717,18 +1760,18 @@ static const struct dis386 grps[][8] = {
     { "(bad)",         { { OP_0f07, 0 } } },
     { "(bad)",         { { OP_0f07, 0 } } },
   },
-  /* GRP_0FAE */
+  /* REG_0FAE */
   {
-    { OPC_EXT_TABLE (OPC_EXT_0FAE_REG_0) },
-    { OPC_EXT_TABLE (OPC_EXT_0FAE_REG_1) },
-    { OPC_EXT_TABLE (OPC_EXT_0FAE_REG_2) },
-    { OPC_EXT_TABLE (OPC_EXT_0FAE_REG_3) },
-    { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0FAE_REG_5) },
-    { OPC_EXT_TABLE (OPC_EXT_0FAE_REG_6) },
-    { OPC_EXT_TABLE (OPC_EXT_0FAE_REG_7) },
+    { MOD_TABLE (MOD_0FAE_REG_0) },
+    { MOD_TABLE (MOD_0FAE_REG_1) },
+    { MOD_TABLE (MOD_0FAE_REG_2) },
+    { MOD_TABLE (MOD_0FAE_REG_3) },
+    { MOD_TABLE (MOD_0FAE_REG_4) },
+    { MOD_TABLE (MOD_0FAE_REG_5) },
+    { MOD_TABLE (MOD_0FAE_REG_6) },
+    { MOD_TABLE (MOD_0FAE_REG_7) },
   },
-  /* GRP_0FBA */
+  /* REG_0FBA */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -1739,7 +1782,7 @@ static const struct dis386 grps[][8] = {
     { "btrQ",  { Ev, Ib } },
     { "btcQ",  { Ev, Ib } },
   },
-  /* GRP_0FC7 */
+  /* REG_0FC7 */
   {
     { "(bad)", { XX } },
     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
@@ -1747,13 +1790,13 @@ static const struct dis386 grps[][8] = {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { OPC_EXT_TABLE (OPC_EXT_0FC7_REG_6) },
-    { OPC_EXT_TABLE (OPC_EXT_0FC7_REG_7) },
+    { MOD_TABLE (MOD_0FC7_REG_6) },
+    { MOD_TABLE (MOD_0FC7_REG_7) },
   },
 };
 
-static const struct dis386 prefix_user_table[][4] = {
-  /* PREGRP_90 */
+static const struct dis386 prefix_table[][4] = {
+  /* PREFIX_90 */
   {
     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
     { "pause", { XX } },
@@ -1761,7 +1804,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F10 */
+  /* PREFIX_0F10 */
   {
     { "movups",        { XM, EXx } },
     { "movss", { XM, EXd } },
@@ -1769,47 +1812,47 @@ static const struct dis386 prefix_user_table[][4] = {
     { "movsd", { XM, EXq } },
   },
 
-  /* PREGRP_0F11 */
+  /* PREFIX_0F11 */
   {
-    { "movups",        { EXx,  XM } },
-    { "movss", { EXd,  XM } },
-    { "movupd",        { EXx,  XM } },
-    { "movsd", { EXq,  XM } },
+    { "movups",        { EXx, XM } },
+    { "movss", { EXd, XM } },
+    { "movupd",        { EXx, XM } },
+    { "movsd", { EXq, XM } },
   },
 
-  /* PREGRP_0F12 */
+  /* PREFIX_0F12 */
   {
-    { OPC_EXT_TABLE (OPC_EXT_0F12_PREFIX_0) },
+    { MOD_TABLE (MOD_0F12_PREFIX_0) },
     { "movsldup", { XM, EXx } },
     { "movlpd",        { XM, EXq } },
     { "movddup", { XM, EXq } },
   },
 
-  /* PREGRP_0F16 */
+  /* PREFIX_0F16 */
   {
-    { OPC_EXT_TABLE (OPC_EXT_0F16_PREFIX_0) },
+    { MOD_TABLE (MOD_0F16_PREFIX_0) },
     { "movshdup", { XM, EXx } },
     { "movhpd",        { XM, EXq } },
-    { "(bad)", { XM, EXq } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F2A */
+  /* PREFIX_0F2A */
   {
     { "cvtpi2ps", { XM, EMCq } },
-    { "cvtsi2ssY", { XM, Ev } },
+    { "cvtsi2ss%LQ", { XM, Ev } },
     { "cvtpi2pd", { XM, EMCq } },
-    { "cvtsi2sdY", { XM, Ev } },
+    { "cvtsi2sd%LQ", { XM, Ev } },
   },
 
-  /* PREGRP_0F2B */
+  /* PREFIX_0F2B */
   {
-    {"movntps", { Ev, XM } },
-    {"movntss", { Ed, XM } },
-    {"movntpd", { Ev, XM } },
-    {"movntsd", { Eq, XM } },
+    { MOD_TABLE (MOD_0F2B_PREFIX_0) },
+    { MOD_TABLE (MOD_0F2B_PREFIX_1) },
+    { MOD_TABLE (MOD_0F2B_PREFIX_2) },
+    { MOD_TABLE (MOD_0F2B_PREFIX_3) },
   },
 
-  /* PREGRP_0F2C */
+  /* PREFIX_0F2C */
   {
     { "cvttps2pi", { MXC, EXq } },
     { "cvttss2siY", { Gv, EXd } },
@@ -1817,7 +1860,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "cvttsd2siY", { Gv, EXq } },
   },
 
-  /* PREGRP_0F2D */
+  /* PREFIX_0F2D */
   {
     { "cvtps2pi", { MXC, EXq } },
     { "cvtss2siY", { Gv, EXd } },
@@ -1825,7 +1868,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "cvtsd2siY", { Gv, EXq } },
   },
 
-  /* PREGRP_0F2E */
+  /* PREFIX_0F2E */
   {
     { "ucomiss",{ XM, EXd } }, 
     { "(bad)", { XX } },
@@ -1833,7 +1876,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F2F */
+  /* PREFIX_0F2F */
   {
     { "comiss",        { XM, EXd } },
     { "(bad)", { XX } },
@@ -1841,7 +1884,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F51 */
+  /* PREFIX_0F51 */
   {
     { "sqrtps", { XM, EXx } },
     { "sqrtss", { XM, EXd } },
@@ -1849,23 +1892,23 @@ static const struct dis386 prefix_user_table[][4] = {
     { "sqrtsd",        { XM, EXq } },
   },
 
-  /* PREGRP_0F52 */
+  /* PREFIX_0F52 */
   {
     { "rsqrtps",{ XM, EXx } },
     { "rsqrtss",{ XM, EXd } },
-    { "(bad)", { XM, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F53 */
+  /* PREFIX_0F53 */
   {
     { "rcpps", { XM, EXx } },
     { "rcpss", { XM, EXd } },
-    { "(bad)", { XM, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F58 */
+  /* PREFIX_0F58 */
   {
     { "addps", { XM, EXx } },
     { "addss", { XM, EXd } },
@@ -1873,7 +1916,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "addsd", { XM, EXq } },
   },
 
-  /* PREGRP_0F59 */
+  /* PREFIX_0F59 */
   {
     { "mulps", { XM, EXx } },
     { "mulss", { XM, EXd } },
@@ -1881,7 +1924,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "mulsd", { XM, EXq } },
   },
 
-  /* PREGRP_0F5A */
+  /* PREFIX_0F5A */
   {
     { "cvtps2pd", { XM, EXq } },
     { "cvtss2sd", { XM, EXd } },
@@ -1889,15 +1932,15 @@ static const struct dis386 prefix_user_table[][4] = {
     { "cvtsd2ss", { XM, EXq } },
   },
 
-  /* PREGRP_0F5B */
+  /* PREFIX_0F5B */
   {
     { "cvtdq2ps", { XM, EXx } },
     { "cvttps2dq", { XM, EXx } },
     { "cvtps2dq", { XM, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F5C */
+  /* PREFIX_0F5C */
   {
     { "subps", { XM, EXx } },
     { "subss", { XM, EXd } },
@@ -1905,7 +1948,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "subsd", { XM, EXq } },
   },
 
-  /* PREGRP_0F5D */
+  /* PREFIX_0F5D */
   {
     { "minps", { XM, EXx } },
     { "minss", { XM, EXd } },
@@ -1913,7 +1956,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "minsd", { XM, EXq } },
   },
 
-  /* PREGRP_0F5E */
+  /* PREFIX_0F5E */
   {
     { "divps", { XM, EXx } },
     { "divss", { XM, EXd } },
@@ -1921,7 +1964,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "divsd", { XM, EXq } },
   },
 
-  /* PREGRP_0F5F */
+  /* PREFIX_0F5F */
   {
     { "maxps", { XM, EXx } },
     { "maxss", { XM, EXd } },
@@ -1929,7 +1972,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "maxsd", { XM, EXq } },
   },
 
-  /* PREGRP_0F60 */
+  /* PREFIX_0F60 */
   {
     { "punpcklbw",{ MX, EMd } },
     { "(bad)", { XX } },
@@ -1937,7 +1980,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F61 */
+  /* PREFIX_0F61 */
   {
     { "punpcklwd",{ MX, EMd } },
     { "(bad)", { XX } },
@@ -1945,7 +1988,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F62 */
+  /* PREFIX_0F62 */
   {
     { "punpckldq",{ MX, EMd } },
     { "(bad)", { XX } },
@@ -1953,31 +1996,31 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F6C */
+  /* PREFIX_0F6C */
   {
-    { "(bad)", { MX, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
     { "punpcklqdq", { XM, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F6D */
+  /* PREFIX_0F6D */
   {
-    { "(bad)", { MX, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
     { "punpckhqdq", { XM, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F6F */
+  /* PREFIX_0F6F */
   {
     { "movq",  { MX, EM } },
     { "movdqu",        { XM, EXx } },
     { "movdqa",        { XM, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F70 */
+  /* PREFIX_0F70 */
   {
     { "pshufw",        { MX, EM, Ib } },
     { "pshufhw",{ XM, EXx, Ib } },
@@ -1985,7 +2028,23 @@ static const struct dis386 prefix_user_table[][4] = {
     { "pshuflw",{ XM, EXx, Ib } },
   },
 
-  /* PREGRP_0F78 */
+  /* PREFIX_0F73_REG_3 */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { "psrldq",        { XS, Ib } },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_0F73_REG_7 */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { "pslldq",        { XS, Ib } },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_0F78 */
   {
     {"vmread", { Em, Gm } },
     {"(bad)",  { XX } },
@@ -1993,7 +2052,7 @@ static const struct dis386 prefix_user_table[][4] = {
     {"insertq",        { XM, XS, Ib, Ib } },
   },
 
-  /* PREGRP_0F79 */
+  /* PREFIX_0F79 */
   {
     {"vmwrite",        { Gm, Em } },
     {"(bad)",  { XX } },
@@ -2001,39 +2060,39 @@ static const struct dis386 prefix_user_table[][4] = {
     {"insertq",        { XM, XS } },
   },
 
-  /* PREGRP_0F7C */
+  /* PREFIX_0F7C */
   {
-    { "(bad)", { MX, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
     { "haddpd",        { XM, EXx } },
     { "haddps",        { XM, EXx } },
   },
 
-  /* PREGRP_0F7D */
+  /* PREFIX_0F7D */
   {
-    { "(bad)", { MX, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
     { "hsubpd",        { XM, EXx } },
     { "hsubps",        { XM, EXx } },
   },
 
-  /* PREGRP_0F7E */
+  /* PREFIX_0F7E */
   {
     { "movK",  { Edq, MX } },
     { "movq",  { XM, EXq } },
     { "movK",  { Edq, XM } },
-    { "(bad)", { Ed, XM } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F7F */
+  /* PREFIX_0F7F */
   {
     { "movq",  { EM, MX } },
-    { "movdqu",        { EXx,  XM } },
-    { "movdqa",        { EXx,  XM } },
-    { "(bad)", { EXx,  XM } },
+    { "movdqu",        { EXx, XM } },
+    { "movdqa",        { EXx, XM } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0FB8 */
+  /* PREFIX_0FB8 */
   {
     { "(bad)", { XX } },
     { "popcntS", { Gv, Ev } },
@@ -2041,7 +2100,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0FBD */
+  /* PREFIX_0FBD */
   {
     { "bsrS",  { Gv, Ev } },
     { "lzcntS",        { Gv, Ev } },
@@ -2049,79 +2108,95 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0FC2 */
+  /* PREFIX_0FC2 */
+  {
+    { "cmpps", { XM, EXx, CMP } },
+    { "cmpss", { XM, EXd, CMP } },
+    { "cmppd", { XM, EXx, CMP } },
+    { "cmpsd", { XM, EXq, CMP } },
+  },
+
+  /* PREFIX_0FC3 */
+  {
+    { "movntiS", { Ma, Gv } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_0FC7_REG_6 */
   {
-    { "", { XM, EXx, OPSIMD } },       /* See OP_SIMD_SUFFIX.  */
-    { "", { XM, EXd, OPSIMD } },
-    { "", { XM, EXx, OPSIMD } },
-    { "", { XM, EXq, OPSIMD } },
+    { "vmptrld",{ Mq } },
+    { "vmxon", { Mq } },
+    { "vmclear",{ Mq } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0FD0 */
+  /* PREFIX_0FD0 */
   {
-    { "(bad)", { MX, EXx } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
     { "addsubpd", { XM, EXx } },
     { "addsubps", { XM, EXx } },
   },
 
-  /* PREGRP_0FD6 */
+  /* PREFIX_0FD6 */
   {
-    { "(bad)", { EXx,  XM } },
+    { "(bad)", { XX } },
     { "movq2dq",{ XM, MS } },
     { "movq",  { EXq, XM } },
     { "movdq2q",{ MX, XS } },
   },
 
-  /* PREGRP_0FE6 */
+  /* PREFIX_0FE6 */
   {
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
     { "cvtdq2pd", { XM, EXq } },
     { "cvttpd2dq", { XM, EXx } },
     { "cvtpd2dq", { XM, EXx } },
   },
 
-  /* PREGRP_0FE7 */
+  /* PREFIX_0FE7 */
   {
-    { "movntq",        { EM, MX } },
-    { "(bad)", { EM, XM } },
-    { "movntdq",{ EM, XM } },
-    { "(bad)", { EM, XM } },
+    { "movntq",        { Mq, MX } },
+    { "(bad)", { XX } },
+    { MOD_TABLE (MOD_0FE7_PREFIX_2) },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0FF0 */
+  /* PREFIX_0FF0 */
   {
-    { "(bad)", { XM, EXx } },
-    { "(bad)", { XM, EXx } },
-    { "(bad)", { XM, EXx } },
-    { OPC_EXT_TABLE (OPC_EXT_0FF0_PREFIX_3) },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { MOD_TABLE (MOD_0FF0_PREFIX_3) },
   },
 
-  /* PREGRP_0FF7 */
+  /* PREFIX_0FF7 */
   {
     { "maskmovq", { MX, MS } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
     { "maskmovdqu", { XM, XS } },
-    { "(bad)", { XM, EXx } },
+    { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3810 */
+  /* PREFIX_0F3810 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "pblendvb", {XM, EXx, XMM0 } },
+    { "pblendvb", { XM, EXx, XMM0 } },
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3814 */
+  /* PREFIX_0F3814 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "blendvps", {XM, EXx, XMM0 } },
+    { "blendvps", { XM, EXx, XMM0 } },
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3815 */
+  /* PREFIX_0F3815 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2129,7 +2204,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3817 */
+  /* PREFIX_0F3817 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2137,7 +2212,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3820 */
+  /* PREFIX_0F3820 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2145,7 +2220,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3821 */
+  /* PREFIX_0F3821 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2153,7 +2228,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3822 */
+  /* PREFIX_0F3822 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2161,7 +2236,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3823 */
+  /* PREFIX_0F3823 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2169,7 +2244,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3824 */
+  /* PREFIX_0F3824 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2177,7 +2252,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3825 */
+  /* PREFIX_0F3825 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2185,7 +2260,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3828 */
+  /* PREFIX_0F3828 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2193,7 +2268,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3829 */
+  /* PREFIX_0F3829 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2201,15 +2276,15 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F382A */
+  /* PREFIX_0F382A */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "movntdqa", { XM, EM } },
+    { MOD_TABLE (MOD_0F382A_PREFIX_2) },
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F382B */
+  /* PREFIX_0F382B */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2217,7 +2292,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3830 */
+  /* PREFIX_0F3830 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2225,7 +2300,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3831 */
+  /* PREFIX_0F3831 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2233,7 +2308,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3832 */
+  /* PREFIX_0F3832 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2241,7 +2316,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3833 */
+  /* PREFIX_0F3833 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2249,7 +2324,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3834 */
+  /* PREFIX_0F3834 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2257,7 +2332,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3835 */
+  /* PREFIX_0F3835 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2265,7 +2340,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3837 */
+  /* PREFIX_0F3837 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2273,7 +2348,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3838 */
+  /* PREFIX_0F3838 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2281,7 +2356,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3839 */
+  /* PREFIX_0F3839 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2289,7 +2364,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F383A */
+  /* PREFIX_0F383A */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2297,7 +2372,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F383B */
+  /* PREFIX_0F383B */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2305,7 +2380,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F383C */
+  /* PREFIX_0F383C */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2313,7 +2388,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F383D */
+  /* PREFIX_0F383D */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2321,7 +2396,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F383E */
+  /* PREFIX_0F383E */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2329,7 +2404,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F383F */
+  /* PREFIX_0F383F */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2337,7 +2412,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3840 */
+  /* PREFIX_0F3840 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2345,7 +2420,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3841 */
+  /* PREFIX_0F3841 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2353,7 +2428,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F38F0 */
+  /* PREFIX_0F38F0 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2361,7 +2436,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },     
   },
 
-  /* PREGRP_0F38F1 */
+  /* PREFIX_0F38F1 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2369,7 +2444,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },     
   },
 
-  /* PREGRP_0F3A08 */
+  /* PREFIX_0F3A08 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2377,7 +2452,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A09 */
+  /* PREFIX_0F3A09 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2385,7 +2460,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A0A */
+  /* PREFIX_0F3A0A */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2393,7 +2468,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A0B */
+  /* PREFIX_0F3A0B */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2401,7 +2476,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A0C */
+  /* PREFIX_0F3A0C */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2409,7 +2484,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A0D */
+  /* PREFIX_0F3A0D */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2417,7 +2492,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A0E */
+  /* PREFIX_0F3A0E */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2425,7 +2500,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A14 */
+  /* PREFIX_0F3A14 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2433,7 +2508,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A15 */
+  /* PREFIX_0F3A15 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2441,7 +2516,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A16 */
+  /* PREFIX_0F3A16 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2449,7 +2524,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A17 */
+  /* PREFIX_0F3A17 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2457,7 +2532,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A20 */
+  /* PREFIX_0F3A20 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2465,7 +2540,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A21 */
+  /* PREFIX_0F3A21 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2473,7 +2548,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A22 */
+  /* PREFIX_0F3A22 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2481,7 +2556,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A40 */
+  /* PREFIX_0F3A40 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2489,7 +2564,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A41 */
+  /* PREFIX_0F3A41 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2497,7 +2572,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A42 */
+  /* PREFIX_0F3A42 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2505,7 +2580,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A60 */
+  /* PREFIX_0F3A60 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2513,7 +2588,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A61 */
+  /* PREFIX_0F3A61 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2521,7 +2596,7 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A62 */
+  /* PREFIX_0F3A62 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
@@ -2529,37 +2604,13 @@ static const struct dis386 prefix_user_table[][4] = {
     { "(bad)", { XX } },
   },
 
-  /* PREGRP_0F3A63 */
+  /* PREFIX_0F3A63 */
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
     { "pcmpistri", { XM, EXx, Ib } },
     { "(bad)", { XX } },
   },
-
-  /* PREGRP_0F73_REG_3 */
-  {
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "psrldq",        { MS, Ib } },
-    { "(bad)", { XX } },
-  },
-
-  /* PREGRP_0F73_REG_7 */
-  {
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "pslldq",        { MS, Ib } },
-    { "(bad)", { XX } },
-  },
-
-  /*PREGRP_0FC7_REG_6 */
-  {
-    { "vmptrld",{ Mq } },
-    { "vmxon", { Mq } },
-    { "vmclear",{ Mq } },
-    { "(bad)", { XX } },
-  },
 };
 
 static const struct dis386 x86_64_table[][2] = {
@@ -2643,7 +2694,7 @@ static const struct dis386 x86_64_table[][2] = {
 
   /* X86_64_62 */
   {
-    { OPC_EXT_TABLE (OPC_EXT_62_32BIT) },
+    { MOD_TABLE (MOD_62_32BIT) },
     { "(bad)", { XX } },
   },
 
@@ -2673,13 +2724,13 @@ static const struct dis386 x86_64_table[][2] = {
 
   /* X86_64_C4 */
   {
-    { OPC_EXT_TABLE (OPC_EXT_C4_32BIT) },
+    { MOD_TABLE (MOD_C4_32BIT) },
     { "(bad)", { XX } },
   },
 
   /* X86_64_C5 */
   {
-    { OPC_EXT_TABLE (OPC_EXT_C5_32BIT) },
+    { MOD_TABLE (MOD_C5_32BIT) },
     { "(bad)", { XX } },
   },
 
@@ -3318,586 +3369,586 @@ static const struct dis386 three_byte_table[][256] = {
   /* THREE_BYTE_0F38 */
   {
     /* 00 */
-    { "pshufb", { MX, EM } },
-    { "phaddw", { MX, EM } },
-    { "phaddd",        { MX, EM } },
-    { "phaddsw", { MX, EM } },
-    { "pmaddubsw", { MX, EM } },
-    { "phsubw", { MX, EM } },
-    { "phsubd", { MX, EM } },
-    { "phsubsw", { MX, EM } },
+    { "pshufb",                { MX, EM } },
+    { "phaddw",                { MX, EM } },
+    { "phaddd",                { MX, EM } },
+    { "phaddsw",       { MX, EM } },
+    { "pmaddubsw",     { MX, EM } },
+    { "phsubw",                { MX, EM } },
+    { "phsubd",                { MX, EM } },
+    { "phsubsw",       { MX, EM } },
     /* 08 */
-    { "psignb", { MX, EM } },
-    { "psignw", { MX, EM } },
-    { "psignd", { MX, EM } },
-    { "pmulhrsw", { MX, EM } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "psignb",                { MX, EM } },
+    { "psignw",                { MX, EM } },
+    { "psignd",                { MX, EM } },
+    { "pmulhrsw",      { MX, EM } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 10 */
-    { PREGRP (PREGRP_0F3810) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { PREGRP (PREGRP_0F3814) },
-    { PREGRP (PREGRP_0F3815) },
-    { "(bad)", { XX } },
-    { PREGRP (PREGRP_0F3817) },
+    { PREFIX_TABLE (PREFIX_0F3810) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { PREFIX_TABLE (PREFIX_0F3814) },
+    { PREFIX_TABLE (PREFIX_0F3815) },
+    { "(bad)",         { XX } },
+    { PREFIX_TABLE (PREFIX_0F3817) },
     /* 18 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "pabsb", { MX, EM } },
-    { "pabsw", { MX, EM } },
-    { "pabsd", { MX, EM } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "pabsb",         { MX, EM } },
+    { "pabsw",         { MX, EM } },
+    { "pabsd",         { MX, EM } },
+    { "(bad)",         { XX } },
     /* 20 */
-    { PREGRP (PREGRP_0F3820) },
-    { PREGRP (PREGRP_0F3821) },
-    { PREGRP (PREGRP_0F3822) },
-    { PREGRP (PREGRP_0F3823) },
-    { PREGRP (PREGRP_0F3824) },
-    { PREGRP (PREGRP_0F3825) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { PREFIX_TABLE (PREFIX_0F3820) },
+    { PREFIX_TABLE (PREFIX_0F3821) },
+    { PREFIX_TABLE (PREFIX_0F3822) },
+    { PREFIX_TABLE (PREFIX_0F3823) },
+    { PREFIX_TABLE (PREFIX_0F3824) },
+    { PREFIX_TABLE (PREFIX_0F3825) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 28 */
-    { PREGRP (PREGRP_0F3828) },
-    { PREGRP (PREGRP_0F3829) },
-    { PREGRP (PREGRP_0F382A) },
-    { PREGRP (PREGRP_0F382B) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { PREFIX_TABLE (PREFIX_0F3828) },
+    { PREFIX_TABLE (PREFIX_0F3829) },
+    { PREFIX_TABLE (PREFIX_0F382A) },
+    { PREFIX_TABLE (PREFIX_0F382B) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 30 */
-    { PREGRP (PREGRP_0F3830) },
-    { PREGRP (PREGRP_0F3831) },
-    { PREGRP (PREGRP_0F3832) },
-    { PREGRP (PREGRP_0F3833) },
-    { PREGRP (PREGRP_0F3834) },
-    { PREGRP (PREGRP_0F3835) },
-    { "(bad)", { XX } },
-    { PREGRP (PREGRP_0F3837) },
+    { PREFIX_TABLE (PREFIX_0F3830) },
+    { PREFIX_TABLE (PREFIX_0F3831) },
+    { PREFIX_TABLE (PREFIX_0F3832) },
+    { PREFIX_TABLE (PREFIX_0F3833) },
+    { PREFIX_TABLE (PREFIX_0F3834) },
+    { PREFIX_TABLE (PREFIX_0F3835) },
+    { "(bad)",         { XX } },
+    { PREFIX_TABLE (PREFIX_0F3837) },
     /* 38 */
-    { PREGRP (PREGRP_0F3838) },
-    { PREGRP (PREGRP_0F3839) },
-    { PREGRP (PREGRP_0F383A) },
-    { PREGRP (PREGRP_0F383B) },
-    { PREGRP (PREGRP_0F383C) },
-    { PREGRP (PREGRP_0F383D) },
-    { PREGRP (PREGRP_0F383E) },
-    { PREGRP (PREGRP_0F383F) },
+    { PREFIX_TABLE (PREFIX_0F3838) },
+    { PREFIX_TABLE (PREFIX_0F3839) },
+    { PREFIX_TABLE (PREFIX_0F383A) },
+    { PREFIX_TABLE (PREFIX_0F383B) },
+    { PREFIX_TABLE (PREFIX_0F383C) },
+    { PREFIX_TABLE (PREFIX_0F383D) },
+    { PREFIX_TABLE (PREFIX_0F383E) },
+    { PREFIX_TABLE (PREFIX_0F383F) },
     /* 40 */
-    { PREGRP (PREGRP_0F3840) },
-    { PREGRP (PREGRP_0F3841) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { PREFIX_TABLE (PREFIX_0F3840) },
+    { PREFIX_TABLE (PREFIX_0F3841) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 48 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 50 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 58 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 60 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 68 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 70 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 78 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* 80 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 80 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 88 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 90 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 98 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* d0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* d8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f0 */
-    { PREGRP (PREGRP_0F38F0) },
-    { PREGRP (PREGRP_0F38F1) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { PREFIX_TABLE (PREFIX_0F38F0) },
+    { PREFIX_TABLE (PREFIX_0F38F1) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
   },
   /* THREE_BYTE_0F3A */
   {
     /* 00 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 08 */
-    { PREGRP (PREGRP_0F3A08) },
-    { PREGRP (PREGRP_0F3A09) },
-    { PREGRP (PREGRP_0F3A0A) },
-    { PREGRP (PREGRP_0F3A0B) },
-    { PREGRP (PREGRP_0F3A0C) },
-    { PREGRP (PREGRP_0F3A0D) },
-    { PREGRP (PREGRP_0F3A0E) },
-    { "palignr", { MX, EM, Ib } },
+    { PREFIX_TABLE (PREFIX_0F3A08) },
+    { PREFIX_TABLE (PREFIX_0F3A09) },
+    { PREFIX_TABLE (PREFIX_0F3A0A) },
+    { PREFIX_TABLE (PREFIX_0F3A0B) },
+    { PREFIX_TABLE (PREFIX_0F3A0C) },
+    { PREFIX_TABLE (PREFIX_0F3A0D) },
+    { PREFIX_TABLE (PREFIX_0F3A0E) },
+    { "palignr",       { MX, EM, Ib } },
     /* 10 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { PREGRP (PREGRP_0F3A14) },
-    { PREGRP (PREGRP_0F3A15) },
-    { PREGRP (PREGRP_0F3A16) },
-    { PREGRP (PREGRP_0F3A17) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { PREFIX_TABLE (PREFIX_0F3A14) },
+    { PREFIX_TABLE (PREFIX_0F3A15) },
+    { PREFIX_TABLE (PREFIX_0F3A16) },
+    { PREFIX_TABLE (PREFIX_0F3A17) },
     /* 18 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 20 */
-    { PREGRP (PREGRP_0F3A20) },
-    { PREGRP (PREGRP_0F3A21) },
-    { PREGRP (PREGRP_0F3A22) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { PREFIX_TABLE (PREFIX_0F3A20) },
+    { PREFIX_TABLE (PREFIX_0F3A21) },
+    { PREFIX_TABLE (PREFIX_0F3A22) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 28 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 30 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 38 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 40 */
-    { PREGRP (PREGRP_0F3A40) },
-    { PREGRP (PREGRP_0F3A41) },
-    { PREGRP (PREGRP_0F3A42) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { PREFIX_TABLE (PREFIX_0F3A40) },
+    { PREFIX_TABLE (PREFIX_0F3A41) },
+    { PREFIX_TABLE (PREFIX_0F3A42) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 48 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 50 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 58 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 60 */
-    { PREGRP (PREGRP_0F3A60) },
-    { PREGRP (PREGRP_0F3A61) },
-    { PREGRP (PREGRP_0F3A62) },
-    { PREGRP (PREGRP_0F3A63) },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { PREFIX_TABLE (PREFIX_0F3A60) },
+    { PREFIX_TABLE (PREFIX_0F3A61) },
+    { PREFIX_TABLE (PREFIX_0F3A62) },
+    { PREFIX_TABLE (PREFIX_0F3A63) },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 68 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 70 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 78 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 80 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 88 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 90 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* 98 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 98 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* d0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* d8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
   },
-  /* THREE_BYTE_SSE5_0F7A */
+  /* THREE_BYTE_0F7A */
   {
     /* 00 */
     { "(bad)",         { XX } },
@@ -3949,774 +4000,819 @@ static const struct dis386 three_byte_table[][256] = {
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 30 */
     { "cvtph2ps",      { XM, EXd } },
     { "cvtps2ph",      { EXd, XM } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 38 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 40 */
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
     { "phaddbw",       { XM, EXq } },
     { "phaddbd",       { XM, EXq } },
     { "phaddbq",       { XM, EXq } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     { "phaddwd",       { XM, EXq } },
     { "phaddwq",       { XM, EXq } },
     /* 48 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     { "phadddq",       { XM, EXq } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 50 */
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
     { "phaddubw",      { XM, EXq } },
     { "phaddubd",      { XM, EXq } },
     { "phaddubq",      { XM, EXq } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     { "phadduwd",      { XM, EXq } },
     { "phadduwq",      { XM, EXq } },
     /* 58 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     { "phaddudq",      { XM, EXq } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 60 */
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
     { "phsubbw",       { XM, EXq } },
     { "phsubbd",       { XM, EXq } },
     { "phsubbq",       { XM, EXq } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 68 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 70 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 78 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 80 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 88 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 90 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 98 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* d0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* d8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f0 */
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
   },
-  /* THREE_BYTE_SSE5_0F7B */
+  /* THREE_BYTE_0F7B */
   {
     /* 00 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 08 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 10 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 18 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 20 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 28 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 30 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
-    /* 38 */
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* 40 */
-    { "protb",         { XM, EXq, Ib } },
-    { "protw",         { XM, EXq, Ib } },
-    { "protd",         { XM, EXq, Ib } },
-    { "protq",         { XM, EXq, Ib } },
-    { "pshlb",         { XM, EXq, Ib } },
-    { "pshlw",         { XM, EXq, Ib } },
-    { "pshld",         { XM, EXq, Ib } },
-    { "pshlq",         { XM, EXq, Ib } },
-    /* 48 */
-    { "pshab",         { XM, EXq, Ib } },
-    { "pshaw",         { XM, EXq, Ib } },
-    { "pshad",         { XM, EXq, Ib } },
-    { "pshaq",         { XM, EXq, Ib } },
     { "(bad)",         { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* 50 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* 58 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* 60 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 38 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 40 */
+    { "protb",         { XM, EXq, Ib } },
+    { "protw",         { XM, EXq, Ib } },
+    { "protd",         { XM, EXq, Ib } },
+    { "protq",         { XM, EXq, Ib } },
+    { "pshlb",         { XM, EXq, Ib } },
+    { "pshlw",         { XM, EXq, Ib } },
+    { "pshld",         { XM, EXq, Ib } },
+    { "pshlq",         { XM, EXq, Ib } },
+    /* 48 */
+    { "pshab",         { XM, EXq, Ib } },
+    { "pshaw",         { XM, EXq, Ib } },
+    { "pshad",         { XM, EXq, Ib } },
+    { "pshaq",         { XM, EXq, Ib } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 50 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 58 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 60 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* 68 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* 68 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
     /* 70 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 78 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 80 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 88 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 90 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* 98 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* a8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* b8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* c8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    /* d0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    /* d0 */
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* d8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* e8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f0 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
     /* f8 */
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
   }
 };
 
-static const struct dis386 opc_ext_table[][2] = {
+static const struct dis386 mod_table[][2] = {
   {
-    /* OPC_EXT_8D */
+    /* MOD_8D */
     { "leaS",          { Gv, M } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0F13 */
-    { "movlpX",                { EXq, XM } },
-    { "(bad)",         { XX } },
+    /* MOD_0F01_REG_0 */
+    { X86_64_TABLE (X86_64_0F01_REG_0) },
+    { RM_TABLE (RM_0F01_REG_0) },
   },
   {
-    /* OPC_EXT_0F17 */
-    { "movhpX",                { EXq, XM } },
-    { "(bad)",         { XX } },
+    /* MOD_0F01_REG_1 */
+    { X86_64_TABLE (X86_64_0F01_REG_1) },
+    { RM_TABLE (RM_0F01_REG_1) },
   },
   {
-    /* OPC_EXT_0F20 */
-    { "(bad)",         { XX } },
-    { "movZ",          { Rm, Cm } },
+    /* MOD_0F01_REG_2 */
+    { X86_64_TABLE (X86_64_0F01_REG_2) },
+    { RM_TABLE (RM_0F01_REG_2) },
   },
   {
-    /* OPC_EXT_0F21 */
-    { "(bad)",         { XX } },
-    { "movZ",          { Rm, Dm } },
+    /* MOD_0F01_REG_3 */
+    { X86_64_TABLE (X86_64_0F01_REG_3) },
+    { RM_TABLE (RM_0F01_REG_3) },
+  },
+  {
+    /* MOD_0F01_REG_7 */
+    { "invlpg",                { Mb } },
+    { RM_TABLE (RM_0F01_REG_7) },
+  },
+  {
+    /* MOD_0F12_PREFIX_0 */
+    { "movlps",                { XM, EXq } },
+    { "movhlps",       { XM, EXq } },
   },
   {
-    /* OPC_EXT_0F22 */
+    /* MOD_0F13 */
+    { "movlpX",                { EXq, XM } },
     { "(bad)",         { XX } },
-    { "movZ",          { Cm, Rm } },
   },
   {
-    /* OPC_EXT_0F23 */
+    /* MOD_0F16_PREFIX_0 */
+    { "movhps",                { XM, EXq } },
+    { "movlhps",       { XM, EXq } },
+  },
+  {
+    /* MOD_0F17 */
+    { "movhpX",                { EXq, XM } },
     { "(bad)",         { XX } },
-    { "movZ",          { Dm, Rm } },
   },
   {
-    /* OPC_EXT_0F24 */
-    { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
-    { "movL",          { Rd, Td } },
+    /* MOD_0F18_REG_0 */
+    { "prefetchnta",   { Mb } },
+    { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0F26 */
+    /* MOD_0F18_REG_1 */
+    { "prefetcht0",    { Mb } },
     { "(bad)",         { XX } },
-    { "movL",          { Td, Rd } },
   },
   {
-    /* OPC_EXT_0FB2 */
-    { "lssS",          { Gv, Mp } },
+    /* MOD_0F18_REG_2 */
+    { "prefetcht1",    { Mb } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FB4 */
-    { "lfsS",          { Gv, Mp } },
+    /* MOD_0F18_REG_3 */
+    { "prefetcht2",    { Mb } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FB5 */
-    { "lgsS",          { Gv, Mp } },
+    /* MOD_0F20 */
     { "(bad)",         { XX } },
+    { "movZ",          { Rm, Cm } },
   },
   {
-    /* OPC_EXT_0F01_REG_0 */
-    { X86_64_TABLE (X86_64_0F01_REG_0) },
-    { OPC_EXT_RM_TABLE (OPC_EXT_RM_0F01_REG_0) },
+    /* MOD_0F21 */
+    { "(bad)",         { XX } },
+    { "movZ",          { Rm, Dm } },
   },
   {
-    /* OPC_EXT_0F01_REG_1 */
-    { X86_64_TABLE (X86_64_0F01_REG_1) },
-    { OPC_EXT_RM_TABLE (OPC_EXT_RM_0F01_REG_1) },
+    /* MOD_0F22 */
+    { "(bad)",         { XX } },
+    { "movZ",          { Cm, Rm } },
   },
   {
-    /* OPC_EXT_0F01_REG_2 */
-    { X86_64_TABLE (X86_64_0F01_REG_2) },
+    /* MOD_0F23 */
     { "(bad)",         { XX } },
+    { "movZ",          { Dm, Rm } },
   },
   {
-    /* OPC_EXT_0F01_REG_3 */
-    { X86_64_TABLE (X86_64_0F01_REG_3) },
-    { OPC_EXT_RM_TABLE (OPC_EXT_RM_0F01_REG_3) },
+    /* MOD_0F24 */
+    { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
+    { "movL",          { Rd, Td } },
   },
   {
-    /* OPC_EXT_0F01_REG_7 */
-    { "invlpg",                { Mb } },
-    { OPC_EXT_RM_TABLE (OPC_EXT_RM_0F01_REG_7) },
+    /* MOD_0F26 */
+    { "(bad)",         { XX } },
+    { "movL",          { Td, Rd } },
   },
   {
-    /* OPC_EXT_0F18_REG_0 */
-    { "prefetchnta",   { Mb } },
+    /* MOD_0F2B_PREFIX_0 */
+    {"movntps",                { Mx, XM } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0F18_REG_1 */
-    { "prefetcht0",    { Mb } },
+    /* MOD_0F2B_PREFIX_1 */
+    {"movntss",                { Md, XM } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0F18_REG_2 */
-    { "prefetcht1",    { Mb } },
+    /* MOD_0F2B_PREFIX_2 */
+    {"movntpd",                { Mx, XM } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0F18_REG_3 */
-    { "prefetcht2",    { Mb } },
+    /* MOD_0F2B_PREFIX_3 */
+    {"movntsd",                { Mq, XM } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0F71_REG_2 */
+    /* MOD_0F51 */
+    { "(bad)",         { XX } },
+    { "movmskpX",      { Gdq, XS } },
+  },
+  {
+    /* MOD_0F71_REG_2 */
     { "(bad)",         { XX } },
     { "psrlw",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F71_REG_4 */
+    /* MOD_0F71_REG_4 */
     { "(bad)",         { XX } },
     { "psraw",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F71_REG_6 */
+    /* MOD_0F71_REG_6 */
     { "(bad)",         { XX } },
     { "psllw",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F72_REG_2 */
+    /* MOD_0F72_REG_2 */
     { "(bad)",         { XX } },
     { "psrld",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F72_REG_4 */
+    /* MOD_0F72_REG_4 */
     { "(bad)",         { XX } },
     { "psrad",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F72_REG_6 */
+    /* MOD_0F72_REG_6 */
     { "(bad)",         { XX } },
     { "pslld",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F73_REG_2 */
+    /* MOD_0F73_REG_2 */
     { "(bad)",         { XX } },
     { "psrlq",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F73_REG_3 */
+    /* MOD_0F73_REG_3 */
     { "(bad)",         { XX } },
-    { PREGRP (PREGRP_0F73_REG_3) },
+    { PREFIX_TABLE (PREFIX_0F73_REG_3) },
   },
   {
-    /* OPC_EXT_0F73_REG_6 */
+    /* MOD_0F73_REG_6 */
     { "(bad)",         { XX } },
     { "psllq",         { MS, Ib } },
   },
   {
-    /* OPC_EXT_0F73_REG_7 */
+    /* MOD_0F73_REG_7 */
     { "(bad)",         { XX } },
-    { PREGRP (PREGRP_0F73_REG_7) },
+    { PREFIX_TABLE (PREFIX_0F73_REG_7) },
   },
   {
-    /* OPC_EXT_0FAE_REG_0 */
+    /* MOD_0FAE_REG_0 */
     { "fxsave",                { M } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FAE_REG_1 */
+    /* MOD_0FAE_REG_1 */
     { "fxrstor",       { M } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FAE_REG_2 */
+    /* MOD_0FAE_REG_2 */
     { "ldmxcsr",       { Md } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FAE_REG_3 */
+    /* MOD_0FAE_REG_3 */
     { "stmxcsr",       { Md } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FAE_REG_5 */
+    /* MOD_0FAE_REG_4 */
+    { "xsave",         { M } },
     { "(bad)",         { XX } },
-    { OPC_EXT_RM_TABLE (OPC_EXT_RM_0FAE_REG_5) },
   },
   {
-    /* OPC_EXT_0FAE_REG_6 */
+    /* MOD_0FAE_REG_5 */
+    { "xrstor",                { M } },
+    { RM_TABLE (RM_0FAE_REG_5) },
+  },
+  {
+    /* MOD_0FAE_REG_6 */
     { "(bad)",         { XX } },
-    { OPC_EXT_RM_TABLE (OPC_EXT_RM_0FAE_REG_6) },
+    { RM_TABLE (RM_0FAE_REG_6) },
   },
   {
-    /* OPC_EXT_0FAE_REG_7 */
+    /* MOD_0FAE_REG_7 */
     { "clflush",       { Mb } },
-    { OPC_EXT_RM_TABLE (OPC_EXT_RM_0FAE_REG_7) },
+    { RM_TABLE (RM_0FAE_REG_7) },
+  },
+  {
+    /* MOD_0FB2 */
+    { "lssS",          { Gv, Mp } },
+    { "(bad)",         { XX } },
+  },
+  {
+    /* MOD_0FB4 */
+    { "lfsS",          { Gv, Mp } },
+    { "(bad)",         { XX } },
+  },
+  {
+    /* MOD_0FB5 */
+    { "lgsS",          { Gv, Mp } },
+    { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FC7_REG_6 */
-    { PREGRP (PREGRP_0FC7_REG_6) },
+    /* MOD_0FC7_REG_6 */
+    { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FC7_REG_7 */
+    /* MOD_0FC7_REG_7 */
     { "vmptrst",       { Mq } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0F12_PREFIX_0 */
-    { "movlpX",                { XM, EXq } },
-    { "movhlpX",       { XM, EXq } },
+    /* MOD_0FD7 */
+    { "(bad)",         { XX } },
+    { "pmovmskb",      { Gdq, MS } },
   },
   {
-    /* OPC_EXT_0F16_PREFIX_0 */
-    { "movhpX",                { XM, EXq } },
-    { "movlhpX",       { XM, EXq } },
+    /* MOD_0FE7_PREFIX_2 */
+    { "movntdq",       { Mx, XM } },
+    { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_0FF0_PREFIX_3 */
+    /* MOD_0FF0_PREFIX_3 */
     { "lddqu",         { XM, M } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_62_32BIT */
+    /* MOD_0F382A_PREFIX_2 */
+    { "movntdqa",      { XM, Mx } },
+    { "(bad)",         { XX } },
+  },
+  {
+    /* MOD_62_32BIT */
     { "bound{S|}",     { Gv, Ma } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_C4_32BIT */
+    /* MOD_C4_32BIT */
     { "lesS",          { Gv, Mp } },
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_C5_32BIT */
+    /* MOD_C5_32BIT */
     { "ldsS",          { Gv, Mp } },
     { "(bad)",         { XX } },
   },
 };
 
-static const struct dis386 opc_ext_rm_table[][8] = {
+static const struct dis386 rm_table[][8] = {
   {
-    /* OPC_EXT_RM_0F01_REG_0 */
+    /* RM_0F01_REG_0 */
     { "(bad)",         { XX } },
     { "vmcall",                { Skip_MODRM } },
     { "vmlaunch",      { Skip_MODRM } },
@@ -4727,7 +4823,7 @@ static const struct dis386 opc_ext_rm_table[][8] = {
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_RM_0F01_REG_1 */
+    /* RM_0F01_REG_1 */
     { "monitor",       { { OP_Monitor, 0 } } },
     { "mwait",         { { OP_Mwait, 0 } } },
     { "(bad)",         { XX } },
@@ -4738,7 +4834,18 @@ static const struct dis386 opc_ext_rm_table[][8] = {
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_RM_0F01_REG_3 */
+    /* RM_0F01_REG_2 */
+    { "xgetbv",                { Skip_MODRM } },
+    { "xsetbv",                { Skip_MODRM } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+    { "(bad)",         { XX } },
+  },
+  {
+    /* RM_0F01_REG_3 */
     { "vmrun",         { Skip_MODRM } },
     { "vmmcall",       { Skip_MODRM } },
     { "vmload",                { Skip_MODRM } },
@@ -4749,7 +4856,7 @@ static const struct dis386 opc_ext_rm_table[][8] = {
     { "invlpga",       { Skip_MODRM } },
   },
   {
-    /* OPC_EXT_RM_0F01_REG_7 */
+    /* RM_0F01_REG_7 */
     { "swapgs",                { Skip_MODRM } },
     { "rdtscp",                { Skip_MODRM } },
     { "(bad)",         { XX } },
@@ -4760,7 +4867,7 @@ static const struct dis386 opc_ext_rm_table[][8] = {
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_RM_0FAE_REG_5 */
+    /* RM_0FAE_REG_5 */
     { "lfence",                { Skip_MODRM } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
@@ -4771,7 +4878,7 @@ static const struct dis386 opc_ext_rm_table[][8] = {
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_RM_0FAE_REG_6 */
+    /* RM_0FAE_REG_6 */
     { "mfence",                { Skip_MODRM } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
@@ -4782,7 +4889,7 @@ static const struct dis386 opc_ext_rm_table[][8] = {
     { "(bad)",         { XX } },
   },
   {
-    /* OPC_EXT_RM_0FAE_REG_7 */
+    /* RM_0FAE_REG_7 */
     { "sfence",                { Skip_MODRM } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
@@ -4986,6 +5093,7 @@ static bfd_vma start_pc;
  */
 
 static char intel_syntax;
+static char intel_mnemonic = !SYSV386_COMPAT;
 static char open_char;
 static char close_char;
 static char separator_char;
@@ -5030,6 +5138,10 @@ with the -M switch (multiple options should be separated by commas):\n"));
   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
+  fprintf (stream, _("  att-mnemonic\n"
+                    "              Display instruction in AT&T mnemonic\n"));
+  fprintf (stream, _("  intel-mnemonic\n"
+                    "              Display instruction in Intel mnemonic\n"));
   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
@@ -5050,8 +5162,17 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
 
   switch (dp->op[0].bytemode)
     {
-    case USE_GROUPS:
-      dp = &grps[dp->op[1].bytemode][modrm.reg];
+    case USE_REG_TABLE:
+      dp = &reg_table[dp->op[1].bytemode][modrm.reg];
+      break;
+
+    case USE_MOD_TABLE:
+      index = modrm.mod == 0x3 ? 1 : 0;
+      dp = &mod_table[dp->op[1].bytemode][index];
+      break;
+
+    case USE_RM_TABLE:
+      dp = &rm_table[dp->op[1].bytemode][modrm.rm];
       break;
 
     case USE_PREFIX_TABLE:
@@ -5082,7 +5203,7 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
                }
            }
        }
-      dp = &prefix_user_table[dp->op[1].bytemode][index];
+      dp = &prefix_table[dp->op[1].bytemode][index];
       break;
 
     case USE_X86_64_TABLE:
@@ -5099,16 +5220,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
       modrm.rm = *codep & 7;
       break;
 
-    case USE_OPC_EXT_TABLE:
-      index = modrm.mod == 0x3 ? 1 : 0;
-      dp = &opc_ext_table[dp->op[1].bytemode][index];
-      break;
-
-    case USE_OPC_EXT_RM_TABLE:
-      index = modrm.rm;
-      dp = &opc_ext_rm_table[dp->op[1].bytemode][index];
-      break;
-
     default:
       oappend (INTERNAL_DISASSEMBLER_ERROR);
       return NULL;
@@ -5174,10 +5285,14 @@ print_insn (bfd_vma pc, disassemble_info *info)
       else if (CONST_STRNEQ (p, "intel"))
        {
          intel_syntax = 1;
+         if (CONST_STRNEQ (p + 5, "-mnemonic"))
+           intel_mnemonic = 1;
        }
       else if (CONST_STRNEQ (p, "att"))
        {
          intel_syntax = 0;
+         if (CONST_STRNEQ (p + 3, "-mnemonic"))
+           intel_mnemonic = 0;
        }
       else if (CONST_STRNEQ (p, "addr"))
        {
@@ -5719,17 +5834,10 @@ static const struct dis386 float_reg[][8] = {
     { "fmul",  { STi, ST } },
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-#if SYSV386_COMPAT
-    { "fsub",  { STi, ST } },
-    { "fsubr", { STi, ST } },
-    { "fdiv",  { STi, ST } },
-    { "fdivr", { STi, ST } },
-#else
-    { "fsubr", { STi, ST } },
-    { "fsub",  { STi, ST } },
-    { "fdivr", { STi, ST } },
-    { "fdiv",  { STi, ST } },
-#endif
+    { "fsub!M",        { STi, ST } },
+    { "fsubM", { STi, ST } },
+    { "fdiv!M",        { STi, ST } },
+    { "fdivM", { STi, ST } },
   },
   /* dd */
   {
@@ -5748,17 +5856,10 @@ static const struct dis386 float_reg[][8] = {
     { "fmulp", { STi, ST } },
     { "(bad)", { XX } },
     { FGRPde_3 },
-#if SYSV386_COMPAT
-    { "fsubp", { STi, ST } },
-    { "fsubrp",        { STi, ST } },
-    { "fdivp", { STi, ST } },
-    { "fdivrp",        { STi, ST } },
-#else
-    { "fsubrp",        { STi, ST } },
-    { "fsubp", { STi, ST } },
-    { "fdivrp",        { STi, ST } },
-    { "fdivp", { STi, ST } },
-#endif
+    { "fsub!Mp", { STi, ST } },
+    { "fsubMp",        { STi, ST } },
+    { "fdiv!Mp", { STi, ST } },
+    { "fdivMp",        { STi, ST } },
   },
   /* df */
   {
@@ -5896,6 +5997,15 @@ putop (const char *template, int sizeflag)
 {
   const char *p;
   int alt = 0;
+  int cond = 1;
+  unsigned int l = 0, len = 1;
+  char last[4];
+
+#define SAVE_LAST(c)                   \
+  if (l < len && l < sizeof (last))    \
+    last[l++] = c;                     \
+  else                                 \
+    abort ();
 
   for (p = template; *p; p++)
     {
@@ -5904,6 +6014,12 @@ putop (const char *template, int sizeflag)
        default:
          *obufp++ = *p;
          break;
+       case '%':
+         len++;
+         break;
+       case '!':
+         cond = 0;
+         break;
        case '{':
          alt = 0;
          if (intel_syntax)
@@ -6037,12 +6153,23 @@ putop (const char *template, int sizeflag)
              break;
            }
          /* Fall through.  */
+         goto case_L;
        case 'L':
+         if (l != 0 || len != 1)
+           {
+             SAVE_LAST (*p);
+             break;
+           }
+case_L:
          if (intel_syntax)
            break;
          if (sizeflag & SUFFIX_ALWAYS)
            *obufp++ = 'l';
          break;
+       case 'M':
+         if (intel_mnemonic != cond)
+           *obufp++ = 'r';
+         break;
        case 'N':
          if ((prefixes & PREFIX_FWAIT) == 0)
            *obufp++ = 'n';
@@ -6099,22 +6226,45 @@ putop (const char *template, int sizeflag)
              break;
            }
          /* Fall through.  */
+         goto case_Q;
        case 'Q':
-         if (intel_syntax && !alt)
-           break;
-         USED_REX (REX_W);
-         if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
+         if (l == 0 && len == 1)
            {
-             if (rex & REX_W)
-               *obufp++ = 'q';
-             else
+case_Q:
+             if (intel_syntax && !alt)
+               break;
+             USED_REX (REX_W);
+             if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
                {
-                 if (sizeflag & DFLAG)
-                   *obufp++ = intel_syntax ? 'd' : 'l';
+                 if (rex & REX_W)
+                   *obufp++ = 'q';
                  else
-                   *obufp++ = 'w';
+                   {
+                     if (sizeflag & DFLAG)
+                       *obufp++ = intel_syntax ? 'd' : 'l';
+                     else
+                       *obufp++ = 'w';
+                   }
+                 used_prefixes |= (prefixes & PREFIX_DATA);
                }
-             used_prefixes |= (prefixes & PREFIX_DATA);
+           }
+         else
+           {
+             if (l != 1 || len != 2 || last[0] != 'L')
+               {
+                 SAVE_LAST (*p);
+                 break;
+               }
+             if (intel_syntax
+                 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
+               break;
+             if ((rex & REX_W))
+               {
+                 USED_REX (REX_W);
+                 *obufp++ = 'q';
+               }
+             else
+               *obufp++ = 'l';
            }
          break;
        case 'R':
@@ -6171,7 +6321,7 @@ putop (const char *template, int sizeflag)
          used_prefixes |= (prefixes & PREFIX_DATA);
          break;
        case 'Y':
-         if (intel_syntax)
+         if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
            break;
          if (rex & REX_W)
            {
@@ -6513,7 +6663,7 @@ OP_E_extended (int bytemode, int sizeflag, int has_drex)
       int havebase;
       int haveindex;
       int needindex;
-      int base;
+      int base, rbase;
       int index = 0;
       int scale = 0;
 
@@ -6535,7 +6685,7 @@ OP_E_extended (int bytemode, int sizeflag, int has_drex)
          haveindex = index != 4;
          codep++;
        }
-      base += add;
+      rbase = base + add;
 
       /* If we have a DREX byte, skip it now 
         (it has already been handled) */
@@ -6548,7 +6698,7 @@ OP_E_extended (int bytemode, int sizeflag, int has_drex)
       switch (modrm.mod)
        {
        case 0:
-         if ((base & 7) == 5)
+         if (base == 5)
            {
              havebase = 0;
              if (address_mode == mode_64bit && !havesib)
@@ -6578,7 +6728,7 @@ OP_E_extended (int bytemode, int sizeflag, int has_drex)
                  || (havesib && (haveindex || scale != 0)));
 
       if (!intel_syntax)
-       if (modrm.mod != 0 || (base & 7) == 5)
+       if (modrm.mod != 0 || base == 5)
          {
            if (havedisp || riprel)
              print_displacement (scratchbuf, disp);
@@ -6606,7 +6756,7 @@ OP_E_extended (int bytemode, int sizeflag, int has_drex)
          *obufp = '\0';
          if (havebase)
            oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
-                    ? names64[base] : names32[base]);
+                    ? names64[rbase] : names32[rbase]);
          if (havesib)
            {
              /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
@@ -6637,7 +6787,7 @@ OP_E_extended (int bytemode, int sizeflag, int has_drex)
                }
            }
          if (intel_syntax
-             && (disp || modrm.mod != 0 || (base & 7) == 5))
+             && (disp || modrm.mod != 0 || base == 5))
            {
              if (!havedisp || (bfd_signed_vma) disp >= 0)
                {
@@ -6663,7 +6813,7 @@ OP_E_extended (int bytemode, int sizeflag, int has_drex)
        }
       else if (intel_syntax)
        {
-         if (modrm.mod != 0 || (base & 7) == 5)
+         if (modrm.mod != 0 || base == 5)
            {
              if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
                              | PREFIX_ES | PREFIX_FS | PREFIX_GS))
@@ -6897,10 +7047,12 @@ static void
 OP_REG (int code, int sizeflag)
 {
   const char *s;
-  int add = 0;
+  int add;
   USED_REX (REX_B);
   if (rex & REX_B)
     add = 8;
+  else
+    add = 0;
 
   switch (code)
     {
@@ -7373,7 +7525,7 @@ OP_DSreg (int code, int sizeflag)
 static void
 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
 {
-  int add = 0;
+  int add;
   if (rex & REX_R)
     {
       USED_REX (REX_R);
@@ -7385,6 +7537,8 @@ OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
       used_prefixes |= PREFIX_LOCK;
       add = 8;
     }
+  else
+    add = 0;
   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
   oappend (scratchbuf + intel_syntax);
 }
@@ -7392,10 +7546,12 @@ OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
 static void
 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
 {
-  int add = 0;
+  int add;
   USED_REX (REX_R);
   if (rex & REX_R)
     add = 8;
+  else
+    add = 0;
   if (intel_syntax)
     sprintf (scratchbuf, "db%d", modrm.reg + add);
   else
@@ -7425,10 +7581,12 @@ OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   used_prefixes |= (prefixes & PREFIX_DATA);
   if (prefixes & PREFIX_DATA)
     {
-      int add = 0;
+      int add;
       USED_REX (REX_R);
       if (rex & REX_R)
        add = 8;
+      else
+       add = 0;
       sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
     }
   else
@@ -7439,10 +7597,12 @@ OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
 static void
 OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
 {
-  int add = 0;
+  int add;
   USED_REX (REX_R);
   if (rex & REX_R)
     add = 8;
+  else
+    add = 0;
   sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
   oappend (scratchbuf + intel_syntax);
 }
@@ -7467,11 +7627,13 @@ OP_EM (int bytemode, int sizeflag)
   used_prefixes |= (prefixes & PREFIX_DATA);
   if (prefixes & PREFIX_DATA)
     {
-      int add = 0;
+      int add;
 
       USED_REX (REX_B);
       if (rex & REX_B)
        add = 8;
+      else
+       add = 0;
       sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
     }
   else
@@ -7517,7 +7679,7 @@ OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
 static void
 OP_EX (int bytemode, int sizeflag)
 {
-  int add = 0;
+  int add;
   if (modrm.mod != 3)
     {
       OP_E (bytemode, sizeflag);
@@ -7526,6 +7688,8 @@ OP_EX (int bytemode, int sizeflag)
   USED_REX (REX_B);
   if (rex & REX_B)
     add = 8;
+  else
+    add = 0;
 
   /* Skip mod/rm byte.  */
   MODRM_CHECK;
@@ -7700,42 +7864,28 @@ static const char *simd_cmp_op[] = {
 };
 
 static void
-OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
+CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
 {
   unsigned int cmp_type;
 
   FETCH_DATA (the_info, codep + 1);
-  obufp = obuf + strlen (obuf);
   cmp_type = *codep++ & 0xff;
   if (cmp_type < 8)
     {
-      char suffix1 = 'p', suffix2 = 's';
-      used_prefixes |= (prefixes & PREFIX_REPZ);
-      if (prefixes & PREFIX_REPZ)
-       suffix1 = 's';
-      else
-       {
-         used_prefixes |= (prefixes & PREFIX_DATA);
-         if (prefixes & PREFIX_DATA)
-           suffix2 = 'd';
-         else
-           {
-             used_prefixes |= (prefixes & PREFIX_REPNZ);
-             if (prefixes & PREFIX_REPNZ)
-               suffix1 = 's', suffix2 = 'd';
-           }
-       }
-      sprintf (scratchbuf, "cmp%s%c%c",
-              simd_cmp_op[cmp_type], suffix1, suffix2);
-      used_prefixes |= (prefixes & PREFIX_REPZ);
-      oappend (scratchbuf);
+      char suffix [3];
+      char *p = obuf + strlen (obuf) - 2;
+      suffix[0] = p[0];
+      suffix[1] = p[1];
+      suffix[2] = '\0';
+      sprintf (p, "%s%s", simd_cmp_op[cmp_type], suffix);
     }
   else
     {
-      /* We have a bad extension byte.  Clean up.  */
-      op_out[0][0] = '\0';
-      op_out[1][0] = '\0';
-      BadOp ();
+      /* We have a reserved extension byte.  Output it directly.  */
+      scratchbuf[0] = '$';
+      print_operand_value (scratchbuf + 1, 1, cmp_type);
+      oappend (scratchbuf + intel_syntax);
+      scratchbuf[0] = '\0';
     }
 }
 
This page took 0.11615 seconds and 4 git commands to generate.