ia64.c (spill_xfmode_operand): Use assign_stack_temp instead of gen_mem_addressof.
authorRichard Henderson <rth@redhat.com>
Sun, 4 Jul 2004 03:03:00 +0000 (20:03 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 4 Jul 2004 03:03:00 +0000 (20:03 -0700)
        * config/ia64/ia64.c (spill_xfmode_operand): Use assign_stack_temp
        instead of gen_mem_addressof.
        * config/ia64/ia64.md (movxf): Use assign_stack_temp to handle
        TImode output register.

From-SVN: r84071

gcc/ChangeLog
gcc/config/ia64/ia64.c
gcc/config/ia64/ia64.md

index 4bf082f1a700e86e207ff68b2933c8b26a7bcda8..cf04490f85537751e59d3ba2902bc582021452b4 100644 (file)
@@ -1,3 +1,10 @@
+2004-07-03  Richard Henderson  <rth@redhat.com>
+
+       * config/ia64/ia64.c (spill_xfmode_operand): Use assign_stack_temp
+       instead of gen_mem_addressof.
+       * config/ia64/ia64.md (movxf): Use assign_stack_temp to handle
+       TImode output register.
+
 2004-07-03  Richard Henderson  <rth@redhat.com>
 
        PR tree-optimization/16341
index e631e87cdda00b4b8eed5f38349b12163935577e..90d4a1f9302096fca8df6a16e4a22355895a181b 100644 (file)
@@ -1640,17 +1640,16 @@ spill_xfmode_operand (rtx in, int force)
       && GET_MODE (SUBREG_REG (in)) == TImode
       && GET_CODE (SUBREG_REG (in)) == REG)
     {
-      rtx mem = gen_mem_addressof (SUBREG_REG (in), NULL_TREE, /*rescan=*/true);
-      return gen_rtx_MEM (XFmode, copy_to_reg (XEXP (mem, 0)));
+      rtx memt = assign_stack_temp (TImode, 16, 0);
+      emit_move_insn (memt, SUBREG_REG (in));
+      return adjust_address (memt, XFmode, 0);
     }
   else if (force && GET_CODE (in) == REG)
     {
-      rtx mem = gen_mem_addressof (in, NULL_TREE, /*rescan=*/true);
-      return gen_rtx_MEM (XFmode, copy_to_reg (XEXP (mem, 0)));
+      rtx memx = assign_stack_temp (XFmode, 16, 0);
+      emit_move_insn (memx, in);
+      return memx;
     }
-  else if (GET_CODE (in) == MEM
-          && GET_CODE (XEXP (in, 0)) == ADDRESSOF)
-    return change_address (in, XFmode, copy_to_reg (XEXP (in, 0)));
   else
     return in;
 }
index b185bc820590b0ab192e06189e0292c6bee92915..08a6d6c059cd5c742d005546a004b63fa21989e6 100644 (file)
 
   if (! reload_in_progress && ! reload_completed)
     {
-      operands[0] = spill_xfmode_operand (operands[0], 0);
       operands[1] = spill_xfmode_operand (operands[1], 0);
 
+      if (GET_MODE (op0) == TImode && GET_CODE (op0) == REG)
+       {
+         rtx memt, memx, in = operands[1];
+         if (CONSTANT_P (in))
+           in = validize_mem (force_const_mem (XFmode, in));
+         if (GET_CODE (in) == MEM)
+           memt = adjust_address (in, TImode, 0);
+         else
+           {
+             memt = assign_stack_temp (TImode, 16, 0);
+             memx = adjust_address (memt, XFmode, 0);
+             emit_move_insn (memx, in);
+           }
+         emit_move_insn (op0, memt);
+         DONE;
+       }
+
       if (! ia64_move_ok (operands[0], operands[1]))
        operands[1] = force_reg (XFmode, operands[1]);
     }