Commit 5ca3d30c by Richard Sandiford Committed by Richard Sandiford

re PR target/34900 (target mips64vrel-elf. Internal compiler error (in…

re PR target/34900 (target mips64vrel-elf. Internal compiler error (in reload_cse_simplify_operands, at postreload.c:392) while building libiberty)

gcc/
	PR target/34900
	* config/mips/mips.c (gen_load_const_gp): New function, taking a
	comment from...
	(mips16_gp_pseudo_reg): ...here.
	* config/mips/mips.md (load_const_gp): Replace with...
	(load_const_gp_<mode>): ...this :P-based insn.

From-SVN: r131983
parent 28dac70a
2008-01-31 Richard Sandiford <rsandifo@nildram.co.uk>
PR target/34900
* config/mips/mips.c (gen_load_const_gp): New function, taking a
comment from...
(mips16_gp_pseudo_reg): ...here.
* config/mips/mips.md (load_const_gp): Replace with...
(load_const_gp_<mode>): ...this :P-based insn.
2008-01-31 Manuel Lopez-Ibanez <manu@gcc.gnu.org> 2008-01-31 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* doc/invoke.texi (-ansi): Mention explicitly corresponding -std= * doc/invoke.texi (-ansi): Mention explicitly corresponding -std=
......
...@@ -2161,6 +2161,18 @@ mips_emit_call_insn (rtx pattern, bool lazy_p) ...@@ -2161,6 +2161,18 @@ mips_emit_call_insn (rtx pattern, bool lazy_p)
return insn; return insn;
} }
/* Return an instruction that copies $gp into register REG. We want
GCC to treat the register's value as constant, so that its value
can be rematerialized on demand. */
static rtx
gen_load_const_gp (rtx reg)
{
return (Pmode == SImode
? gen_load_const_gp_si (reg)
: gen_load_const_gp_di (reg));
}
/* Return a pseudo register that contains the value of $gp throughout /* Return a pseudo register that contains the value of $gp throughout
the current function. Such registers are needed by MIPS16 functions, the current function. Such registers are needed by MIPS16 functions,
for which $gp itself is not a valid base register or addition operand. */ for which $gp itself is not a valid base register or addition operand. */
...@@ -2179,8 +2191,6 @@ mips16_gp_pseudo_reg (void) ...@@ -2179,8 +2191,6 @@ mips16_gp_pseudo_reg (void)
{ {
rtx insn, scan, after; rtx insn, scan, after;
/* We want GCC to treat the register's value as constant, so that
it can be rematerialized on demand. */
insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx); insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
push_topmost_sequence (); push_topmost_sequence ();
......
...@@ -4265,9 +4265,9 @@ ...@@ -4265,9 +4265,9 @@
(set_attr "mode" "<HALFMODE>")]) (set_attr "mode" "<HALFMODE>")])
;; Move a constant that satisfies CONST_GP_P into operand 0. ;; Move a constant that satisfies CONST_GP_P into operand 0.
(define_expand "load_const_gp" (define_expand "load_const_gp_<mode>"
[(set (match_operand 0 "register_operand" "=d") [(set (match_operand:P 0 "register_operand" "=d")
(const (unspec [(const_int 0)] UNSPEC_GP)))]) (const:P (unspec:P [(const_int 0)] UNSPEC_GP)))])
;; Insn to initialize $gp for n32/n64 abicalls. Operand 0 is the offset ;; Insn to initialize $gp for n32/n64 abicalls. Operand 0 is the offset
;; of _gp from the start of this function. Operand 1 is the incoming ;; of _gp from the start of this function. Operand 1 is the incoming
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment