diff options
Diffstat (limited to 'opcodes/i386-dis.c')
-rw-r--r-- | opcodes/i386-dis.c | 2633 |
1 files changed, 1563 insertions, 1070 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 87ecf0f..15a0e1b 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -74,7 +74,8 @@ static bool OP_EM (instr_info *, int, int); static bool OP_EX (instr_info *, int, int); static bool OP_EMC (instr_info *, int,int); static bool OP_MXC (instr_info *, int,int); -static bool OP_R (instr_info *, int, int); +static bool OP_MS (instr_info *, int, int); +static bool OP_XS (instr_info *, int, int); static bool OP_M (instr_info *, int, int); static bool OP_VEX (instr_info *, int, int); static bool OP_VexR (instr_info *, int, int); @@ -145,7 +146,7 @@ struct instr_info uint8_t rex_used; bool need_modrm; - unsigned char need_vex; + bool need_vex; bool has_sib; /* Flags for ins->prefixes which we somehow handled when printing the @@ -218,9 +219,6 @@ struct instr_info bool two_source_ops; - /* Record whether EVEX masking is used incorrectly. */ - bool illegal_masking; - unsigned char op_ad; signed char op_index[MAX_OPERANDS]; bool op_riprel[MAX_OPERANDS]; @@ -412,7 +410,6 @@ fetch_error (const instr_info *ins) #define Mw { OP_M, w_mode } #define Mx { OP_M, x_mode } #define Mxmm { OP_M, xmm_mode } -#define Mymm { OP_M, ymm_mode } #define Gb { OP_G, b_mode } #define Gbnd { OP_G, bnd_mode } #define Gv { OP_G, v_mode } @@ -516,6 +513,7 @@ fetch_error (const instr_info *ins) #define EXxS { OP_EX, x_swap_mode } #define EXxmm { OP_EX, xmm_mode } #define EXymm { OP_EX, ymm_mode } +#define EXtmm { OP_EX, tmm_mode } #define EXxmmq { OP_EX, xmmq_mode } #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode } #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode } @@ -525,14 +523,8 @@ fetch_error (const instr_info *ins) #define EXymmq { OP_EX, ymmq_mode } #define EXEvexXGscat { OP_EX, evex_x_gscat_mode } #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode } -#define Rd { OP_R, d_mode } -#define Rdq { OP_R, dq_mode } -#define Nq { OP_R, q_mode } -#define Ux { OP_R, x_mode } -#define Uxmm { OP_R, xmm_mode } -#define Rxmmq { OP_R, xmmq_mode } -#define Rymm { OP_R, ymm_mode } -#define Rtmm { OP_R, tmm_mode } +#define MS { OP_MS, v_mode } +#define XS { OP_XS, v_mode } #define EMCq { OP_EMC, q_mode } #define MXC { OP_MXC, 0 } #define OPSUF { OP_3DNowSuffix, 0 } @@ -562,7 +554,6 @@ fetch_error (const instr_info *ins) #define MaskG { OP_G, mask_mode } #define MaskE { OP_E, mask_mode } -#define MaskR { OP_R, mask_mode } #define MaskBDE { OP_E, mask_bd_mode } #define MaskVex { OP_VEX, mask_mode } @@ -791,18 +782,20 @@ enum #define FLOAT NULL, { { NULL, FLOATCODE } }, 0 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0 +#define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P #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 XOP_8F_TABLE() DIS386 (USE_XOP_8F_TABLE, 0) -#define VEX_C4_TABLE() DIS386 (USE_VEX_C4_TABLE, 0) -#define VEX_C5_TABLE() DIS386 (USE_VEX_C5_TABLE, 0) +#define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P) +#define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I)) +#define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I)) +#define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I)) #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I)) #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I)) -#define EVEX_TABLE() DIS386 (USE_EVEX_TABLE, 0) +#define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I)) #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I)) enum @@ -830,47 +823,58 @@ enum REG_0F1C_P_0_MOD_0, REG_0F1E_P_1_MOD_3, REG_0F38D8_PREFIX_1, - REG_0F3A0F_P_1, - REG_0F71, - REG_0F72, - REG_0F73, + REG_0F3A0F_PREFIX_1_MOD_3, + REG_0F71_MOD_0, + REG_0F72_MOD_0, + REG_0F73_MOD_0, REG_0FA6, REG_0FA7, REG_0FAE, REG_0FBA, REG_0FC7, - REG_VEX_0F71, - REG_VEX_0F72, - REG_VEX_0F73, + REG_VEX_0F71_M_0, + REG_VEX_0F72_M_0, + REG_VEX_0F73_M_0, REG_VEX_0FAE, REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0, REG_VEX_0F38F3_L_0, REG_XOP_09_01_L_0, REG_XOP_09_02_L_0, - REG_XOP_09_12_L_0, + REG_XOP_09_12_M_1_L_0, REG_XOP_0A_12_L_0, REG_EVEX_0F71, REG_EVEX_0F72, REG_EVEX_0F73, - REG_EVEX_0F38C6_L_2, - REG_EVEX_0F38C7_L_2 + REG_EVEX_0F38C6_M_0_L_2, + REG_EVEX_0F38C7_M_0_L_2 }; enum { MOD_62_32BIT = 0, + MOD_8D, MOD_C4_32BIT, MOD_C5_32BIT, + MOD_C6_REG_7, + MOD_C7_REG_7, + MOD_FF_REG_3, + MOD_FF_REG_5, MOD_0F01_REG_0, MOD_0F01_REG_1, MOD_0F01_REG_2, MOD_0F01_REG_3, MOD_0F01_REG_5, MOD_0F01_REG_7, + MOD_0F02, + MOD_0F03, MOD_0F12_PREFIX_0, + MOD_0F12_PREFIX_2, + MOD_0F13, MOD_0F16_PREFIX_0, + MOD_0F16_PREFIX_2, + MOD_0F17, MOD_0F18_REG_0, MOD_0F18_REG_1, MOD_0F18_REG_2, @@ -882,6 +886,14 @@ enum MOD_0F1B_PREFIX_1, MOD_0F1C_PREFIX_0, MOD_0F1E_PREFIX_1, + MOD_0F2B_PREFIX_0, + MOD_0F2B_PREFIX_1, + MOD_0F2B_PREFIX_2, + MOD_0F2B_PREFIX_3, + MOD_0F50, + MOD_0F71, + MOD_0F72, + MOD_0F73, MOD_0FAE_REG_0, MOD_0FAE_REG_1, MOD_0FAE_REG_2, @@ -890,11 +902,96 @@ enum MOD_0FAE_REG_5, MOD_0FAE_REG_6, MOD_0FAE_REG_7, + MOD_0FB2, + MOD_0FB4, + MOD_0FB5, + MOD_0FC3, + MOD_0FC7_REG_3, + MOD_0FC7_REG_4, + MOD_0FC7_REG_5, MOD_0FC7_REG_6, MOD_0FC7_REG_7, + MOD_0FD7, + MOD_0FE7_PREFIX_2, + MOD_0FF0_PREFIX_3, + MOD_0F382A, MOD_0F38DC_PREFIX_1, - + MOD_0F38DD_PREFIX_1, + MOD_0F38DE_PREFIX_1, + MOD_0F38DF_PREFIX_1, + MOD_0F38F5, + MOD_0F38F6_PREFIX_0, + MOD_0F38F8_PREFIX_1, + MOD_0F38F8_PREFIX_2, + MOD_0F38F8_PREFIX_3, + MOD_0F38F9, + MOD_0F38FA_PREFIX_1, + MOD_0F38FB_PREFIX_1, + MOD_0F3A0F_PREFIX_1, + + MOD_VEX_0F12_PREFIX_0, + MOD_VEX_0F12_PREFIX_2, + MOD_VEX_0F13, + MOD_VEX_0F16_PREFIX_0, + MOD_VEX_0F16_PREFIX_2, + MOD_VEX_0F17, + MOD_VEX_0F2B, + MOD_VEX_0F41_L_1, + MOD_VEX_0F42_L_1, + MOD_VEX_0F44_L_0, + MOD_VEX_0F45_L_1, + MOD_VEX_0F46_L_1, + MOD_VEX_0F47_L_1, + MOD_VEX_0F4A_L_1, + MOD_VEX_0F4B_L_1, + MOD_VEX_0F50, + MOD_VEX_0F71, + MOD_VEX_0F72, + MOD_VEX_0F73, + MOD_VEX_0F91_L_0, + MOD_VEX_0F92_L_0, + MOD_VEX_0F93_L_0, + MOD_VEX_0F98_L_0, + MOD_VEX_0F99_L_0, + MOD_VEX_0FAE_REG_2, + MOD_VEX_0FAE_REG_3, + MOD_VEX_0FD7, + MOD_VEX_0FE7, + MOD_VEX_0FF0_PREFIX_3, + MOD_VEX_0F381A, + MOD_VEX_0F382A, + MOD_VEX_0F382C, + MOD_VEX_0F382D, + MOD_VEX_0F382E, + MOD_VEX_0F382F, MOD_VEX_0F3849_X86_64_L_0_W_0, + MOD_VEX_0F384B_X86_64_L_0_W_0, + MOD_VEX_0F385A, + MOD_VEX_0F385C_X86_64, + MOD_VEX_0F385E_X86_64, + MOD_VEX_0F386C_X86_64, + MOD_VEX_0F388C, + MOD_VEX_0F388E, + MOD_VEX_0F3A30_L_0, + MOD_VEX_0F3A31_L_0, + MOD_VEX_0F3A32_L_0, + MOD_VEX_0F3A33_L_0, + + MOD_XOP_09_12, + + MOD_EVEX_0F381A, + MOD_EVEX_0F381B, + MOD_EVEX_0F3828_P_1, + MOD_EVEX_0F382A_P_1_W_1, + MOD_EVEX_0F3838_P_1, + MOD_EVEX_0F383A_P_1_W_0, + MOD_EVEX_0F385A, + MOD_EVEX_0F385B, + MOD_EVEX_0F387A_W_0, + MOD_EVEX_0F387B_W_0, + MOD_EVEX_0F387C, + MOD_EVEX_0F38C6, + MOD_EVEX_0F38C7, }; enum @@ -910,7 +1007,7 @@ enum RM_0F1E_P_1_MOD_3_REG_7, RM_0FAE_REG_6_MOD_3_P_0, RM_0FAE_REG_7_MOD_3, - RM_0F3A0F_P_1_R_0, + RM_0F3A0F_P_1_MOD_3_REG_0, RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0, RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3, @@ -921,7 +1018,6 @@ enum PREFIX_90 = 0, PREFIX_0F00_REG_6_X86_64, PREFIX_0F01_REG_0_MOD_3_RM_6, - PREFIX_0F01_REG_0_MOD_3_RM_7, PREFIX_0F01_REG_1_RM_2, PREFIX_0F01_REG_1_RM_4, PREFIX_0F01_REG_1_RM_5, @@ -1015,60 +1111,75 @@ enum PREFIX_0F38FB, PREFIX_0F38FC, PREFIX_0F3A0F, + PREFIX_VEX_0F10, + PREFIX_VEX_0F11, PREFIX_VEX_0F12, PREFIX_VEX_0F16, PREFIX_VEX_0F2A, PREFIX_VEX_0F2C, PREFIX_VEX_0F2D, - PREFIX_VEX_0F41_L_1_W_0, - PREFIX_VEX_0F41_L_1_W_1, - PREFIX_VEX_0F42_L_1_W_0, - PREFIX_VEX_0F42_L_1_W_1, - PREFIX_VEX_0F44_L_0_W_0, - PREFIX_VEX_0F44_L_0_W_1, - PREFIX_VEX_0F45_L_1_W_0, - PREFIX_VEX_0F45_L_1_W_1, - PREFIX_VEX_0F46_L_1_W_0, - PREFIX_VEX_0F46_L_1_W_1, - PREFIX_VEX_0F47_L_1_W_0, - PREFIX_VEX_0F47_L_1_W_1, - PREFIX_VEX_0F4A_L_1_W_0, - PREFIX_VEX_0F4A_L_1_W_1, - PREFIX_VEX_0F4B_L_1_W_0, - PREFIX_VEX_0F4B_L_1_W_1, + PREFIX_VEX_0F2E, + PREFIX_VEX_0F2F, + PREFIX_VEX_0F41_L_1_M_1_W_0, + PREFIX_VEX_0F41_L_1_M_1_W_1, + PREFIX_VEX_0F42_L_1_M_1_W_0, + PREFIX_VEX_0F42_L_1_M_1_W_1, + PREFIX_VEX_0F44_L_0_M_1_W_0, + PREFIX_VEX_0F44_L_0_M_1_W_1, + PREFIX_VEX_0F45_L_1_M_1_W_0, + PREFIX_VEX_0F45_L_1_M_1_W_1, + PREFIX_VEX_0F46_L_1_M_1_W_0, + PREFIX_VEX_0F46_L_1_M_1_W_1, + PREFIX_VEX_0F47_L_1_M_1_W_0, + PREFIX_VEX_0F47_L_1_M_1_W_1, + PREFIX_VEX_0F4A_L_1_M_1_W_0, + PREFIX_VEX_0F4A_L_1_M_1_W_1, + PREFIX_VEX_0F4B_L_1_M_1_W_0, + PREFIX_VEX_0F4B_L_1_M_1_W_1, + PREFIX_VEX_0F51, + PREFIX_VEX_0F52, + PREFIX_VEX_0F53, + PREFIX_VEX_0F58, + PREFIX_VEX_0F59, + PREFIX_VEX_0F5A, + PREFIX_VEX_0F5B, + PREFIX_VEX_0F5C, + PREFIX_VEX_0F5D, + PREFIX_VEX_0F5E, + PREFIX_VEX_0F5F, PREFIX_VEX_0F6F, PREFIX_VEX_0F70, + PREFIX_VEX_0F7C, + PREFIX_VEX_0F7D, PREFIX_VEX_0F7E, PREFIX_VEX_0F7F, PREFIX_VEX_0F90_L_0_W_0, PREFIX_VEX_0F90_L_0_W_1, - PREFIX_VEX_0F91_L_0_W_0, - PREFIX_VEX_0F91_L_0_W_1, - PREFIX_VEX_0F92_L_0_W_0, - PREFIX_VEX_0F92_L_0_W_1, - PREFIX_VEX_0F93_L_0_W_0, - PREFIX_VEX_0F93_L_0_W_1, - PREFIX_VEX_0F98_L_0_W_0, - PREFIX_VEX_0F98_L_0_W_1, - PREFIX_VEX_0F99_L_0_W_0, - PREFIX_VEX_0F99_L_0_W_1, + PREFIX_VEX_0F91_L_0_M_0_W_0, + PREFIX_VEX_0F91_L_0_M_0_W_1, + PREFIX_VEX_0F92_L_0_M_1_W_0, + PREFIX_VEX_0F92_L_0_M_1_W_1, + PREFIX_VEX_0F93_L_0_M_1_W_0, + PREFIX_VEX_0F93_L_0_M_1_W_1, + PREFIX_VEX_0F98_L_0_M_1_W_0, + PREFIX_VEX_0F98_L_0_M_1_W_1, + PREFIX_VEX_0F99_L_0_M_1_W_0, + PREFIX_VEX_0F99_L_0_M_1_W_1, + PREFIX_VEX_0FC2, + PREFIX_VEX_0FD0, + PREFIX_VEX_0FE6, + PREFIX_VEX_0FF0, PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0, PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1, - PREFIX_VEX_0F384B_X86_64_L_0_W_0, + PREFIX_VEX_0F384B_X86_64_L_0_W_0_M_0, PREFIX_VEX_0F3850_W_0, PREFIX_VEX_0F3851_W_0, - PREFIX_VEX_0F385C_X86_64_L_0_W_0, - PREFIX_VEX_0F385E_X86_64_L_0_W_0, - PREFIX_VEX_0F386C_X86_64_L_0_W_0, + PREFIX_VEX_0F385C_X86_64_M_1_L_0_W_0, + PREFIX_VEX_0F385E_X86_64_M_1_L_0_W_0, + PREFIX_VEX_0F386C_X86_64_M_1_L_0_W_0, PREFIX_VEX_0F3872, PREFIX_VEX_0F38B0_W_0, PREFIX_VEX_0F38B1_W_0, - PREFIX_VEX_0F38D2_W_0, - PREFIX_VEX_0F38D3_W_0, - PREFIX_VEX_0F38CB, - PREFIX_VEX_0F38CC, - PREFIX_VEX_0F38CD, - PREFIX_VEX_0F38DA_W_0, PREFIX_VEX_0F38F5_L_0, PREFIX_VEX_0F38F6_L_0, PREFIX_VEX_0F38F7_L_0, @@ -1196,7 +1307,6 @@ enum X86_64_0F01_REG_0, X86_64_0F01_REG_0_MOD_3_RM_6_P_1, X86_64_0F01_REG_0_MOD_3_RM_6_P_3, - X86_64_0F01_REG_0_MOD_3_RM_7_P_0, X86_64_0F01_REG_1, X86_64_0F01_REG_1_RM_2_PREFIX_1, X86_64_0F01_REG_1_RM_2_PREFIX_3, @@ -1273,12 +1383,14 @@ enum enum { - VEX_LEN_0F12_P_0 = 0, - VEX_LEN_0F12_P_2, - VEX_LEN_0F13, - VEX_LEN_0F16_P_0, - VEX_LEN_0F16_P_2, - VEX_LEN_0F17, + VEX_LEN_0F12_P_0_M_0 = 0, + VEX_LEN_0F12_P_0_M_1, +#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0 + VEX_LEN_0F13_M_0, + VEX_LEN_0F16_P_0_M_0, + VEX_LEN_0F16_P_0_M_1, +#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0 + VEX_LEN_0F17_M_0, VEX_LEN_0F41, VEX_LEN_0F42, VEX_LEN_0F44, @@ -1297,26 +1409,23 @@ enum VEX_LEN_0F93, VEX_LEN_0F98, VEX_LEN_0F99, - VEX_LEN_0FAE_R_2, - VEX_LEN_0FAE_R_3, + VEX_LEN_0FAE_R_2_M_0, + VEX_LEN_0FAE_R_3_M_0, VEX_LEN_0FC4, + VEX_LEN_0FC5, VEX_LEN_0FD6, + VEX_LEN_0FF7, VEX_LEN_0F3816, VEX_LEN_0F3819, - VEX_LEN_0F381A, + VEX_LEN_0F381A_M_0, VEX_LEN_0F3836, VEX_LEN_0F3841, VEX_LEN_0F3849_X86_64, VEX_LEN_0F384B_X86_64, - VEX_LEN_0F385A, - VEX_LEN_0F385C_X86_64, - VEX_LEN_0F385E_X86_64, - VEX_LEN_0F386C_X86_64, - VEX_LEN_0F38CB_P_3_W_0, - VEX_LEN_0F38CC_P_3_W_0, - VEX_LEN_0F38CD_P_3_W_0, - VEX_LEN_0F38DA_W_0_P_0, - VEX_LEN_0F38DA_W_0_P_2, + VEX_LEN_0F385A_M_0, + VEX_LEN_0F385C_X86_64_M_1, + VEX_LEN_0F385E_X86_64_M_1, + VEX_LEN_0F386C_X86_64_M_1, VEX_LEN_0F38DB, VEX_LEN_0F38F2, VEX_LEN_0F38F3, @@ -1347,80 +1456,79 @@ enum VEX_LEN_0F3A61, VEX_LEN_0F3A62, VEX_LEN_0F3A63, - VEX_LEN_0F3ADE_W_0, VEX_LEN_0F3ADF, VEX_LEN_0F3AF0, - VEX_LEN_XOP_08_85, - VEX_LEN_XOP_08_86, - VEX_LEN_XOP_08_87, - VEX_LEN_XOP_08_8E, - VEX_LEN_XOP_08_8F, - VEX_LEN_XOP_08_95, - VEX_LEN_XOP_08_96, - VEX_LEN_XOP_08_97, - VEX_LEN_XOP_08_9E, - VEX_LEN_XOP_08_9F, - VEX_LEN_XOP_08_A3, - VEX_LEN_XOP_08_A6, - VEX_LEN_XOP_08_B6, - VEX_LEN_XOP_08_C0, - VEX_LEN_XOP_08_C1, - VEX_LEN_XOP_08_C2, - VEX_LEN_XOP_08_C3, - VEX_LEN_XOP_08_CC, - VEX_LEN_XOP_08_CD, - VEX_LEN_XOP_08_CE, - VEX_LEN_XOP_08_CF, - VEX_LEN_XOP_08_EC, - VEX_LEN_XOP_08_ED, - VEX_LEN_XOP_08_EE, - VEX_LEN_XOP_08_EF, - VEX_LEN_XOP_09_01, - VEX_LEN_XOP_09_02, - VEX_LEN_XOP_09_12, - VEX_LEN_XOP_09_82_W_0, - VEX_LEN_XOP_09_83_W_0, - VEX_LEN_XOP_09_90, - VEX_LEN_XOP_09_91, - VEX_LEN_XOP_09_92, - VEX_LEN_XOP_09_93, - VEX_LEN_XOP_09_94, - VEX_LEN_XOP_09_95, - VEX_LEN_XOP_09_96, - VEX_LEN_XOP_09_97, - VEX_LEN_XOP_09_98, - VEX_LEN_XOP_09_99, - VEX_LEN_XOP_09_9A, - VEX_LEN_XOP_09_9B, - VEX_LEN_XOP_09_C1, - VEX_LEN_XOP_09_C2, - VEX_LEN_XOP_09_C3, - VEX_LEN_XOP_09_C6, - VEX_LEN_XOP_09_C7, - VEX_LEN_XOP_09_CB, - VEX_LEN_XOP_09_D1, - VEX_LEN_XOP_09_D2, - VEX_LEN_XOP_09_D3, - VEX_LEN_XOP_09_D6, - VEX_LEN_XOP_09_D7, - VEX_LEN_XOP_09_DB, - VEX_LEN_XOP_09_E1, - VEX_LEN_XOP_09_E2, - VEX_LEN_XOP_09_E3, - VEX_LEN_XOP_0A_12, + VEX_LEN_0FXOP_08_85, + VEX_LEN_0FXOP_08_86, + VEX_LEN_0FXOP_08_87, + VEX_LEN_0FXOP_08_8E, + VEX_LEN_0FXOP_08_8F, + VEX_LEN_0FXOP_08_95, + VEX_LEN_0FXOP_08_96, + VEX_LEN_0FXOP_08_97, + VEX_LEN_0FXOP_08_9E, + VEX_LEN_0FXOP_08_9F, + VEX_LEN_0FXOP_08_A3, + VEX_LEN_0FXOP_08_A6, + VEX_LEN_0FXOP_08_B6, + VEX_LEN_0FXOP_08_C0, + VEX_LEN_0FXOP_08_C1, + VEX_LEN_0FXOP_08_C2, + VEX_LEN_0FXOP_08_C3, + VEX_LEN_0FXOP_08_CC, + VEX_LEN_0FXOP_08_CD, + VEX_LEN_0FXOP_08_CE, + VEX_LEN_0FXOP_08_CF, + VEX_LEN_0FXOP_08_EC, + VEX_LEN_0FXOP_08_ED, + VEX_LEN_0FXOP_08_EE, + VEX_LEN_0FXOP_08_EF, + VEX_LEN_0FXOP_09_01, + VEX_LEN_0FXOP_09_02, + VEX_LEN_0FXOP_09_12_M_1, + VEX_LEN_0FXOP_09_82_W_0, + VEX_LEN_0FXOP_09_83_W_0, + VEX_LEN_0FXOP_09_90, + VEX_LEN_0FXOP_09_91, + VEX_LEN_0FXOP_09_92, + VEX_LEN_0FXOP_09_93, + VEX_LEN_0FXOP_09_94, + VEX_LEN_0FXOP_09_95, + VEX_LEN_0FXOP_09_96, + VEX_LEN_0FXOP_09_97, + VEX_LEN_0FXOP_09_98, + VEX_LEN_0FXOP_09_99, + VEX_LEN_0FXOP_09_9A, + VEX_LEN_0FXOP_09_9B, + VEX_LEN_0FXOP_09_C1, + VEX_LEN_0FXOP_09_C2, + VEX_LEN_0FXOP_09_C3, + VEX_LEN_0FXOP_09_C6, + VEX_LEN_0FXOP_09_C7, + VEX_LEN_0FXOP_09_CB, + VEX_LEN_0FXOP_09_D1, + VEX_LEN_0FXOP_09_D2, + VEX_LEN_0FXOP_09_D3, + VEX_LEN_0FXOP_09_D6, + VEX_LEN_0FXOP_09_D7, + VEX_LEN_0FXOP_09_DB, + VEX_LEN_0FXOP_09_E1, + VEX_LEN_0FXOP_09_E2, + VEX_LEN_0FXOP_09_E3, + VEX_LEN_0FXOP_0A_12, }; enum { EVEX_LEN_0F3816 = 0, EVEX_LEN_0F3819, - EVEX_LEN_0F381A, - EVEX_LEN_0F381B, + EVEX_LEN_0F381A_M_0, + EVEX_LEN_0F381B_M_0, EVEX_LEN_0F3836, - EVEX_LEN_0F385A, - EVEX_LEN_0F385B, - EVEX_LEN_0F38C6, - EVEX_LEN_0F38C7, + EVEX_LEN_0F385A_M_0, + EVEX_LEN_0F385B_M_0, + EVEX_LEN_0F38C6_M_0, + EVEX_LEN_0F38C7_M_0, EVEX_LEN_0F3A00, EVEX_LEN_0F3A01, EVEX_LEN_0F3A18, @@ -1437,20 +1545,20 @@ enum enum { - VEX_W_0F41_L_1 = 0, - VEX_W_0F42_L_1, - VEX_W_0F44_L_0, - VEX_W_0F45_L_1, - VEX_W_0F46_L_1, - VEX_W_0F47_L_1, - VEX_W_0F4A_L_1, - VEX_W_0F4B_L_1, + VEX_W_0F41_L_1_M_1 = 0, + VEX_W_0F42_L_1_M_1, + VEX_W_0F44_L_0_M_1, + VEX_W_0F45_L_1_M_1, + VEX_W_0F46_L_1_M_1, + VEX_W_0F47_L_1_M_1, + VEX_W_0F4A_L_1_M_1, + VEX_W_0F4B_L_1_M_1, VEX_W_0F90_L_0, - VEX_W_0F91_L_0, - VEX_W_0F92_L_0, - VEX_W_0F93_L_0, - VEX_W_0F98_L_0, - VEX_W_0F99_L_0, + VEX_W_0F91_L_0_M_0, + VEX_W_0F92_L_0_M_1, + VEX_W_0F93_L_0_M_1, + VEX_W_0F98_L_0_M_1, + VEX_W_0F99_L_0_M_1, VEX_W_0F380C, VEX_W_0F380D, VEX_W_0F380E, @@ -1459,11 +1567,11 @@ enum VEX_W_0F3816_L_1, VEX_W_0F3818, VEX_W_0F3819_L_1, - VEX_W_0F381A_L_1, - VEX_W_0F382C, - VEX_W_0F382D, - VEX_W_0F382E, - VEX_W_0F382F, + VEX_W_0F381A_M_0_L_1, + VEX_W_0F382C_M_0, + VEX_W_0F382D_M_0, + VEX_W_0F382E_M_0, + VEX_W_0F382F_M_0, VEX_W_0F3836, VEX_W_0F3846, VEX_W_0F3849_X86_64_L_0, @@ -1474,10 +1582,10 @@ enum VEX_W_0F3853, VEX_W_0F3858, VEX_W_0F3859, - VEX_W_0F385A_L_0, - VEX_W_0F385C_X86_64_L_0, - VEX_W_0F385E_X86_64_L_0, - VEX_W_0F386C_X86_64_L_0, + VEX_W_0F385A_M_0_L_0, + VEX_W_0F385C_X86_64_M_1_L_0, + VEX_W_0F385E_X86_64_M_1_L_0, + VEX_W_0F386C_X86_64_M_1_L_0, VEX_W_0F3872_P_1, VEX_W_0F3878, VEX_W_0F3879, @@ -1485,13 +1593,7 @@ enum VEX_W_0F38B1, VEX_W_0F38B4, VEX_W_0F38B5, - VEX_W_0F38CB_P_3, - VEX_W_0F38CC_P_3, - VEX_W_0F38CD_P_3, VEX_W_0F38CF, - VEX_W_0F38D2, - VEX_W_0F38D3, - VEX_W_0F38DA, VEX_W_0F3A00_L_1, VEX_W_0F3A01_L_1, VEX_W_0F3A02, @@ -1509,52 +1611,51 @@ enum VEX_W_0F3A4C, VEX_W_0F3ACE, VEX_W_0F3ACF, - VEX_W_0F3ADE, - - VEX_W_XOP_08_85_L_0, - VEX_W_XOP_08_86_L_0, - VEX_W_XOP_08_87_L_0, - VEX_W_XOP_08_8E_L_0, - VEX_W_XOP_08_8F_L_0, - VEX_W_XOP_08_95_L_0, - VEX_W_XOP_08_96_L_0, - VEX_W_XOP_08_97_L_0, - VEX_W_XOP_08_9E_L_0, - VEX_W_XOP_08_9F_L_0, - VEX_W_XOP_08_A6_L_0, - VEX_W_XOP_08_B6_L_0, - VEX_W_XOP_08_C0_L_0, - VEX_W_XOP_08_C1_L_0, - VEX_W_XOP_08_C2_L_0, - VEX_W_XOP_08_C3_L_0, - VEX_W_XOP_08_CC_L_0, - VEX_W_XOP_08_CD_L_0, - VEX_W_XOP_08_CE_L_0, - VEX_W_XOP_08_CF_L_0, - VEX_W_XOP_08_EC_L_0, - VEX_W_XOP_08_ED_L_0, - VEX_W_XOP_08_EE_L_0, - VEX_W_XOP_08_EF_L_0, - - VEX_W_XOP_09_80, - VEX_W_XOP_09_81, - VEX_W_XOP_09_82, - VEX_W_XOP_09_83, - VEX_W_XOP_09_C1_L_0, - VEX_W_XOP_09_C2_L_0, - VEX_W_XOP_09_C3_L_0, - VEX_W_XOP_09_C6_L_0, - VEX_W_XOP_09_C7_L_0, - VEX_W_XOP_09_CB_L_0, - VEX_W_XOP_09_D1_L_0, - VEX_W_XOP_09_D2_L_0, - VEX_W_XOP_09_D3_L_0, - VEX_W_XOP_09_D6_L_0, - VEX_W_XOP_09_D7_L_0, - VEX_W_XOP_09_DB_L_0, - VEX_W_XOP_09_E1_L_0, - VEX_W_XOP_09_E2_L_0, - VEX_W_XOP_09_E3_L_0, + + VEX_W_0FXOP_08_85_L_0, + VEX_W_0FXOP_08_86_L_0, + VEX_W_0FXOP_08_87_L_0, + VEX_W_0FXOP_08_8E_L_0, + VEX_W_0FXOP_08_8F_L_0, + VEX_W_0FXOP_08_95_L_0, + VEX_W_0FXOP_08_96_L_0, + VEX_W_0FXOP_08_97_L_0, + VEX_W_0FXOP_08_9E_L_0, + VEX_W_0FXOP_08_9F_L_0, + VEX_W_0FXOP_08_A6_L_0, + VEX_W_0FXOP_08_B6_L_0, + VEX_W_0FXOP_08_C0_L_0, + VEX_W_0FXOP_08_C1_L_0, + VEX_W_0FXOP_08_C2_L_0, + VEX_W_0FXOP_08_C3_L_0, + VEX_W_0FXOP_08_CC_L_0, + VEX_W_0FXOP_08_CD_L_0, + VEX_W_0FXOP_08_CE_L_0, + VEX_W_0FXOP_08_CF_L_0, + VEX_W_0FXOP_08_EC_L_0, + VEX_W_0FXOP_08_ED_L_0, + VEX_W_0FXOP_08_EE_L_0, + VEX_W_0FXOP_08_EF_L_0, + + VEX_W_0FXOP_09_80, + VEX_W_0FXOP_09_81, + VEX_W_0FXOP_09_82, + VEX_W_0FXOP_09_83, + VEX_W_0FXOP_09_C1_L_0, + VEX_W_0FXOP_09_C2_L_0, + VEX_W_0FXOP_09_C3_L_0, + VEX_W_0FXOP_09_C6_L_0, + VEX_W_0FXOP_09_C7_L_0, + VEX_W_0FXOP_09_CB_L_0, + VEX_W_0FXOP_09_D1_L_0, + VEX_W_0FXOP_09_D2_L_0, + VEX_W_0FXOP_09_D3_L_0, + VEX_W_0FXOP_09_D6_L_0, + VEX_W_0FXOP_09_D7_L_0, + VEX_W_0FXOP_09_DB_L_0, + VEX_W_0FXOP_09_E1_L_0, + VEX_W_0FXOP_09_E2_L_0, + VEX_W_0FXOP_09_E3_L_0, EVEX_W_0F5B_P_0, EVEX_W_0F62, @@ -1607,8 +1708,8 @@ enum EVEX_W_0F3814_P_1, EVEX_W_0F3815_P_1, EVEX_W_0F3819_L_n, - EVEX_W_0F381A_L_n, - EVEX_W_0F381B_L_2, + EVEX_W_0F381A_M_0_L_n, + EVEX_W_0F381B_M_0_L_2, EVEX_W_0F381E, EVEX_W_0F381F, EVEX_W_0F3820_P_1, @@ -1633,8 +1734,8 @@ enum EVEX_W_0F3837, EVEX_W_0F383A_P_1, EVEX_W_0F3859, - EVEX_W_0F385A_L_n, - EVEX_W_0F385B_L_2, + EVEX_W_0F385A_M_0_L_n, + EVEX_W_0F385B_M_0_L_2, EVEX_W_0F3870, EVEX_W_0F3872_P_2, EVEX_W_0F387A, @@ -1699,10 +1800,10 @@ struct dis386 { 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size prefix or if suffix_always is true. 'U' unused. - 'V' => print 'v' for VEX/EVEX and nothing for legacy encodings. + 'V' unused. 'W' => print 'b', 'w' or 'l' ('d' in Intel mode) 'X' => print 's', 'd' depending on data16 prefix (for XMM) - 'Y' => no output, mark EVEX.aaa != 0 as bad. + 'Y' unused. 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true. '!' => change condition from true to false or from false to true. '%' => add 1 upper case letter to the macro. @@ -1724,8 +1825,6 @@ struct dis386 { "XV" => print "{vex} " pseudo prefix "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is is used by an EVEX-encoded (AVX512VL) instruction. - "YK" keep unused, to avoid ambiguity with the combined use of Y and K. - "YX" keep unused, to avoid ambiguity with the combined use of Y and X. "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond being false, or no operand at all in 64bit mode, or if suffix_always is true. @@ -1904,7 +2003,7 @@ static const struct dis386 dis386[] = { { "movB", { Gb, EbS }, 0 }, { "movS", { Gv, EvS }, 0 }, { "movD", { Sv, Sw }, 0 }, - { "leaS", { Gv, M }, 0 }, + { MOD_TABLE (MOD_8D) }, { "movD", { Sw, Sv }, 0 }, { REG_TABLE (REG_8F) }, /* 90 */ @@ -2039,8 +2138,8 @@ static const struct dis386 dis386_twobyte[] = { /* 00 */ { REG_TABLE (REG_0F00 ) }, { REG_TABLE (REG_0F01 ) }, - { "larS", { Gv, Sv }, 0 }, - { "lslS", { Gv, Sv }, 0 }, + { MOD_TABLE (MOD_0F02) }, + { MOD_TABLE (MOD_0F03) }, { Bad_Opcode }, { "syscall", { XX }, 0 }, { "clts", { XX }, 0 }, @@ -2058,11 +2157,11 @@ static const struct dis386 dis386_twobyte[] = { { PREFIX_TABLE (PREFIX_0F10) }, { PREFIX_TABLE (PREFIX_0F11) }, { PREFIX_TABLE (PREFIX_0F12) }, - { "movlpX", { Mq, XM }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F13) }, { "unpcklpX", { XM, EXx }, PREFIX_OPCODE }, { "unpckhpX", { XM, EXx }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0F16) }, - { "movhpX", { Mq, XM }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F17) }, /* 18 */ { REG_TABLE (REG_0F18) }, { "nopQ", { Ev }, 0 }, @@ -2100,9 +2199,9 @@ static const struct dis386 dis386_twobyte[] = { { Bad_Opcode }, { "getsec", { XX }, 0 }, /* 38 */ - { THREE_BYTE_TABLE (THREE_BYTE_0F38) }, + { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) }, { Bad_Opcode }, - { THREE_BYTE_TABLE (THREE_BYTE_0F3A) }, + { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -2127,7 +2226,7 @@ static const struct dis386 dis386_twobyte[] = { { "cmovleS", { Gv, Ev }, 0 }, { "cmovgS", { Gv, Ev }, 0 }, /* 50 */ - { "movmskpX", { Gdq, Ux }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F50) }, { PREFIX_TABLE (PREFIX_0F51) }, { PREFIX_TABLE (PREFIX_0F52) }, { PREFIX_TABLE (PREFIX_0F53) }, @@ -2164,9 +2263,9 @@ static const struct dis386 dis386_twobyte[] = { { PREFIX_TABLE (PREFIX_0F6F) }, /* 70 */ { PREFIX_TABLE (PREFIX_0F70) }, - { REG_TABLE (REG_0F71) }, - { REG_TABLE (REG_0F72) }, - { REG_TABLE (REG_0F73) }, + { MOD_TABLE (MOD_0F71) }, + { MOD_TABLE (MOD_0F72) }, + { MOD_TABLE (MOD_0F73) }, { "pcmpeqb", { MX, EM }, PREFIX_OPCODE }, { "pcmpeqw", { MX, EM }, PREFIX_OPCODE }, { "pcmpeqd", { MX, EM }, PREFIX_OPCODE }, @@ -2237,10 +2336,10 @@ static const struct dis386 dis386_twobyte[] = { /* b0 */ { "cmpxchgB", { Ebh1, Gb }, 0 }, { "cmpxchgS", { Evh1, Gv }, 0 }, - { "lssS", { Gv, Mp }, 0 }, + { MOD_TABLE (MOD_0FB2) }, { "btrS", { Evh1, Gv }, 0 }, - { "lfsS", { Gv, Mp }, 0 }, - { "lgsS", { Gv, Mp }, 0 }, + { MOD_TABLE (MOD_0FB4) }, + { MOD_TABLE (MOD_0FB5) }, { "movz{bR|x}", { Gv, Eb }, 0 }, { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */ /* b8 */ @@ -2256,9 +2355,9 @@ static const struct dis386 dis386_twobyte[] = { { "xaddB", { Ebh1, Gb }, 0 }, { "xaddS", { Evh1, Gv }, 0 }, { PREFIX_TABLE (PREFIX_0FC2) }, - { "movntiS", { Mdq, Gdq }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0FC3) }, { "pinsrw", { MX, Edw, Ib }, PREFIX_OPCODE }, - { "pextrw", { Gd, Nq, Ib }, PREFIX_OPCODE }, + { "pextrw", { Gd, MS, Ib }, PREFIX_OPCODE }, { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE }, { REG_TABLE (REG_0FC7) }, /* c8 */ @@ -2278,7 +2377,7 @@ static const struct dis386 dis386_twobyte[] = { { "paddq", { MX, EM }, PREFIX_OPCODE }, { "pmullw", { MX, EM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_0FD6) }, - { "pmovmskb", { Gdq, Nq }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0FD7) }, /* d8 */ { "psubusb", { MX, EM }, PREFIX_OPCODE }, { "psubusw", { MX, EM }, PREFIX_OPCODE }, @@ -2512,11 +2611,11 @@ static const struct dis386 reg_table[][8] = { /* REG_8F */ { { "pop{P|}", { stackEv }, 0 }, - { XOP_8F_TABLE () }, + { XOP_8F_TABLE (XOP_09) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { XOP_8F_TABLE () }, + { XOP_8F_TABLE (XOP_09) }, }, /* REG_C0 */ { @@ -2549,7 +2648,7 @@ static const struct dis386 reg_table[][8] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { RM_TABLE (RM_C6_REG_7) }, + { MOD_TABLE (MOD_C6_REG_7) }, }, /* REG_C7 */ { @@ -2560,7 +2659,7 @@ static const struct dis386 reg_table[][8] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { RM_TABLE (RM_C7_REG_7) }, + { MOD_TABLE (MOD_C7_REG_7) }, }, /* REG_D0 */ { @@ -2638,9 +2737,9 @@ static const struct dis386 reg_table[][8] = { { "incQ", { Evh1 }, 0 }, { "decQ", { Evh1 }, 0 }, { "call{@|}", { NOTRACK, indirEv, BND }, 0 }, - { "{l|}call^", { indirEp }, 0 }, + { MOD_TABLE (MOD_FF_REG_3) }, { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 }, - { "{l|}jmp^", { indirEp }, 0 }, + { MOD_TABLE (MOD_FF_REG_5) }, { "push{P|}", { stackEv }, 0 }, { Bad_Opcode }, }, @@ -2648,10 +2747,10 @@ static const struct dis386 reg_table[][8] = { { { "sldtD", { Sv }, 0 }, { "strD", { Sv }, 0 }, - { "lldtD", { Sv }, 0 }, - { "ltrD", { Sv }, 0 }, - { "verrD", { Sv }, 0 }, - { "verwD", { Sv }, 0 }, + { "lldt", { Ew }, 0 }, + { "ltr", { Ew }, 0 }, + { "verr", { Ew }, 0 }, + { "verw", { Ew }, 0 }, { X86_64_TABLE (X86_64_0F00_REG_6) }, { Bad_Opcode }, }, @@ -2717,40 +2816,40 @@ static const struct dis386 reg_table[][8] = { { "aesencwide256kl", { M }, 0 }, { "aesdecwide256kl", { M }, 0 }, }, - /* REG_0F3A0F_P_1 */ + /* REG_0F3A0F_PREFIX_1_MOD_3 */ { - { RM_TABLE (RM_0F3A0F_P_1_R_0) }, + { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) }, }, - /* REG_0F71 */ + /* REG_0F71_MOD_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "psrlw", { Nq, Ib }, PREFIX_OPCODE }, + { "psrlw", { MS, Ib }, PREFIX_OPCODE }, { Bad_Opcode }, - { "psraw", { Nq, Ib }, PREFIX_OPCODE }, + { "psraw", { MS, Ib }, PREFIX_OPCODE }, { Bad_Opcode }, - { "psllw", { Nq, Ib }, PREFIX_OPCODE }, + { "psllw", { MS, Ib }, PREFIX_OPCODE }, }, - /* REG_0F72 */ + /* REG_0F72_MOD_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "psrld", { Nq, Ib }, PREFIX_OPCODE }, + { "psrld", { MS, Ib }, PREFIX_OPCODE }, { Bad_Opcode }, - { "psrad", { Nq, Ib }, PREFIX_OPCODE }, + { "psrad", { MS, Ib }, PREFIX_OPCODE }, { Bad_Opcode }, - { "pslld", { Nq, Ib }, PREFIX_OPCODE }, + { "pslld", { MS, Ib }, PREFIX_OPCODE }, }, - /* REG_0F73 */ + /* REG_0F73_MOD_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "psrlq", { Nq, Ib }, PREFIX_OPCODE }, - { "psrldq", { Ux, Ib }, PREFIX_DATA }, + { "psrlq", { MS, Ib }, PREFIX_OPCODE }, + { "psrldq", { XS, Ib }, PREFIX_DATA }, { Bad_Opcode }, { Bad_Opcode }, - { "psllq", { Nq, Ib }, PREFIX_OPCODE }, - { "pslldq", { Ux, Ib }, PREFIX_DATA }, + { "psllq", { MS, Ib }, PREFIX_OPCODE }, + { "pslldq", { XS, Ib }, PREFIX_DATA }, }, /* REG_0FA6 */ { @@ -2794,49 +2893,49 @@ static const struct dis386 reg_table[][8] = { { Bad_Opcode }, { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 }, { Bad_Opcode }, - { "xrstors", { FXSAVE }, 0 }, - { "xsavec", { FXSAVE }, 0 }, - { "xsaves", { FXSAVE }, 0 }, + { MOD_TABLE (MOD_0FC7_REG_3) }, + { MOD_TABLE (MOD_0FC7_REG_4) }, + { MOD_TABLE (MOD_0FC7_REG_5) }, { MOD_TABLE (MOD_0FC7_REG_6) }, { MOD_TABLE (MOD_0FC7_REG_7) }, }, - /* REG_VEX_0F71 */ + /* REG_VEX_0F71_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vpsrlw", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA }, { Bad_Opcode }, - { "vpsraw", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA }, { Bad_Opcode }, - { "vpsllw", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA }, }, - /* REG_VEX_0F72 */ + /* REG_VEX_0F72_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vpsrld", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA }, { Bad_Opcode }, - { "vpsrad", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA }, { Bad_Opcode }, - { "vpslld", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpslld", { Vex, XS, Ib }, PREFIX_DATA }, }, - /* REG_VEX_0F73 */ + /* REG_VEX_0F73_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vpsrlq", { Vex, Ux, Ib }, PREFIX_DATA }, - { "vpsrldq", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA }, + { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA }, { Bad_Opcode }, { Bad_Opcode }, - { "vpsllq", { Vex, Ux, Ib }, PREFIX_DATA }, - { "vpslldq", { Vex, Ux, Ib }, PREFIX_DATA }, + { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA }, + { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA }, }, /* REG_VEX_0FAE */ { { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) }, - { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) }, + { MOD_TABLE (MOD_VEX_0FAE_REG_2) }, + { MOD_TABLE (MOD_VEX_0FAE_REG_3) }, }, /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */ { @@ -2870,10 +2969,10 @@ static const struct dis386 reg_table[][8] = { { Bad_Opcode }, { "blci", { VexGdq, Edq }, 0 }, }, - /* REG_XOP_09_12_L_0 */ + /* REG_XOP_09_12_M_1_L_0 */ { - { "llwpcb", { Rdq }, 0 }, - { "slwpcb", { Rdq }, 0 }, + { "llwpcb", { Edq }, 0 }, + { "slwpcb", { Edq }, 0 }, }, /* REG_XOP_0A_12_L_0 */ { @@ -2898,7 +2997,7 @@ static const struct dis386 prefix_table[][4] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "lkgsD", { Sv }, 0 }, + { "lkgs", { Ew }, 0 }, }, /* PREFIX_0F01_REG_0_MOD_3_RM_6 */ @@ -2909,11 +3008,6 @@ static const struct dis386 prefix_table[][4] = { { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) }, }, - /* PREFIX_0F01_REG_0_MOD_3_RM_7 */ - { - { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) }, - }, - /* PREFIX_0F01_REG_1_RM_2 */ { { "clac", { Skip_MODRM }, 0 }, @@ -3050,33 +3144,33 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F10 */ { - { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 }, - { "%XEVmovs%XS", { XMScalar, VexScalarR, EXd }, 0 }, - { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 }, - { "%XEVmovs%XD", { XMScalar, VexScalarR, EXq }, 0 }, + { "movups", { XM, EXx }, PREFIX_OPCODE }, + { "movss", { XM, EXd }, PREFIX_OPCODE }, + { "movupd", { XM, EXx }, PREFIX_OPCODE }, + { "movsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F11 */ { - { "%XEVmovupX", { EXxS, XM }, 0 }, - { "%XEVmovs%XS", { EXdS, VexScalarR, XMScalar }, 0 }, - { "%XEVmovupX", { EXxS, XM }, 0 }, - { "%XEVmovs%XD", { EXqS, VexScalarR, XMScalar }, 0 }, + { "movups", { EXxS, XM }, PREFIX_OPCODE }, + { "movss", { EXdS, XM }, PREFIX_OPCODE }, + { "movupd", { EXxS, XM }, PREFIX_OPCODE }, + { "movsd", { EXqS, XM }, PREFIX_OPCODE }, }, /* PREFIX_0F12 */ { { MOD_TABLE (MOD_0F12_PREFIX_0) }, - { "movsldup", { XM, EXx }, 0 }, - { "%XEVmovlpYX", { XM, Vex, Mq }, 0 }, - { "movddup", { XM, EXq }, 0 }, + { "movsldup", { XM, EXx }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F12_PREFIX_2) }, + { "movddup", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F16 */ { { MOD_TABLE (MOD_0F16_PREFIX_0) }, - { "movshdup", { XM, EXx }, 0 }, - { "%XEVmovhpYX", { XM, Vex, Mq }, 0 }, + { "movshdup", { XM, EXx }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F16_PREFIX_2) }, }, /* PREFIX_0F18_REG_6_MOD_0_X86_64 */ @@ -3137,10 +3231,10 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F2B */ { - { "movntps", { Mx, XM }, 0 }, - { "movntss", { Md, XM }, 0 }, - { "movntpd", { Mx, XM }, 0 }, - { "movntsd", { Mq, XM }, 0 }, + { MOD_TABLE (MOD_0F2B_PREFIX_0) }, + { MOD_TABLE (MOD_0F2B_PREFIX_1) }, + { MOD_TABLE (MOD_0F2B_PREFIX_2) }, + { MOD_TABLE (MOD_0F2B_PREFIX_3) }, }, /* PREFIX_0F2C */ @@ -3161,99 +3255,99 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F2E */ { - { "%XEVucomisYX", { XMScalar, EXd, EXxEVexS }, 0 }, + { "ucomiss",{ XM, EXd }, 0 }, { Bad_Opcode }, - { "%XEVucomisYX", { XMScalar, EXq, EXxEVexS }, 0 }, + { "ucomisd",{ XM, EXq }, 0 }, }, /* PREFIX_0F2F */ { - { "%XEVcomisYX", { XMScalar, EXd, EXxEVexS }, 0 }, + { "comiss", { XM, EXd }, 0 }, { Bad_Opcode }, - { "%XEVcomisYX", { XMScalar, EXq, EXxEVexS }, 0 }, + { "comisd", { XM, EXq }, 0 }, }, /* PREFIX_0F51 */ { - { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 }, - { "%XEVsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, - { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 }, - { "%XEVsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + { "sqrtps", { XM, EXx }, PREFIX_OPCODE }, + { "sqrtss", { XM, EXd }, PREFIX_OPCODE }, + { "sqrtpd", { XM, EXx }, PREFIX_OPCODE }, + { "sqrtsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F52 */ { - { "Vrsqrtps", { XM, EXx }, 0 }, - { "Vrsqrtss", { XMScalar, VexScalar, EXd }, 0 }, + { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE }, + { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F53 */ { - { "Vrcpps", { XM, EXx }, 0 }, - { "Vrcpss", { XMScalar, VexScalar, EXd }, 0 }, + { "rcpps", { XM, EXx }, PREFIX_OPCODE }, + { "rcpss", { XM, EXd }, PREFIX_OPCODE }, }, /* PREFIX_0F58 */ { - { "%XEVaddpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVadds%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, - { "%XEVaddpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVadds%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + { "addps", { XM, EXx }, PREFIX_OPCODE }, + { "addss", { XM, EXd }, PREFIX_OPCODE }, + { "addpd", { XM, EXx }, PREFIX_OPCODE }, + { "addsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F59 */ { - { "%XEVmulpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVmuls%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, - { "%XEVmulpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVmuls%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + { "mulps", { XM, EXx }, PREFIX_OPCODE }, + { "mulss", { XM, EXd }, PREFIX_OPCODE }, + { "mulpd", { XM, EXx }, PREFIX_OPCODE }, + { "mulsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5A */ { - { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 }, - { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, - { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 }, - { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE }, + { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE }, + { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE }, + { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5B */ { - { "Vcvtdq2ps", { XM, EXx }, 0 }, - { "Vcvttps2dq", { XM, EXx }, 0 }, - { "Vcvtps2dq", { XM, EXx }, 0 }, + { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE }, + { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE }, + { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F5C */ { - { "%XEVsubpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVsubs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, - { "%XEVsubpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVsubs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + { "subps", { XM, EXx }, PREFIX_OPCODE }, + { "subss", { XM, EXd }, PREFIX_OPCODE }, + { "subpd", { XM, EXx }, PREFIX_OPCODE }, + { "subsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5D */ { - { "%XEVminpX", { XM, Vex, EXx, EXxEVexS }, 0 }, - { "%XEVmins%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, - { "%XEVminpX", { XM, Vex, EXx, EXxEVexS }, 0 }, - { "%XEVmins%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 }, + { "minps", { XM, EXx }, PREFIX_OPCODE }, + { "minss", { XM, EXd }, PREFIX_OPCODE }, + { "minpd", { XM, EXx }, PREFIX_OPCODE }, + { "minsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5E */ { - { "%XEVdivpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVdivs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, - { "%XEVdivpX", { XM, Vex, EXx, EXxEVexR }, 0 }, - { "%XEVdivs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + { "divps", { XM, EXx }, PREFIX_OPCODE }, + { "divss", { XM, EXd }, PREFIX_OPCODE }, + { "divpd", { XM, EXx }, PREFIX_OPCODE }, + { "divsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F5F */ { - { "%XEVmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 }, - { "%XEVmaxs%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, - { "%XEVmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 }, - { "%XEVmaxs%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 }, + { "maxps", { XM, EXx }, PREFIX_OPCODE }, + { "maxss", { XM, EXd }, PREFIX_OPCODE }, + { "maxpd", { XM, EXx }, PREFIX_OPCODE }, + { "maxsd", { XM, EXq }, PREFIX_OPCODE }, }, /* PREFIX_0F60 */ @@ -3296,32 +3390,32 @@ static const struct dis386 prefix_table[][4] = { { {"vmread", { Em, Gm }, 0 }, { Bad_Opcode }, - {"extrq", { Uxmm, Ib, Ib }, 0 }, - {"insertq", { XM, Uxmm, Ib, Ib }, 0 }, + {"extrq", { XS, Ib, Ib }, 0 }, + {"insertq", { XM, XS, Ib, Ib }, 0 }, }, /* PREFIX_0F79 */ { {"vmwrite", { Gm, Em }, 0 }, { Bad_Opcode }, - {"extrq", { XM, Uxmm }, 0 }, - {"insertq", { XM, Uxmm }, 0 }, + {"extrq", { XM, XS }, 0 }, + {"insertq", { XM, XS }, 0 }, }, /* PREFIX_0F7C */ { { Bad_Opcode }, { Bad_Opcode }, - { "Vhaddpd", { XM, Vex, EXx }, 0 }, - { "Vhaddps", { XM, Vex, EXx }, 0 }, + { "haddpd", { XM, EXx }, PREFIX_OPCODE }, + { "haddps", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F7D */ { { Bad_Opcode }, { Bad_Opcode }, - { "Vhsubpd", { XM, Vex, EXx }, 0 }, - { "Vhsubps", { XM, Vex, EXx }, 0 }, + { "hsubpd", { XM, EXx }, PREFIX_OPCODE }, + { "hsubps", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0F7E */ @@ -3424,10 +3518,10 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0FC2 */ { - { "VcmppX", { XM, Vex, EXx, CMP }, 0 }, - { "Vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 }, - { "VcmppX", { XM, Vex, EXx, CMP }, 0 }, - { "Vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 }, + { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE }, + { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE }, + { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE }, + { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE }, }, /* PREFIX_0FC7_REG_6_MOD_0 */ @@ -3455,31 +3549,31 @@ static const struct dis386 prefix_table[][4] = { { { Bad_Opcode }, { Bad_Opcode }, - { "VaddsubpX", { XM, Vex, EXx }, 0 }, - { "VaddsubpX", { XM, Vex, EXx }, 0 }, + { "addsubpd", { XM, EXx }, 0 }, + { "addsubps", { XM, EXx }, 0 }, }, /* PREFIX_0FD6 */ { { Bad_Opcode }, - { "movq2dq",{ XM, Nq }, 0 }, + { "movq2dq",{ XM, MS }, 0 }, { "movq", { EXqS, XM }, 0 }, - { "movdq2q",{ MX, Ux }, 0 }, + { "movdq2q",{ MX, XS }, 0 }, }, /* PREFIX_0FE6 */ { { Bad_Opcode }, - { "Vcvtdq2pd", { XM, EXxmmq }, 0 }, - { "Vcvttpd2dq%XY", { XMM, EXx }, 0 }, - { "Vcvtpd2dq%XY", { XMM, EXx }, 0 }, + { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE }, + { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE }, + { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE }, }, /* PREFIX_0FE7 */ { - { "movntq", { Mq, MX }, 0 }, + { "movntq", { Mq, MX }, PREFIX_OPCODE }, { Bad_Opcode }, - { "movntdq", { Mx, XM }, 0 }, + { MOD_TABLE (MOD_0FE7_PREFIX_2) }, }, /* PREFIX_0FF0 */ @@ -3487,14 +3581,14 @@ static const struct dis386 prefix_table[][4] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "Vlddqu", { XM, M }, 0 }, + { MOD_TABLE (MOD_0FF0_PREFIX_3) }, }, /* PREFIX_0FF7 */ { - { "maskmovq", { MX, Nq }, PREFIX_OPCODE }, + { "maskmovq", { MX, MS }, PREFIX_OPCODE }, { Bad_Opcode }, - { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE }, + { "maskmovdqu", { XM, XS }, PREFIX_OPCODE }, }, /* PREFIX_0F38D8 */ @@ -3513,21 +3607,21 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F38DD */ { { Bad_Opcode }, - { "aesdec128kl", { XM, M }, 0 }, + { MOD_TABLE (MOD_0F38DD_PREFIX_1) }, { "aesenclast", { XM, EXx }, 0 }, }, /* PREFIX_0F38DE */ { { Bad_Opcode }, - { "aesenc256kl", { XM, M }, 0 }, + { MOD_TABLE (MOD_0F38DE_PREFIX_1) }, { "aesdec", { XM, EXx }, 0 }, }, /* PREFIX_0F38DF */ { { Bad_Opcode }, - { "aesdec256kl", { XM, M }, 0 }, + { MOD_TABLE (MOD_0F38DF_PREFIX_1) }, { "aesdeclast", { XM, EXx }, 0 }, }, @@ -3549,29 +3643,29 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F38F6 */ { - { "wrssK", { M, Gdq }, 0 }, - { "adoxS", { Gdq, Edq}, 0 }, - { "adcxS", { Gdq, Edq}, 0 }, + { MOD_TABLE (MOD_0F38F6_PREFIX_0) }, + { "adoxS", { Gdq, Edq}, PREFIX_OPCODE }, + { "adcxS", { Gdq, Edq}, PREFIX_OPCODE }, { Bad_Opcode }, }, /* PREFIX_0F38F8 */ { { Bad_Opcode }, - { "enqcmds", { Gva, M }, 0 }, - { "movdir64b", { Gva, M }, 0 }, - { "enqcmd", { Gva, M }, 0 }, + { MOD_TABLE (MOD_0F38F8_PREFIX_1) }, + { MOD_TABLE (MOD_0F38F8_PREFIX_2) }, + { MOD_TABLE (MOD_0F38F8_PREFIX_3) }, }, /* PREFIX_0F38FA */ { { Bad_Opcode }, - { "encodekey128", { Gd, Rd }, 0 }, + { MOD_TABLE (MOD_0F38FA_PREFIX_1) }, }, /* PREFIX_0F38FB */ { { Bad_Opcode }, - { "encodekey256", { Gd, Rd }, 0 }, + { MOD_TABLE (MOD_0F38FB_PREFIX_1) }, }, /* PREFIX_0F38FC */ @@ -3585,30 +3679,46 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F3A0F */ { { Bad_Opcode }, - { REG_TABLE (REG_0F3A0F_P_1) }, + { MOD_TABLE (MOD_0F3A0F_PREFIX_1)}, + }, + + /* PREFIX_VEX_0F10 */ + { + { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 }, + { "%XEvmovs%XS", { XMScalar, VexScalarR, EXd }, 0 }, + { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 }, + { "%XEvmovs%XD", { XMScalar, VexScalarR, EXq }, 0 }, + }, + + /* PREFIX_VEX_0F11 */ + { + { "%XEvmovupX", { EXxS, XM }, 0 }, + { "%XEvmovs%XS", { EXdS, VexScalarR, XMScalar }, 0 }, + { "%XEvmovupX", { EXxS, XM }, 0 }, + { "%XEvmovs%XD", { EXqS, VexScalarR, XMScalar }, 0 }, }, /* PREFIX_VEX_0F12 */ { - { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) }, + { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) }, { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 }, - { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) }, + { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) }, { "%XEvmov%XDdup", { XM, EXymmq }, 0 }, }, /* PREFIX_VEX_0F16 */ { - { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) }, + { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) }, { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 }, - { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) }, + { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) }, }, /* PREFIX_VEX_0F2A */ { { Bad_Opcode }, - { "%XEvcvtsi2ssY{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 }, + { "%XEvcvtsi2ss{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 }, { Bad_Opcode }, - { "%XEvcvtsi2sdY{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 }, + { "%XEvcvtsi2sd{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 }, }, /* PREFIX_VEX_0F2C */ @@ -3627,114 +3737,211 @@ static const struct dis386 prefix_table[][4] = { { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 }, }, - /* PREFIX_VEX_0F41_L_1_W_0 */ + /* PREFIX_VEX_0F2E */ + { + { "%XEvucomisX", { XMScalar, EXd, EXxEVexS }, 0 }, + { Bad_Opcode }, + { "%XEvucomisX", { XMScalar, EXq, EXxEVexS }, 0 }, + }, + + /* PREFIX_VEX_0F2F */ { - { "kandw", { MaskG, MaskVex, MaskR }, 0 }, + { "%XEvcomisX", { XMScalar, EXd, EXxEVexS }, 0 }, { Bad_Opcode }, - { "kandb", { MaskG, MaskVex, MaskR }, 0 }, + { "%XEvcomisX", { XMScalar, EXq, EXxEVexS }, 0 }, }, - /* PREFIX_VEX_0F41_L_1_W_1 */ + /* PREFIX_VEX_0F41_L_1_M_1_W_0 */ { - { "kandq", { MaskG, MaskVex, MaskR }, 0 }, + { "kandw", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kandd", { MaskG, MaskVex, MaskR }, 0 }, + { "kandb", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F42_L_1_W_0 */ + /* PREFIX_VEX_0F41_L_1_M_1_W_1 */ { - { "kandnw", { MaskG, MaskVex, MaskR }, 0 }, + { "kandq", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kandnb", { MaskG, MaskVex, MaskR }, 0 }, + { "kandd", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F42_L_1_W_1 */ + /* PREFIX_VEX_0F42_L_1_M_1_W_0 */ { - { "kandnq", { MaskG, MaskVex, MaskR }, 0 }, + { "kandnw", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kandnd", { MaskG, MaskVex, MaskR }, 0 }, + { "kandnb", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F44_L_0_W_0 */ + /* PREFIX_VEX_0F42_L_1_M_1_W_1 */ { - { "knotw", { MaskG, MaskR }, 0 }, + { "kandnq", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "knotb", { MaskG, MaskR }, 0 }, + { "kandnd", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F44_L_0_W_1 */ + /* PREFIX_VEX_0F44_L_0_M_1_W_0 */ { - { "knotq", { MaskG, MaskR }, 0 }, + { "knotw", { MaskG, MaskE }, 0 }, { Bad_Opcode }, - { "knotd", { MaskG, MaskR }, 0 }, + { "knotb", { MaskG, MaskE }, 0 }, }, - /* PREFIX_VEX_0F45_L_1_W_0 */ + /* PREFIX_VEX_0F44_L_0_M_1_W_1 */ { - { "korw", { MaskG, MaskVex, MaskR }, 0 }, + { "knotq", { MaskG, MaskE }, 0 }, { Bad_Opcode }, - { "korb", { MaskG, MaskVex, MaskR }, 0 }, + { "knotd", { MaskG, MaskE }, 0 }, }, - /* PREFIX_VEX_0F45_L_1_W_1 */ + /* PREFIX_VEX_0F45_L_1_M_1_W_0 */ { - { "korq", { MaskG, MaskVex, MaskR }, 0 }, + { "korw", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kord", { MaskG, MaskVex, MaskR }, 0 }, + { "korb", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F46_L_1_W_0 */ + /* PREFIX_VEX_0F45_L_1_M_1_W_1 */ { - { "kxnorw", { MaskG, MaskVex, MaskR }, 0 }, + { "korq", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kxnorb", { MaskG, MaskVex, MaskR }, 0 }, + { "kord", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F46_L_1_W_1 */ + /* PREFIX_VEX_0F46_L_1_M_1_W_0 */ { - { "kxnorq", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnorw", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kxnord", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnorb", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F47_L_1_W_0 */ + /* PREFIX_VEX_0F46_L_1_M_1_W_1 */ { - { "kxorw", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnorq", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kxorb", { MaskG, MaskVex, MaskR }, 0 }, + { "kxnord", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F47_L_1_W_1 */ + /* PREFIX_VEX_0F47_L_1_M_1_W_0 */ { - { "kxorq", { MaskG, MaskVex, MaskR }, 0 }, + { "kxorw", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kxord", { MaskG, MaskVex, MaskR }, 0 }, + { "kxorb", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F4A_L_1_W_0 */ + /* PREFIX_VEX_0F47_L_1_M_1_W_1 */ { - { "kaddw", { MaskG, MaskVex, MaskR }, 0 }, + { "kxorq", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kaddb", { MaskG, MaskVex, MaskR }, 0 }, + { "kxord", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F4A_L_1_W_1 */ + /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */ { - { "kaddq", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddw", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kaddd", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddb", { MaskG, MaskVex, MaskE }, 0 }, }, - /* PREFIX_VEX_0F4B_L_1_W_0 */ + /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */ { - { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddq", { MaskG, MaskVex, MaskE }, 0 }, { Bad_Opcode }, - { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 }, + { "kaddd", { MaskG, MaskVex, MaskE }, 0 }, + }, + + /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */ + { + { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 }, + { Bad_Opcode }, + { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 }, + }, + + /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */ + { + { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 }, + }, + + /* PREFIX_VEX_0F51 */ + { + { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 }, + { "%XEvsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, + { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 }, + { "%XEvsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, }, - /* PREFIX_VEX_0F4B_L_1_W_1 */ + /* PREFIX_VEX_0F52 */ { - { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 }, + { "vrsqrtps", { XM, EXx }, 0 }, + { "vrsqrtss", { XMScalar, VexScalar, EXd }, 0 }, + }, + + /* PREFIX_VEX_0F53 */ + { + { "vrcpps", { XM, EXx }, 0 }, + { "vrcpss", { XMScalar, VexScalar, EXd }, 0 }, + }, + + /* PREFIX_VEX_0F58 */ + { + { "%XEvaddpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvadds%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, + { "%XEvaddpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvadds%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + }, + + /* PREFIX_VEX_0F59 */ + { + { "%XEvmulpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvmuls%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, + { "%XEvmulpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvmuls%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + }, + + /* PREFIX_VEX_0F5A */ + { + { "%XEvcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 }, + { "%XEvcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, + { "%XEvcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 }, + { "%XEvcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + }, + + /* PREFIX_VEX_0F5B */ + { + { "vcvtdq2ps", { XM, EXx }, 0 }, + { "vcvttps2dq", { XM, EXx }, 0 }, + { "vcvtps2dq", { XM, EXx }, 0 }, + }, + + /* PREFIX_VEX_0F5C */ + { + { "%XEvsubpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvsubs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, + { "%XEvsubpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvsubs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + }, + + /* PREFIX_VEX_0F5D */ + { + { "%XEvminpX", { XM, Vex, EXx, EXxEVexS }, 0 }, + { "%XEvmins%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, + { "%XEvminpX", { XM, Vex, EXx, EXxEVexS }, 0 }, + { "%XEvmins%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 }, + }, + + /* PREFIX_VEX_0F5E */ + { + { "%XEvdivpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvdivs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, + { "%XEvdivpX", { XM, Vex, EXx, EXxEVexR }, 0 }, + { "%XEvdivs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, + }, + + /* PREFIX_VEX_0F5F */ + { + { "%XEvmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 }, + { "%XEvmaxs%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, + { "%XEvmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 }, + { "%XEvmaxs%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 }, }, /* PREFIX_VEX_0F6F */ @@ -3752,6 +3959,22 @@ static const struct dis386 prefix_table[][4] = { { "vpshuflw", { XM, EXx, Ib }, 0 }, }, + /* PREFIX_VEX_0F7C */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { "vhaddpd", { XM, Vex, EXx }, 0 }, + { "vhaddps", { XM, Vex, EXx }, 0 }, + }, + + /* PREFIX_VEX_0F7D */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { "vhsubpd", { XM, Vex, EXx }, 0 }, + { "vhsubps", { XM, Vex, EXx }, 0 }, + }, + /* PREFIX_VEX_0F7E */ { { Bad_Opcode }, @@ -3780,78 +4003,110 @@ static const struct dis386 prefix_table[][4] = { { "kmovd", { MaskG, MaskBDE }, 0 }, }, - /* PREFIX_VEX_0F91_L_0_W_0 */ + /* PREFIX_VEX_0F91_L_0_M_0_W_0 */ { - { "kmovw", { Mw, MaskG }, 0 }, + { "kmovw", { Ew, MaskG }, 0 }, { Bad_Opcode }, - { "kmovb", { Mb, MaskG }, 0 }, + { "kmovb", { Eb, MaskG }, 0 }, }, - /* PREFIX_VEX_0F91_L_0_W_1 */ + /* PREFIX_VEX_0F91_L_0_M_0_W_1 */ { - { "kmovq", { Mq, MaskG }, 0 }, + { "kmovq", { Eq, MaskG }, 0 }, { Bad_Opcode }, - { "kmovd", { Md, MaskG }, 0 }, + { "kmovd", { Ed, MaskG }, 0 }, }, - /* PREFIX_VEX_0F92_L_0_W_0 */ + /* PREFIX_VEX_0F92_L_0_M_1_W_0 */ { - { "kmovw", { MaskG, Rdq }, 0 }, + { "kmovw", { MaskG, Edq }, 0 }, { Bad_Opcode }, - { "kmovb", { MaskG, Rdq }, 0 }, - { "kmovd", { MaskG, Rdq }, 0 }, + { "kmovb", { MaskG, Edq }, 0 }, + { "kmovd", { MaskG, Edq }, 0 }, }, - /* PREFIX_VEX_0F92_L_0_W_1 */ + /* PREFIX_VEX_0F92_L_0_M_1_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "kmovK", { MaskG, Rdq }, 0 }, + { "kmovK", { MaskG, Edq }, 0 }, }, - /* PREFIX_VEX_0F93_L_0_W_0 */ + /* PREFIX_VEX_0F93_L_0_M_1_W_0 */ { - { "kmovw", { Gdq, MaskR }, 0 }, + { "kmovw", { Gdq, MaskE }, 0 }, { Bad_Opcode }, - { "kmovb", { Gdq, MaskR }, 0 }, - { "kmovd", { Gdq, MaskR }, 0 }, + { "kmovb", { Gdq, MaskE }, 0 }, + { "kmovd", { Gdq, MaskE }, 0 }, }, - /* PREFIX_VEX_0F93_L_0_W_1 */ + /* PREFIX_VEX_0F93_L_0_M_1_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "kmovK", { Gdq, MaskR }, 0 }, + { "kmovK", { Gdq, MaskE }, 0 }, + }, + + /* PREFIX_VEX_0F98_L_0_M_1_W_0 */ + { + { "kortestw", { MaskG, MaskE }, 0 }, + { Bad_Opcode }, + { "kortestb", { MaskG, MaskE }, 0 }, }, - /* PREFIX_VEX_0F98_L_0_W_0 */ + /* PREFIX_VEX_0F98_L_0_M_1_W_1 */ { - { "kortestw", { MaskG, MaskR }, 0 }, + { "kortestq", { MaskG, MaskE }, 0 }, { Bad_Opcode }, - { "kortestb", { MaskG, MaskR }, 0 }, + { "kortestd", { MaskG, MaskE }, 0 }, }, - /* PREFIX_VEX_0F98_L_0_W_1 */ + /* PREFIX_VEX_0F99_L_0_M_1_W_0 */ { - { "kortestq", { MaskG, MaskR }, 0 }, + { "ktestw", { MaskG, MaskE }, 0 }, { Bad_Opcode }, - { "kortestd", { MaskG, MaskR }, 0 }, + { "ktestb", { MaskG, MaskE }, 0 }, }, - /* PREFIX_VEX_0F99_L_0_W_0 */ + /* PREFIX_VEX_0F99_L_0_M_1_W_1 */ { - { "ktestw", { MaskG, MaskR }, 0 }, + { "ktestq", { MaskG, MaskE }, 0 }, { Bad_Opcode }, - { "ktestb", { MaskG, MaskR }, 0 }, + { "ktestd", { MaskG, MaskE }, 0 }, + }, + + /* PREFIX_VEX_0FC2 */ + { + { "vcmpps", { XM, Vex, EXx, CMP }, 0 }, + { "vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 }, + { "vcmppd", { XM, Vex, EXx, CMP }, 0 }, + { "vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 }, }, - /* PREFIX_VEX_0F99_L_0_W_1 */ + /* PREFIX_VEX_0FD0 */ { - { "ktestq", { MaskG, MaskR }, 0 }, { Bad_Opcode }, - { "ktestd", { MaskG, MaskR }, 0 }, + { Bad_Opcode }, + { "vaddsubpd", { XM, Vex, EXx }, 0 }, + { "vaddsubps", { XM, Vex, EXx }, 0 }, + }, + + /* PREFIX_VEX_0FE6 */ + { + { Bad_Opcode }, + { "vcvtdq2pd", { XM, EXxmmq }, 0 }, + { "vcvttpd2dq%XY", { XMM, EXx }, 0 }, + { "vcvtpd2dq%XY", { XMM, EXx }, 0 }, + }, + + /* PREFIX_VEX_0FF0 */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { Bad_Opcode }, + { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) }, }, /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */ @@ -3869,7 +4124,7 @@ static const struct dis386 prefix_table[][4] = { { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) }, }, - /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */ + /* PREFIX_VEX_0F384B_X86_64_L_0_W_0_M_0 */ { { Bad_Opcode }, { "tilestored", { MVexSIBMEM, TMM }, 0 }, @@ -3892,27 +4147,27 @@ static const struct dis386 prefix_table[][4] = { { "%XVvpdpbusds", { XM, Vex, EXx }, 0 }, { "vpdpbssds", { XM, Vex, EXx }, 0 }, }, - /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */ + /* PREFIX_VEX_0F385C_X86_64_M_1_L_0_W_0 */ { { Bad_Opcode }, - { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 }, + { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 }, { Bad_Opcode }, - { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 }, + { "tdpfp16ps", { TMM, EXtmm, VexTmm }, 0 }, }, - /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */ + /* PREFIX_VEX_0F385E_X86_64_M_1_L_0_W_0 */ { - { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 }, - { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 }, - { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 }, - { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 }, + { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 }, + { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 }, + { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 }, + { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 }, }, - /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */ + /* PREFIX_VEX_0F386C_X86_64_M_1_L_0_W_0 */ { - { "tcmmrlfp16ps", { TMM, Rtmm, VexTmm }, 0 }, + { "tcmmrlfp16ps", { TMM, EXtmm, VexTmm }, 0 }, { Bad_Opcode }, - { "tcmmimfp16ps", { TMM, Rtmm, VexTmm }, 0 }, + { "tcmmimfp16ps", { TMM, EXtmm, VexTmm }, 0 }, }, /* PREFIX_VEX_0F3872 */ @@ -3936,52 +4191,6 @@ static const struct dis386 prefix_table[][4] = { { "vbcstnesh2ps", { XM, Mw }, 0 }, }, - /* PREFIX_VEX_0F38D2_W_0 */ - { - { "vpdpwuud", { XM, Vex, EXx }, 0 }, - { "vpdpwsud", { XM, Vex, EXx }, 0 }, - { "vpdpwusd", { XM, Vex, EXx }, 0 }, - }, - - /* PREFIX_VEX_0F38D3_W_0 */ - { - { "vpdpwuuds", { XM, Vex, EXx }, 0 }, - { "vpdpwsuds", { XM, Vex, EXx }, 0 }, - { "vpdpwusds", { XM, Vex, EXx }, 0 }, - }, - - /* PREFIX_VEX_0F38CB */ - { - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F38CB_P_3) }, - }, - - /* PREFIX_VEX_0F38CC */ - { - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F38CC_P_3) }, - }, - - /* PREFIX_VEX_0F38CD */ - { - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F38CD_P_3) }, - }, - - /* PREFIX_VEX_0F38DA_W_0 */ - { - { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) }, - { "vsm4key4", { XM, Vex, EXx }, 0 }, - { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) }, - { "vsm4rnds4", { XM, Vex, EXx }, 0 }, - }, - /* PREFIX_VEX_0F38F5_L_0 */ { { "bzhiS", { Gdq, Edq, VexGdq }, 0 }, @@ -4086,12 +4295,12 @@ static const struct dis386 x86_64_table[][2] = { /* X86_64_62 */ { { MOD_TABLE (MOD_62_32BIT) }, - { EVEX_TABLE () }, + { EVEX_TABLE (EVEX_0F) }, }, /* X86_64_63 */ { - { "arplS", { Sv, Gv }, 0 }, + { "arpl", { Ew, Gw }, 0 }, { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 }, }, @@ -4133,13 +4342,13 @@ static const struct dis386 x86_64_table[][2] = { /* X86_64_C4 */ { { MOD_TABLE (MOD_C4_32BIT) }, - { VEX_C4_TABLE () }, + { VEX_C4_TABLE (VEX_0F) }, }, /* X86_64_C5 */ { { MOD_TABLE (MOD_C5_32BIT) }, - { VEX_C5_TABLE () }, + { VEX_C5_TABLE (VEX_0F) }, }, /* X86_64_CE */ @@ -4198,12 +4407,6 @@ static const struct dis386 x86_64_table[][2] = { { "rdmsrlist", { Skip_MODRM }, 0 }, }, - /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */ - { - { Bad_Opcode }, - { "pbndkb", { Skip_MODRM }, 0 }, - }, - /* X86_64_0F01_REG_1 */ { { "sidt{Q|Q}", { M }, 0 }, @@ -4343,19 +4546,19 @@ static const struct dis386 x86_64_table[][2] = { /* X86_64_VEX_0F385C */ { { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) }, + { MOD_TABLE (MOD_VEX_0F385C_X86_64) }, }, /* X86_64_VEX_0F385E */ { { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) }, + { MOD_TABLE (MOD_VEX_0F385E_X86_64) }, }, /* X86_64_VEX_0F386C */ { { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) }, + { MOD_TABLE (MOD_VEX_0F386C_X86_64) }, }, /* X86_64_VEX_0F38E0 */ @@ -4507,7 +4710,7 @@ static const struct dis386 three_byte_table[][256] = { /* 28 */ { "pmuldq", { XM, EXx }, PREFIX_DATA }, { "pcmpeqq", { XM, EXx }, PREFIX_DATA }, - { "movntdqa", { XM, Mx }, PREFIX_DATA }, + { MOD_TABLE (MOD_0F382A) }, { "packusdw", { XM, EXx }, PREFIX_DATA }, { Bad_Opcode }, { Bad_Opcode }, @@ -4735,12 +4938,12 @@ static const struct dis386 three_byte_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "wrussK", { M, Gdq }, PREFIX_DATA }, + { MOD_TABLE (MOD_0F38F5) }, { PREFIX_TABLE (PREFIX_0F38F6) }, { Bad_Opcode }, /* f8 */ { PREFIX_TABLE (PREFIX_0F38F8) }, - { "movdiri", { Mdq, Gdq }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_0F38F9) }, { PREFIX_TABLE (PREFIX_0F38FA) }, { PREFIX_TABLE (PREFIX_0F38FB) }, { PREFIX_TABLE (PREFIX_0F38FC) }, @@ -5194,9 +5397,9 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) }, /* 88 */ { Bad_Opcode }, { Bad_Opcode }, @@ -5204,17 +5407,17 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) }, /* 90 */ { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) }, /* 98 */ { Bad_Opcode }, { Bad_Opcode }, @@ -5222,16 +5425,16 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) }, /* a0 */ { Bad_Opcode }, { Bad_Opcode }, { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) }, { Bad_Opcode }, /* a8 */ { Bad_Opcode }, @@ -5249,7 +5452,7 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) }, { Bad_Opcode }, /* b8 */ { Bad_Opcode }, @@ -5261,10 +5464,10 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* c0 */ - { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -5274,10 +5477,10 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) }, /* d0 */ { Bad_Opcode }, { Bad_Opcode }, @@ -5310,10 +5513,10 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) }, /* f0 */ { Bad_Opcode }, { Bad_Opcode }, @@ -5337,8 +5540,8 @@ static const struct dis386 xop_table[][256] = { { /* 00 */ { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -5356,7 +5559,7 @@ static const struct dis386 xop_table[][256] = { /* 10 */ { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) }, + { MOD_TABLE (MOD_XOP_09_12) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -5480,10 +5683,10 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* 80 */ - { VEX_W_TABLE (VEX_W_XOP_09_80) }, - { VEX_W_TABLE (VEX_W_XOP_09_81) }, - { VEX_W_TABLE (VEX_W_XOP_09_82) }, - { VEX_W_TABLE (VEX_W_XOP_09_83) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_80) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_81) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_82) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_83) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -5498,19 +5701,19 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* 90 */ - { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) }, /* 98 */ - { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -5553,45 +5756,45 @@ static const struct dis386 xop_table[][256] = { { Bad_Opcode }, /* c0 */ { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) }, /* c8 */ { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, /* d0 */ { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) }, /* d8 */ { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, /* e0 */ { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) }, - { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -5647,7 +5850,7 @@ static const struct dis386 xop_table[][256] = { /* 10 */ { "bextrS", { Gdq, Edq, Id }, 0 }, { Bad_Opcode }, - { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -5939,14 +6142,14 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* 10 */ - { PREFIX_TABLE (PREFIX_0F10) }, - { PREFIX_TABLE (PREFIX_0F11) }, + { PREFIX_TABLE (PREFIX_VEX_0F10) }, + { PREFIX_TABLE (PREFIX_VEX_0F11) }, { PREFIX_TABLE (PREFIX_VEX_0F12) }, - { VEX_LEN_TABLE (VEX_LEN_0F13) }, + { MOD_TABLE (MOD_VEX_0F13) }, { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE }, { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_VEX_0F16) }, - { VEX_LEN_TABLE (VEX_LEN_0F17) }, + { MOD_TABLE (MOD_VEX_0F17) }, /* 18 */ { Bad_Opcode }, { Bad_Opcode }, @@ -5969,11 +6172,11 @@ static const struct dis386 vex_table[][256] = { { "vmovapX", { XM, EXx }, PREFIX_OPCODE }, { "vmovapX", { EXxS, XM }, PREFIX_OPCODE }, { PREFIX_TABLE (PREFIX_VEX_0F2A) }, - { "vmovntpX", { Mx, XM }, PREFIX_OPCODE }, + { MOD_TABLE (MOD_VEX_0F2B) }, { PREFIX_TABLE (PREFIX_VEX_0F2C) }, { PREFIX_TABLE (PREFIX_VEX_0F2D) }, - { PREFIX_TABLE (PREFIX_0F2E) }, - { PREFIX_TABLE (PREFIX_0F2F) }, + { PREFIX_TABLE (PREFIX_VEX_0F2E) }, + { PREFIX_TABLE (PREFIX_VEX_0F2F) }, /* 30 */ { Bad_Opcode }, { Bad_Opcode }, @@ -6011,23 +6214,23 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* 50 */ - { "vmovmskpX", { Gdq, Ux }, PREFIX_OPCODE }, - { PREFIX_TABLE (PREFIX_0F51) }, - { PREFIX_TABLE (PREFIX_0F52) }, - { PREFIX_TABLE (PREFIX_0F53) }, + { MOD_TABLE (MOD_VEX_0F50) }, + { PREFIX_TABLE (PREFIX_VEX_0F51) }, + { PREFIX_TABLE (PREFIX_VEX_0F52) }, + { PREFIX_TABLE (PREFIX_VEX_0F53) }, { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE }, { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE }, { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE }, { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE }, /* 58 */ - { 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) }, + { PREFIX_TABLE (PREFIX_VEX_0F58) }, + { PREFIX_TABLE (PREFIX_VEX_0F59) }, + { PREFIX_TABLE (PREFIX_VEX_0F5A) }, + { PREFIX_TABLE (PREFIX_VEX_0F5B) }, + { PREFIX_TABLE (PREFIX_VEX_0F5C) }, + { PREFIX_TABLE (PREFIX_VEX_0F5D) }, + { PREFIX_TABLE (PREFIX_VEX_0F5E) }, + { PREFIX_TABLE (PREFIX_VEX_0F5F) }, /* 60 */ { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA }, { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA }, @@ -6048,9 +6251,9 @@ static const struct dis386 vex_table[][256] = { { PREFIX_TABLE (PREFIX_VEX_0F6F) }, /* 70 */ { PREFIX_TABLE (PREFIX_VEX_0F70) }, - { REG_TABLE (REG_VEX_0F71) }, - { REG_TABLE (REG_VEX_0F72) }, - { REG_TABLE (REG_VEX_0F73) }, + { MOD_TABLE (MOD_VEX_0F71) }, + { MOD_TABLE (MOD_VEX_0F72) }, + { MOD_TABLE (MOD_VEX_0F73) }, { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA }, { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA }, { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA }, @@ -6060,8 +6263,8 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { PREFIX_TABLE (PREFIX_0F7C) }, - { PREFIX_TABLE (PREFIX_0F7D) }, + { PREFIX_TABLE (PREFIX_VEX_0F7C) }, + { PREFIX_TABLE (PREFIX_VEX_0F7D) }, { PREFIX_TABLE (PREFIX_VEX_0F7E) }, { PREFIX_TABLE (PREFIX_VEX_0F7F) }, /* 80 */ @@ -6139,10 +6342,10 @@ static const struct dis386 vex_table[][256] = { /* c0 */ { Bad_Opcode }, { Bad_Opcode }, - { PREFIX_TABLE (PREFIX_0FC2) }, + { PREFIX_TABLE (PREFIX_VEX_0FC2) }, { Bad_Opcode }, { VEX_LEN_TABLE (VEX_LEN_0FC4) }, - { "vpextrw", { Gd, Uxmm, Ib }, PREFIX_DATA }, + { VEX_LEN_TABLE (VEX_LEN_0FC5) }, { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE }, { Bad_Opcode }, /* c8 */ @@ -6155,14 +6358,14 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* d0 */ - { PREFIX_TABLE (PREFIX_0FD0) }, + { PREFIX_TABLE (PREFIX_VEX_0FD0) }, { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA }, { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA }, { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA }, { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA }, { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA }, { VEX_LEN_TABLE (VEX_LEN_0FD6) }, - { "vpmovmskb", { Gdq, Ux }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0FD7) }, /* d8 */ { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA }, { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA }, @@ -6179,8 +6382,8 @@ static const struct dis386 vex_table[][256] = { { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA }, { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA }, { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA }, - { PREFIX_TABLE (PREFIX_0FE6) }, - { "vmovntdq", { Mx, XM }, PREFIX_DATA }, + { PREFIX_TABLE (PREFIX_VEX_0FE6) }, + { MOD_TABLE (MOD_VEX_0FE7) }, /* e8 */ { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA }, { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA }, @@ -6191,14 +6394,14 @@ static const struct dis386 vex_table[][256] = { { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA }, { "vpxor", { XM, Vex, EXx }, PREFIX_DATA }, /* f0 */ - { PREFIX_TABLE (PREFIX_0FF0) }, + { PREFIX_TABLE (PREFIX_VEX_0FF0) }, { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA }, { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA }, { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA }, { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA }, { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA }, { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA }, - { "vmaskmovdqu", { XM, Uxmm }, PREFIX_DATA }, + { VEX_LEN_TABLE (VEX_LEN_0FF7) }, /* f8 */ { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA }, { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA }, @@ -6241,7 +6444,7 @@ static const struct dis386 vex_table[][256] = { /* 18 */ { VEX_W_TABLE (VEX_W_0F3818) }, { VEX_LEN_TABLE (VEX_LEN_0F3819) }, - { VEX_LEN_TABLE (VEX_LEN_0F381A) }, + { MOD_TABLE (MOD_VEX_0F381A) }, { Bad_Opcode }, { "vpabsb", { XM, EXx }, PREFIX_DATA }, { "vpabsw", { XM, EXx }, PREFIX_DATA }, @@ -6259,12 +6462,12 @@ static const struct dis386 vex_table[][256] = { /* 28 */ { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA }, { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA }, - { "vmovntdqa", { XM, Mx }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0F382A) }, { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA }, - { VEX_W_TABLE (VEX_W_0F382C) }, - { VEX_W_TABLE (VEX_W_0F382D) }, - { VEX_W_TABLE (VEX_W_0F382E) }, - { VEX_W_TABLE (VEX_W_0F382F) }, + { MOD_TABLE (MOD_VEX_0F382C) }, + { MOD_TABLE (MOD_VEX_0F382D) }, + { MOD_TABLE (MOD_VEX_0F382E) }, + { MOD_TABLE (MOD_VEX_0F382F) }, /* 30 */ { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA }, { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA }, @@ -6313,7 +6516,7 @@ static const struct dis386 vex_table[][256] = { /* 58 */ { VEX_W_TABLE (VEX_W_0F3858) }, { VEX_W_TABLE (VEX_W_0F3859) }, - { VEX_LEN_TABLE (VEX_LEN_0F385A) }, + { MOD_TABLE (MOD_VEX_0F385A) }, { Bad_Opcode }, { X86_64_TABLE (X86_64_VEX_0F385C) }, { Bad_Opcode }, @@ -6369,9 +6572,9 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0F388C) }, { Bad_Opcode }, - { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0F388E) }, { Bad_Opcode }, /* 90 */ { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA }, @@ -6440,16 +6643,16 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { PREFIX_TABLE (PREFIX_VEX_0F38CB) }, - { PREFIX_TABLE (PREFIX_VEX_0F38CC) }, - { PREFIX_TABLE (PREFIX_VEX_0F38CD) }, + { Bad_Opcode }, + { Bad_Opcode }, + { Bad_Opcode }, { Bad_Opcode }, { VEX_W_TABLE (VEX_W_0F38CF) }, /* d0 */ { Bad_Opcode }, { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F38D2) }, - { VEX_W_TABLE (VEX_W_0F38D3) }, + { Bad_Opcode }, + { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -6457,7 +6660,7 @@ static const struct dis386 vex_table[][256] = { /* d8 */ { Bad_Opcode }, { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F38DA) }, + { Bad_Opcode }, { VEX_LEN_TABLE (VEX_LEN_0F38DB) }, { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA }, { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA }, @@ -6752,7 +6955,7 @@ static const struct dis386 vex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F3ADE) }, + { Bad_Opcode }, { VEX_LEN_TABLE (VEX_LEN_0F3ADF) }, /* e0 */ { Bad_Opcode }, @@ -6796,86 +6999,86 @@ static const struct dis386 vex_table[][256] = { #include "i386-dis-evex.h" static const struct dis386 vex_len_table[][2] = { - /* VEX_LEN_0F12_P_0 */ + /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */ { - { MOD_TABLE (MOD_0F12_PREFIX_0) }, + { "%XEvmovlpX", { XM, Vex, EXq }, 0 }, }, - /* VEX_LEN_0F12_P_2 */ + /* VEX_LEN_0F12_P_0_M_1 */ { - { "%XEVmovlpYX", { XM, Vex, Mq }, 0 }, + { "%XEvmovhlp%XS", { XM, Vex, EXq }, 0 }, }, - /* VEX_LEN_0F13 */ + /* VEX_LEN_0F13_M_0 */ { - { "%XEVmovlpYX", { Mq, XM }, PREFIX_OPCODE }, + { "%XEvmovlpX", { EXq, XM }, PREFIX_OPCODE }, }, - /* VEX_LEN_0F16_P_0 */ + /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */ { - { MOD_TABLE (MOD_0F16_PREFIX_0) }, + { "%XEvmovhpX", { XM, Vex, EXq }, 0 }, }, - /* VEX_LEN_0F16_P_2 */ + /* VEX_LEN_0F16_P_0_M_1 */ { - { "%XEVmovhpYX", { XM, Vex, Mq }, 0 }, + { "%XEvmovlhp%XS", { XM, Vex, EXq }, 0 }, }, - /* VEX_LEN_0F17 */ + /* VEX_LEN_0F17_M_0 */ { - { "%XEVmovhpYX", { Mq, XM }, PREFIX_OPCODE }, + { "%XEvmovhpX", { EXq, XM }, PREFIX_OPCODE }, }, /* VEX_LEN_0F41 */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F41_L_1) }, + { MOD_TABLE (MOD_VEX_0F41_L_1) }, }, /* VEX_LEN_0F42 */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F42_L_1) }, + { MOD_TABLE (MOD_VEX_0F42_L_1) }, }, /* VEX_LEN_0F44 */ { - { VEX_W_TABLE (VEX_W_0F44_L_0) }, + { MOD_TABLE (MOD_VEX_0F44_L_0) }, }, /* VEX_LEN_0F45 */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F45_L_1) }, + { MOD_TABLE (MOD_VEX_0F45_L_1) }, }, /* VEX_LEN_0F46 */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F46_L_1) }, + { MOD_TABLE (MOD_VEX_0F46_L_1) }, }, /* VEX_LEN_0F47 */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F47_L_1) }, + { MOD_TABLE (MOD_VEX_0F47_L_1) }, }, /* VEX_LEN_0F4A */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F4A_L_1) }, + { MOD_TABLE (MOD_VEX_0F4A_L_1) }, }, /* VEX_LEN_0F4B */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F4B_L_1) }, + { MOD_TABLE (MOD_VEX_0F4B_L_1) }, }, /* VEX_LEN_0F6E */ { - { "%XEvmovYK", { XMScalar, Edq }, PREFIX_DATA }, + { "%XEvmovK", { XMScalar, Edq }, PREFIX_DATA }, }, /* VEX_LEN_0F77 */ @@ -6886,7 +7089,7 @@ static const struct dis386 vex_len_table[][2] = { /* VEX_LEN_0F7E_P_1 */ { - { "%XEvmovqY", { XMScalar, EXq }, 0 }, + { "%XEvmovq", { XMScalar, EXq }, 0 }, }, /* VEX_LEN_0F7E_P_2 */ @@ -6901,47 +7104,57 @@ static const struct dis386 vex_len_table[][2] = { /* VEX_LEN_0F91 */ { - { VEX_W_TABLE (VEX_W_0F91_L_0) }, + { MOD_TABLE (MOD_VEX_0F91_L_0) }, }, /* VEX_LEN_0F92 */ { - { VEX_W_TABLE (VEX_W_0F92_L_0) }, + { MOD_TABLE (MOD_VEX_0F92_L_0) }, }, /* VEX_LEN_0F93 */ { - { VEX_W_TABLE (VEX_W_0F93_L_0) }, + { MOD_TABLE (MOD_VEX_0F93_L_0) }, }, /* VEX_LEN_0F98 */ { - { VEX_W_TABLE (VEX_W_0F98_L_0) }, + { MOD_TABLE (MOD_VEX_0F98_L_0) }, }, /* VEX_LEN_0F99 */ { - { VEX_W_TABLE (VEX_W_0F99_L_0) }, + { MOD_TABLE (MOD_VEX_0F99_L_0) }, }, - /* VEX_LEN_0FAE_R_2 */ + /* VEX_LEN_0FAE_R_2_M_0 */ { { "vldmxcsr", { Md }, 0 }, }, - /* VEX_LEN_0FAE_R_3 */ + /* VEX_LEN_0FAE_R_3_M_0 */ { { "vstmxcsr", { Md }, 0 }, }, /* VEX_LEN_0FC4 */ { - { "%XEvpinsrwY", { XM, Vex, Edw, Ib }, PREFIX_DATA }, + { "%XEvpinsrw", { XM, Vex, Edw, Ib }, PREFIX_DATA }, + }, + + /* VEX_LEN_0FC5 */ + { + { "%XEvpextrw", { Gd, XS, Ib }, PREFIX_DATA }, }, /* VEX_LEN_0FD6 */ { - { "%XEvmovqY", { EXqS, XMScalar }, PREFIX_DATA }, + { "%XEvmovq", { EXqS, XMScalar }, PREFIX_DATA }, + }, + + /* VEX_LEN_0FF7 */ + { + { "vmaskmovdqu", { XM, XS }, PREFIX_DATA }, }, /* VEX_LEN_0F3816 */ @@ -6956,10 +7169,10 @@ static const struct dis386 vex_len_table[][2] = { { VEX_W_TABLE (VEX_W_0F3819_L_1) }, }, - /* VEX_LEN_0F381A */ + /* VEX_LEN_0F381A_M_0 */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F381A_L_1) }, + { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) }, }, /* VEX_LEN_0F3836 */ @@ -6983,53 +7196,25 @@ static const struct dis386 vex_len_table[][2] = { { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) }, }, - /* VEX_LEN_0F385A */ + /* VEX_LEN_0F385A_M_0 */ { { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F385A_L_0) }, - }, - - /* VEX_LEN_0F385C_X86_64 */ - { - { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) }, + { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) }, }, - /* VEX_LEN_0F385E_X86_64 */ + /* VEX_LEN_0F385C_X86_64_M_1 */ { - { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) }, - }, - - /* VEX_LEN_0F386C_X86_64 */ - { - { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) }, - }, - - /* VEX_LEN_0F38CB_P_3_W_0 */ - { - { Bad_Opcode }, - { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 }, - }, - - /* VEX_LEN_0F38CC_P_3_W_0 */ - { - { Bad_Opcode }, - { "vsha512msg1", { XM, Rxmmq }, 0 }, - }, - - /* VEX_LEN_0F38CD_P_3_W_0 */ - { - { Bad_Opcode }, - { "vsha512msg2", { XM, Rymm }, 0 }, + { VEX_W_TABLE (VEX_W_0F385C_X86_64_M_1_L_0) }, }, - /* VEX_LEN_0F38DA_W_0_P_0 */ + /* VEX_LEN_0F385E_X86_64_M_1 */ { - { "vsm3msg1", { XM, Vex, EXxmm }, 0 }, + { VEX_W_TABLE (VEX_W_0F385E_X86_64_M_1_L_0) }, }, - /* VEX_LEN_0F38DA_W_0_P_2 */ + /* VEX_LEN_0F386C_X86_64_M_1 */ { - { "vsm3msg2", { XM, Vex, EXxmm }, 0 }, + { VEX_W_TABLE (VEX_W_0F386C_X86_64_M_1_L_0) }, }, /* VEX_LEN_0F38DB */ @@ -7114,37 +7299,37 @@ static const struct dis386 vex_len_table[][2] = { /* VEX_LEN_0F3A20 */ { - { "%XEvpinsrbY", { XM, Vex, Edb, Ib }, PREFIX_DATA }, + { "%XEvpinsrb", { XM, Vex, Edb, Ib }, PREFIX_DATA }, }, /* VEX_LEN_0F3A21 */ { - { "%XEvinsertpsY", { XM, Vex, EXd, Ib }, PREFIX_DATA }, + { "%XEvinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA }, }, /* VEX_LEN_0F3A22 */ { - { "%XEvpinsrYK", { XM, Vex, Edq, Ib }, PREFIX_DATA }, + { "%XEvpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA }, }, /* VEX_LEN_0F3A30 */ { - { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0F3A30_L_0) }, }, /* VEX_LEN_0F3A31 */ { - { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0F3A31_L_0) }, }, /* VEX_LEN_0F3A32 */ { - { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0F3A32_L_0) }, }, /* VEX_LEN_0F3A33 */ { - { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA }, + { MOD_TABLE (MOD_VEX_0F3A33_L_0) }, }, /* VEX_LEN_0F3A38 */ @@ -7190,11 +7375,6 @@ static const struct dis386 vex_len_table[][2] = { { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA }, }, - /* VEX_LEN_0F3ADE_W_0 */ - { - { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, - }, - /* VEX_LEN_0F3ADF */ { { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA }, @@ -7205,292 +7385,292 @@ static const struct dis386 vex_len_table[][2] = { { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) }, }, - /* VEX_LEN_XOP_08_85 */ + /* VEX_LEN_0FXOP_08_85 */ { - { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) }, }, - /* VEX_LEN_XOP_08_86 */ + /* VEX_LEN_0FXOP_08_86 */ { - { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) }, }, - /* VEX_LEN_XOP_08_87 */ + /* VEX_LEN_0FXOP_08_87 */ { - { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) }, }, - /* VEX_LEN_XOP_08_8E */ + /* VEX_LEN_0FXOP_08_8E */ { - { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) }, }, - /* VEX_LEN_XOP_08_8F */ + /* VEX_LEN_0FXOP_08_8F */ { - { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) }, }, - /* VEX_LEN_XOP_08_95 */ + /* VEX_LEN_0FXOP_08_95 */ { - { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) }, }, - /* VEX_LEN_XOP_08_96 */ + /* VEX_LEN_0FXOP_08_96 */ { - { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) }, }, - /* VEX_LEN_XOP_08_97 */ + /* VEX_LEN_0FXOP_08_97 */ { - { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) }, }, - /* VEX_LEN_XOP_08_9E */ + /* VEX_LEN_0FXOP_08_9E */ { - { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) }, }, - /* VEX_LEN_XOP_08_9F */ + /* VEX_LEN_0FXOP_08_9F */ { - { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) }, }, - /* VEX_LEN_XOP_08_A3 */ + /* VEX_LEN_0FXOP_08_A3 */ { { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_LEN_XOP_08_A6 */ + /* VEX_LEN_0FXOP_08_A6 */ { - { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) }, }, - /* VEX_LEN_XOP_08_B6 */ + /* VEX_LEN_0FXOP_08_B6 */ { - { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) }, }, - /* VEX_LEN_XOP_08_C0 */ + /* VEX_LEN_0FXOP_08_C0 */ { - { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) }, }, - /* VEX_LEN_XOP_08_C1 */ + /* VEX_LEN_0FXOP_08_C1 */ { - { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) }, }, - /* VEX_LEN_XOP_08_C2 */ + /* VEX_LEN_0FXOP_08_C2 */ { - { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) }, }, - /* VEX_LEN_XOP_08_C3 */ + /* VEX_LEN_0FXOP_08_C3 */ { - { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) }, }, - /* VEX_LEN_XOP_08_CC */ + /* VEX_LEN_0FXOP_08_CC */ { - { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) }, }, - /* VEX_LEN_XOP_08_CD */ + /* VEX_LEN_0FXOP_08_CD */ { - { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) }, }, - /* VEX_LEN_XOP_08_CE */ + /* VEX_LEN_0FXOP_08_CE */ { - { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) }, }, - /* VEX_LEN_XOP_08_CF */ + /* VEX_LEN_0FXOP_08_CF */ { - { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) }, }, - /* VEX_LEN_XOP_08_EC */ + /* VEX_LEN_0FXOP_08_EC */ { - { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) }, }, - /* VEX_LEN_XOP_08_ED */ + /* VEX_LEN_0FXOP_08_ED */ { - { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) }, }, - /* VEX_LEN_XOP_08_EE */ + /* VEX_LEN_0FXOP_08_EE */ { - { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) }, }, - /* VEX_LEN_XOP_08_EF */ + /* VEX_LEN_0FXOP_08_EF */ { - { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) }, }, - /* VEX_LEN_XOP_09_01 */ + /* VEX_LEN_0FXOP_09_01 */ { { REG_TABLE (REG_XOP_09_01_L_0) }, }, - /* VEX_LEN_XOP_09_02 */ + /* VEX_LEN_0FXOP_09_02 */ { { REG_TABLE (REG_XOP_09_02_L_0) }, }, - /* VEX_LEN_XOP_09_12 */ + /* VEX_LEN_0FXOP_09_12_M_1 */ { - { REG_TABLE (REG_XOP_09_12_L_0) }, + { REG_TABLE (REG_XOP_09_12_M_1_L_0) }, }, - /* VEX_LEN_XOP_09_82_W_0 */ + /* VEX_LEN_0FXOP_09_82_W_0 */ { { "vfrczss", { XM, EXd }, 0 }, }, - /* VEX_LEN_XOP_09_83_W_0 */ + /* VEX_LEN_0FXOP_09_83_W_0 */ { { "vfrczsd", { XM, EXq }, 0 }, }, - /* VEX_LEN_XOP_09_90 */ + /* VEX_LEN_0FXOP_09_90 */ { { "vprotb", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_91 */ + /* VEX_LEN_0FXOP_09_91 */ { { "vprotw", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_92 */ + /* VEX_LEN_0FXOP_09_92 */ { { "vprotd", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_93 */ + /* VEX_LEN_0FXOP_09_93 */ { { "vprotq", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_94 */ + /* VEX_LEN_0FXOP_09_94 */ { { "vpshlb", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_95 */ + /* VEX_LEN_0FXOP_09_95 */ { { "vpshlw", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_96 */ + /* VEX_LEN_0FXOP_09_96 */ { { "vpshld", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_97 */ + /* VEX_LEN_0FXOP_09_97 */ { { "vpshlq", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_98 */ + /* VEX_LEN_0FXOP_09_98 */ { { "vpshab", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_99 */ + /* VEX_LEN_0FXOP_09_99 */ { { "vpshaw", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_9A */ + /* VEX_LEN_0FXOP_09_9A */ { { "vpshad", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_9B */ + /* VEX_LEN_0FXOP_09_9B */ { { "vpshaq", { XM, EXx, VexW }, 0 }, }, - /* VEX_LEN_XOP_09_C1 */ + /* VEX_LEN_0FXOP_09_C1 */ { - { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) }, }, - /* VEX_LEN_XOP_09_C2 */ + /* VEX_LEN_0FXOP_09_C2 */ { - { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) }, }, - /* VEX_LEN_XOP_09_C3 */ + /* VEX_LEN_0FXOP_09_C3 */ { - { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) }, }, - /* VEX_LEN_XOP_09_C6 */ + /* VEX_LEN_0FXOP_09_C6 */ { - { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) }, }, - /* VEX_LEN_XOP_09_C7 */ + /* VEX_LEN_0FXOP_09_C7 */ { - { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) }, }, - /* VEX_LEN_XOP_09_CB */ + /* VEX_LEN_0FXOP_09_CB */ { - { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) }, }, - /* VEX_LEN_XOP_09_D1 */ + /* VEX_LEN_0FXOP_09_D1 */ { - { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) }, }, - /* VEX_LEN_XOP_09_D2 */ + /* VEX_LEN_0FXOP_09_D2 */ { - { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) }, }, - /* VEX_LEN_XOP_09_D3 */ + /* VEX_LEN_0FXOP_09_D3 */ { - { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) }, }, - /* VEX_LEN_XOP_09_D6 */ + /* VEX_LEN_0FXOP_09_D6 */ { - { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) }, }, - /* VEX_LEN_XOP_09_D7 */ + /* VEX_LEN_0FXOP_09_D7 */ { - { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) }, }, - /* VEX_LEN_XOP_09_DB */ + /* VEX_LEN_0FXOP_09_DB */ { - { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) }, }, - /* VEX_LEN_XOP_09_E1 */ + /* VEX_LEN_0FXOP_09_E1 */ { - { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) }, }, - /* VEX_LEN_XOP_09_E2 */ + /* VEX_LEN_0FXOP_09_E2 */ { - { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) }, }, - /* VEX_LEN_XOP_09_E3 */ + /* VEX_LEN_0FXOP_09_E3 */ { - { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) }, + { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) }, }, - /* VEX_LEN_XOP_0A_12 */ + /* VEX_LEN_0FXOP_0A_12 */ { { REG_TABLE (REG_XOP_0A_12_L_0) }, }, @@ -7501,43 +7681,43 @@ static const struct dis386 vex_len_table[][2] = { static const struct dis386 vex_w_table[][2] = { { /* VEX_W_0F41_L_1_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1) }, }, { /* VEX_W_0F42_L_1_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1) }, }, { /* VEX_W_0F44_L_0_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1) }, }, { /* VEX_W_0F45_L_1_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1) }, }, { /* VEX_W_0F46_L_1_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1) }, }, { /* VEX_W_0F47_L_1_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1) }, }, { /* VEX_W_0F4A_L_1_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1) }, }, { /* VEX_W_0F4B_L_1_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1) }, }, { /* VEX_W_0F90_L_0 */ @@ -7546,28 +7726,28 @@ static const struct dis386 vex_w_table[][2] = { }, { /* VEX_W_0F91_L_0_M_0 */ - { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1) }, }, { /* VEX_W_0F92_L_0_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1) }, }, { /* VEX_W_0F93_L_0_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1) }, }, { /* VEX_W_0F98_L_0_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1) }, }, { /* VEX_W_0F99_L_0_M_1 */ - { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) }, - { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) }, + { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0) }, + { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1) }, }, { /* VEX_W_0F380C */ @@ -7602,23 +7782,23 @@ static const struct dis386 vex_w_table[][2] = { { "vbroadcastsd", { XM, EXq }, PREFIX_DATA }, }, { - /* VEX_W_0F381A_L_1 */ + /* VEX_W_0F381A_M_0_L_1 */ { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA }, }, { - /* VEX_W_0F382C */ + /* VEX_W_0F382C_M_0 */ { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA }, }, { - /* VEX_W_0F382D */ + /* VEX_W_0F382D_M_0 */ { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA }, }, { - /* VEX_W_0F382E */ + /* VEX_W_0F382E_M_0 */ { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA }, }, { - /* VEX_W_0F382F */ + /* VEX_W_0F382F_M_0 */ { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA }, }, { @@ -7635,7 +7815,7 @@ static const struct dis386 vex_w_table[][2] = { }, { /* VEX_W_0F384B_X86_64_L_0 */ - { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) }, + { MOD_TABLE (MOD_VEX_0F384B_X86_64_L_0_W_0) }, }, { /* VEX_W_0F3850 */ @@ -7662,20 +7842,20 @@ static const struct dis386 vex_w_table[][2] = { { "vpbroadcastq", { XM, EXq }, PREFIX_DATA }, }, { - /* VEX_W_0F385A_L_0 */ + /* VEX_W_0F385A_M_0_L_0 */ { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA }, }, { - /* VEX_W_0F385C_X86_64_L_0 */ - { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) }, + /* VEX_W_0F385C_X86_64_M_1_L_0 */ + { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_M_1_L_0_W_0) }, }, { - /* VEX_W_0F385E_X86_64_L_0 */ - { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) }, + /* VEX_W_0F385E_X86_64_M_1_L_0 */ + { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_M_1_L_0_W_0) }, }, { - /* VEX_W_0F386C_X86_64_L_0 */ - { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) }, + /* VEX_W_0F386C_X86_64_M_1_L_0 */ + { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_M_1_L_0_W_0) }, }, { /* VEX_W_0F3872_P_1 */ @@ -7708,34 +7888,10 @@ static const struct dis386 vex_w_table[][2] = { { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA }, }, { - /* VEX_W_0F38CB_P_3 */ - { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) }, - }, - { - /* VEX_W_0F38CC_P_3 */ - { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) }, - }, - { - /* VEX_W_0F38CD_P_3 */ - { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) }, - }, - { /* VEX_W_0F38CF */ { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA }, }, { - /* VEX_W_0F38D2 */ - { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) }, - }, - { - /* VEX_W_0F38D3 */ - { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) }, - }, - { - /* VEX_W_0F38DA */ - { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) }, - }, - { /* VEX_W_0F3A00_L_1 */ { Bad_Opcode }, { "%XEvpermq", { XM, EXx, Ib }, PREFIX_DATA }, @@ -7807,179 +7963,175 @@ static const struct dis386 vex_w_table[][2] = { { Bad_Opcode }, { "%XEvgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA }, }, - { - /* VEX_W_0F3ADE */ - { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) }, - }, - /* VEX_W_XOP_08_85_L_0 */ + /* VEX_W_0FXOP_08_85_L_0 */ { { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_86_L_0 */ + /* VEX_W_0FXOP_08_86_L_0 */ { { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_87_L_0 */ + /* VEX_W_0FXOP_08_87_L_0 */ { { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_8E_L_0 */ + /* VEX_W_0FXOP_08_8E_L_0 */ { { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_8F_L_0 */ + /* VEX_W_0FXOP_08_8F_L_0 */ { { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_95_L_0 */ + /* VEX_W_0FXOP_08_95_L_0 */ { { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_96_L_0 */ + /* VEX_W_0FXOP_08_96_L_0 */ { { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_97_L_0 */ + /* VEX_W_0FXOP_08_97_L_0 */ { { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_9E_L_0 */ + /* VEX_W_0FXOP_08_9E_L_0 */ { { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_9F_L_0 */ + /* VEX_W_0FXOP_08_9F_L_0 */ { { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_A6_L_0 */ + /* VEX_W_0FXOP_08_A6_L_0 */ { { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_B6_L_0 */ + /* VEX_W_0FXOP_08_B6_L_0 */ { { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 }, }, - /* VEX_W_XOP_08_C0_L_0 */ + /* VEX_W_0FXOP_08_C0_L_0 */ { { "vprotb", { XM, EXx, Ib }, 0 }, }, - /* VEX_W_XOP_08_C1_L_0 */ + /* VEX_W_0FXOP_08_C1_L_0 */ { { "vprotw", { XM, EXx, Ib }, 0 }, }, - /* VEX_W_XOP_08_C2_L_0 */ + /* VEX_W_0FXOP_08_C2_L_0 */ { { "vprotd", { XM, EXx, Ib }, 0 }, }, - /* VEX_W_XOP_08_C3_L_0 */ + /* VEX_W_0FXOP_08_C3_L_0 */ { { "vprotq", { XM, EXx, Ib }, 0 }, }, - /* VEX_W_XOP_08_CC_L_0 */ + /* VEX_W_0FXOP_08_CC_L_0 */ { { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_08_CD_L_0 */ + /* VEX_W_0FXOP_08_CD_L_0 */ { { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_08_CE_L_0 */ + /* VEX_W_0FXOP_08_CE_L_0 */ { { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_08_CF_L_0 */ + /* VEX_W_0FXOP_08_CF_L_0 */ { { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_08_EC_L_0 */ + /* VEX_W_0FXOP_08_EC_L_0 */ { { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_08_ED_L_0 */ + /* VEX_W_0FXOP_08_ED_L_0 */ { { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_08_EE_L_0 */ + /* VEX_W_0FXOP_08_EE_L_0 */ { { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_08_EF_L_0 */ + /* VEX_W_0FXOP_08_EF_L_0 */ { { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 }, }, - /* VEX_W_XOP_09_80 */ + /* VEX_W_0FXOP_09_80 */ { { "vfrczps", { XM, EXx }, 0 }, }, - /* VEX_W_XOP_09_81 */ + /* VEX_W_0FXOP_09_81 */ { { "vfrczpd", { XM, EXx }, 0 }, }, - /* VEX_W_XOP_09_82 */ + /* VEX_W_0FXOP_09_82 */ { - { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) }, }, - /* VEX_W_XOP_09_83 */ + /* VEX_W_0FXOP_09_83 */ { - { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) }, }, - /* VEX_W_XOP_09_C1_L_0 */ + /* VEX_W_0FXOP_09_C1_L_0 */ { { "vphaddbw", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_C2_L_0 */ + /* VEX_W_0FXOP_09_C2_L_0 */ { { "vphaddbd", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_C3_L_0 */ + /* VEX_W_0FXOP_09_C3_L_0 */ { { "vphaddbq", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_C6_L_0 */ + /* VEX_W_0FXOP_09_C6_L_0 */ { { "vphaddwd", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_C7_L_0 */ + /* VEX_W_0FXOP_09_C7_L_0 */ { { "vphaddwq", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_CB_L_0 */ + /* VEX_W_0FXOP_09_CB_L_0 */ { { "vphadddq", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_D1_L_0 */ + /* VEX_W_0FXOP_09_D1_L_0 */ { { "vphaddubw", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_D2_L_0 */ + /* VEX_W_0FXOP_09_D2_L_0 */ { { "vphaddubd", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_D3_L_0 */ + /* VEX_W_0FXOP_09_D3_L_0 */ { { "vphaddubq", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_D6_L_0 */ + /* VEX_W_0FXOP_09_D6_L_0 */ { { "vphadduwd", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_D7_L_0 */ + /* VEX_W_0FXOP_09_D7_L_0 */ { { "vphadduwq", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_DB_L_0 */ + /* VEX_W_0FXOP_09_DB_L_0 */ { { "vphaddudq", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_E1_L_0 */ + /* VEX_W_0FXOP_09_E1_L_0 */ { { "vphsubbw", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_E2_L_0 */ + /* VEX_W_0FXOP_09_E2_L_0 */ { { "vphsubwd", { XM, EXxmm }, 0 }, }, - /* VEX_W_XOP_09_E3_L_0 */ + /* VEX_W_0FXOP_09_E3_L_0 */ { { "vphsubdq", { XM, EXxmm }, 0 }, }, @@ -7991,17 +8143,39 @@ static const struct dis386 mod_table[][2] = { { /* MOD_62_32BIT */ { "bound{S|}", { Gv, Ma }, 0 }, - { EVEX_TABLE () }, + { EVEX_TABLE (EVEX_0F) }, + }, + { + /* MOD_8D */ + { "leaS", { Gv, M }, 0 }, }, { /* MOD_C4_32BIT */ { "lesS", { Gv, Mp }, 0 }, - { VEX_C4_TABLE () }, + { VEX_C4_TABLE (VEX_0F) }, }, { /* MOD_C5_32BIT */ { "ldsS", { Gv, Mp }, 0 }, - { VEX_C5_TABLE () }, + { VEX_C5_TABLE (VEX_0F) }, + }, + { + /* MOD_C6_REG_7 */ + { Bad_Opcode }, + { RM_TABLE (RM_C6_REG_7) }, + }, + { + /* MOD_C7_REG_7 */ + { Bad_Opcode }, + { RM_TABLE (RM_C7_REG_7) }, + }, + { + /* MOD_FF_REG_3 */ + { "{l|}call^", { indirEp }, 0 }, + }, + { + /* MOD_FF_REG_5 */ + { "{l|}jmp^", { indirEp }, 0 }, }, { /* MOD_0F01_REG_0 */ @@ -8034,14 +8208,40 @@ static const struct dis386 mod_table[][2] = { { RM_TABLE (RM_0F01_REG_7_MOD_3) }, }, { + /* MOD_0F02 */ + { "larS", { Gv, Mw }, 0 }, + { "larS", { Gv, Ev }, 0 }, + }, + { + /* MOD_0F03 */ + { "lslS", { Gv, Mw }, 0 }, + { "lslS", { Gv, Ev }, 0 }, + }, + { /* MOD_0F12_PREFIX_0 */ - { "%XEVmovlpYX", { XM, Vex, EXq }, 0 }, - { "%XEVmovhlpY%XS", { XM, Vex, EXq }, 0 }, + { "movlpX", { XM, EXq }, 0 }, + { "movhlps", { XM, EXq }, 0 }, + }, + { + /* MOD_0F12_PREFIX_2 */ + { "movlpX", { XM, EXq }, 0 }, + }, + { + /* MOD_0F13 */ + { "movlpX", { EXq, XM }, PREFIX_OPCODE }, }, { /* MOD_0F16_PREFIX_0 */ - { "%XEVmovhpYX", { XM, Vex, EXq }, 0 }, - { "%XEVmovlhpY%XS", { XM, Vex, EXq }, 0 }, + { "movhpX", { XM, EXq }, 0 }, + { "movlhps", { XM, EXq }, 0 }, + }, + { + /* MOD_0F16_PREFIX_2 */ + { "movhpX", { XM, EXq }, 0 }, + }, + { + /* MOD_0F17 */ + { "movhpX", { EXq, XM }, PREFIX_OPCODE }, }, { /* MOD_0F18_REG_0 */ @@ -8099,6 +8299,42 @@ static const struct dis386 mod_table[][2] = { { REG_TABLE (REG_0F1E_P_1_MOD_3) }, }, { + /* MOD_0F2B_PREFIX_0 */ + {"movntps", { Mx, XM }, PREFIX_OPCODE }, + }, + { + /* MOD_0F2B_PREFIX_1 */ + {"movntss", { Md, XM }, PREFIX_OPCODE }, + }, + { + /* MOD_0F2B_PREFIX_2 */ + {"movntpd", { Mx, XM }, PREFIX_OPCODE }, + }, + { + /* MOD_0F2B_PREFIX_3 */ + {"movntsd", { Mq, XM }, PREFIX_OPCODE }, + }, + { + /* MOD_0F50 */ + { Bad_Opcode }, + { "movmskpX", { Gdq, XS }, PREFIX_OPCODE }, + }, + { + /* MOD_0F71 */ + { Bad_Opcode }, + { REG_TABLE (REG_0F71_MOD_0) }, + }, + { + /* MOD_0F72 */ + { Bad_Opcode }, + { REG_TABLE (REG_0F72_MOD_0) }, + }, + { + /* MOD_0F73 */ + { Bad_Opcode }, + { REG_TABLE (REG_0F73_MOD_0) }, + }, + { /* MOD_0FAE_REG_0 */ { "fxsave", { FXSAVE }, 0 }, { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) }, @@ -8139,6 +8375,34 @@ static const struct dis386 mod_table[][2] = { { RM_TABLE (RM_0FAE_REG_7_MOD_3) }, }, { + /* MOD_0FB2 */ + { "lssS", { Gv, Mp }, 0 }, + }, + { + /* MOD_0FB4 */ + { "lfsS", { Gv, Mp }, 0 }, + }, + { + /* MOD_0FB5 */ + { "lgsS", { Gv, Mp }, 0 }, + }, + { + /* MOD_0FC3 */ + { "movntiS", { Edq, Gdq }, PREFIX_OPCODE }, + }, + { + /* MOD_0FC7_REG_3 */ + { "xrstors", { FXSAVE }, 0 }, + }, + { + /* MOD_0FC7_REG_4 */ + { "xsavec", { FXSAVE }, 0 }, + }, + { + /* MOD_0FC7_REG_5 */ + { "xsaves", { FXSAVE }, 0 }, + }, + { /* MOD_0FC7_REG_6 */ { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) }, { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) } @@ -8149,15 +8413,298 @@ static const struct dis386 mod_table[][2] = { { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) } }, { + /* MOD_0FD7 */ + { Bad_Opcode }, + { "pmovmskb", { Gdq, MS }, 0 }, + }, + { + /* MOD_0FE7_PREFIX_2 */ + { "movntdq", { Mx, XM }, 0 }, + }, + { + /* MOD_0FF0_PREFIX_3 */ + { "lddqu", { XM, M }, 0 }, + }, + { + /* MOD_0F382A */ + { "movntdqa", { XM, Mx }, PREFIX_DATA }, + }, + { /* MOD_0F38DC_PREFIX_1 */ { "aesenc128kl", { XM, M }, 0 }, { "loadiwkey", { XM, EXx }, 0 }, }, { + /* MOD_0F38DD_PREFIX_1 */ + { "aesdec128kl", { XM, M }, 0 }, + }, + { + /* MOD_0F38DE_PREFIX_1 */ + { "aesenc256kl", { XM, M }, 0 }, + }, + { + /* MOD_0F38DF_PREFIX_1 */ + { "aesdec256kl", { XM, M }, 0 }, + }, + { + /* MOD_0F38F5 */ + { "wrussK", { M, Gdq }, PREFIX_DATA }, + }, + { + /* MOD_0F38F6_PREFIX_0 */ + { "wrssK", { M, Gdq }, PREFIX_OPCODE }, + }, + { + /* MOD_0F38F8_PREFIX_1 */ + { "enqcmds", { Gva, M }, PREFIX_OPCODE }, + }, + { + /* MOD_0F38F8_PREFIX_2 */ + { "movdir64b", { Gva, M }, PREFIX_OPCODE }, + }, + { + /* MOD_0F38F8_PREFIX_3 */ + { "enqcmd", { Gva, M }, PREFIX_OPCODE }, + }, + { + /* MOD_0F38F9 */ + { "movdiri", { Edq, Gdq }, PREFIX_OPCODE }, + }, + { + /* MOD_0F38FA_PREFIX_1 */ + { Bad_Opcode }, + { "encodekey128", { Gd, Ed }, 0 }, + }, + { + /* MOD_0F38FB_PREFIX_1 */ + { Bad_Opcode }, + { "encodekey256", { Gd, Ed }, 0 }, + }, + { + /* MOD_0F3A0F_PREFIX_1 */ + { Bad_Opcode }, + { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) }, + }, + { + /* MOD_VEX_0F12_PREFIX_0 */ + { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) }, + { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) }, + }, + { + /* MOD_VEX_0F12_PREFIX_2 */ + { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) }, + }, + { + /* MOD_VEX_0F13 */ + { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) }, + }, + { + /* MOD_VEX_0F16_PREFIX_0 */ + { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) }, + { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) }, + }, + { + /* MOD_VEX_0F16_PREFIX_2 */ + { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) }, + }, + { + /* MOD_VEX_0F17 */ + { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) }, + }, + { + /* MOD_VEX_0F2B */ + { "%XEvmovntpX", { Mx, XM }, PREFIX_OPCODE }, + }, + { + /* MOD_VEX_0F41_L_1 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F41_L_1_M_1) }, + }, + { + /* MOD_VEX_0F42_L_1 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F42_L_1_M_1) }, + }, + { + /* MOD_VEX_0F44_L_0 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F44_L_0_M_1) }, + }, + { + /* MOD_VEX_0F45_L_1 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F45_L_1_M_1) }, + }, + { + /* MOD_VEX_0F46_L_1 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F46_L_1_M_1) }, + }, + { + /* MOD_VEX_0F47_L_1 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F47_L_1_M_1) }, + }, + { + /* MOD_VEX_0F4A_L_1 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1) }, + }, + { + /* MOD_VEX_0F4B_L_1 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1) }, + }, + { + /* MOD_VEX_0F50 */ + { Bad_Opcode }, + { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE }, + }, + { + /* MOD_VEX_0F71 */ + { Bad_Opcode }, + { REG_TABLE (REG_VEX_0F71_M_0) }, + }, + { + /* MOD_VEX_0F72 */ + { Bad_Opcode }, + { REG_TABLE (REG_VEX_0F72_M_0) }, + }, + { + /* MOD_VEX_0F73 */ + { Bad_Opcode }, + { REG_TABLE (REG_VEX_0F73_M_0) }, + }, + { + /* MOD_VEX_0F91_L_0 */ + { VEX_W_TABLE (VEX_W_0F91_L_0_M_0) }, + }, + { + /* MOD_VEX_0F92_L_0 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F92_L_0_M_1) }, + }, + { + /* MOD_VEX_0F93_L_0 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F93_L_0_M_1) }, + }, + { + /* MOD_VEX_0F98_L_0 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F98_L_0_M_1) }, + }, + { + /* MOD_VEX_0F99_L_0 */ + { Bad_Opcode }, + { VEX_W_TABLE (VEX_W_0F99_L_0_M_1) }, + }, + { + /* MOD_VEX_0FAE_REG_2 */ + { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) }, + }, + { + /* MOD_VEX_0FAE_REG_3 */ + { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) }, + }, + { + /* MOD_VEX_0FD7 */ + { Bad_Opcode }, + { "vpmovmskb", { Gdq, XS }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0FE7 */ + { "vmovntdq", { Mx, XM }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0FF0_PREFIX_3 */ + { "vlddqu", { XM, M }, 0 }, + }, + { + /* MOD_VEX_0F381A */ + { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) }, + }, + { + /* MOD_VEX_0F382A */ + { "vmovntdqa", { XM, Mx }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0F382C */ + { VEX_W_TABLE (VEX_W_0F382C_M_0) }, + }, + { + /* MOD_VEX_0F382D */ + { VEX_W_TABLE (VEX_W_0F382D_M_0) }, + }, + { + /* MOD_VEX_0F382E */ + { VEX_W_TABLE (VEX_W_0F382E_M_0) }, + }, + { + /* MOD_VEX_0F382F */ + { VEX_W_TABLE (VEX_W_0F382F_M_0) }, + }, + { /* MOD_VEX_0F3849_X86_64_L_0_W_0 */ { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) }, { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) }, }, + { + /* MOD_VEX_0F384B_X86_64_L_0_W_0 */ + { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0_M_0) }, + }, + { + /* MOD_VEX_0F385A */ + { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) }, + }, + { + /* MOD_VEX_0F385C_X86_64 */ + { Bad_Opcode }, + { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_M_1) }, + }, + { + /* MOD_VEX_0F385E_X86_64 */ + { Bad_Opcode }, + { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_M_1) }, + }, + { + /* MOD_VEX_0F386C_X86_64 */ + { Bad_Opcode }, + { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64_M_1) }, + }, + { + /* MOD_VEX_0F388C */ + { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0F388E */ + { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0F3A30_L_0 */ + { Bad_Opcode }, + { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0F3A31_L_0 */ + { Bad_Opcode }, + { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0F3A32_L_0 */ + { Bad_Opcode }, + { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA }, + }, + { + /* MOD_VEX_0F3A33_L_0 */ + { Bad_Opcode }, + { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA }, + }, + { + /* MOD_XOP_09_12 */ + { Bad_Opcode }, + { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) }, + }, #include "i386-dis-evex-mod.h" }; @@ -8180,7 +8727,6 @@ static const struct dis386 rm_table[][8] = { { "vmxoff", { Skip_MODRM }, 0 }, { "pconfig", { Skip_MODRM }, 0 }, { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) }, - { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) }, }, { /* RM_0F01_REG_1 */ @@ -8257,7 +8803,7 @@ static const struct dis386 rm_table[][8] = { { "sfence", { Skip_MODRM }, 0 }, }, { - /* RM_0F3A0F_P_1_R_0 */ + /* RM_0F3A0F_P_1_MOD_3_REG_0 */ { "hreset", { Skip_MODRM, Ib }, 0 }, }, { @@ -8735,7 +9281,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) ins->vex.prefix = REPNE_PREFIX_OPCODE; break; } - ins->need_vex = 3; + ins->need_vex = true; ins->codep++; vindex = *ins->codep++; dp = &xop_table[vex_table_index][vindex]; @@ -8800,7 +9346,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) ins->vex.prefix = REPNE_PREFIX_OPCODE; break; } - ins->need_vex = 3; + ins->need_vex = true; ins->codep++; vindex = *ins->codep++; dp = &vex_table[vex_table_index][vindex]; @@ -8835,10 +9381,10 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) ins->vex.prefix = REPNE_PREFIX_OPCODE; break; } - ins->need_vex = 2; + ins->need_vex = true; ins->codep++; vindex = *ins->codep++; - dp = &vex_table[VEX_0F][vindex]; + dp = &vex_table[dp->op[1].bytemode][vindex]; ins->end_codep = ins->codep; /* There is no MODRM byte for VEX 77. */ if (vindex != 0x77 && !fetch_modrm (ins)) @@ -8927,7 +9473,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) ins->vex.r = true; } - ins->need_vex = 4; + ins->need_vex = true; ins->codep++; vindex = *ins->codep++; dp = &evex_table[vex_table_index][vindex]; @@ -9359,21 +9905,9 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) oappend (&ins, "{"); oappend_register (&ins, reg_name); oappend (&ins, "}"); - - if (ins.vex.zeroing) - oappend (&ins, "{z}"); - } - else if (ins.vex.zeroing) - { - oappend (&ins, "{bad}"); - continue; } - - /* Instructions with a mask register destination allow for - zeroing-masking only (if any masking at all), which is - _not_ expressed by EVEX.z. */ - if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode) - ins.illegal_masking = true; + if (ins.vex.zeroing) + oappend (&ins, "{z}"); /* S/G insns require a mask and don't allow zeroing-masking. */ @@ -9381,9 +9915,6 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) || dp->op[0].bytemode == vex_vsib_q_w_dq_mode) && (ins.vex.mask_register_specifier == 0 || ins.vex.zeroing)) - ins.illegal_masking = true; - - if (ins.illegal_masking) oappend (&ins, "/(bad)"); } } @@ -9454,6 +9985,14 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) goto out; } + /* If EVEX.z is set, there must be an actual mask register in use. */ + if (ins.vex.zeroing && ins.vex.mask_register_specifier == 0) + { + i386_dis_printf (info, dis_style_text, "(bad)"); + ret = ins.end_codep - priv.the_buffer; + goto out; + } + switch (dp->prefix_requirement) { case PREFIX_DATA: @@ -10001,6 +10540,16 @@ swap_operand (instr_info *ins) } static bool +OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, + int sizeflag ATTRIBUTE_UNUSED) +{ + /* Skip mod/rm byte. */ + MODRM_CHECK; + ins->codep++; + return true; +} + +static bool dofloat (instr_info *ins, int sizeflag) { const struct dis386 *dp; @@ -10490,10 +11039,7 @@ putop (instr_info *ins, const char *in_template, int sizeflag) break; case 'V': if (l == 0) - { - if (ins->need_vex) - *ins->obufp++ = 'v'; - } + abort (); else if (l == 1) { switch (last[0]) @@ -10570,15 +11116,10 @@ putop (instr_info *ins, const char *in_template, int sizeflag) *ins->obufp++ = 's'; break; case 'Y': - if (l == 0) - { - if (ins->vex.mask_register_specifier) - ins->illegal_masking = true; - } - else if (l == 1 && last[0] == 'X') + if (l == 1 && last[0] == 'X') { if (!ins->need_vex) - break; + abort (); if (ins->intel_syntax || ((ins->modrm.mod == 3 || ins->vex.b) && !(sizeflag & SUFFIX_ALWAYS))) @@ -10755,6 +11296,14 @@ append_seg (instr_info *ins) oappend_char (ins, ':'); } +static bool +OP_indirE (instr_info *ins, int bytemode, int sizeflag) +{ + if (!ins->intel_syntax) + oappend (ins, "*"); + return OP_E (ins, bytemode, sizeflag); +} + static void print_operand_value (instr_info *ins, bfd_vma disp, enum disassembler_style style) @@ -10965,9 +11514,11 @@ intel_operand_size (instr_info *ins, int bytemode, int sizeflag) case xmmq_mode: case evex_half_bcst_xmmqh_mode: case evex_half_bcst_xmmq_mode: + if (!ins->need_vex) + abort (); + switch (ins->vex.length) { - case 0: case 128: oappend (ins, "QWORD PTR "); break; @@ -11080,11 +11631,6 @@ print_register (instr_info *ins, unsigned int reg, unsigned int rexmask, { const char (*names)[8]; - /* Masking is invalid for insns with GPR destination. Set the flag uniformly, - as the consumer will inspect it only for the destination operand. */ - if (bytemode != mask_mode && ins->vex.mask_register_specifier) - ins->illegal_masking = true; - USED_REX (rexmask); if (ins->rex & rexmask) reg += 8; @@ -11285,25 +11831,12 @@ BadOp (instr_info *ins) /* Throw away prefixes and 1st. opcode byte. */ struct dis_private *priv = ins->info->private_data; - ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1; + ins->codep = priv->the_buffer + ins->nr_prefixes + 1; ins->obufp = stpcpy (ins->obufp, "(bad)"); return true; } static bool -OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, - int sizeflag ATTRIBUTE_UNUSED) -{ - if (ins->modrm.mod != 3) - return BadOp (ins); - - /* Skip mod/rm byte. */ - MODRM_CHECK; - ins->codep++; - return true; -} - -static bool OP_E_memory (instr_info *ins, int bytemode, int sizeflag) { int add = (ins->rex & REX_B) ? 8 : 0; @@ -11312,13 +11845,6 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag) if (ins->vex.evex) { - - /* Zeroing-masking is invalid for memory destinations. Set the flag - uniformly, as the consumer will inspect it only for the destination - operand. */ - if (ins->vex.zeroing) - ins->illegal_masking = true; - switch (bytemode) { case dw_mode: @@ -11832,27 +12358,10 @@ OP_E (instr_info *ins, int bytemode, int sizeflag) return true; } - /* Masking is invalid for insns with GPR-like memory destination. Set the - flag uniformly, as the consumer will inspect it only for the destination - operand. */ - if (ins->vex.mask_register_specifier) - ins->illegal_masking = true; - return OP_E_memory (ins, bytemode, sizeflag); } static bool -OP_indirE (instr_info *ins, int bytemode, int sizeflag) -{ - if (ins->modrm.mod == 3 && bytemode == f_mode) - /* bad lcall/ljmp */ - return BadOp (ins); - if (!ins->intel_syntax) - oappend (ins, "*"); - return OP_E (ins, bytemode, sizeflag); -} - -static bool OP_G (instr_info *ins, int bytemode, int sizeflag) { if (ins->vex.evex && !ins->vex.r && ins->address_mode == mode_64bit) @@ -12412,7 +12921,6 @@ print_vector_reg (instr_info *ins, unsigned int reg, int bytemode) { switch (ins->vex.length) { - case 0: case 128: case 256: names = att_names_xmm; @@ -12614,43 +13122,28 @@ OP_EX (instr_info *ins, int bytemode, int sizeflag) } static bool -OP_R (instr_info *ins, int bytemode, int sizeflag) +OP_MS (instr_info *ins, int bytemode, int sizeflag) { - if (ins->modrm.mod != 3) - return BadOp (ins); - - switch (bytemode) - { - case d_mode: - case dq_mode: - case mask_mode: - return OP_E (ins, bytemode, sizeflag); - case q_mode: - return OP_EM (ins, x_mode, sizeflag); - case xmm_mode: - if (ins->vex.length <= 128) - break; - return BadOp (ins); - } + if (ins->modrm.mod == 3) + return OP_EM (ins, bytemode, sizeflag); + return BadOp (ins); +} - return OP_EX (ins, bytemode, sizeflag); +static bool +OP_XS (instr_info *ins, int bytemode, int sizeflag) +{ + if (ins->modrm.mod == 3) + return OP_EX (ins, bytemode, sizeflag); + return BadOp (ins); } static bool OP_M (instr_info *ins, int bytemode, int sizeflag) { - /* Skip mod/rm byte. */ - MODRM_CHECK; - ins->codep++; - if (ins->modrm.mod == 3) /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */ return BadOp (ins); - - if (bytemode == x_mode) - ins->vex.no_broadcast = true; - - return OP_E_memory (ins, bytemode, sizeflag); + return OP_E (ins, bytemode, sizeflag); } static bool @@ -13093,7 +13586,7 @@ OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) const char (*names)[8]; if (!ins->need_vex) - return true; + abort (); reg = ins->vex.register_specifier; ins->vex.register_specifier = 0; |