[V6,2/2] split complicate 64bit constant to memory for -m32 -mpowerpc64
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gcc_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-arm |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 |
success
|
Test passed
|
Commit Message
Hi,
For "-m32 -mpowerpc64", it is also ok to use fewer instruciton (p?ld)
to loading 64bit constant from memory. So, splitting the complicate 64bit
constant to constant pool should also work for this case.
Compare with previous version:
This version is using the new parameter to control what kind of complicate
constanst should be put into memory.
Bootstrap and regtest pass on ppc64{,le}.
Also no regression for "-m32 -mpowerpc64" variation on ppc64.
Is this ok for trunk?
BR,
Jeff(Jiufu) Guo
gcc/ChangeLog:
* config/rs6000/rs6000.cc (rs6000_emit_set_const): Split constant to
pool for "-m32 -mpowerpc64".
gcc/testsuite/ChangeLog:
* gcc.target/powerpc/pr63281.c: Allow checking -m32.
---
gcc/config/rs6000/rs6000.cc | 21 +++++++++++++++++++--
gcc/testsuite/gcc.target/powerpc/pr63281.c | 2 +-
2 files changed, 20 insertions(+), 3 deletions(-)
@@ -10245,8 +10245,7 @@ rs6000_emit_set_const (rtx dest, rtx source)
after RA when reusing the DEST register to build the value. */
else if ((can_create_pseudo_p () || base_reg_operand (dest, mode))
&& num_insns_constant (source, mode)
- > rs6000_min_insns_constant_in_pool
- && TARGET_64BIT)
+ > rs6000_min_insns_constant_in_pool)
{
rtx sym = force_const_mem (mode, source);
if (TARGET_TOC && SYMBOL_REF_P (XEXP (sym, 0))
@@ -10256,6 +10255,24 @@ rs6000_emit_set_const (rtx dest, rtx source)
sym = gen_const_mem (mode, toc);
set_mem_alias_set (sym, get_TOC_alias_set ());
}
+ else if (TARGET_32BIT)
+ {
+ /* After RA, reuse 'DEST' reg. */
+ rtx addr = can_create_pseudo_p ()
+ ? gen_reg_rtx (Pmode)
+ : gen_rtx_REG (Pmode, REGNO (dest));
+ rtx sym_ref = XEXP (sym, 0);
+ if (flag_pic)
+ emit_move_insn (addr, sym_ref);
+ else
+ {
+ emit_move_insn (addr, gen_rtx_HIGH (Pmode, sym_ref));
+ emit_move_insn (addr, gen_rtx_LO_SUM (Pmode, addr, sym_ref));
+ }
+ rtx mem = gen_rtx_MEM (mode, addr);
+ MEM_COPY_ATTRIBUTES (mem, sym);
+ sym = mem;
+ }
emit_move_insn (dest, sym);
}
@@ -7,5 +7,5 @@ foo (unsigned long long *a)
*a++ = 0x2351847027482577ULL;
}
-/* { dg-final { scan-assembler-times {\mp?ld\M} 1 { target { lp64 } } } } */
+/* { dg-final { scan-assembler-times {\mp?ld\M} 1 { target { has_arch_ppc64 } } } } */