rs6000: Use subreg for QI/HI vector init
authorKewen Lin <linkw@linux.ibm.com>
Wed, 16 Dec 2020 06:28:44 +0000 (00:28 -0600)
committerKewen Lin <linkw@linux.ibm.com>
Wed, 16 Dec 2020 08:12:08 +0000 (02:12 -0600)
This patch is to use paradoxical subreg instead of
zero_extend for promoting QI/HI to SI/DI when we
want to construct one vector with these modes.
Since we do the gpr->vsx movement and vector merge
or pack later, the high part is useless and safe to
use paradoxical subreg.  It can avoid useless rlwinms
generated for signed cases.

Bootstrapped/regtested on powerpc64le-linux-gnu P9.

gcc/ChangeLog:

* config/rs6000/rs6000.c (rs6000_expand_vector_init): Use
paradoxical subreg instead of zero_extend for QI/HI promotion.

gcc/testsuite/ChangeLog:

* gcc.target/powerpc/pr96933-1.c: Adjusted to check no rlwinm.
* gcc.target/powerpc/pr96933-2.c: Likewise.

gcc/config/rs6000/rs6000.c
gcc/testsuite/gcc.target/powerpc/pr96933-1.c
gcc/testsuite/gcc.target/powerpc/pr96933-2.c

index f26fc13..cf17213 100644 (file)
@@ -6806,17 +6806,9 @@ rs6000_expand_vector_init (rtx target, rtx vals)
       /* Force the values into word_mode registers.  */
       for (i = 0; i < n_elts; i++)
        {
-         rtx tmp = force_reg (GET_MODE_INNER (mode), XVECEXP (vals, 0, i));
-         if (TARGET_POWERPC64)
-           {
-             op[i] = gen_reg_rtx (DImode);
-             emit_insn (gen_zero_extendqidi2 (op[i], tmp));
-           }
-         else
-           {
-             op[i] = gen_reg_rtx (SImode);
-             emit_insn (gen_zero_extendqisi2 (op[i], tmp));
-           }
+         rtx tmp = force_reg (inner_mode, XVECEXP (vals, 0, i));
+         machine_mode tmode = TARGET_POWERPC64 ? DImode : SImode;
+         op[i] = simplify_gen_subreg (tmode, tmp, inner_mode, 0);
        }
 
       /* Take unsigned char big endianness on 64bit as example for below
index 3b63865..71d7208 100644 (file)
@@ -13,3 +13,4 @@
 /* { dg-final { scan-assembler-times {\mvpkudum\M} 12 } } */
 /* { dg-final { scan-assembler-not {\mstb\M} } } */
 /* { dg-final { scan-assembler-not {\msth\M} } } */
+/* { dg-final { scan-assembler-not {\mrlwinm\M} } } */
index cef8fbd..9fa1512 100644 (file)
@@ -13,3 +13,4 @@
 /* { dg-final { scan-assembler-times {\mxxpermdi\M} 4 } } */
 /* { dg-final { scan-assembler-not {\mstb\M} } } */
 /* { dg-final { scan-assembler-not {\msth\M} } } */
+/* { dg-final { scan-assembler-not {\mrlwinm\M} } } */