From 641916126ab82884b20fe98e24e20c0a8f099de7 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Mon, 3 Apr 1995 20:19:05 +0000 Subject: [PATCH] Get correct bit offset for big endian (SUBREG (REG)) From-SVN: r9299 --- gcc/expmed.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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); } -- 2.30.2