aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2000-11-23 13:23:04 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2000-11-23 13:23:04 +0000
commit69295d6d2639897d9bea1199495189aede6440ae (patch)
tree8ec3fb055335632e906197e39a5c75576c5eec37 /gcc
parentd0c3e4f4987cc0e0e0a8880554593ebace217b00 (diff)
downloadgcc-69295d6d2639897d9bea1199495189aede6440ae.zip
gcc-69295d6d2639897d9bea1199495189aede6440ae.tar.gz
gcc-69295d6d2639897d9bea1199495189aede6440ae.tar.bz2
emit-rtl.c (gen_lowpart_common): Use word 0 if register mode is narrower than requested mode.
* emit-rtl.c (gen_lowpart_common): Use word 0 if register mode is narrower than requested mode. (gen_highpart): Abort if register mode is narrower than requested mode. From-SVN: r37696
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/emit-rtl.c7
2 files changed, 12 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6721de1..8263d94 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2000-11-23 Alexandre Oliva <aoliva@redhat.com>
+
+ * emit-rtl.c (gen_lowpart_common): Use word 0 if register mode
+ is narrower than requested mode.
+ (gen_highpart): Abort if register mode is narrower than
+ requested mode.
+
2000-11-23 Graham Stott <grahams@redhat.com>
* cse.c (cse_insn): Initialise all regcost variables.
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index db1c73f..4329346 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -709,7 +709,8 @@ gen_lowpart_common (mode, x)
regs are sized by the underlying register size. Better would be
to always interpret the subreg offset parameter as bytes or bits. */
- if (WORDS_BIG_ENDIAN && REGNO (x) < FIRST_PSEUDO_REGISTER)
+ if (WORDS_BIG_ENDIAN && REGNO (x) < FIRST_PSEUDO_REGISTER
+ && GET_MODE_SIZE (GET_MODE (x)) > GET_MODE_SIZE (mode))
word = (HARD_REGNO_NREGS (REGNO (x), GET_MODE (x))
- HARD_REGNO_NREGS (REGNO (x), mode));
@@ -1141,7 +1142,9 @@ gen_highpart (mode, x)
regs are sized by the underlying register size. Better would be
to always interpret the subreg offset parameter as bytes or bits. */
- if (WORDS_BIG_ENDIAN)
+ if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode))
+ abort ();
+ else if (WORDS_BIG_ENDIAN)
word = 0;
else if (REGNO (x) < FIRST_PSEUDO_REGISTER)
word = (HARD_REGNO_NREGS (REGNO (x), GET_MODE (x))