diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expmed.c | 11 |
2 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4b3db3f28b8..dd832b26a43 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-11-17 Jakub Jelinek <jakub@redhat.com> + + * expmed.c (store_bit_field): Set SUBREG_BYTE correctly on big + endian. + (extract_bit_field): Likewise. + 2000-11-03 Jakub Jelinek <jakub@redhat.com> * emit-rtl.c (operand_subword): Return const0_rtx if looking for a diff --git a/gcc/expmed.c b/gcc/expmed.c index b57de21710d..78359001c47 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -329,7 +329,8 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size) } if (GET_CODE (op0) == REG) op0 = gen_rtx_SUBREG (fieldmode, op0, - (offset * UNITS_PER_WORD)); + (bitnum % BITS_PER_WORD) / BITS_PER_UNIT + + (offset * UNITS_PER_WORD)); else op0 = change_address (op0, fieldmode, plus_constant (XEXP (op0, 0), offset)); @@ -374,7 +375,9 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size) } emit_insn (GEN_FCN (icode) - (gen_rtx_SUBREG (fieldmode, op0, (offset * UNITS_PER_WORD)), + (gen_rtx_SUBREG (fieldmode, op0, + (bitnum % BITS_PER_WORD) / BITS_PER_UNIT + + (offset * UNITS_PER_WORD)), value)); return value; @@ -1097,7 +1100,9 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, abort (); } if (GET_CODE (op0) == REG) - op0 = gen_rtx_SUBREG (mode1, op0, (offset * UNITS_PER_WORD)); + op0 = gen_rtx_SUBREG (mode1, op0, + (bitnum % BITS_PER_WORD) / BITS_PER_UNIT + + (offset * UNITS_PER_WORD)); else op0 = change_address (op0, mode1, plus_constant (XEXP (op0, 0), offset)); |