]> gcc.gnu.org Git - gcc.git/commitdiff
pa.c (emit_move_sequence): Also handle displacements which do not fit in 14 bits...
authorJeff Law <law@gcc.gnu.org>
Tue, 17 Jan 1995 23:42:12 +0000 (16:42 -0700)
committerJeff Law <law@gcc.gnu.org>
Tue, 17 Jan 1995 23:42:12 +0000 (16:42 -0700)
* pa.c (emit_move_sequence): Also handle displacements which
do not fit in 14 bits for fp load/store secondary reloads.

From-SVN: r8769

gcc/config/pa/pa.c

index 59c14660d0ed5b76946580aee5ff82bbb360222a..72a86b5142cc2be41051174836474251f0c7bf20 100644 (file)
@@ -797,7 +797,19 @@ emit_move_sequence (operands, mode, scratch_reg)
        operand1 = XEXP (operand1, 0);
 
       scratch_reg = gen_rtx (REG, SImode, REGNO (scratch_reg));
-      emit_move_insn (scratch_reg, XEXP (operand1, 0));
+
+      /* D might not fit in 14 bits either; for such cases load D into
+        scratch reg.  */
+      if (!memory_address_p (SImode, XEXP (operand1, 0)))
+       {
+         emit_move_insn (scratch_reg, XEXP (XEXP (operand1, 0), 1));
+         emit_move_insn (scratch_reg, gen_rtx (GET_CODE (XEXP (operand1, 0)),
+                                               SImode,
+                                               XEXP (XEXP (operand1, 0), 0),
+                                               scratch_reg));
+       }
+      else
+       emit_move_insn (scratch_reg, XEXP (operand1, 0));
       emit_insn (gen_rtx (SET, VOIDmode, operand0, gen_rtx (MEM, mode,
                                                            scratch_reg)));
       return 1;
@@ -814,7 +826,18 @@ emit_move_sequence (operands, mode, scratch_reg)
        operand0 = XEXP (operand0, 0);
 
       scratch_reg = gen_rtx (REG, SImode, REGNO (scratch_reg));
-      emit_move_insn (scratch_reg, XEXP (operand0, 0));
+      /* D might not fit in 14 bits either; for such cases load D into
+        scratch reg.  */
+      if (!memory_address_p (SImode, XEXP (operand0, 0)))
+       {
+         emit_move_insn (scratch_reg, XEXP (XEXP (operand0, 0), 1));
+         emit_move_insn (scratch_reg, gen_rtx (GET_CODE (XEXP (operand0, 0)),
+                                               SImode,
+                                               XEXP (XEXP (operand0, 0), 0),
+                                               scratch_reg));
+       }
+      else
+       emit_move_insn (scratch_reg, XEXP (operand0, 0));
       emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (MEM, mode, scratch_reg),
                          operand1));
       return 1;
This page took 0.066478 seconds and 5 git commands to generate.