From e74d9fa9cf7cbbcd290b74564d58456611a019bf Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 6 Jul 2020 13:41:27 +0200 Subject: x86: AVX512 extract/insert insns need to honor EVEX.L'L Just like their AVX counterparts do for VEX.L. At this occasion also make EVEX.W have the same effect as VEX.W on the printing of VPINSR{B,W}'s operands, bringing them also in sync with VPEXTR{B,W}. --- opcodes/ChangeLog | 13 ++++++++++++ opcodes/i386-dis-evex-len.h | 45 ++++++++++++++++++++++++++++++++++++++++++ opcodes/i386-dis-evex-prefix.h | 16 +++++++-------- opcodes/i386-dis-evex-w.h | 2 +- opcodes/i386-dis.c | 9 +++++++++ 5 files changed, 76 insertions(+), 9 deletions(-) (limited to 'opcodes') diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 296ef26..62f8a08 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,5 +1,18 @@ 2020-07-06 Jan Beulich + * i386-dis.c (EVEX_LEN_0FC4_P_2, EVEX_LEN_0FC5_P_2, + EVEX_LEN_0F3A14_P_2, EVEX_LEN_0F3A15_P_2, EVEX_LEN_0F3A16_P_2, + EVEX_LEN_0F3A17_P_2, EVEX_LEN_0F3A20_P_2, + EVEX_LEN_0F3A21_P_2_W_0, EVEX_LEN_0F3A22_P_2): New enumerators. + * i386-dis-evex-len.h (evex_len_table): New EVEX_LEN_0FC4_P_2, + EVEX_LEN_0FC5_P_2, EVEX_LEN_0F3A14_P_2, EVEX_LEN_0F3A15_P_2, + EVEX_LEN_0F3A16_P_2, EVEX_LEN_0F3A17_P_2, EVEX_LEN_0F3A20_P_2, + EVEX_LEN_0F3A21_P_2_W_0, and EVEX_LEN_0F3A22_P_2 table entries. + * i386-dis-evex-prefix.h, i386-dis-evex-w.h: Reference the above + entries. + +2020-07-06 Jan Beulich + * i386-dis.c (PREFIX_EVEX_0F3A1D, EVEX_W_0F3A1D_P_2): Delete. (VEX_W_0F3813_P_2, VEX_W_0F3A1D_P_2): New enumerators. (prefix_table): Reference VEX_W_0F3813_P_2 and VEX_W_0F3A1D_P_2 diff --git a/opcodes/i386-dis-evex-len.h b/opcodes/i386-dis-evex-len.h index ce58199..51ce98f 100644 --- a/opcodes/i386-dis-evex-len.h +++ b/opcodes/i386-dis-evex-len.h @@ -14,6 +14,16 @@ static const struct dis386 evex_len_table[][3] = { { "vmovK", { Edq, XMScalar }, 0 }, }, + /* EVEX_LEN_0FC4_P_2 */ + { + { "vpinsrw", { XM, Vex128, Edqw, Ib }, 0 }, + }, + + /* EVEX_LEN_0FC5_P_2 */ + { + { "vpextrw", { Gdq, XS, Ib }, 0 }, + }, + /* EVEX_LEN_0FD6_P_2 */ { { VEX_W_TABLE (EVEX_W_0FD6_P_2) }, @@ -173,6 +183,26 @@ static const struct dis386 evex_len_table[][3] = { { "vscatterpf1qpd", { MVexVSIBQWpX }, 0 }, }, + /* EVEX_LEN_0F3A14_P_2 */ + { + { "vpextrb", { Edqb, XM, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A15_P_2 */ + { + { "vpextrw", { Edqw, XM, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A16_P_2 */ + { + { "vpextrK", { Edq, XM, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A17_P_2 */ + { + { "vextractps", { Edqd, XMM, Ib }, 0 }, + }, + /* EVEX_LEN_0F3A18_P_2_W_0 */ { { Bad_Opcode }, @@ -229,6 +259,21 @@ static const struct dis386 evex_len_table[][3] = { { "vextractf64x4", { EXxmmq, XM, Ib }, 0 }, }, + /* EVEX_LEN_0F3A20_P_2 */ + { + { "vpinsrb", { XM, Vex128, Edqb, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A21_P_2_W_0 */ + { + { "vinsertps", { XMM, Vex, EXxmm_md, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A22_P_2 */ + { + { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 }, + }, + /* EVEX_LEN_0F3A23_P_2_W_0 */ { { Bad_Opcode }, diff --git a/opcodes/i386-dis-evex-prefix.h b/opcodes/i386-dis-evex-prefix.h index 01998c5..f5cce6f 100644 --- a/opcodes/i386-dis-evex-prefix.h +++ b/opcodes/i386-dis-evex-prefix.h @@ -330,13 +330,13 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vpinsrw", { XM, Vex128, Edw, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0FC4_P_2) }, }, /* PREFIX_EVEX_0FC5 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vpextrw", { Gdq, XS, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0FC5_P_2) }, }, /* PREFIX_EVEX_0FD2 */ { @@ -1191,25 +1191,25 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vpextrb", { Edqb, XM, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A14_P_2) }, }, /* PREFIX_EVEX_0F3A15 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vpextrw", { Edqw, XM, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A15_P_2) }, }, /* PREFIX_EVEX_0F3A16 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vpextrK", { Edq, XM, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A16_P_2) }, }, /* PREFIX_EVEX_0F3A17 */ { { Bad_Opcode }, { Bad_Opcode }, - { "vextractps", { Edqd, XMM, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A17_P_2) }, }, /* PREFIX_EVEX_0F3A18 */ { @@ -1251,7 +1251,7 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vpinsrb", { XM, Vex128, Edb, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A20_P_2) }, }, /* PREFIX_EVEX_0F3A21 */ { @@ -1263,7 +1263,7 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A22_P_2) }, }, /* PREFIX_EVEX_0F3A23 */ { diff --git a/opcodes/i386-dis-evex-w.h b/opcodes/i386-dis-evex-w.h index ed7968a..72cd648 100644 --- a/opcodes/i386-dis-evex-w.h +++ b/opcodes/i386-dis-evex-w.h @@ -740,7 +740,7 @@ }, /* EVEX_W_0F3A21_P_2 */ { - { "vinsertps", { XMM, Vex, EXxmm_md, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A21_P_2_W_0) }, }, /* EVEX_W_0F3A23_P_2 */ { diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 7f521b2..25a2f13 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -1830,6 +1830,8 @@ enum EVEX_LEN_0F6E_P_2 = 0, EVEX_LEN_0F7E_P_1, EVEX_LEN_0F7E_P_2, + EVEX_LEN_0FC4_P_2, + EVEX_LEN_0FC5_P_2, EVEX_LEN_0FD6_P_2, EVEX_LEN_0F3819_P_2_W_0, EVEX_LEN_0F3819_P_2_W_1, @@ -1853,6 +1855,10 @@ enum EVEX_LEN_0F38C7_R_5_P_2_W_1, EVEX_LEN_0F38C7_R_6_P_2_W_0, EVEX_LEN_0F38C7_R_6_P_2_W_1, + EVEX_LEN_0F3A14_P_2, + EVEX_LEN_0F3A15_P_2, + EVEX_LEN_0F3A16_P_2, + EVEX_LEN_0F3A17_P_2, EVEX_LEN_0F3A18_P_2_W_0, EVEX_LEN_0F3A18_P_2_W_1, EVEX_LEN_0F3A19_P_2_W_0, @@ -1861,6 +1867,9 @@ enum EVEX_LEN_0F3A1A_P_2_W_1, EVEX_LEN_0F3A1B_P_2_W_0, EVEX_LEN_0F3A1B_P_2_W_1, + EVEX_LEN_0F3A20_P_2, + EVEX_LEN_0F3A21_P_2_W_0, + EVEX_LEN_0F3A22_P_2, EVEX_LEN_0F3A23_P_2_W_0, EVEX_LEN_0F3A23_P_2_W_1, EVEX_LEN_0F3A38_P_2_W_0, -- cgit v1.1