aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2005-01-20 16:18:02 +0000
committerAldy Hernandez <aldyh@redhat.com>2005-01-20 16:18:02 +0000
commitdc8eb481d64d2820e4c7872733fe5d1e67a82f0d (patch)
treeb132a8edb86a9ae98a97bd176c34214de7d574c5
parent62734ea608c57df4c705f00c7f2b04d54d8a8481 (diff)
* 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: https://gcc.gnu.org/svn/gcc/branches/gcc-3_4-e500-branch@93962 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog.e50010
-rw-r--r--gcc/expmed.c12
2 files changed, 16 insertions, 6 deletions
diff --git a/gcc/ChangeLog.e500 b/gcc/ChangeLog.e500
index 4418e57bcb5..1f4ebccfdff 100644
--- a/gcc/ChangeLog.e500
+++ b/gcc/ChangeLog.e500
@@ -1,3 +1,13 @@
+2005-01-20 Aldy Hernandez <aldyh@redhat.com>
+
+ Backport from mainline.
+
+ 2004-11-26 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * 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.
+
2005-01-19 Aldy Hernandez <aldyh@redhat.com>
Backport from mainline.
diff --git a/gcc/expmed.c b/gcc/expmed.c
index b4ae0ab1463..88db488feef 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -1145,12 +1145,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 (GET_CODE (op0) == MEM)
- op0 = adjust_address (op0, imode, 0);
- else if (imode != BLKmode)
- op0 = gen_lowpart (imode, op0);
- else
- abort ();
+ 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);
}
}