x86: optimize pre-AVX512 {,V}PCMPEQQ with identical sources
authorJan Beulich <jbeulich@suse.com>
Tue, 4 Jul 2023 15:05:47 +0000 (17:05 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 4 Jul 2023 15:05:47 +0000 (17:05 +0200)
The {,V}PCMPEQD alternative is 1 byte shorter in many cases.

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/x86-64-optimize-3.d
gas/testsuite/gas/i386/x86-64-optimize-3.s
gas/testsuite/gas/i386/x86-64-optimize-3b.d
opcodes/i386-opc.tbl
opcodes/i386-tbl.h

index de35ee2a2c6952e596e2f5092a22dee5cc54d92c..eb3f128e6efbcdb4b691441d57569bd76e3890f0 100644 (file)
@@ -4563,6 +4563,23 @@ optimize_encoding (void)
        i.types[j].bitfield.disp8
          = fits_in_disp8 (i.op[j].disps->X_add_number);
     }
+  else if (optimize_for_space
+          && i.tm.base_opcode == 0x29
+          && i.tm.opcode_space == SPACE_0F38
+          && i.operands == i.reg_operands
+          && i.op[0].regs == i.op[1].regs
+          && (!i.tm.opcode_modifier.vex
+              || !(i.op[0].regs->reg_flags & RegRex))
+          && !is_evex_encoding (&i.tm))
+    {
+      /* Optimize: -Os:
+         pcmpeqq %xmmN, %xmmN          -> pcmpeqd %xmmN, %xmmN
+         vpcmpeqq %xmmN, %xmmN, %xmmM  -> vpcmpeqd %xmmN, %xmmN, %xmmM (N < 8)
+         vpcmpeqq %ymmN, %ymmN, %ymmM  -> vpcmpeqd %ymmN, %ymmN, %ymmM (N < 8)
+       */
+      i.tm.opcode_space = SPACE_0F;
+      i.tm.base_opcode = 0x76;
+    }
 }
 
 /* Return non-zero for load instruction.  */
