diff options
author | Jan Beulich <jbeulich@suse.com> | 2024-01-26 10:34:24 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2024-01-26 10:34:24 +0100 |
commit | 836f6ceb83dceca0c261507928fbd7fe5a6aea65 (patch) | |
tree | 0395496fac108d845c2dc0d5a6399fb72a05fdd6 /opcodes | |
parent | 213f15cf1b2d29e0e6f1467c0df05c8cb97d9d6e (diff) |
x86/APX: no need to have decode go through x86_64_table[]
As suggested during review already, all such entries have their first
slot as Bad_Opcode, so by adding two more enumerators we can avoid doing
that decode step altogether.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/i386-dis-evex-x86-64.h | 50 | ||||
-rw-r--r-- | opcodes/i386-dis-evex.h | 20 | ||||
-rw-r--r-- | opcodes/i386-dis.c | 33 |
3 files changed, 27 insertions, 76 deletions
diff --git a/opcodes/i386-dis-evex-x86-64.h b/opcodes/i386-dis-evex-x86-64.h deleted file mode 100644 index 0d9d98a7691..00000000000 --- a/opcodes/i386-dis-evex-x86-64.h +++ /dev/null @@ -1,50 +0,0 @@ - /* X86_64_EVEX_0F90 */ - { - { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F90_L_0) }, - }, - /* X86_64_EVEX_0F91 */ - { - { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F91_L_0) }, - }, - /* X86_64_EVEX_0F92 */ - { - { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F92_L_0) }, - }, - /* X86_64_EVEX_0F93 */ - { - { Bad_Opcode }, - { VEX_W_TABLE (VEX_W_0F93_L_0) }, - }, - /* X86_64_EVEX_0F38F2 */ - { - { Bad_Opcode }, - { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) }, - }, - /* X86_64_EVEX_0F38F3 */ - { - { Bad_Opcode }, - { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) }, - }, - /* X86_64_EVEX_0F38F5 */ - { - { Bad_Opcode }, - { PREFIX_TABLE (PREFIX_VEX_0F38F5_L_0) }, - }, - /* X86_64_EVEX_0F38F6 */ - { - { Bad_Opcode }, - { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) }, - }, - /* X86_64_EVEX_0F38F7 */ - { - { Bad_Opcode }, - { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) }, - }, - /* X86_64_EVEX_0F3AF0 */ - { - { Bad_Opcode }, - { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) }, - }, diff --git a/opcodes/i386-dis-evex.h b/opcodes/i386-dis-evex.h index 4f2ec966457..62cf7d7d18e 100644 --- a/opcodes/i386-dis-evex.h +++ b/opcodes/i386-dis-evex.h @@ -164,10 +164,10 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* 90 */ - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F90) }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F91) }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F92) }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F93) }, + { X86_64_EVEX_W_TABLE (VEX_W_0F90_L_0) }, + { X86_64_EVEX_W_TABLE (VEX_W_0F91_L_0) }, + { X86_64_EVEX_W_TABLE (VEX_W_0F92_L_0) }, + { X86_64_EVEX_W_TABLE (VEX_W_0F93_L_0) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, @@ -565,12 +565,12 @@ static const struct dis386 evex_table[][256] = { /* F0 */ { Bad_Opcode }, { Bad_Opcode }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F38F2) }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F38F3) }, + { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F2_L_0) }, + { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F3_L_0) }, { Bad_Opcode }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F38F5) }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F38F6) }, - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F38F7) }, + { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F5_L_0) }, + { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F6_L_0) }, + { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F7_L_0) }, /* F8 */ { Bad_Opcode }, { Bad_Opcode }, @@ -854,7 +854,7 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, { Bad_Opcode }, /* F0 */ - { X86_64_EVEX_FROM_VEX_TABLE (X86_64_EVEX_0F3AF0) }, + { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F3AF0_L_0) }, { Bad_Opcode }, { Bad_Opcode }, { Bad_Opcode }, diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 6b154ab214a..4a5efa7717e 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -821,6 +821,8 @@ enum USE_PREFIX_TABLE, USE_X86_64_TABLE, USE_X86_64_EVEX_FROM_VEX_TABLE, + USE_X86_64_EVEX_PFX_TABLE, + USE_X86_64_EVEX_W_TABLE, USE_3BYTE_TABLE, USE_XOP_8F_TABLE, USE_VEX_C4_TABLE, @@ -841,6 +843,8 @@ enum #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I)) #define X86_64_EVEX_FROM_VEX_TABLE(I) \ DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I)) +#define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I)) +#define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_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) @@ -1317,17 +1321,6 @@ enum X86_64_VEX_0F38EF, X86_64_VEX_MAP7_F8_L_0_W_0_R_0, - - X86_64_EVEX_0F90, - X86_64_EVEX_0F91, - X86_64_EVEX_0F92, - X86_64_EVEX_0F93, - X86_64_EVEX_0F38F2, - X86_64_EVEX_0F38F3, - X86_64_EVEX_0F38F5, - X86_64_EVEX_0F38F6, - X86_64_EVEX_0F38F7, - X86_64_EVEX_0F3AF0, }; enum @@ -4600,8 +4593,6 @@ static const struct dis386 x86_64_table[][2] = { { Bad_Opcode }, { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) }, }, - -#include "i386-dis-evex-x86-64.h" }; static const struct dis386 three_byte_table[][256] = { @@ -8738,6 +8729,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) break; case USE_PREFIX_TABLE: + use_prefix_table: if (ins->need_vex) { /* The prefix in VEX is implicit. */ @@ -8808,15 +8800,23 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) break; case USE_X86_64_EVEX_FROM_VEX_TABLE: + case USE_X86_64_EVEX_PFX_TABLE: + case USE_X86_64_EVEX_W_TABLE: ins->evex_type = evex_from_vex; - /* EVEX from VEX instrucions require that EVEX.z, EVEX.L’L, EVEX.b and - the lower 2 bits of EVEX.aaa must be 0. */ - if ((ins->vex.mask_register_specifier & 0x3) != 0 + /* EVEX from VEX instructions are 64-bit only and require that EVEX.z, + EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0. */ + if (ins->address_mode != mode_64bit + || (ins->vex.mask_register_specifier & 0x3) != 0 || ins->vex.ll != 0 || ins->vex.zeroing != 0 || ins->vex.b) return &bad_opcode; + if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE) + goto use_prefix_table; + if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE) + goto use_vex_w_table; + /* Fall through. */ case USE_X86_64_TABLE: vindex = ins->address_mode == mode_64bit ? 1 : 0; @@ -9050,6 +9050,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) break; case USE_VEX_W_TABLE: + use_vex_w_table: if (!ins->need_vex) abort (); |