@@ -10242,7 +10242,8 @@ rs6000_emit_set_const (rtx dest, rtx source)
}
else if ((can_create_pseudo_p () || base_reg_operand (dest, mode))
- && TARGET_64BIT && num_insns_constant (source, mode) > 2)
+ && num_insns_constant (source, mode)
+ > (TARGET_32BIT && TARGET_CMODEL != CMODEL_SMALL ? 3 : 2))
{
rtx sym = force_const_mem (mode, source);
if (TARGET_TOC && SYMBOL_REF_P (XEXP (sym, 0))
@@ -10252,6 +10253,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);
}
@@ -1,4 +1,4 @@
-/* Check loading constant from memory pool. */
+/* Check loading constant from memory pool under -mpowerpc64 (include -m32). */
/* { dg-options "-O2 -mpowerpc64" } */
void
@@ -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 } } } } */