index 571059e8cfe9cb809d310a256b21b836f02d809c..60a9069c6a72d1c8749c9c9896314dc10de0440a 100644 (file)
@@ -161,4 +161,7 @@ Disassembly of section .text:
  +[a-f0-9]+:   62 .*   vporq  \(%eax\)\{1to2\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxord \(%eax\)\{1to4\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxorq \(%eax\)\{1to4\},%ymm2,%ymm3
+ +[a-f0-9]+:   66 .*   pcmpeqd %xmm2,%xmm2
+ +[a-f0-9]+:   c5 .*   vpcmpeqd %xmm2,%xmm2,%xmm0
+ +[a-f0-9]+:   c5 .*   vpcmpeqd %ymm2,%ymm2,%ymm0
 #pass
index 43af9459a8a32b92a6db41fc7b5b82c7b062ca38..3cf41b1f59cd2c96c2d101fe409fdb5ddaaffa27 100644 (file)
@@ -180,3 +180,7 @@ _start:
        vporq           (%eax){1to2}, %xmm2, %xmm3
        vpxord          (%eax){1to4}, %xmm2, %xmm3
        vpxorq          (%eax){1to4}, %ymm2, %ymm3
+
+       pcmpeqq         %xmm2, %xmm2
+       vpcmpeqq        %xmm2, %xmm2, %xmm0
+       vpcmpeqq        %ymm2, %ymm2, %ymm0
index 58636885eeb698b6501c7dfd066e591a375524be..0624cb482d531b66f43df5de779098a9b694f4cc 100644 (file)
@@ -162,4 +162,7 @@ Disassembly of section .text:
  +[a-f0-9]+:   62 .*   vporq  \(%eax\)\{1to2\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxord \(%eax\)\{1to4\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxorq \(%eax\)\{1to4\},%ymm2,%ymm3
+ +[a-f0-9]+:   66 .*   pcmpeqq %xmm2,%xmm2
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %xmm2,%xmm2,%xmm0
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %ymm2,%ymm2,%ymm0
 #pass
index 26122dd4e1e88565ca41d2f583a0a9db967a531d..fc5ec5e43d0d948dd1451b0b0d65f876617d2ad7 100644 (file)
@@ -199,4 +199,10 @@ Disassembly of section .text:
  +[a-f0-9]+:   62 .*   vporq  \(%rax\)\{1to2\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxord \(%rax\)\{1to4\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxorq \(%rax\)\{1to4\},%ymm2,%ymm3
+ +[a-f0-9]+:   66 .*   pcmpeqd %xmm2,%xmm2
+ +[a-f0-9]+:   c5 .*   vpcmpeqd %xmm2,%xmm2,%xmm0
+ +[a-f0-9]+:   c5 .*   vpcmpeqd %ymm2,%ymm2,%ymm0
+ +[a-f0-9]+:   66 .*   pcmpeqd %xmm12,%xmm12
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %xmm12,%xmm12,%xmm0
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %ymm12,%ymm12,%ymm0
 #pass
index cbfed3bdf471b3f805d945dfc8f9010cf6034686..d2bcbce3bf4dba684c95e370a333da88650579f2 100644 (file)
@@ -221,3 +221,11 @@ _start:
        vporq           (%rax){1to2}, %xmm2, %xmm3
        vpxord          (%rax){1to4}, %xmm2, %xmm3
        vpxorq          (%rax){1to4}, %ymm2, %ymm3
+
+       pcmpeqq         %xmm2, %xmm2
+       vpcmpeqq        %xmm2, %xmm2, %xmm0
+       vpcmpeqq        %ymm2, %ymm2, %ymm0
+
+       pcmpeqq         %xmm12, %xmm12
+       vpcmpeqq        %xmm12, %xmm12, %xmm0
+       vpcmpeqq        %ymm12, %ymm12, %ymm0
index 00b65f3d8b239b5ac53a785b9b99f1dae57ed037..abd48dce3a8628adb9157cd7564abdbfe7ddf99f 100644 (file)
@@ -200,4 +200,10 @@ Disassembly of section .text:
  +[a-f0-9]+:   62 .*   vporq  \(%rax\)\{1to2\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxord \(%rax\)\{1to4\},%xmm2,%xmm3
  +[a-f0-9]+:   62 .*   vpxorq \(%rax\)\{1to4\},%ymm2,%ymm3
+ +[a-f0-9]+:   66 .*   pcmpeqq %xmm2,%xmm2
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %xmm2,%xmm2,%xmm0
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %ymm2,%ymm2,%ymm0
+ +[a-f0-9]+:   66 .*   pcmpeqq %xmm12,%xmm12
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %xmm12,%xmm12,%xmm0
+ +[a-f0-9]+:   c4 .*   vpcmpeqq %ymm12,%ymm12,%ymm0
 #pass
index 26fee21d10dd60132972debb41e8b73fe649dc9e..607a438249735b31d974d5b8320634b421814e75 100644 (file)
@@ -1363,7 +1363,7 @@ pblendvb, 0x664c, AVX, Modrm|Vex128|Space0F3A|VexVVVV|VexW0|NoSuf|Implicit1stXmm
 pblendvb, 0x660f3810, SSE4_1, Modrm|NoSuf, { Acc|Xmmword, RegXMM|Unspecified|BaseIndex, RegXMM }
 pblendvb, 0x660f3810, SSE4_1, Modrm|NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM }
 pblendw<sse41>, 0x660f3a0e, <sse41:cpu>, Modrm|<sse41:attr>|<sse41:vvvv>|NoSuf, { Imm8|Imm8S, RegXMM|Unspecified|BaseIndex, RegXMM }
-pcmpeqq<sse41>, 0x660f3829, <sse41:cpu>, Modrm|<sse41:attr>|<sse41:vvvv>|NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM }
+pcmpeqq<sse41>, 0x660f3829, <sse41:cpu>, Modrm|<sse41:attr>|<sse41:vvvv>|NoSuf|Optimize, { RegXMM|Unspecified|BaseIndex, RegXMM }
 pextr<bw><sse41>, 0x660f3a14 | <bw:opc>, <sse41:cpu>, RegMem|<sse41:attr>|NoSuf|IgnoreSize|NoRex64, { Imm8, RegXMM, Reg32|Reg64 }
 pextr<bw><sse41>, 0x660f3a14 | <bw:opc>, <sse41:cpu>, Modrm|<sse41:attr>|NoSuf, { Imm8, RegXMM, <bw:elem>|Unspecified|BaseIndex }
 pextrd<sse41>, 0x660f3a16, <sse41:cpu>, Modrm|<sse41:attr>|NoSuf|IgnoreSize, { Imm8, RegXMM, Reg32|Unspecified|BaseIndex }
@@ -1592,7 +1592,7 @@ vpblendvb, 0x664c, AVX|AVX2, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|CheckOperandSize
 vpblendw, 0x660e, AVX|AVX2, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM }
 vpcmpeq<bw>, 0x6674 | <bw:opc>, AVX|AVX2, Modrm|C|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM }
 vpcmpeqd, 0x6676, AVX|AVX2, Modrm|C|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM }
-vpcmpeqq, 0x6629, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM }
+vpcmpeqq, 0x6629, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf|Optimize, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM }
 vpcmpestri, 0x6661, AVX|No64, Modrm|Vex|Space0F3A|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM }
 vpcmpestri, 0x6661, AVX|x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, Xmmword|Unspecified|BaseIndex|RegXMM, RegXMM }
 vpcmpestrm, 0x6660, AVX|No64, Modrm|Vex|Space0F3A|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM }
index cecb084a335579ddba245f83fc6dc08113c021f4..4a6c92a29ff0ebc9ec9849748f3923b59209a3ed 100644 (file)
@@ -17966,7 +17966,7 @@ static const insn_template i386_optab[] =
          1, 0, 0, 0, 0, 0 } } } },
   { MN_pcmpeqq, 0x29, 2, SPACE_0F38, None,
     { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
-      0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+      0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -17980,7 +17980,7 @@ static const insn_template i386_optab[] =
          1, 0, 0, 0, 0, 0 } } } },
   { MN_pcmpeqq, 0x29, 2, SPACE_0F38, None,
     { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
-      0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+      0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -30132,7 +30132,7 @@ static const insn_template i386_optab[] =
          0, 0, 0, 0, 0, 0 } } } },
   { MN_vpcmpeqq, 0x29, 3, SPACE_0F38, None,
     { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
-      0, 0, 0, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+      0, 0, 0, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,