aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-09-15 04:13:04 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-09-15 04:13:04 -0700
commit308ecea098abc587b1c690d89c5ec9aa29a8a6c9 (patch)
tree5c3d481d792fb5e4774cbae90ba4d86701a9ca24 /gcc
parente01acbb16e7207ef8aad5e3257c9f9dfc64795d6 (diff)
downloadgcc-308ecea098abc587b1c690d89c5ec9aa29a8a6c9.zip
gcc-308ecea098abc587b1c690d89c5ec9aa29a8a6c9.tar.gz
gcc-308ecea098abc587b1c690d89c5ec9aa29a8a6c9.tar.bz2
expmed.c (store_bit_field): Consider naturally aligned memory for direct reference.
* expmed.c (store_bit_field): Consider naturally aligned memory for direct reference. From-SVN: r36431
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expmed.c27
2 files changed, 20 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e7decce..c80ffa8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
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
AND addresses into alias set 0.
(alpha_expand_unaligned_store): Likewise.
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 606333f..e2ca70a 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -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)