From: Michael Meissner Date: Mon, 3 Apr 1995 20:19:05 +0000 (+0000) Subject: Get correct bit offset for big endian (SUBREG (REG)) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=641916126ab82884b20fe98e24e20c0a8f099de7;p=gcc.git Get correct bit offset for big endian (SUBREG (REG)) From-SVN: r9299 --- diff --git a/gcc/expmed.c b/gcc/expmed.c index f725f7ab18b..fc0a0ef7046 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -878,7 +878,21 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, tmode = mode; while (GET_CODE (op0) == SUBREG) { + int outer_size = GET_MODE_BITSIZE (GET_MODE (op0)); + int inner_size = GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))); + offset += SUBREG_WORD (op0); + + if (BYTES_BIG_ENDIAN && (outer_size < inner_size)) + { + bitpos += inner_size - outer_size; + if (bitpos > unit) + { + offset += (bitpos / unit); + bitpos %= unit; + } + } + op0 = SUBREG_REG (op0); }