diff options
author | Diego Novillo <dnovillo@redhat.com> | 2002-02-20 13:53:13 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2002-02-20 08:53:13 -0500 |
commit | 420e7dfad9f58f508c1bc9fef2d083236a43ad85 (patch) | |
tree | 133766631cb712f6838b7f41de0fef40a3f49010 /gcc | |
parent | 1b7a2af6dd6962ce0a05f4df876cef50840198cd (diff) | |
download | gcc-420e7dfad9f58f508c1bc9fef2d083236a43ad85.zip gcc-420e7dfad9f58f508c1bc9fef2d083236a43ad85.tar.gz gcc-420e7dfad9f58f508c1bc9fef2d083236a43ad85.tar.bz2 |
expmed.c (store_bit_field): Do not store bit fields using SUBREG operations if...
* 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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expmed.c | 11 |
2 files changed, 12 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d676016..dedb531 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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, diff --git a/gcc/expmed.c b/gcc/expmed.c index ad87865..973cbf1 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -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); } |