From 7531c61332dbd9061b09312e44b62523547e8225 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 14 Jul 2020 10:33:40 +0200 Subject: x86: simplify decode of opcodes valid with (embedded) 66 prefix only The only valid (embedded or explicit) prefix being the data size one (which is a fairly common pattern), avoid going through prefix_table[]. Instead extend the "required prefix" logic to also handle PREFIX_DATA alone in a table entry, now used to identify this case. This requires moving the (adjusted) ->prefix_requirement logic ahead of the printing of stray prefixes, as the latter needs to observe the new setting of PREFIX_DATA in used_prefixes. Also add PREFIX_OPCODE on related entries when previously there was mistakenly no decode step through prefix_table[]. --- opcodes/i386-dis-evex-len.h | 268 ++++++++++++++++++++++---------------------- 1 file changed, 134 insertions(+), 134 deletions(-) (limited to 'opcodes/i386-dis-evex-len.h') diff --git a/opcodes/i386-dis-evex-len.h b/opcodes/i386-dis-evex-len.h index 51f19dcc1e9..ebe0945d5fc 100644 --- a/opcodes/i386-dis-evex-len.h +++ b/opcodes/i386-dis-evex-len.h @@ -1,7 +1,7 @@ static const struct dis386 evex_len_table[][3] = { - /* EVEX_LEN_0F6E_P_2 */ + /* EVEX_LEN_0F6E */ { - { "vmovK", { XMScalar, Edq }, 0 }, + { "vmovK", { XMScalar, Edq }, PREFIX_DATA }, }, /* EVEX_LEN_0F7E_P_1 */ @@ -14,61 +14,61 @@ static const struct dis386 evex_len_table[][3] = { { "vmovK", { Edq, XMScalar }, 0 }, }, - /* EVEX_LEN_0FC4_P_2 */ + /* EVEX_LEN_0FC4 */ { - { "vpinsrw", { XM, Vex, Edqw, Ib }, 0 }, + { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0FC5_P_2 */ + /* EVEX_LEN_0FC5 */ { - { "vpextrw", { Gdq, XS, Ib }, 0 }, + { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0FD6_P_2 */ + /* EVEX_LEN_0FD6 */ { - { VEX_W_TABLE (EVEX_W_0FD6_P_2) }, + { VEX_W_TABLE (EVEX_W_0FD6_L_0) }, }, - /* EVEX_LEN_0F3816_P_2 */ + /* EVEX_LEN_0F3816 */ { { Bad_Opcode }, - { "vpermp%XW", { XM, Vex, EXx }, 0 }, - { "vpermp%XW", { XM, Vex, EXx }, 0 }, + { "vpermp%XW", { XM, Vex, EXx }, PREFIX_DATA }, + { "vpermp%XW", { XM, Vex, EXx }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3819_P_2_W_0 */ + /* EVEX_LEN_0F3819_W_0 */ { { Bad_Opcode }, - { "vbroadcastf32x2", { XM, EXxmm_mq }, 0 }, - { "vbroadcastf32x2", { XM, EXxmm_mq }, 0 }, + { "vbroadcastf32x2", { XM, EXxmm_mq }, PREFIX_DATA }, + { "vbroadcastf32x2", { XM, EXxmm_mq }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3819_P_2_W_1 */ + /* EVEX_LEN_0F3819_W_1 */ { { Bad_Opcode }, - { "vbroadcastsd", { XM, EXxmm_mq }, 0 }, - { "vbroadcastsd", { XM, EXxmm_mq }, 0 }, + { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA }, + { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA }, }, - /* EVEX_LEN_0F381A_P_2_W_0_M_0 */ + /* EVEX_LEN_0F381A_W_0_M_0 */ { { Bad_Opcode }, - { "vbroadcastf32x4", { XM, EXxmm }, 0 }, - { "vbroadcastf32x4", { XM, EXxmm }, 0 }, + { "vbroadcastf32x4", { XM, EXxmm }, PREFIX_DATA }, + { "vbroadcastf32x4", { XM, EXxmm }, PREFIX_DATA }, }, - /* EVEX_LEN_0F381A_P_2_W_1_M_0 */ + /* EVEX_LEN_0F381A_W_1_M_0 */ { { Bad_Opcode }, - { "vbroadcastf64x2", { XM, EXxmm }, 0 }, - { "vbroadcastf64x2", { XM, EXxmm }, 0 }, + { "vbroadcastf64x2", { XM, EXxmm }, PREFIX_DATA }, + { "vbroadcastf64x2", { XM, EXxmm }, PREFIX_DATA }, }, - /* EVEX_LEN_0F381B_P_2_W_0_M_0 */ + /* EVEX_LEN_0F381B_W_0_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vbroadcastf32x8", { XM, EXymm }, 0 }, + { "vbroadcastf32x8", { XM, EXymm }, PREFIX_DATA }, }, /* EVEX_LEN_0F381B_P_2_W_1_M_0 */ @@ -78,311 +78,311 @@ static const struct dis386 evex_len_table[][3] = { { "vbroadcastf64x4", { XM, EXymm }, 0 }, }, - /* EVEX_LEN_0F3836_P_2 */ + /* EVEX_LEN_0F3836 */ { { Bad_Opcode }, - { "vperm%DQ", { XM, Vex, EXx }, 0 }, - { "vperm%DQ", { XM, Vex, EXx }, 0 }, + { "vperm%DQ", { XM, Vex, EXx }, PREFIX_DATA }, + { "vperm%DQ", { XM, Vex, EXx }, PREFIX_DATA }, }, - /* EVEX_LEN_0F385A_P_2_W_0_M_0 */ + /* EVEX_LEN_0F385A_W_0_M_0 */ { { Bad_Opcode }, - { "vbroadcasti32x4", { XM, EXxmm }, 0 }, - { "vbroadcasti32x4", { XM, EXxmm }, 0 }, + { "vbroadcasti32x4", { XM, EXxmm }, PREFIX_DATA }, + { "vbroadcasti32x4", { XM, EXxmm }, PREFIX_DATA }, }, - /* EVEX_LEN_0F385A_P_2_W_1_M_0 */ + /* EVEX_LEN_0F385A_W_1_M_0 */ { { Bad_Opcode }, - { "vbroadcasti64x2", { XM, EXxmm }, 0 }, - { "vbroadcasti64x2", { XM, EXxmm }, 0 }, + { "vbroadcasti64x2", { XM, EXxmm }, PREFIX_DATA }, + { "vbroadcasti64x2", { XM, EXxmm }, PREFIX_DATA }, }, - /* EVEX_LEN_0F385B_P_2_W_0_M_0 */ + /* EVEX_LEN_0F385B_W_0_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vbroadcasti32x8", { XM, EXymm }, 0 }, + { "vbroadcasti32x8", { XM, EXymm }, PREFIX_DATA }, }, - /* EVEX_LEN_0F385B_P_2_W_1_M_0 */ + /* EVEX_LEN_0F385B_W_1_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vbroadcasti64x4", { XM, EXymm }, 0 }, + { "vbroadcasti64x4", { XM, EXymm }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C6_REG_1_PREFIX_2 */ + /* EVEX_LEN_0F38C6_R_1_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vgatherpf0dp%XW", { MVexVSIBDWpX }, 0 }, + { "vgatherpf0dp%XW", { MVexVSIBDWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C6_REG_2_PREFIX_2 */ + /* EVEX_LEN_0F38C6_R_2_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vgatherpf1dp%XW", { MVexVSIBDWpX }, 0 }, + { "vgatherpf1dp%XW", { MVexVSIBDWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C6_REG_5_PREFIX_2 */ + /* EVEX_LEN_0F38C6_R_5_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vscatterpf0dp%XW", { MVexVSIBDWpX }, 0 }, + { "vscatterpf0dp%XW", { MVexVSIBDWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C6_REG_6_PREFIX_2 */ + /* EVEX_LEN_0F38C6_R_6_M_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vscatterpf1dp%XW", { MVexVSIBDWpX }, 0 }, + { "vscatterpf1dp%XW", { MVexVSIBDWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_1_P_2_W_0 */ + /* EVEX_LEN_0F38C7_R_1_M_0_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vgatherpf0qps", { MVexVSIBDQWpX }, 0 }, + { "vgatherpf0qps", { MVexVSIBDQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_1_P_2_W_1 */ + /* EVEX_LEN_0F38C7_R_1_M_0_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vgatherpf0qpd", { MVexVSIBQWpX }, 0 }, + { "vgatherpf0qpd", { MVexVSIBQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_2_P_2_W_0 */ + /* EVEX_LEN_0F38C7_R_2_M_0_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vgatherpf1qps", { MVexVSIBDQWpX }, 0 }, + { "vgatherpf1qps", { MVexVSIBDQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_2_P_2_W_1 */ + /* EVEX_LEN_0F38C7_R_2_M_0_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vgatherpf1qpd", { MVexVSIBQWpX }, 0 }, + { "vgatherpf1qpd", { MVexVSIBQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_5_P_2_W_0 */ + /* EVEX_LEN_0F38C7_R_5_M_0_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vscatterpf0qps", { MVexVSIBDQWpX }, 0 }, + { "vscatterpf0qps", { MVexVSIBDQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_5_P_2_W_1 */ + /* EVEX_LEN_0F38C7_R_5_M_0_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vscatterpf0qpd", { MVexVSIBQWpX }, 0 }, + { "vscatterpf0qpd", { MVexVSIBQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_6_P_2_W_0 */ + /* EVEX_LEN_0F38C7_R_6_M_0_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vscatterpf1qps", { MVexVSIBDQWpX }, 0 }, + { "vscatterpf1qps", { MVexVSIBDQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F38C7_R_6_P_2_W_1 */ + /* EVEX_LEN_0F38C7_R_6_M_0_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vscatterpf1qpd", { MVexVSIBQWpX }, 0 }, + { "vscatterpf1qpd", { MVexVSIBQWpX }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A00_P_2_W_1 */ + /* EVEX_LEN_0F3A00_W_1 */ { { Bad_Opcode }, - { "vpermq", { XM, EXx, Ib }, 0 }, - { "vpermq", { XM, EXx, Ib }, 0 }, + { "vpermq", { XM, EXx, Ib }, PREFIX_DATA }, + { "vpermq", { XM, EXx, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A01_P_2_W_1 */ + /* EVEX_LEN_0F3A01_W_1 */ { { Bad_Opcode }, - { "vpermpd", { XM, EXx, Ib }, 0 }, - { "vpermpd", { XM, EXx, Ib }, 0 }, + { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA }, + { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A14_P_2 */ + /* EVEX_LEN_0F3A14 */ { - { "vpextrb", { Edqb, XM, Ib }, 0 }, + { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A15_P_2 */ + /* EVEX_LEN_0F3A15 */ { - { "vpextrw", { Edqw, XM, Ib }, 0 }, + { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A16_P_2 */ + /* EVEX_LEN_0F3A16 */ { - { "vpextrK", { Edq, XM, Ib }, 0 }, + { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A17_P_2 */ + /* EVEX_LEN_0F3A17 */ { - { "vextractps", { Edqd, XMM, Ib }, 0 }, + { "vextractps", { Edqd, XMM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A18_P_2_W_0 */ + /* EVEX_LEN_0F3A18_W_0 */ { { Bad_Opcode }, - { "vinsertf32x4", { XM, Vex, EXxmm, Ib }, 0 }, - { "vinsertf32x4", { XM, Vex, EXxmm, Ib }, 0 }, + { "vinsertf32x4", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, + { "vinsertf32x4", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A18_P_2_W_1 */ + /* EVEX_LEN_0F3A18_W_1 */ { { Bad_Opcode }, - { "vinsertf64x2", { XM, Vex, EXxmm, Ib }, 0 }, - { "vinsertf64x2", { XM, Vex, EXxmm, Ib }, 0 }, + { "vinsertf64x2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, + { "vinsertf64x2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A19_P_2_W_0 */ + /* EVEX_LEN_0F3A19_W_0 */ { { Bad_Opcode }, - { "vextractf32x4", { EXxmm, XM, Ib }, 0 }, - { "vextractf32x4", { EXxmm, XM, Ib }, 0 }, + { "vextractf32x4", { EXxmm, XM, Ib }, PREFIX_DATA }, + { "vextractf32x4", { EXxmm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A19_P_2_W_1 */ + /* EVEX_LEN_0F3A19_W_1 */ { { Bad_Opcode }, - { "vextractf64x2", { EXxmm, XM, Ib }, 0 }, - { "vextractf64x2", { EXxmm, XM, Ib }, 0 }, + { "vextractf64x2", { EXxmm, XM, Ib }, PREFIX_DATA }, + { "vextractf64x2", { EXxmm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A1A_P_2_W_0 */ + /* EVEX_LEN_0F3A1A_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vinsertf32x8", { XM, Vex, EXymm, Ib }, 0 }, + { "vinsertf32x8", { XM, Vex, EXymm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A1A_P_2_W_1 */ + /* EVEX_LEN_0F3A1A_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vinsertf64x4", { XM, Vex, EXymm, Ib }, 0 }, + { "vinsertf64x4", { XM, Vex, EXymm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A1B_P_2_W_0 */ + /* EVEX_LEN_0F3A1B_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vextractf32x8", { EXymm, XM, Ib }, 0 }, + { "vextractf32x8", { EXymm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A1B_P_2_W_1 */ + /* EVEX_LEN_0F3A1B_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vextractf64x4", { EXymm, XM, Ib }, 0 }, + { "vextractf64x4", { EXymm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A20_P_2 */ + /* EVEX_LEN_0F3A20 */ { - { "vpinsrb", { XM, Vex, Edqb, Ib }, 0 }, + { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A21_P_2_W_0 */ + /* EVEX_LEN_0F3A21_W_0 */ { - { "vinsertps", { XMM, Vex, EXxmm_md, Ib }, 0 }, + { "vinsertps", { XMM, Vex, EXxmm_md, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A22_P_2 */ + /* EVEX_LEN_0F3A22 */ { - { "vpinsrK", { XM, Vex, Edq, Ib }, 0 }, + { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A23_P_2_W_0 */ + /* EVEX_LEN_0F3A23_W_0 */ { { Bad_Opcode }, - { "vshuff32x4", { XM, Vex, EXx, Ib }, 0 }, - { "vshuff32x4", { XM, Vex, EXx, Ib }, 0 }, + { "vshuff32x4", { XM, Vex, EXx, Ib }, PREFIX_DATA }, + { "vshuff32x4", { XM, Vex, EXx, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A23_P_2_W_1 */ + /* EVEX_LEN_0F3A23_W_1 */ { { Bad_Opcode }, - { "vshuff64x2", { XM, Vex, EXx, Ib }, 0 }, - { "vshuff64x2", { XM, Vex, EXx, Ib }, 0 }, + { "vshuff64x2", { XM, Vex, EXx, Ib }, PREFIX_DATA }, + { "vshuff64x2", { XM, Vex, EXx, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A38_P_2_W_0 */ + /* EVEX_LEN_0F3A38_W_0 */ { { Bad_Opcode }, - { "vinserti32x4", { XM, Vex, EXxmm, Ib }, 0 }, - { "vinserti32x4", { XM, Vex, EXxmm, Ib }, 0 }, + { "vinserti32x4", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, + { "vinserti32x4", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A38_P_2_W_1 */ + /* EVEX_LEN_0F3A38_W_1 */ { { Bad_Opcode }, - { "vinserti64x2", { XM, Vex, EXxmm, Ib }, 0 }, - { "vinserti64x2", { XM, Vex, EXxmm, Ib }, 0 }, + { "vinserti64x2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, + { "vinserti64x2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A39_P_2_W_0 */ + /* EVEX_LEN_0F3A39_W_0 */ { { Bad_Opcode }, - { "vextracti32x4", { EXxmm, XM, Ib }, 0 }, - { "vextracti32x4", { EXxmm, XM, Ib }, 0 }, + { "vextracti32x4", { EXxmm, XM, Ib }, PREFIX_DATA }, + { "vextracti32x4", { EXxmm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A39_P_2_W_1 */ + /* EVEX_LEN_0F3A39_W_1 */ { { Bad_Opcode }, - { "vextracti64x2", { EXxmm, XM, Ib }, 0 }, - { "vextracti64x2", { EXxmm, XM, Ib }, 0 }, + { "vextracti64x2", { EXxmm, XM, Ib }, PREFIX_DATA }, + { "vextracti64x2", { EXxmm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A3A_P_2_W_0 */ + /* EVEX_LEN_0F3A3A_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vinserti32x8", { XM, Vex, EXymm, Ib }, 0 }, + { "vinserti32x8", { XM, Vex, EXymm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A3A_P_2_W_1 */ + /* EVEX_LEN_0F3A3A_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vinserti64x4", { XM, Vex, EXymm, Ib }, 0 }, + { "vinserti64x4", { XM, Vex, EXymm, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A3B_P_2_W_0 */ + /* EVEX_LEN_0F3A3B_W_0 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vextracti32x8", { EXymm, XM, Ib }, 0 }, + { "vextracti32x8", { EXymm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A3B_P_2_W_1 */ + /* EVEX_LEN_0F3A3B_W_1 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vextracti64x4", { EXymm, XM, Ib }, 0 }, + { "vextracti64x4", { EXymm, XM, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A43_P_2_W_0 */ + /* EVEX_LEN_0F3A43_W_0 */ { { Bad_Opcode }, - { "vshufi32x4", { XM, Vex, EXx, Ib }, 0 }, - { "vshufi32x4", { XM, Vex, EXx, Ib }, 0 }, + { "vshufi32x4", { XM, Vex, EXx, Ib }, PREFIX_DATA }, + { "vshufi32x4", { XM, Vex, EXx, Ib }, PREFIX_DATA }, }, - /* EVEX_LEN_0F3A43_P_2_W_1 */ + /* EVEX_LEN_0F3A43_W_1 */ { { Bad_Opcode }, - { "vshufi64x2", { XM, Vex, EXx, Ib }, 0 }, - { "vshufi64x2", { XM, Vex, EXx, Ib }, 0 }, + { "vshufi64x2", { XM, Vex, EXx, Ib }, PREFIX_DATA }, + { "vshufi64x2", { XM, Vex, EXx, Ib }, PREFIX_DATA }, }, }; -- cgit v1.2.1