diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 22f8817493b..787f54626af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Feb 17 21:28:12 1998 Gavin Koch + + * mips/mips.h (CAN_ELIMINATE): Don't eliminate the frame + pointer for the stack pointer in MIPS16 and 64BIT. + Tue Feb 17 21:17:30 1997 J"orn Rennecke * rtl.h (force_line_numbers, restore_line_number_status): Declare. diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index b68d660608d..582478f3fdb 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -2115,16 +2115,23 @@ extern struct mips_frame_info current_frame_info; cases preventing register elimination are things that the compiler already knows about. - We can always eliminate to the frame pointer. We can eliminate to - the stack pointer unless a frame pointer is needed. In mips16 - mode, we need a frame pointer for a large frame; otherwise, reload - may be unable to compute the address of a local variable, since - there is no way to add a large constant to the stack pointer - without using a temporary register. */ + When not in mips16 and mips64, we can always eliminate to the + frame pointer. We can eliminate to the stack pointer unless + a frame pointer is needed. In mips16 mode, we need a frame + pointer for a large frame; otherwise, reload may be unable + to compute the address of a local variable, since there is + no way to add a large constant to the stack pointer + without using a temporary register. + + In mips16, for some instructions (eg lwu), we can't eliminate the + frame pointer for the stack pointer. These instructions are + only generated in TARGET_64BIT mode. + */ #define CAN_ELIMINATE(FROM, TO) \ ((TO) == HARD_FRAME_POINTER_REGNUM \ || ((TO) == STACK_POINTER_REGNUM && ! frame_pointer_needed \ + && ! (TARGET_MIPS16 && TARGET_64BIT) \ && (! TARGET_MIPS16 \ || compute_frame_size (get_frame_size ()) < 32768)))