From: Jan Beulich Date: Mon, 6 Jul 2020 11:41:58 +0000 (+0200) Subject: x86: AVX512 VPERM{D,Q,PS,PD} insns need to honor EVEX.L'L X-Git-Url: http://git.efficios.com/?p=deliverable%2Fbinutils-gdb.git;a=commitdiff_plain;h=3a57774c7b3840355b5b21818515fa2b6df3e5e9 x86: AVX512 VPERM{D,Q,PS,PD} insns need to honor EVEX.L'L Just like (where they exist) their AVX counterparts do for VEX.L. For all of them the 128-bit forms are invalid. --- diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 62f8a0874c..c72e1d144a 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,14 @@ +2020-07-06 Jan Beulich + + * i386-dis.c (EVEX_LEN_0F3816_P_2, EVEX_LEN_0F3836_P_2, + EVEX_LEN_0F3A00_P_2_W_1, EVEX_LEN_0F3A01_P_2_W_1): New + enumerators. + * i386-dis-evex-len.h (evex_len_table): New EVEX_LEN_0F3816_P_2, + EVEX_LEN_0F3836_P_2, EVEX_LEN_0F3A00_P_2_W_1, and + EVEX_LEN_0F3A01_P_2_W_1 table entries. + * i386-dis-evex-prefix.h, i386-dis-evex-w.h: Reference the above + entries. + 2020-07-06 Jan Beulich * i386-dis.c (EVEX_LEN_0FC4_P_2, EVEX_LEN_0FC5_P_2, diff --git a/opcodes/i386-dis-evex-len.h b/opcodes/i386-dis-evex-len.h index 51ce98f4a9..2941ab1dcb 100644 --- a/opcodes/i386-dis-evex-len.h +++ b/opcodes/i386-dis-evex-len.h @@ -29,6 +29,13 @@ static const struct dis386 evex_len_table[][3] = { { VEX_W_TABLE (EVEX_W_0FD6_P_2) }, }, + /* EVEX_LEN_0F3816_P_2 */ + { + { Bad_Opcode }, + { "vpermp%XW", { XM, Vex, EXx }, 0 }, + { "vpermp%XW", { XM, Vex, EXx }, 0 }, + }, + /* EVEX_LEN_0F3819_P_2_W_0 */ { { Bad_Opcode }, @@ -71,6 +78,13 @@ static const struct dis386 evex_len_table[][3] = { { "vbroadcastf64x4", { XM, EXymm }, 0 }, }, + /* EVEX_LEN_0F3836_P_2 */ + { + { Bad_Opcode }, + { "vperm%LW", { XM, Vex, EXx }, 0 }, + { "vperm%LW", { XM, Vex, EXx }, 0 }, + }, + /* EVEX_LEN_0F385A_P_2_W_0 */ { { Bad_Opcode }, @@ -183,6 +197,20 @@ static const struct dis386 evex_len_table[][3] = { { "vscatterpf1qpd", { MVexVSIBQWpX }, 0 }, }, + /* EVEX_LEN_0F3A00_P_2_W_1 */ + { + { Bad_Opcode }, + { "vpermq", { XM, EXx, Ib }, 0 }, + { "vpermq", { XM, EXx, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A01_P_2_W_1 */ + { + { Bad_Opcode }, + { "vpermpd", { XM, EXx, Ib }, 0 }, + { "vpermpd", { XM, EXx, Ib }, 0 }, + }, + /* EVEX_LEN_0F3A14_P_2 */ { { "vpextrb", { Edqb, XM, Ib }, 0 }, diff --git a/opcodes/i386-dis-evex-prefix.h b/opcodes/i386-dis-evex-prefix.h index f5cce6f370..25514dbfc7 100644 --- a/opcodes/i386-dis-evex-prefix.h +++ b/opcodes/i386-dis-evex-prefix.h @@ -487,7 +487,7 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vpermp%XW", { XM, Vex, EXx }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3816_P_2) }, }, /* PREFIX_EVEX_0F3819 */ { @@ -643,7 +643,7 @@ { { Bad_Opcode }, { Bad_Opcode }, - { "vperm%LW", { XM, Vex, EXx }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3836_P_2) }, }, /* PREFIX_EVEX_0F3837 */ { diff --git a/opcodes/i386-dis-evex-w.h b/opcodes/i386-dis-evex-w.h index 72cd648e68..b388defdd8 100644 --- a/opcodes/i386-dis-evex-w.h +++ b/opcodes/i386-dis-evex-w.h @@ -688,12 +688,12 @@ /* EVEX_W_0F3A00_P_2 */ { { Bad_Opcode }, - { "vpermq", { XM, EXx, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A00_P_2_W_1) }, }, /* EVEX_W_0F3A01_P_2 */ { { Bad_Opcode }, - { "vpermpd", { XM, EXx, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A01_P_2_W_1) }, }, /* EVEX_W_0F3A05_P_2 */ { diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 25a2f13d09..58fa21c936 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -1833,12 +1833,14 @@ enum EVEX_LEN_0FC4_P_2, EVEX_LEN_0FC5_P_2, EVEX_LEN_0FD6_P_2, + EVEX_LEN_0F3816_P_2, EVEX_LEN_0F3819_P_2_W_0, EVEX_LEN_0F3819_P_2_W_1, EVEX_LEN_0F381A_P_2_W_0, EVEX_LEN_0F381A_P_2_W_1, EVEX_LEN_0F381B_P_2_W_0, EVEX_LEN_0F381B_P_2_W_1, + EVEX_LEN_0F3836_P_2, EVEX_LEN_0F385A_P_2_W_0, EVEX_LEN_0F385A_P_2_W_1, EVEX_LEN_0F385B_P_2_W_0, @@ -1855,6 +1857,8 @@ 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_0F3A00_P_2_W_1, + EVEX_LEN_0F3A01_P_2_W_1, EVEX_LEN_0F3A14_P_2, EVEX_LEN_0F3A15_P_2, EVEX_LEN_0F3A16_P_2,