diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2000-11-23 13:23:04 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2000-11-23 13:23:04 +0000 |
commit | 69295d6d2639897d9bea1199495189aede6440ae (patch) | |
tree | 8ec3fb055335632e906197e39a5c75576c5eec37 /gcc | |
parent | d0c3e4f4987cc0e0e0a8880554593ebace217b00 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 7 |
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)) |