]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86/SSE2AVX: respect prefixes
authorJan Beulich <jbeulich@suse.com>
Thu, 28 Mar 2024 10:55:25 +0000 (11:55 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 28 Mar 2024 10:55:25 +0000 (11:55 +0100)
1) Without -msse2avx we unconditionally honor REX.W. Hence we ought to
   also do so with -msse2avx, converting to VEX.W.

2) {rex} doesn't prevent conversion to VEX encodings. Thus {rex2}
   shouldn't either.

gas/config/tc-i386.c
gas/testsuite/gas/i386/x86-64-sse2avx.d
gas/testsuite/gas/i386/x86-64-sse2avx.s

index 6d35c87a1e11565fbc558d07755491d4e97e61f6..9f5273f9d453f28740fe2e64611b9bedf4817fbe 100644 (file)
@@ -3885,7 +3885,7 @@ build_vex_prefix (const insn_template *t)
   /* Check the REX.W bit and VEXW.  */
   if (i.tm.opcode_modifier.vexw == VEXWIG)
     w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
-  else if (i.tm.opcode_modifier.vexw)
+  else if (i.tm.opcode_modifier.vexw && !(i.rex & REX_W))
     w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
   else
     w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
@@ -8413,7 +8413,7 @@ check_EgprOperands (const insn_template *t)
     }
 
   /* Check if pseudo prefix {rex2} is valid.  */
-  if (i.rex2_encoding)
+  if (i.rex2_encoding && !t->opcode_modifier.sse2avx)
     {
       i.error = invalid_pseudo_prefix;
       return true;
@@ -10031,6 +10031,7 @@ process_operands (void)
       i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
       i.prefix[REX_PREFIX] = 0;
       i.rex_encoding = 0;
+      i.rex2_encoding = 0;
     }
   /* ImmExt should be processed after SSE2AVX.  */
   else if (i.tm.opcode_modifier.immext)
index 18036fb5a2ad3aaeef1837a9b16ebda1ed374bb4..dbbba4fc8d073f8b266dcd924406aacbfc763e29 100644 (file)
@@ -740,6 +740,15 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    c4 e1 fa 2a 00          vcvtsi2ssq \(%rax\),%xmm0,%xmm0
 [      ]*[a-f0-9]+:    c4 e3 f9 61 c0 00       vpcmpestriq \$(0x)?0,%xmm0,%xmm0
 [      ]*[a-f0-9]+:    c4 e3 f9 60 c0 00       vpcmpestrmq \$(0x)?0,%xmm0,%xmm0
+[      ]*[a-f0-9]+:    c5 f9 7e c8             vmovd  %xmm1,%eax
+[      ]*[a-f0-9]+:    c5 f9 7e c8             vmovd  %xmm1,%eax
+[      ]*[a-f0-9]+:    c4 c1 79 7e c8          vmovd  %xmm1,%r8d
+[      ]*[a-f0-9]+:    c5 79 7e c8             vmovd  %xmm9,%eax
+[      ]*[a-f0-9]+:    c4 a1 79 7e c8          vmovd  %xmm1,%eax
+[      ]*[a-f0-9]+:    c4 e1 f9 7e c8          vmovq  %xmm1,%rax
+[      ]*[a-f0-9]+:    c5 f9 7e c8             vmovd  %xmm1,%eax
+[      ]*[a-f0-9]+:    c5 f9 7e c8             vmovd  %xmm1,%eax
+[      ]*[a-f0-9]+:    c4 e1 79 7e c8          vmovd  %xmm1,%eax
 [      ]*[a-f0-9]+:    c5 f8 ae 11             vldmxcsr \(%rcx\)
 [      ]*[a-f0-9]+:    c5 f8 ae 19             vstmxcsr \(%rcx\)
 [      ]*[a-f0-9]+:    c5 f8 5b f4             vcvtdq2ps %xmm4,%xmm6
index 3452de9c3872ed5b5473052a63bc39ff142c7a7b..8b37a60dacbec662a1a3eeac0711ab4a576065fb 100644 (file)
@@ -841,6 +841,15 @@ _start:
        rex64 pcmpestri $0, %xmm0, %xmm0
        rex64 pcmpestrm $0, %xmm0, %xmm0
 
+               movd    %xmm1, %eax
+       rex     movd    %xmm1, %eax
+       rex.b   movd    %xmm1, %eax
+       rex.r   movd    %xmm1, %eax
+       rex.x   movd    %xmm1, %eax
+       rex.w   movd    %xmm1, %eax
+       {rex}   movd    %xmm1, %eax
+       {rex2}  movd    %xmm1, %eax
+       {vex3}  movd    %xmm1, %eax
 
        .intel_syntax noprefix
 # Tests for op mem64