expmed.c (store_bit_field): Do not store bit fields using SUBREG operations if...
authorDiego Novillo <dnovillo@redhat.com>
Wed, 20 Feb 2002 13:53:13 +0000 (13:53 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Wed, 20 Feb 2002 13:53:13 +0000 (08:53 -0500)
* expmed.c (store_bit_field): Do not store bit fields using SUBREG
operations if the field does not start at a mode boundary.

From-SVN: r49899

gcc/ChangeLog
gcc/expmed.c

index d67601657d97f9fd2c0dd270f12a7d610b0b14fe..dedb5317a0ee54007f076933559b8e536a294e7a 100644 (file)
@@ -1,3 +1,8 @@
+2002-02-20  Diego Novillo  <dnovillo@redhat.com>
+
+       * expmed.c (store_bit_field): Do not store bit fields using SUBREG
+       operations if the field does not start at a mode boundary.
+
 2001-02-20     Joel Sherrill <joel@OARcorp.com>
 
        * config/a29k/rtems.h, config/arm/rtems-elf.h, config/h8300/rtems.h,
index ad87865a06317ac032fe11e4f9f82fcf676839d0..973cbf16b5c85cd91cf0718e231c42fbac31a654 100644 (file)
@@ -299,6 +299,7 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
   unsigned HOST_WIDE_INT offset = bitnum / unit;
   unsigned HOST_WIDE_INT bitpos = bitnum % unit;
   rtx op0 = str_rtx;
+  int byte_offset;
 
   enum machine_mode op_mode = mode_for_extraction (EP_insv, 3);
 
@@ -333,11 +334,15 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
      done with a simple store.  For targets that support fast unaligned
      memory, any naturally sized, unit aligned field can be done directly.  */
      
+  byte_offset = (bitnum % BITS_PER_WORD) / BITS_PER_UNIT
+                + (offset * UNITS_PER_WORD);
+
   if (bitpos == 0
       && bitsize == GET_MODE_BITSIZE (fieldmode)
       && (GET_CODE (op0) != MEM
-         ? (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
+         ? ((GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
             || GET_MODE_SIZE (GET_MODE (op0)) == GET_MODE_SIZE (fieldmode))
+            && byte_offset % GET_MODE_SIZE (fieldmode) == 0)
          : (! SLOW_UNALIGNED_ACCESS (fieldmode, MEM_ALIGN (op0))
             || (offset * BITS_PER_UNIT % bitsize == 0
                 && MEM_ALIGN (op0) % GET_MODE_BITSIZE (fieldmode) == 0))))
@@ -357,9 +362,7 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
                abort ();
            }
          if (GET_CODE (op0) == REG)
-           op0 = gen_rtx_SUBREG (fieldmode, op0,
-                                 (bitnum % BITS_PER_WORD) / BITS_PER_UNIT
-                                 + (offset * UNITS_PER_WORD));
+           op0 = gen_rtx_SUBREG (fieldmode, op0, byte_offset);
          else
            op0 = adjust_address (op0, fieldmode, offset);
        }