i386.c (ix86_split_long_move): Fix base register mode for XFmode splits for TARGET_64BIT.
authorRichard Henderson <rth@redhat.com>
Thu, 8 May 2003 00:51:15 +0000 (17:51 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 8 May 2003 00:51:15 +0000 (17:51 -0700)
        * config/i386/i386.c (ix86_split_long_move): Fix base register
        mode for XFmode splits for TARGET_64BIT.

From-SVN: r66589

gcc/ChangeLog
gcc/config/i386/i386.c

index e61e92e5f4b2e4096e58bca4030f68db2bd4c348..ba540d456e8fe634daa587c1444768cf9bd1275e 100644 (file)
@@ -1,3 +1,8 @@
+2003-05-07  Richard Henderson  <rth@redhat.com>
+
+       * config/i386/i386.c (ix86_split_long_move): Fix base register
+       mode for XFmode splits for TARGET_64BIT.
+
 2003-05-07  Richard Henderson  <rth@redhat.com>
 
        * sched-ebb.c (schedule_ebb): Supply the correct starting
index 1bf50cb34a9a234c6dde64502fe6e6e32228c876..048d5f880264e0c434fb4a546b1f0950ac5232a2 100644 (file)
@@ -10593,15 +10593,24 @@ ix86_split_long_move (operands)
         Do an lea to the last part and use only one colliding move.  */
       else if (collisions > 1)
        {
+         rtx base;
+
          collisions = 1;
-         emit_insn (gen_rtx_SET (VOIDmode, part[0][nparts - 1],
-                                 XEXP (part[1][0], 0)));
-         part[1][0] = change_address (part[1][0],
-                                      TARGET_64BIT ? DImode : SImode,
-                                      part[0][nparts - 1]);
-         part[1][1] = adjust_address (part[1][0], VOIDmode, UNITS_PER_WORD);
+
+         base = part[0][nparts - 1];
+
+         /* Handle the case when the last part isn't valid for lea.
+            Happens in 64-bit mode storing the 12-byte XFmode.  */
+         if (GET_MODE (base) != Pmode)
+           base = gen_rtx_REG (Pmode, REGNO (base));
+
+         emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
+         part[1][0] = replace_equiv_address (part[1][0], base);
+         part[1][1] = replace_equiv_address (part[1][1],
+                                     plus_constant (base, UNITS_PER_WORD));
          if (nparts == 3)
-           part[1][2] = adjust_address (part[1][0], VOIDmode, 8);
+           part[1][2] = replace_equiv_address (part[1][2],
+                                     plus_constant (base, 8));
        }
     }