diff options
author | Michael Meissner <meissner@gcc.gnu.org> | 1995-04-03 20:19:05 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 1995-04-03 20:19:05 +0000 |
commit | 641916126ab82884b20fe98e24e20c0a8f099de7 (patch) | |
tree | d80e0d42c1ef6898d38f0e489fce867c80d97a99 /gcc | |
parent | faae18abc203528841d2aa8c6481f0c5f0638a7e (diff) | |
download | gcc-641916126ab82884b20fe98e24e20c0a8f099de7.zip gcc-641916126ab82884b20fe98e24e20c0a8f099de7.tar.gz gcc-641916126ab82884b20fe98e24e20c0a8f099de7.tar.bz2 |
Get correct bit offset for big endian (SUBREG (REG))
From-SVN: r9299
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/expmed.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index f725f7a..fc0a0ef 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); } |