x86: optimize 128-bit VPBROADCASTQ to VPUNPCKLQDQ
authorJan Beulich <jbeulich@suse.com>
Tue, 4 Jul 2023 15:07:26 +0000 (17:07 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 4 Jul 2023 15:07:26 +0000 (17:07 +0200)
The alternative is 1 byte shorter when the source is %xmm0-7, as a
2-byte VEX prefix can then be used.

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 8ebeaf1ab84a63baf97e839b8058680dd8cac6f3..bc02f8e0abf9ee718f024696845c717992f6bccf 100644 (file)
@@ -4620,6 +4620,33 @@ optimize_encoding (void)
          i.op[1].regs = i.op[0].regs;
        }
     }
+  else if (optimize_for_space
+          && i.tm.base_opcode == 0x59
+          && i.tm.opcode_space == SPACE_0F38
+          && i.operands == i.reg_operands
+          && i.tm.opcode_modifier.vex
+          && !(i.op[0].regs->reg_flags & RegRex)
+          && i.op[0].regs->reg_type.bitfield.xmmword
+          && i.vec_encoding != vex_encoding_vex3)
+    {
+      /* Optimize: -Os:
+         vpbroadcastq %xmmN, %xmmM  -> vpunpcklqdq %xmmN, %xmmN, %xmmM (N < 8)
+       */
+      i.tm.opcode_space = SPACE_0F;
+      i.tm.base_opcode = 0x6c;
+      i.tm.opcode_modifier.vexvvvv = 1;
+
+      ++i.operands;
+      ++i.reg_operands;
+      ++i.tm.operands;
+
+      i.op[2].regs = i.op[0].regs;
+      i.types[2] = i.types[0];
+      i.flags[2] = i.flags[0];
+      i.tm.operand_types[2] = i.tm.operand_types[0];
+
+      swap_2_operands (1, 2);
+    }
 }
 
 /* Return non-zero for load instruction.  */
index 60a9069c6a72d1c8749c9c9896314dc10de0440a..41056fb6ef1cb8387263a2c99e293ac9b108bda6 100644 (file)
@@ -164,4 +164,5 @@ Disassembly of section .text:
  +[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]+:   c5 .*   vpunpcklqdq %xmm2,%xmm2,%xmm0
 #pass
index 3cf41b1f59cd2c96c2d101fe409fdb5ddaaffa27..29399ae84731d5df2cfbe94b5249697544e5f75e 100644 (file)
@@ -184,3 +184,5 @@ _start:
        pcmpeqq         %xmm2, %xmm2
        vpcmpeqq        %xmm2, %xmm2, %xmm0
        vpcmpeqq        %ymm2, %ymm2, %ymm0
+
+       vpbroadcastq    %xmm2, %xmm0
index 0624cb482d531b66f43df5de779098a9b694f4cc..d9e83198fb6a6149437c3a28f7a5636468397bd5 100644 (file)
@@ -165,4 +165,5 @@ Disassembly of section .text:
  +[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]+:   c4 .*   vpbroadcastq %xmm2,%xmm0
 #pass
index fc5ec5e43d0d948dd1451b0b0d65f876617d2ad7..23b9305d25cf4f9b37c6171e5e115a8b52a6a469 100644 (file)
@@ -205,4 +205,6 @@ Disassembly of section .text:
  +[a-f0-9]+:   66 .*   pcmpeqd %xmm12,%xmm12
  +[a-f0-9]+:   c4 .*   vpcmpeqq %xmm12,%xmm12,%xmm0
  +[a-f0-9]+:   c4 .*   vpcmpeqq %ymm12,%ymm12,%ymm0
+ +[a-f0-9]+:   c5 .*   vpunpcklqdq %xmm2,%xmm2,%xmm0
+ +[a-f0-9]+:   c4 .*   vpbroadcastq %xmm12,%xmm0
 #pass
