From 69295d6d2639897d9bea1199495189aede6440ae Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Thu, 23 Nov 2000 13:23:04 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/emit-rtl.c | 7 +++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6721de104f3..8263d94cda5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2000-11-23 Alexandre Oliva + + * 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 * cse.c (cse_insn): Initialise all regcost variables. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index db1c73fc936..4329346260a 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)) -- 2.30.2