diff options
author | Doug Evans <dje@gnu.org> | 1993-09-24 19:39:25 +0000 |
---|---|---|
committer | Doug Evans <dje@gnu.org> | 1993-09-24 19:39:25 +0000 |
commit | ac6f08b075eef606a4d0c63d28566150f70ac857 (patch) | |
tree | ef76a27a55ca9ba23febabdee504ee28499b9d30 | |
parent | 804f56d8d906cf1a24c49b19c33d45aa2bf6f082 (diff) | |
download | gcc-ac6f08b075eef606a4d0c63d28566150f70ac857.zip gcc-ac6f08b075eef606a4d0c63d28566150f70ac857.tar.gz gcc-ac6f08b075eef606a4d0c63d28566150f70ac857.tar.bz2 |
emit-rtl.c: (hard_frame_pointer_rtx): New variable.
* emit-rtl.c: (hard_frame_pointer_rtx): New variable.
(gen_rtx): return hard_frame_pointer_rtx if generating rtl
for HARD_FRAME_POINTER_REGNUM.
(enit_emit_once): Generate initial rtl for hard_frame_pointer_rtx.
From-SVN: r5453
-rw-r--r-- | gcc/emit-rtl.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 5495a45..32bc6b6 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -128,10 +128,18 @@ REAL_VALUE_TYPE dconstm1; But references that were originally to the frame-pointer can be distinguished from the others because they contain frame_pointer_rtx. + When to use frame_pointer_rtx and hard_frame_pointer_rtx is a little + tricky: until register elimination has taken place hard_frame_pointer_rtx + should be used if it is being set, and frame_pointer_rtx otherwise. After + register elimination hard_frame_pointer_rtx should always be used. + On machines where the two registers are same (most) then these are the + same. + In an inline procedure, the stack and frame pointer rtxs may not be used for anything else. */ rtx stack_pointer_rtx; /* (REG:Pmode STACK_POINTER_REGNUM) */ rtx frame_pointer_rtx; /* (REG:Pmode FRAME_POINTER_REGNUM) */ +rtx hard_frame_pointer_rtx; /* (REG:Pmode HARD_FRAME_POINTER_REGNUM) */ rtx arg_pointer_rtx; /* (REG:Pmode ARG_POINTER_REGNUM) */ rtx struct_value_rtx; /* (REG:Pmode STRUCT_VALUE_REGNUM) */ rtx struct_value_incoming_rtx; /* (REG:Pmode STRUCT_VALUE_INCOMING_REGNUM) */ @@ -305,7 +313,12 @@ gen_rtx (va_alist) if (frame_pointer_rtx && regno == FRAME_POINTER_REGNUM && mode == Pmode && ! reload_in_progress) return frame_pointer_rtx; -#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM +#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM + if (hard_frame_pointer_rtx && regno == HARD_FRAME_POINTER_REGNUM + && mode == Pmode && ! reload_in_progress) + return hard_frame_pointer_rtx; +#endif +#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM && HARD_FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM if (arg_pointer_rtx && regno == ARG_POINTER_REGNUM && mode == Pmode && ! reload_in_progress) return arg_pointer_rtx; @@ -3152,8 +3165,15 @@ init_emit_once (line_numbers) stack_pointer_rtx = gen_rtx (REG, Pmode, STACK_POINTER_REGNUM); frame_pointer_rtx = gen_rtx (REG, Pmode, FRAME_POINTER_REGNUM); + if (HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM) + hard_frame_pointer_rtx = frame_pointer_rtx; + else + hard_frame_pointer_rtx = gen_rtx (REG, Pmode, HARD_FRAME_POINTER_REGNUM); + if (FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM) arg_pointer_rtx = frame_pointer_rtx; + else if (HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM) + arg_pointer_rtx = hard_frame_pointer_rtx; else if (STACK_POINTER_REGNUM == ARG_POINTER_REGNUM) arg_pointer_rtx = stack_pointer_rtx; else |