]> gcc.gnu.org Git - gcc.git/commitdiff
expr.c (emit_move_insn_1): Handle arbitrary moves that are the same size as a word.
authorJ"orn Rennecke <joern.rennecke@superh.com>
Tue, 16 Jul 2002 10:59:15 +0000 (10:59 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Tue, 16 Jul 2002 10:59:15 +0000 (11:59 +0100)
* expr.c (emit_move_insn_1): Handle arbitrary moves that are
the same size as a word.

* regrename.c (find_oldest_value_reg): Take WORDS_BIG_ENDIAN /
BYTES_BIG_ENDIAN into account.

From-SVN: r55482

gcc/ChangeLog
gcc/expr.c
gcc/regrename.c

index e326efc5f30ee291ea63d68f9f675809d32aaaca..e463efd87e1b05aeae9c9da960b9fbba6d25b0ac 100644 (file)
@@ -1,3 +1,11 @@
+Tue Jul 16 11:57:45 2002  J"orn Rennecke <joern.rennecke@superh.com>
+
+       * expr.c (emit_move_insn_1): Handle arbitrary moves that are
+       the same size as a word.
+
+       * regrename.c (find_oldest_value_reg): Take WORDS_BIG_ENDIAN /
+       BYTES_BIG_ENDIAN into account.
+
 Tue Jul 16 12:22:44 CEST 2002  Jan Hubicka  <jh@suse.cz>
 
        * i386.md (prefetch): Fix for 64bit mode.
index 870a4c527bf2ff9f15d1fe33a1b681c7c3aa6108..7b5810c617cd139fd0241dbe09b0e993132e02c3 100644 (file)
@@ -3058,10 +3058,10 @@ emit_move_insn_1 (x, y)
       return get_last_insn ();
     }
 
-  /* This will handle any multi-word mode that lacks a move_insn pattern.
-     However, you will get better code if you define such patterns,
+  /* This will handle any multi-word or full-word mode that lacks a move_insn
+     pattern.  However, you will get better code if you define such patterns,
      even if they must turn into multiple assembler instructions.  */
-  else if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+  else if (GET_MODE_SIZE (mode) >= UNITS_PER_WORD)
     {
       rtx last_insn = 0;
       rtx seq, inner;
index ffe170e279575b025c667ed7932c3f79f8c07666..532d5753df3809a66332d2b44ce01ccee210e5af 100644 (file)
@@ -1335,14 +1335,26 @@ find_oldest_value_reg (class, reg, vd)
     }
 
   for (i = vd->e[regno].oldest_regno; i != regno; i = vd->e[i].next_regno)
+    {
+      enum machine_mode oldmode = vd->e[i].mode;
+
     if (TEST_HARD_REG_BIT (reg_class_contents[class], i)
-       && (vd->e[i].mode == mode
-           || mode_change_ok (vd->e[i].mode, mode, i)))
+       && (oldmode == mode
+           || mode_change_ok (oldmode, mode, i)))
       {
-       rtx new = gen_rtx_raw_REG (mode, i);
+       int offset = GET_MODE_SIZE (oldmode) - GET_MODE_SIZE (mode);
+       int byteoffset = offset % UNITS_PER_WORD;
+       int wordoffset = offset - byteoffset;
+       rtx new;
+
+       offset = ((WORDS_BIG_ENDIAN ? wordoffset : 0)
+                 + (BYTES_BIG_ENDIAN ? byteoffset : 0));
+       new = (gen_rtx_raw_REG
+              (mode, i + subreg_regno_offset (i, oldmode, offset, mode)));
        ORIGINAL_REGNO (new) = ORIGINAL_REGNO (reg);
        return new;
       }
+    }
 
   return NULL_RTX;
 }
This page took 0.111976 seconds and 5 git commands to generate.