(extract_fixed_bit_field): Adjust BITPOS so that it
authorJim Wilson <wilson@gcc.gnu.org>
Sun, 25 Apr 1993 21:07:22 +0000 (14:07 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Sun, 25 Apr 1993 21:07:22 +0000 (14:07 -0700)
fits inside MODE before adjusting OFFSET to get an aligned address.

From-SVN: r4216

gcc/expmed.c

index 90ab40faa986fc8a579fe32b5f3884d6a0e456ad..6e7efadb8faa4e0abf122ee907ac1e0714ab28aa 100644 (file)
@@ -1257,6 +1257,16 @@ extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos,
 
       total_bits = GET_MODE_BITSIZE (mode);
 
+      /* Make sure bitpos is valid for the chosen mode.  Adjust BITPOS to
+        be be in the range 0 to total_bits-1, and put any excess bytes in
+        OFFSET.  */
+      if (bitpos >= total_bits)
+       {
+         offset += (bitpos / total_bits) * (total_bits / BITS_PER_UNIT);
+         bitpos -= ((bitpos / total_bits) * (total_bits / BITS_PER_UNIT)
+                    * BITS_PER_UNIT);
+       }
+
       /* Get ref to an aligned byte, halfword, or word containing the field.
         Adjust BITPOS to be position within a word,
         and OFFSET to be the offset of that word.