diff options
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index d93be93..da631c9 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -326,13 +326,16 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, 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. */ + memory, any naturally sized, unit aligned field can be done directly. + + It's okay if the requested bitsize is greater than fieldmode's + bitsize; that just means the mode has padding bits. */ byte_offset = (bitnum % BITS_PER_WORD) / BITS_PER_UNIT + (offset * UNITS_PER_WORD); if (bitpos == 0 - && bitsize == GET_MODE_BITSIZE (fieldmode) + && bitsize >= GET_MODE_BITSIZE (fieldmode) && (GET_CODE (op0) != MEM ? ((GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD || GET_MODE_SIZE (GET_MODE (op0)) == GET_MODE_SIZE (fieldmode)) @@ -1029,9 +1032,11 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, if (GET_CODE (op0) == REG && mode == GET_MODE (op0) && bitnum == 0 - && bitsize == GET_MODE_BITSIZE (GET_MODE (op0))) + && bitsize >= GET_MODE_BITSIZE (GET_MODE (op0))) { - /* We're trying to extract a full register from itself. */ + /* We're trying to extract a full register from itself. + (If the requested bitsize is greater than the bitsize of op0, + that just means op0's mode has padding bits.) */ return op0; } |