The attached fixes an ICE building gridengine.  The problem is we are asked to 
do an HImode reload
for a floating pointing register.  However, we can only do 32 and 64-bit loads 
and stores to/from floating
point registers.

The problem is resolved by not checking that the mode requested is consistent 
with the modes of the
input and output operands.

Tested on hppa-unknown-linux-gnu, hppa2.0w-hp-hpux11.11 and 
hppa64-hp-hpux11.11.  Committed
to trunk and active branches.

Dave
--
John David Anglin       dave.ang...@bell.net


2015-12-09  John David Anglin  <dang...@gcc.gnu.org>

        PR target/68729
        * config/pa/pa.c (pa_emit_move_sequence): Don't check that mode is
        consistent with modes of the input and output operands when doing
        reloads to and from floating point registers.  Do reload for all
        address forms.

Index: config/pa/pa.c
===================================================================
--- config/pa/pa.c      (revision 231326)
+++ config/pa/pa.c      (working copy)
@@ -1683,11 +1683,10 @@
      REG+D addresses where D does not fit in 5 or 14 bits, including
      (subreg (mem (addr))) cases.  */
   if (scratch_reg
-      && fp_reg_operand (operand0, mode)
+      && FP_REG_P (operand0)
       && (MEM_P (operand1)
          || (GET_CODE (operand1) == SUBREG
-             && MEM_P (XEXP (operand1, 0))))
-      && !floating_point_store_memory_operand (operand1, mode))
+             && MEM_P (XEXP (operand1, 0)))))
     {
       if (GET_CODE (operand1) == SUBREG)
        operand1 = XEXP (operand1, 0);
@@ -1699,10 +1698,8 @@
 
       /* D might not fit in 14 bits either; for such cases load D into
         scratch reg.  */
-      if (reg_plus_base_memory_operand (operand1, mode)
-         && !(TARGET_PA_20
-              && !TARGET_ELF32
-              && INT_14_BITS (XEXP (XEXP (operand1, 0), 1))))
+      if (reg_plus_base_memory_operand (operand1, GET_MODE (operand1))
+         && !INT_14_BITS (XEXP (XEXP (operand1, 0), 1)))
        {
          emit_move_insn (scratch_reg, XEXP (XEXP (operand1, 0), 1));
          emit_move_insn (scratch_reg,
@@ -1718,11 +1715,10 @@
       return 1;
     }
   else if (scratch_reg
-          && fp_reg_operand (operand1, mode)
+          && FP_REG_P (operand1)
           && (MEM_P (operand0)
               || (GET_CODE (operand0) == SUBREG
-                  && MEM_P (XEXP (operand0, 0))))
-          && !floating_point_store_memory_operand (operand0, mode))
+                  && MEM_P (XEXP (operand0, 0)))))
     {
       if (GET_CODE (operand0) == SUBREG)
        operand0 = XEXP (operand0, 0);
@@ -1734,10 +1730,8 @@
 
       /* D might not fit in 14 bits either; for such cases load D into
         scratch reg.  */
-      if (reg_plus_base_memory_operand (operand0, mode)
-         && !(TARGET_PA_20
-              && !TARGET_ELF32
-              && INT_14_BITS (XEXP (XEXP (operand0, 0), 1))))
+      if (reg_plus_base_memory_operand (operand0, GET_MODE (operand0))
+         && !INT_14_BITS (XEXP (XEXP (operand0, 0), 1)))
        {
          emit_move_insn (scratch_reg, XEXP (XEXP (operand0, 0), 1));
          emit_move_insn (scratch_reg, gen_rtx_fmt_ee (GET_CODE (XEXP (operand0,

Reply via email to