Hi, 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. Is it ok for trunk? BR, Kewen ------ gcc/ChangeLog: * config/rs6000/rs6000.c (rs6000_expand_vector_init): Use paradoxical subreg instead of zero_extend for QI/HI promotion when doing QI/HI vector init. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr96933-1.c: Adjusted to check no rlwinm. * gcc.target/powerpc/pr96933-2.c: Likewise.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index f33fca3982a..9c084b055b8 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -6793,17 +6793,8 @@ 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)); + op[i] = simplify_gen_subreg (Pmode, tmp, inner_mode, 0); } /* Take unsigned char big endianness on 64bit as example for below diff --git a/gcc/testsuite/gcc.target/powerpc/pr96933-1.c b/gcc/testsuite/gcc.target/powerpc/pr96933-1.c index 3b63865b3b8..71d72084413 100644 --- a/gcc/testsuite/gcc.target/powerpc/pr96933-1.c +++ b/gcc/testsuite/gcc.target/powerpc/pr96933-1.c @@ -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} } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr96933-2.c b/gcc/testsuite/gcc.target/powerpc/pr96933-2.c index cef8fbd4f35..9fa15125d8d 100644 --- a/gcc/testsuite/gcc.target/powerpc/pr96933-2.c +++ b/gcc/testsuite/gcc.target/powerpc/pr96933-2.c @@ -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} } } */