diff options
author | Haochen Gui <guihaoc@gcc.gnu.org> | 2022-06-09 13:24:15 +0800 |
---|---|---|
committer | Haochen Gui <guihaoc@gcc.gnu.org> | 2022-06-09 13:31:09 +0800 |
commit | 2fc6e3d55f6080da3a43243f595bd1266595127d (patch) | |
tree | f345204828ff53a0bb4f10ed1a47c0d8c84dfd7e | |
parent | 02b4e2de3204e74ce06d2d46bc8ee30ac93ce9fb (diff) | |
download | gcc-2fc6e3d55f6080da3a43243f595bd1266595127d.zip gcc-2fc6e3d55f6080da3a43243f595bd1266595127d.tar.gz gcc-2fc6e3d55f6080da3a43243f595bd1266595127d.tar.bz2 |
This patch replaces shift and ior insns with one rotate and mask insn for the split patterns which are for DI byte swap on Power6.
gcc/
* config/rs6000/rs6000.md (define_split for bswapdi load): Merge shift
and ior insns to one rotate and mask insn.
(define_split for bswapdi register): Likewise.
gcc/testsuite/
* gcc.target/powerpc/pr93453-1.c: New.
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr93453-1.c | 14 |
2 files changed, 20 insertions, 6 deletions
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 3eca448a..1c125f0 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -2841,8 +2841,8 @@ emit_insn (gen_bswapsi2 (dest_32, word2)); } - emit_insn (gen_ashldi3 (op3, op3, GEN_INT (32))); - emit_insn (gen_iordi3 (dest, dest, op3)); + emit_insn (gen_rotldi3_insert_3 (dest, op3, GEN_INT (32), dest, + GEN_INT (0xffffffff))); DONE; }) @@ -2927,10 +2927,10 @@ rtx op3_si = simplify_gen_subreg (SImode, op3, DImode, lo_off); emit_insn (gen_lshrdi3 (op2, src, GEN_INT (32))); - emit_insn (gen_bswapsi2 (dest_si, src_si)); - emit_insn (gen_bswapsi2 (op3_si, op2_si)); - emit_insn (gen_ashldi3 (dest, dest, GEN_INT (32))); - emit_insn (gen_iordi3 (dest, dest, op3)); + emit_insn (gen_bswapsi2 (op3_si, src_si)); + emit_insn (gen_bswapsi2 (dest_si, op2_si)); + emit_insn (gen_rotldi3_insert_3 (dest, op3, GEN_INT (32), dest, + GEN_INT (0xffffffff))); DONE; }) diff --git a/gcc/testsuite/gcc.target/powerpc/pr93453-1.c b/gcc/testsuite/gcc.target/powerpc/pr93453-1.c new file mode 100644 index 0000000..b396458 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr93453-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target has_arch_ppc64 } } */ +/* { dg-options "-mdejagnu-cpu=power6 -O2" } */ + +unsigned long load_byte_reverse (unsigned long *in) +{ + return __builtin_bswap64 (*in); +} + +unsigned long byte_reverse (unsigned long in) +{ + return __builtin_bswap64 (in); +} + +/* { dg-final { scan-assembler-times {\mrldimi\M} 2 } } */ |