index d2bcbce3bf4dba684c95e370a333da88650579f2..bab99cf1eae89125a50b4938fd264952af6ad6c2 100644 (file)
@@ -229,3 +229,6 @@ _start:
        pcmpeqq         %xmm12, %xmm12
        vpcmpeqq        %xmm12, %xmm12, %xmm0
        vpcmpeqq        %ymm12, %ymm12, %ymm0
+
+       vpbroadcastq    %xmm2, %xmm0
+       vpbroadcastq    %xmm12, %xmm0
index abd48dce3a8628adb9157cd7564abdbfe7ddf99f..929c6f70e8bf773813004cdab65a5e312b7c752e 100644 (file)
@@ -206,4 +206,6 @@ Disassembly of section .text:
  +[a-f0-9]+:   66 .*   pcmpeqq %xmm12,%xmm12
  +[a-f0-9]+:   c4 .*   vpcmpeqq %xmm12,%xmm12,%xmm0
  +[a-f0-9]+:   c4 .*   vpcmpeqq %ymm12,%ymm12,%ymm0
+ +[a-f0-9]+:   c4 .*   vpbroadcastq %xmm2,%xmm0
+ +[a-f0-9]+:   c4 .*   vpbroadcastq %xmm12,%xmm0
 #pass
index f9abffb4b9fb699760647a53db64833bc6750199..b6263f8860546661b4eb26d540a4dca10e00ab22 100644 (file)
@@ -1734,7 +1734,7 @@ vbroadcastsd, 0x6619, AVX2, Modrm|Vex=2|Space0F38|VexW=1|NoSuf, { RegXMM, RegYMM
 vbroadcastss, 0x6618, AVX2, Modrm|Vex|Space0F38|VexW=1|NoSuf, { RegXMM, RegXMM|RegYMM }
 vpblendd, 0x6602, AVX2, Modrm|Vex|Space0F3A|VexVVVV|VexW0|CheckOperandSize|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM }
 vpbroadcast<bw>, 0x6678 | <bw:opc>, AVX2, Modrm|Vex|Space0F38|VexW0|NoSuf, { <bw:elem>|Unspecified|BaseIndex|RegXMM, RegXMM|RegYMM }
-vpbroadcast<dq>, 0x6658 | <dq:opc>, AVX2, Modrm|Vex|Space0F38|VexW0|NoSuf, { <dq:elem>|Unspecified|BaseIndex|RegXMM, RegXMM|RegYMM }
+vpbroadcast<dq>, 0x6658 | <dq:opc>, AVX2, Modrm|Vex|Space0F38|VexW0|NoSuf|Optimize, { <dq:elem>|Unspecified|BaseIndex|RegXMM, RegXMM|RegYMM }
 vperm2i128, 0x6646, AVX2, Modrm|Vex=2|Space0F3A|VexVVVV|VexW0|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegYMM, RegYMM, RegYMM }
 vpermd, 0x6636, AVX2, Modrm|Vex256|Space0F38|VexVVVV|VexW0|NoSuf, { Unspecified|BaseIndex|RegYMM, RegYMM, RegYMM }
 vpermpd, 0x6601, AVX2, Modrm|Vex=2|Space0F3A|VexW1|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegYMM, RegYMM }
index 4779cc958dbb9cdb38533271b277a4987b1b33e7..43bcd68885276b2484344123989cd67534413d45 100644 (file)
@@ -34844,7 +34844,7 @@ static const insn_template i386_optab[] =
          1, 1, 1, 0, 0, 0 } } } },
   { MN_vpbroadcastd, 0x58 | 0, 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, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+      0, 0, 0, 1, 0, 1, 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, 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,
@@ -34886,7 +34886,7 @@ static const insn_template i386_optab[] =
          1, 1, 1, 0, 0, 0 } } } },
   { MN_vpbroadcastq, 0x58 | 1, 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, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+      0, 0, 0, 1, 0, 1, 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, 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,