From 9819647a63bfca45a879650ac23fe80f51b89edb Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 6 Nov 2018 11:45:11 +0100 Subject: [PATCH] x86: correctly handle VMOVD with EVEX.W set outside of 64-bit mode For the flavors having a GPR operand EVEX.W is ignored outside of 64-bit mode. The mnemonic should therefore not be KMOVQ, the GPR operand should not name a non-existing 64-bit register, just like is already the case for the AVX counterparts, and the Disp8 scaling factor should be 4 rather than 8. --- gas/ChangeLog | 6 ++++++ gas/testsuite/gas/i386/evex-wig.s | 6 ++++++ gas/testsuite/gas/i386/evex-wig1-intel.d | 4 ++++ gas/testsuite/gas/i386/evex-wig1.d | 4 ++++ opcodes/ChangeLog | 6 ++++++ opcodes/i386-dis-evex.h | 14 ++------------ opcodes/i386-dis.c | 2 -- 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 967f6bc9683..d3300acb9da 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2018-11-06 Jan Beulich + + * testsuite/gas/i386/evex-wig.s: Add vmovd cases. + * testsuite/gas/i386/evex-wig.d, + testsuite/gas/i386/evex-wig1-intel.d: Adjust expectations. + 2018-11-06 Jan Beulich * testsuite/gas/i386/avx-wig.s: Add kmovd cases. diff --git a/gas/testsuite/gas/i386/evex-wig.s b/gas/testsuite/gas/i386/evex-wig.s index 0694f9645ca..593b6fdb2d5 100644 --- a/gas/testsuite/gas/i386/evex-wig.s +++ b/gas/testsuite/gas/i386/evex-wig.s @@ -35,6 +35,12 @@ _start: {evex} vextractps $0, %xmm0, %eax {evex} vextractps $0, %xmm0, 4(%eax) + {evex} vmovd %eax, %xmm0 + {evex} vmovd 4(%eax), %xmm0 + + {evex} vmovd %xmm0, %eax + {evex} vmovd %xmm0, 4(%eax) + {evex} vpextrb $0, %xmm0, %eax {evex} vpextrb $0, %xmm0, 1(%eax) diff --git a/gas/testsuite/gas/i386/evex-wig1-intel.d b/gas/testsuite/gas/i386/evex-wig1-intel.d index f6a28e8f76b..7d020f60044 100644 --- a/gas/testsuite/gas/i386/evex-wig1-intel.d +++ b/gas/testsuite/gas/i386/evex-wig1-intel.d @@ -27,6 +27,10 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 62 f1 ff 08 78 c0 vcvttsd2usi eax,xmm0 [ ]*[a-f0-9]+: 62 f3 fd 08 17 c0 00 vextractps eax,xmm0,0x0 [ ]*[a-f0-9]+: 62 f3 fd 08 17 40 01 00 vextractps DWORD PTR \[eax\+0x4\],xmm0,0x0 +[ ]*[a-f0-9]+: 62 f1 fd 08 6e c0 vmovd xmm0,eax +[ ]*[a-f0-9]+: 62 f1 fd 08 6e 40 01 vmovd xmm0,DWORD PTR \[eax\+0x4\] +[ ]*[a-f0-9]+: 62 f1 fd 08 7e c0 vmovd eax,xmm0 +[ ]*[a-f0-9]+: 62 f1 fd 08 7e 40 01 vmovd DWORD PTR \[eax\+0x4\],xmm0 [ ]*[a-f0-9]+: 62 f3 fd 08 14 c0 00 vpextrb eax,xmm0,0x0 [ ]*[a-f0-9]+: 62 f3 fd 08 14 40 01 00 vpextrb BYTE PTR \[eax\+0x1\],xmm0,0x0 [ ]*[a-f0-9]+: 62 f3 fd 08 16 c0 00 vpextrd eax,xmm0,0x0 diff --git a/gas/testsuite/gas/i386/evex-wig1.d b/gas/testsuite/gas/i386/evex-wig1.d index c69f54c492d..bb2408377d2 100644 --- a/gas/testsuite/gas/i386/evex-wig1.d +++ b/gas/testsuite/gas/i386/evex-wig1.d @@ -27,6 +27,10 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 62 f1 ff 08 78 c0 vcvttsd2usi %xmm0,%eax [ ]*[a-f0-9]+: 62 f3 fd 08 17 c0 00 vextractps \$0x0,%xmm0,%eax [ ]*[a-f0-9]+: 62 f3 fd 08 17 40 01 00 vextractps \$0x0,%xmm0,0x4\(%eax\) +[ ]*[a-f0-9]+: 62 f1 fd 08 6e c0 vmovd %eax,%xmm0 +[ ]*[a-f0-9]+: 62 f1 fd 08 6e 40 01 vmovd 0x4\(%eax\),%xmm0 +[ ]*[a-f0-9]+: 62 f1 fd 08 7e c0 vmovd %xmm0,%eax +[ ]*[a-f0-9]+: 62 f1 fd 08 7e 40 01 vmovd %xmm0,0x4\(%eax\) [ ]*[a-f0-9]+: 62 f3 fd 08 14 c0 00 vpextrb \$0x0,%xmm0,%eax [ ]*[a-f0-9]+: 62 f3 fd 08 14 40 01 00 vpextrb \$0x0,%xmm0,0x1\(%eax\) [ ]*[a-f0-9]+: 62 f3 fd 08 16 c0 00 vpextrd \$0x0,%xmm0,%eax diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 2212d8ec855..70b95f3caca 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2018-11-06 Jan Beulich + + * i386-dis.c (EVEX_W_0F6E_P_2, EVEX_W_0F7E_P_2): Delete. + * i386-dis-evex.h (evex_table): Move vmov[dq} with GPR operand + cases up one level in the hierarchy. + 2018-11-06 Jan Beulich * i386-dis.c (MOD_VEX_W_0_0F92_P_3_LEN_0, diff --git a/opcodes/i386-dis-evex.h b/opcodes/i386-dis-evex.h index 22c9165ac7f..84eaf83c09d 100644 --- a/opcodes/i386-dis-evex.h +++ b/opcodes/i386-dis-evex.h @@ -3299,11 +3299,6 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, { "vpunpckhqdq", { XM, Vex, EXx }, 0 }, }, - /* EVEX_W_0F6E_P_2 */ - { - { "vmovd", { XMScalar, Ed }, 0 }, - { "vmovq", { XMScalar, Eq }, 0 }, - }, /* EVEX_W_0F6F_P_1 */ { { "vmovdqu32", { XM, EXEvexXNoBcst }, 0 }, @@ -3400,11 +3395,6 @@ static const struct dis386 evex_table[][256] = { { Bad_Opcode }, { "vmovq", { XMScalar, EXxmm_mq }, 0 }, }, - /* EVEX_W_0F7E_P_2 */ - { - { "vmovd", { Ed, XMScalar }, 0 }, - { "vmovq", { Eq, XMScalar }, 0 }, - }, /* EVEX_W_0F7F_P_1 */ { { "vmovdqu32", { EXxS, XM }, 0 }, @@ -4093,7 +4083,7 @@ static const struct dis386 evex_table[][256] = { #ifdef NEED_EVEX_LEN_TABLE /* EVEX_LEN_0F6E_P_2 */ { - { VEX_W_TABLE (EVEX_W_0F6E_P_2) }, + { "vmovK", { XMScalar, Edq }, 0 }, }, /* EVEX_LEN_0F7E_P_1 */ @@ -4103,7 +4093,7 @@ static const struct dis386 evex_table[][256] = { /* EVEX_LEN_0F7E_P_2 */ { - { VEX_W_TABLE (EVEX_W_0F7E_P_2) }, + { "vmovK", { Edq, XMScalar }, 0 }, }, /* EVEX_LEN_0FD6_P_2 */ diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index f3fbf1969c3..3f3fd36bcd1 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -2100,7 +2100,6 @@ enum EVEX_W_0F6B_P_2, EVEX_W_0F6C_P_2, EVEX_W_0F6D_P_2, - EVEX_W_0F6E_P_2, EVEX_W_0F6F_P_1, EVEX_W_0F6F_P_2, EVEX_W_0F6F_P_3, @@ -2121,7 +2120,6 @@ enum EVEX_W_0F7B_P_2, EVEX_W_0F7B_P_3, EVEX_W_0F7E_P_1, - EVEX_W_0F7E_P_2, EVEX_W_0F7F_P_1, EVEX_W_0F7F_P_2, EVEX_W_0F7F_P_3, -- 2.30.2