(store_split_bit_field): For BYTES_BIG_ENDIAN, only
authorJim Wilson <wilson@gcc.gnu.org>
Tue, 25 Jan 1994 00:24:18 +0000 (16:24 -0800)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 25 Jan 1994 00:24:18 +0000 (16:24 -0800)
pad on left if value not in memory.

From-SVN: r6429

gcc/expmed.c

index 4c06fb49c592255ddb0fa4bc126d85b131583242..f20fb1868759fd8f4e68175c2c74bbfdacefc16d 100644 (file)
@@ -721,11 +721,19 @@ store_split_bit_field (op0, bitsize, bitpos, value, align)
                         >> (bitsize - bitsdone - thissize))
                        & (((HOST_WIDE_INT) 1 << thissize) - 1));
       else
-       /* The args are chosen so that the last part
-          includes the lsb.  */
-       part = extract_fixed_bit_field (word_mode, value, 0, thissize,
-                                       BITS_PER_WORD - bitsize + bitsdone,
-                                       NULL_RTX, 1, align);
+       {
+         /* The args are chosen so that the last part
+            includes the lsb.  */
+         int bit_offset = 0;
+         /* If the value isn't in memory, then it must be right aligned
+            if a register, so skip past the padding on the left.  If it
+            is in memory, then there is no padding on the left.  */
+         if (GET_CODE (value) != MEM)
+           bit_offset = BITS_PER_WORD - bitsize;
+         part = extract_fixed_bit_field (word_mode, value, 0, thissize,
+                                         bit_offset + bitsdone,
+                                         NULL_RTX, 1, align);
+       }
 #else
       /* Fetch successively more significant portions.  */
       if (GET_CODE (value) == CONST_INT)