x86: drop LOCK from XCHG when optimizing
authorJan Beulich <jbeulich@suse.com>
Fri, 3 Feb 2023 07:23:05 +0000 (08:23 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 3 Feb 2023 07:23:05 +0000 (08:23 +0100)
Like with segment overrides on LEA, optimize away such a redundant
instruction prefix.

gas/config/tc-i386.c
gas/testsuite/gas/i386/optimize-2.d
gas/testsuite/gas/i386/optimize-2.s
gas/testsuite/gas/i386/optimize-2b.d
gas/testsuite/gas/i386/optimize-3.d
gas/testsuite/gas/i386/optimize-3.s

index d5a24ae1637e02ea81e138379ecec0abfce68aac..3e102834ea7c394ef782199df2f4a5049c5e381e 100644 (file)
@@ -5179,14 +5179,20 @@ md_assemble (char *line)
 
   /* Check for lock without a lockable instruction.  Destination operand
      must be memory unless it is xchg (0x86).  */
-  if (i.prefix[LOCK_PREFIX]
-      && (i.tm.opcode_modifier.prefixok < PrefixLock
+  if (i.prefix[LOCK_PREFIX])
+    {
+      if (i.tm.opcode_modifier.prefixok < PrefixLock
          || i.mem_operands == 0
          || (i.tm.base_opcode != 0x86
-             && !(i.flags[i.operands - 1] & Operand_Mem))))
-    {
-      as_bad (_("expecting lockable instruction after `lock'"));
-      return;
+             && !(i.flags[i.operands - 1] & Operand_Mem)))
+       {
+         as_bad (_("expecting lockable instruction after `lock'"));
+         return;
+       }
+
+      /* Zap the redundant prefix from XCHG when optimizing.  */
+      if (i.tm.base_opcode == 0x86 && optimize && !i.no_optimize)
+       i.prefix[LOCK_PREFIX] = 0;
     }
 
   if (is_any_vex_encoding (&i.tm)
index 243cf9f545c6be4ab74b6f4732fa12857e31b659..571059e8cfe9cb809d310a256b21b836f02d809c 100644 (file)
@@ -22,6 +22,8 @@ Disassembly of section .text:
  +[a-f0-9]+:   08 e4                   or     %ah,%ah
  +[a-f0-9]+:   66 09 ed                or     %bp,%bp
  +[a-f0-9]+:   09 f6                   or     %esi,%esi
+ +[a-f0-9]+:   87 0a                   xchg   %ecx,\(%edx\)
+ +[a-f0-9]+:   87 11                   xchg   %edx,\(%ecx\)
  +[a-f0-9]+:   c5 f1 55 e9             vandnpd %xmm1,%xmm1,%xmm5
  +[a-f0-9]+:   c5 f9 6f d1             vmovdqa %xmm1,%xmm2
  +[a-f0-9]+:   c5 f9 6f d1             vmovdqa %xmm1,%xmm2
index 0ad973cd07fe51ae01eda8d6fa9fe7eb9dc7451a..43af9459a8a32b92a6db41fc7b5b82c7b062ca38 100644 (file)
@@ -20,6 +20,9 @@ _start:
        or      %bp, %bp
        or      %esi, %esi
 
+       lock xchg %ecx, (%edx)
+       lock xchg (%ecx), %edx
+
        vandnpd %zmm1, %zmm1, %zmm5
 
        vmovdqa32       %xmm1, %xmm2
index c9e4f92b4ad223fc861945759ded86a992095bbc..58636885eeb698b6501c7dfd066e591a375524be 100644 (file)
@@ -23,6 +23,8 @@ Disassembly of section .text:
  +[a-f0-9]+:   84 e4                   test   %ah,%ah
  +[a-f0-9]+:   66 85 ed                test   %bp,%bp
  +[a-f0-9]+:   85 f6                   test   %esi,%esi
+ +[a-f0-9]+:   87 0a                   xchg   %ecx,\(%edx\)
+ +[a-f0-9]+:   87 11                   xchg   %edx,\(%ecx\)
  +[a-f0-9]+:   c5 f1 55 e9             vandnpd %xmm1,%xmm1,%xmm5
  +[a-f0-9]+:   c5 f9 6f d1             vmovdqa %xmm1,%xmm2
  +[a-f0-9]+:   c5 f9 6f d1             vmovdqa %xmm1,%xmm2
index ea8a9b55b47a1adece28e6700bd8fd59f35c011b..3a6fa062161d5f07141afb5d2662a72676828c28 100644 (file)
@@ -9,6 +9,8 @@ Disassembly of section .text:
 
 0+ <_start>:
  +[a-f0-9]+:   a9 7f 00 00 00          test   \$0x7f,%eax
+ +[a-f0-9]+:   f0 87 0a                lock xchg %ecx,\(%edx\)
+ +[a-f0-9]+:   f0 87 11                lock xchg %edx,\(%ecx\)
  +[a-f0-9]+:   62 f1 7d 28 6f d1       vmovdqa32 %ymm1,%ymm2
  +[a-f0-9]+:   62 f1 fd 28 6f d1       vmovdqa64 %ymm1,%ymm2
  +[a-f0-9]+:   62 f1 7f 08 6f d1       vmovdqu8 %xmm1,%xmm2
index ec2a5b9de9ecc64f2d51c6ee6b588664310bc499..efaaa070b10ae6fb4d3243a41ec4b77067c99060 100644 (file)
@@ -5,6 +5,9 @@
 _start:
        {nooptimize} testl $0x7f, %eax
 
+       {nooptimize} lock xchg  %ecx, (%edx)
+       {nooptimize} lock xchg  (%ecx), %edx
+
        {nooptimize} vmovdqa32  %ymm1, %ymm2
        {nooptimize} vmovdqa64  %ymm1, %ymm2
        {nooptimize} vmovdqu8   %xmm1, %xmm2