diff options
author | Richard Henderson <rth@cygnus.com> | 2000-09-15 04:13:04 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-09-15 04:13:04 -0700 |
commit | 308ecea098abc587b1c690d89c5ec9aa29a8a6c9 (patch) | |
tree | 5c3d481d792fb5e4774cbae90ba4d86701a9ca24 /gcc | |
parent | e01acbb16e7207ef8aad5e3257c9f9dfc64795d6 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expmed.c | 27 |
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) |