expmed.c (store_bit_field): Consider naturally aligned memory for direct reference.
authorRichard Henderson <rth@cygnus.com>
Fri, 15 Sep 2000 11:13:04 +0000 (04:13 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 15 Sep 2000 11:13:04 +0000 (04:13 -0700)
        * expmed.c (store_bit_field): Consider naturally aligned
        memory for direct reference.

From-SVN: r36431

gcc/ChangeLog
gcc/expmed.c

index e7decce40e5227a00c6b85e1ac6927abce3cd755..c80ffa859f3dbd4ad107ff3e0be95cd39e1b8850 100644 (file)
@@ -1,3 +1,8 @@
+2000-09-15  Richard Henderson  <rth@cygnus.com>
+
+       * expmed.c (store_bit_field): Consider naturally aligned
+       memory for direct reference.
+
 2000-09-15  Richard Henderson  <rth@cygnus.com>
 
        * config/alpha/alpha.c (alpha_expand_unaligned_load): Force all
index 606333fdbe3d3507615876b16deb98fefb831125..e2ca70a13abf27b30b242431d57605154d8d22ae 100644 (file)
@@ -297,19 +297,22 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
   if (flag_force_mem)
     value = force_not_mem (value);
 
-  if ((GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
-       || (GET_MODE_SIZE (GET_MODE (op0)) == GET_MODE_SIZE (fieldmode)
-          && GET_MODE_SIZE (fieldmode) != 0))
-      && (GET_CODE (op0) != MEM
-         || ! SLOW_UNALIGNED_ACCESS (fieldmode, align)
-         || (offset * BITS_PER_UNIT % bitsize == 0
-             && align % GET_MODE_BITSIZE (fieldmode) == 0))
-      && (BYTES_BIG_ENDIAN ? bitpos + bitsize == unit : bitpos == 0)
-      && bitsize == GET_MODE_BITSIZE (fieldmode))
+  /* If the target is a register, overwriting the entire object, or storing
+     a full-word or multi-word field can be done with just a SUBREG.
+
+     If the target is memory, storing any naturally aligned field can be
+     done with a simple store.  For targets that support fast unaligned
+     memory, any naturally sized, unit aligned field can be done directly.  */
+     
+  if (bitsize == GET_MODE_BITSIZE (fieldmode)
+      && (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
+         || GET_MODE_SIZE (GET_MODE (op0)) == GET_MODE_SIZE (fieldmode)
+         || (GET_CODE (op0) == MEM
+             && (! SLOW_UNALIGNED_ACCESS (fieldmode, align)
+                 || (offset * BITS_PER_UNIT % bitsize == 0
+                     && align % GET_MODE_BITSIZE (fieldmode) == 0))))
+      && (BYTES_BIG_ENDIAN ? bitpos + bitsize == unit : bitpos == 0))
     {
-      /* Storing in a full-word or multi-word field in a register
-        can be done with just SUBREG.  Also, storing in the entire object
-        can be done with just SUBREG.  */
       if (GET_MODE (op0) != fieldmode)
        {
          if (GET_CODE (op0) == SUBREG)