mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-24 03:19:09 +08:00
fr30.md (movdi): Do not accept immediates as the destination of this insn.
* config/fr30/fr30.md (movdi): Do not accept immediates as the destination of this insn. * config/fr30/fr30.c (fr30_move_double): Use emit_move_insn rather than calling gen_rtx_SET directly. Use r0 to hold the value of 'address + 4' rather than a stack based temporary which can be mis-optimized away. From-SVN: r123326
This commit is contained in:
parent
833cd70a0c
commit
ed31d14caf
@ -1,3 +1,12 @@
|
||||
2007-03-29 Lars Poeschel <larsi@wh2.tu-dresden.de>
|
||||
|
||||
* config/fr30/fr30.md (movdi): Do not accept immediates as the
|
||||
destination of this insn.
|
||||
* config/fr30/fr30.c (fr30_move_double): Use emit_move_insn rather
|
||||
than calling gen_rtx_SET directly. Use r0 to hold the value of
|
||||
'address + 4' rather than a stack based temporary which can be
|
||||
mis-optimized away.
|
||||
|
||||
2007-03-29 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
* config/s390/s390.c (s390_secondary_input_reload_class,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* FR30 specific functions.
|
||||
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
|
||||
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2007
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Cygnus Solutions.
|
||||
|
||||
@ -894,8 +894,7 @@ fr30_move_double (rtx * operands)
|
||||
src0 = operand_subword (src, 0, TRUE, mode);
|
||||
src1 = operand_subword (src, 1, TRUE, mode);
|
||||
|
||||
emit_insn (gen_rtx_SET (VOIDmode, adjust_address (dest, SImode, 0),
|
||||
src0));
|
||||
emit_move_insn (adjust_address (dest, SImode, 0), src0);
|
||||
|
||||
if (REGNO (addr) == STACK_POINTER_REGNUM
|
||||
|| REGNO (addr) == FRAME_POINTER_REGNUM)
|
||||
@ -905,19 +904,19 @@ fr30_move_double (rtx * operands)
|
||||
else
|
||||
{
|
||||
rtx new_mem;
|
||||
rtx scratch_reg_r0 = gen_rtx_REG (SImode, 0);
|
||||
|
||||
/* We need a scratch register to hold the value of 'address + 4'.
|
||||
We ought to allow gcc to find one for us, but for now, just
|
||||
push one of the source registers. */
|
||||
emit_insn (gen_movsi_push (src0));
|
||||
emit_insn (gen_movsi_internal (src0, addr));
|
||||
emit_insn (gen_addsi_small_int (src0, src0, GEN_INT (UNITS_PER_WORD)));
|
||||
|
||||
new_mem = gen_rtx_MEM (SImode, src0);
|
||||
We use r0 for this purpose. It is used for example for long
|
||||
jumps and is already marked to not be used by normal register
|
||||
allocation. */
|
||||
emit_insn (gen_movsi_internal (scratch_reg_r0, addr));
|
||||
emit_insn (gen_addsi_small_int (scratch_reg_r0, scratch_reg_r0,
|
||||
GEN_INT (UNITS_PER_WORD)));
|
||||
new_mem = gen_rtx_MEM (SImode, scratch_reg_r0);
|
||||
MEM_COPY_ATTRIBUTES (new_mem, dest);
|
||||
|
||||
emit_insn (gen_rtx_SET (VOIDmode, new_mem, src1));
|
||||
emit_insn (gen_movsi_pop (src0));
|
||||
emit_move_insn (new_mem, src1);
|
||||
emit_insn (gen_blockage ());
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -929,6 +928,7 @@ fr30_move_double (rtx * operands)
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
/*}}}*/
|
||||
/* Local Variables: */
|
||||
/* folded-file: t */
|
||||
|
@ -1,5 +1,5 @@
|
||||
;; FR30 machine description.
|
||||
;; Copyright (C) 1998, 1999, 2000, 2002, 2004, 2005
|
||||
;; Copyright (C) 1998, 1999, 2000, 2002, 2004, 2005, 2007
|
||||
;; Free Software Foundation, Inc.
|
||||
;; Contributed by Cygnus Solutions.
|
||||
|
||||
@ -380,7 +380,7 @@
|
||||
;; (This code is stolen from the M32R port.)
|
||||
|
||||
(define_expand "movdi"
|
||||
[(set (match_operand:DI 0 "general_operand" "")
|
||||
[(set (match_operand:DI 0 "nonimmediate_operand" "")
|
||||
(match_operand:DI 1 "general_operand" ""))]
|
||||
""
|
||||
"
|
||||
@ -388,7 +388,8 @@
|
||||
|
||||
if (GET_CODE (operands[0]) == MEM)
|
||||
operands[1] = force_reg (DImode, operands[1]);
|
||||
")
|
||||
"
|
||||
)
|
||||
|
||||
;; We use an insn and a split so that we can generate
|
||||
;; RTL rather than text from fr30_move_double().
|
||||
@ -406,7 +407,8 @@
|
||||
(match_operand:DI 1 "di_operand" ""))]
|
||||
"reload_completed"
|
||||
[(match_dup 2)]
|
||||
"operands[2] = fr30_move_double (operands);")
|
||||
"operands[2] = fr30_move_double (operands);"
|
||||
)
|
||||
|
||||
;;}}}
|
||||
;;{{{ Load & Store Multiple Registers
|
||||
|
Loading…
Reference in New Issue
Block a user