diff options
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index 19d972d2ad3..00172a355d6 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -608,8 +608,8 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, if (HAVE_insv && GET_MODE (value) != BLKmode && !(bitsize == 1 && GET_CODE (value) == CONST_INT) - /* Ensure insv's size is wide enough for this field. */ - && (GET_MODE_BITSIZE (op_mode) >= bitsize) + && bitsize > 0 + && GET_MODE_BITSIZE (op_mode) >= bitsize && ! ((REG_P (op0) || GET_CODE (op0) == SUBREG) && (bitsize + bitpos > GET_MODE_BITSIZE (op_mode)))) { @@ -1356,7 +1356,8 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, if (unsignedp) { if (HAVE_extzv - && (GET_MODE_BITSIZE (extzv_mode) >= bitsize) + && bitsize > 0 + && GET_MODE_BITSIZE (extzv_mode) >= bitsize && ! ((REG_P (op0) || GET_CODE (op0) == SUBREG) && (bitsize + bitpos > GET_MODE_BITSIZE (extzv_mode)))) { @@ -1488,7 +1489,8 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize, else { if (HAVE_extv - && (GET_MODE_BITSIZE (extv_mode) >= bitsize) + && bitsize > 0 + && GET_MODE_BITSIZE (extv_mode) >= bitsize && ! ((REG_P (op0) || GET_CODE (op0) == SUBREG) && (bitsize + bitpos > GET_MODE_BITSIZE (extv_mode)))) { |