summaryrefslogtreecommitdiff
path: root/gcc/expmed.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2004-11-27 01:01:12 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2004-11-27 01:01:12 +0000
commitf6d8f384a24b358f3021f0e6a2e75779631e891b (patch)
tree8d0dff310443267538186659b8b0d591fe1694bc /gcc/expmed.c
parent4d1d1bcff742cfe34d5fbb0305e0aa3b64af31c3 (diff)
downloadgcc-f6d8f384a24b358f3021f0e6a2e75779631e891b.tar.gz
* expmed.c (extract_bit_field): When extracting from non-integer mode,
force a SUBREG into a register because we may be taking a further SUBREG of it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91361 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r--gcc/expmed.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index eeab02fadcf..37d6768b266 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -1163,13 +1163,12 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
enum machine_mode imode = int_mode_for_mode (GET_MODE (op0));
if (imode != GET_MODE (op0))
{
- if (MEM_P (op0))
- op0 = adjust_address (op0, imode, 0);
- else
- {
- gcc_assert (imode != BLKmode);
- op0 = gen_lowpart (imode, op0);
- }
+ op0 = gen_lowpart (imode, op0);
+
+ /* If we got a SUBREG, force it into a register since we aren't going
+ to be able to do another SUBREG on it. */
+ if (GET_CODE (op0) == SUBREG)
+ op0 = force_reg (imode, op0);
}
}