Commit 785e6a26 by Richard Kenner

(movsf, movdf): Handle a move from an integer register before reload.

This can happen if the user uses asm to put a floating point variable
in an integer register.

From-SVN: r4666
parent 11e5fe42
...@@ -2259,20 +2259,19 @@ ...@@ -2259,20 +2259,19 @@
&& REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER) && REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER)
operands[1] = alter_subreg (operands[1]); operands[1] = alter_subreg (operands[1]);
/* If we are being called from reload, it is possible that operands[1] if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 32)
is a hard non-fp register. So handle those cases. */
if (reload_in_progress && GET_CODE (operands[1]) == REG
&& REGNO (operands[1]) < 32)
{ {
rtx stack_slot; rtx stack_slot;
/* Remember that we only see a pseudo here if it didn't get a hard /* If this is a store to memory or another integer register do the
register, so it is memory. */ move directly. Otherwise store to a temporary stack slot and
load from there into a floating point register. */
if (GET_CODE (operands[0]) == MEM if (GET_CODE (operands[0]) == MEM
|| (GET_CODE (operands[0]) == REG || (GET_CODE (operands[0]) == REG
&& (REGNO (operands[0]) < 32 && (REGNO (operands[0]) < 32
|| REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)) || (reload_in_progress
|| (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32)) && REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))))
{ {
emit_move_insn (operand_subword (operands[0], 0, 0, SFmode), emit_move_insn (operand_subword (operands[0], 0, 0, SFmode),
operand_subword (operands[1], 0, 0, SFmode)); operand_subword (operands[1], 0, 0, SFmode));
...@@ -2371,19 +2370,19 @@ ...@@ -2371,19 +2370,19 @@
&& REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER) && REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER)
operands[1] = alter_subreg (operands[1]); operands[1] = alter_subreg (operands[1]);
/* If we are being called from reload, it is possible that operands[1] if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 32)
is a hard non-fp register. So handle those cases. */
if (reload_in_progress && GET_CODE (operands[1]) == REG
&& REGNO (operands[1]) < 32)
{ {
rtx stack_slot; rtx stack_slot;
/* Remember that we only see a pseudo here if it didn't get a hard /* If this is a store to memory or another integer register do the
register, so it is memory. */ move directly. Otherwise store to a temporary stack slot and
load from there into a floating point register. */
if (GET_CODE (operands[0]) == MEM if (GET_CODE (operands[0]) == MEM
|| (GET_CODE (operands[0]) == REG || (GET_CODE (operands[0]) == REG
&& (REGNO (operands[0]) < 32 && (REGNO (operands[0]) < 32
|| REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))) || (reload_in_progress
&& REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))))
{ {
emit_move_insn (operand_subword (operands[0], 0, 0, DFmode), emit_move_insn (operand_subword (operands[0], 0, 0, DFmode),
operand_subword (operands[1], 0, 0, DFmode)); operand_subword (operands[1], 0, 0, DFmode));
......
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