* emit-rtl.c (gen_highpart): initialize `word' properly for pseudo.
authorGreg McGary <gkm@gnu.org>
Fri, 17 Apr 1998 16:35:07 +0000 (16:35 +0000)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 17 Apr 1998 16:35:07 +0000 (09:35 -0700)
From-SVN: r19271

gcc/ChangeLog
gcc/emit-rtl.c

index 9790268131900e82bd173f3c9b279c3f09c9387d..23a0e8fb4a184ef2bf28fb17b9d9f167bedebc0d 100644 (file)
@@ -1,3 +1,7 @@
+Fri Apr 17 16:35:35 1998  Greg McGary  <gkm@gnu.org>
+
+       * emit-rtl.c (gen_highpart): initialize `word' properly for pseudo.
+
 Fri Apr 17 14:30:37 1998  John Carr <jfc@mit.edu>
 
        * emit-rtl.c (operand_subword_force): If a register can not be
index 40b0aa54e5199aab5d7509dbcf2fddc3b47e147a..aafc41c28ebad8f9936bc7659b1ca72a725f0320 100644 (file)
@@ -1011,18 +1011,24 @@ gen_highpart (mode, x)
     }
   else if (GET_CODE (x) == REG)
     {
-      int word = 0;
+      int word;
 
       /* Let the backend decide how many registers to skip.  This is needed
          in particular for sparc64 where fp regs are smaller than a word.  */
       /* ??? Note that subregs are now ambiguous, in that those against
-        pseudos are sized by the Word Size, while those against hard
+        pseudos are sized by the word size, while those against hard
         regs are sized by the underlying register size.  Better would be
         to always interpret the subreg offset parameter as bytes or bits.  */
 
-      if (! WORDS_BIG_ENDIAN && REGNO (x) < FIRST_PSEUDO_REGISTER)
+      if (WORDS_BIG_ENDIAN)
+       word = 0;
+      else if (REGNO (x) < FIRST_PSEUDO_REGISTER)
        word = (HARD_REGNO_NREGS (REGNO (x), GET_MODE (x))
                - HARD_REGNO_NREGS (REGNO (x), mode));
+      else
+       word = ((GET_MODE_SIZE (GET_MODE (x))
+                - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
+               / UNITS_PER_WORD);
 
       if (REGNO (x) < FIRST_PSEUDO_REGISTER
          /* integrate.c can't handle parts of a return value register.  */