From 3a57774c7b3840355b5b21818515fa2b6df3e5e9 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 6 Jul 2020 13:41:58 +0200 Subject: 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. --- opcodes/ChangeLog | 11 +++++++++++ opcodes/i386-dis-evex-len.h | 28 ++++++++++++++++++++++++++++ opcodes/i386-dis-evex-prefix.h | 4 ++-- opcodes/i386-dis-evex-w.h | 4 ++-- opcodes/i386-dis.c | 4 ++++ 5 files changed, 47 insertions(+), 4 deletions(-) (limited to 'opcodes') diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 62f8a08..c72e1d1 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,5 +1,16 @@ 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, 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, diff --git a/opcodes/i386-dis-evex-len.h b/opcodes/i386-dis-evex-len.h index 51ce98f..2941ab1 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 f5cce6f..25514db 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 72cd648..b388def 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 25a2f13..58fa21c 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, -- cgit v1.1