Commit f6bcf44c by John David Anglin Committed by John David Anglin

pa.c (DO_FRAME_NOTES): Move forward.

	* pa.c (DO_FRAME_NOTES): Move forward.
	(store_reg): Revise handling of frame notes.
	(load_reg): Likewise.
	(set_reg_plus_d): Likewise.
	(hppa_expand_prologue): Likewise.
	(hppa_expand_epilogue): Likewise.

From-SVN: r49499
parent 703b0080
2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca> 2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
* pa.c (DO_FRAME_NOTES): Move forward.
(store_reg): Revise handling of frame notes.
(load_reg): Likewise.
(set_reg_plus_d): Likewise.
(hppa_expand_prologue): Likewise.
(hppa_expand_epilogue): Likewise.
2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
* unwind-dw2-fde-glibc.c: Define _GNU_SOURCE if not defined. * unwind-dw2-fde-glibc.c: Define _GNU_SOURCE if not defined.
2002-02-04 Jakub Jelinek <jakub@redhat.com> 2002-02-04 Jakub Jelinek <jakub@redhat.com>
......
...@@ -55,6 +55,18 @@ Boston, MA 02111-1307, USA. */ ...@@ -55,6 +55,18 @@ Boston, MA 02111-1307, USA. */
#endif #endif
#endif #endif
#if DO_FRAME_NOTES
#define FRP(INSN) \
do \
{ \
rtx insn = INSN; \
RTX_FRAME_RELATED_P (insn) = 1; \
} \
while (0)
#else
#define FRP(INSN) INSN
#endif
#ifndef FUNC_BEGIN_PROLOG_LABEL #ifndef FUNC_BEGIN_PROLOG_LABEL
#define FUNC_BEGIN_PROLOG_LABEL "LFBP" #define FUNC_BEGIN_PROLOG_LABEL "LFBP"
#endif #endif
...@@ -70,9 +82,9 @@ static void compute_zdepwi_operands PARAMS ((unsigned HOST_WIDE_INT, unsigned *) ...@@ -70,9 +82,9 @@ static void compute_zdepwi_operands PARAMS ((unsigned HOST_WIDE_INT, unsigned *)
static int compute_movstrsi_length PARAMS ((rtx)); static int compute_movstrsi_length PARAMS ((rtx));
static bool pa_assemble_integer PARAMS ((rtx, unsigned int, int)); static bool pa_assemble_integer PARAMS ((rtx, unsigned int, int));
static void remove_useless_addtr_insns PARAMS ((rtx, int)); static void remove_useless_addtr_insns PARAMS ((rtx, int));
static rtx store_reg PARAMS ((int, int, int)); static void store_reg PARAMS ((int, int, int));
static rtx load_reg PARAMS ((int, int, int)); static void load_reg PARAMS ((int, int, int));
static rtx set_reg_plus_d PARAMS ((int, int, int)); static void set_reg_plus_d PARAMS ((int, int, int));
static void pa_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT)); static void pa_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
static int pa_adjust_cost PARAMS ((rtx, rtx, rtx, int)); static int pa_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static int pa_adjust_priority PARAMS ((rtx, int)); static int pa_adjust_priority PARAMS ((rtx, int));
...@@ -2879,18 +2891,18 @@ static int local_fsize, save_fregs; ...@@ -2879,18 +2891,18 @@ static int local_fsize, save_fregs;
Note in DISP > 8k case, we will leave the high part of the address Note in DISP > 8k case, we will leave the high part of the address
in %r1. There is code in expand_hppa_{prologue,epilogue} that knows this.*/ in %r1. There is code in expand_hppa_{prologue,epilogue} that knows this.*/
static rtx static void
store_reg (reg, disp, base) store_reg (reg, disp, base)
int reg, disp, base; int reg, disp, base;
{ {
rtx i, dest, src, basereg; rtx insn, dest, src, basereg;
src = gen_rtx_REG (word_mode, reg); src = gen_rtx_REG (word_mode, reg);
basereg = gen_rtx_REG (Pmode, base); basereg = gen_rtx_REG (Pmode, base);
if (VAL_14_BITS_P (disp)) if (VAL_14_BITS_P (disp))
{ {
dest = gen_rtx_MEM (word_mode, plus_constant (basereg, disp)); dest = gen_rtx_MEM (word_mode, plus_constant (basereg, disp));
i = emit_move_insn (dest, src); insn = emit_move_insn (dest, src);
} }
else else
{ {
...@@ -2899,9 +2911,22 @@ store_reg (reg, disp, base) ...@@ -2899,9 +2911,22 @@ store_reg (reg, disp, base)
rtx tmpreg = gen_rtx_REG (Pmode, 1); rtx tmpreg = gen_rtx_REG (Pmode, 1);
emit_move_insn (tmpreg, high); emit_move_insn (tmpreg, high);
dest = gen_rtx_MEM (word_mode, gen_rtx_LO_SUM (Pmode, tmpreg, delta)); dest = gen_rtx_MEM (word_mode, gen_rtx_LO_SUM (Pmode, tmpreg, delta));
i = emit_move_insn (dest, src); insn = emit_move_insn (dest, src);
if (DO_FRAME_NOTES)
{
REG_NOTES (insn)
= gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode,
gen_rtx_MEM (word_mode,
gen_rtx_PLUS (word_mode, basereg,
delta)),
src),
REG_NOTES (insn));
}
} }
return i;
if (DO_FRAME_NOTES)
RTX_FRAME_RELATED_P (insn) = 1;
} }
/* Emit RTL to set REG to the value specified by BASE+DISP. /* Emit RTL to set REG to the value specified by BASE+DISP.
...@@ -2910,28 +2935,32 @@ store_reg (reg, disp, base) ...@@ -2910,28 +2935,32 @@ store_reg (reg, disp, base)
Note in DISP > 8k case, we will leave the high part of the address Note in DISP > 8k case, we will leave the high part of the address
in %r1. There is code in expand_hppa_{prologue,epilogue} that knows this.*/ in %r1. There is code in expand_hppa_{prologue,epilogue} that knows this.*/
static rtx static void
set_reg_plus_d (reg, base, disp) set_reg_plus_d (reg, base, disp)
int reg, base, disp; int reg, base, disp;
{ {
rtx i; rtx insn;
if (VAL_14_BITS_P (disp)) if (VAL_14_BITS_P (disp))
{ {
i = emit_move_insn (gen_rtx_REG (Pmode, reg), insn = emit_move_insn (gen_rtx_REG (Pmode, reg),
plus_constant (gen_rtx_REG (Pmode, base), disp)); plus_constant (gen_rtx_REG (Pmode, base), disp));
} }
else else
{ {
rtx basereg = gen_rtx_REG (Pmode, base);
rtx delta = GEN_INT (disp); rtx delta = GEN_INT (disp);
emit_move_insn (gen_rtx_REG (Pmode, 1), emit_move_insn (gen_rtx_REG (Pmode, 1),
gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, base), gen_rtx_PLUS (Pmode, basereg,
gen_rtx_HIGH (Pmode, delta))); gen_rtx_HIGH (Pmode, delta)));
i = emit_move_insn (gen_rtx_REG (Pmode, reg), insn = emit_move_insn (gen_rtx_REG (Pmode, reg),
gen_rtx_LO_SUM (Pmode, gen_rtx_REG (Pmode, 1), gen_rtx_LO_SUM (Pmode, gen_rtx_REG (Pmode, 1),
delta)); delta));
} }
return i;
if (DO_FRAME_NOTES && reg == STACK_POINTER_REGNUM)
RTX_FRAME_RELATED_P (insn) = 1;
} }
int int
...@@ -3069,18 +3098,6 @@ pa_output_function_prologue (file, size) ...@@ -3069,18 +3098,6 @@ pa_output_function_prologue (file, size)
remove_useless_addtr_insns (get_insns (), 0); remove_useless_addtr_insns (get_insns (), 0);
} }
#if DO_FRAME_NOTES
#define FRP(INSN) \
do \
{ \
rtx insn = INSN; \
RTX_FRAME_RELATED_P (insn) = 1; \
} \
while (0)
#else
#define FRP(INSN) INSN
#endif
void void
hppa_expand_prologue () hppa_expand_prologue ()
{ {
...@@ -3111,7 +3128,7 @@ hppa_expand_prologue () ...@@ -3111,7 +3128,7 @@ hppa_expand_prologue ()
always be stored into the caller's frame at sp - 20 or sp - 16 always be stored into the caller's frame at sp - 20 or sp - 16
depending on which ABI is in use. */ depending on which ABI is in use. */
if (regs_ever_live[2]) if (regs_ever_live[2])
FRP (store_reg (2, TARGET_64BIT ? -16 : -20, STACK_POINTER_REGNUM)); store_reg (2, TARGET_64BIT ? -16 : -20, STACK_POINTER_REGNUM);
/* Allocate the local frame and set up the frame pointer if needed. */ /* Allocate the local frame and set up the frame pointer if needed. */
if (actual_fsize != 0) if (actual_fsize != 0)
...@@ -3183,9 +3200,8 @@ hppa_expand_prologue () ...@@ -3183,9 +3200,8 @@ hppa_expand_prologue ()
REG_NOTES (insn)); REG_NOTES (insn));
} }
FRP (set_reg_plus_d (STACK_POINTER_REGNUM, set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
STACK_POINTER_REGNUM, adjust2);
adjust2));
} }
/* Prevent register spills from being scheduled before the /* Prevent register spills from being scheduled before the
stack pointer is raised. Necessary as we will be storing stack pointer is raised. Necessary as we will be storing
...@@ -3205,9 +3221,8 @@ hppa_expand_prologue () ...@@ -3205,9 +3221,8 @@ hppa_expand_prologue ()
/* Can not optimize. Adjust the stack frame by actual_fsize /* Can not optimize. Adjust the stack frame by actual_fsize
bytes. */ bytes. */
else else
FRP (set_reg_plus_d (STACK_POINTER_REGNUM, set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
STACK_POINTER_REGNUM, actual_fsize);
actual_fsize));
} }
} }
...@@ -3220,7 +3235,7 @@ hppa_expand_prologue () ...@@ -3220,7 +3235,7 @@ hppa_expand_prologue ()
for (i = 18, offset = local_fsize; i >= 4; i--) for (i = 18, offset = local_fsize; i >= 4; i--)
if (regs_ever_live[i] && ! call_used_regs[i]) if (regs_ever_live[i] && ! call_used_regs[i])
{ {
FRP (store_reg (i, offset, FRAME_POINTER_REGNUM)); store_reg (i, offset, FRAME_POINTER_REGNUM);
offset += UNITS_PER_WORD; offset += UNITS_PER_WORD;
gr_saved++; gr_saved++;
} }
...@@ -3244,7 +3259,7 @@ hppa_expand_prologue () ...@@ -3244,7 +3259,7 @@ hppa_expand_prologue ()
delta))); delta)));
} }
else else
FRP (store_reg (i, offset, STACK_POINTER_REGNUM)); store_reg (i, offset, STACK_POINTER_REGNUM);
offset += UNITS_PER_WORD; offset += UNITS_PER_WORD;
gr_saved++; gr_saved++;
} }
...@@ -3252,9 +3267,8 @@ hppa_expand_prologue () ...@@ -3252,9 +3267,8 @@ hppa_expand_prologue ()
/* If we wanted to merge the SP adjustment with a GR save, but we never /* If we wanted to merge the SP adjustment with a GR save, but we never
did any GR saves, then just emit the adjustment here. */ did any GR saves, then just emit the adjustment here. */
if (merge_sp_adjust_with_store) if (merge_sp_adjust_with_store)
FRP (set_reg_plus_d (STACK_POINTER_REGNUM, set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
STACK_POINTER_REGNUM, actual_fsize);
actual_fsize));
} }
/* The hppa calling conventions say that %r19, the pic offset /* The hppa calling conventions say that %r19, the pic offset
...@@ -3275,9 +3289,9 @@ hppa_expand_prologue () ...@@ -3275,9 +3289,9 @@ hppa_expand_prologue ()
/* First get the frame or stack pointer to the start of the FP register /* First get the frame or stack pointer to the start of the FP register
save area. */ save area. */
if (frame_pointer_needed) if (frame_pointer_needed)
FRP (set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset)); set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset);
else else
FRP (set_reg_plus_d (1, STACK_POINTER_REGNUM, offset)); set_reg_plus_d (1, STACK_POINTER_REGNUM, offset);
/* Now actually save the FP registers. */ /* Now actually save the FP registers. */
for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP) for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP)
...@@ -3285,37 +3299,44 @@ hppa_expand_prologue () ...@@ -3285,37 +3299,44 @@ hppa_expand_prologue ()
if (regs_ever_live[i] if (regs_ever_live[i]
|| (! TARGET_64BIT && regs_ever_live[i + 1])) || (! TARGET_64BIT && regs_ever_live[i + 1]))
{ {
rtx addr, reg; rtx addr, insn, reg;
addr = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg)); addr = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg));
reg = gen_rtx_REG (DFmode, i); reg = gen_rtx_REG (DFmode, i);
FRP (emit_move_insn (addr, reg)); insn = emit_move_insn (addr, reg);
if (DO_FRAME_NOTES)
{
RTX_FRAME_RELATED_P (insn) = 1;
REG_NOTES (insn)
= gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode,
gen_rtx_MEM (DFmode,
plus_constant (stack_pointer_rtx,
offset)),
reg),
REG_NOTES (insn));
}
offset += GET_MODE_SIZE (DFmode);
fr_saved++; fr_saved++;
} }
} }
} }
} }
/* ?!? Do we want frame notes in the epilogue yet? */
#undef DO_FRAME_NOTES
#define DO_FRAME_NOTES 0
#undef FRP
#define FRP(INSN) INSN
/* Emit RTL to load REG from the memory location specified by BASE+DISP. /* Emit RTL to load REG from the memory location specified by BASE+DISP.
Handle case where DISP > 8k by using the add_high_const patterns. */ Handle case where DISP > 8k by using the add_high_const patterns. */
static rtx static void
load_reg (reg, disp, base) load_reg (reg, disp, base)
int reg, disp, base; int reg, disp, base;
{ {
rtx i, src, dest, basereg; rtx src, dest, basereg;
dest = gen_rtx_REG (word_mode, reg); dest = gen_rtx_REG (word_mode, reg);
basereg = gen_rtx_REG (Pmode, base); basereg = gen_rtx_REG (Pmode, base);
if (VAL_14_BITS_P (disp)) if (VAL_14_BITS_P (disp))
{ {
src = gen_rtx_MEM (word_mode, plus_constant (basereg, disp)); src = gen_rtx_MEM (word_mode, plus_constant (basereg, disp));
i = emit_move_insn (dest, src); emit_move_insn (dest, src);
} }
else else
{ {
...@@ -3324,9 +3345,8 @@ load_reg (reg, disp, base) ...@@ -3324,9 +3345,8 @@ load_reg (reg, disp, base)
rtx tmpreg = gen_rtx_REG (Pmode, 1); rtx tmpreg = gen_rtx_REG (Pmode, 1);
emit_move_insn (tmpreg, high); emit_move_insn (tmpreg, high);
src = gen_rtx_MEM (word_mode, gen_rtx_LO_SUM (Pmode, tmpreg, delta)); src = gen_rtx_MEM (word_mode, gen_rtx_LO_SUM (Pmode, tmpreg, delta));
i = emit_move_insn (dest, src); emit_move_insn (dest, src);
} }
return i;
} }
/* This function generates the assembly code for function exit. /* This function generates the assembly code for function exit.
...@@ -3388,7 +3408,7 @@ hppa_expand_epilogue () ...@@ -3388,7 +3408,7 @@ hppa_expand_epilogue ()
ret_off = TARGET_64BIT ? -16 : -20; ret_off = TARGET_64BIT ? -16 : -20;
if (frame_pointer_needed) if (frame_pointer_needed)
{ {
FRP (load_reg (2, ret_off, FRAME_POINTER_REGNUM)); load_reg (2, ret_off, FRAME_POINTER_REGNUM);
ret_off = 0; ret_off = 0;
} }
else else
...@@ -3396,7 +3416,7 @@ hppa_expand_epilogue () ...@@ -3396,7 +3416,7 @@ hppa_expand_epilogue ()
/* No frame pointer, and stack is smaller than 8k. */ /* No frame pointer, and stack is smaller than 8k. */
if (VAL_14_BITS_P (ret_off - actual_fsize)) if (VAL_14_BITS_P (ret_off - actual_fsize))
{ {
FRP (load_reg (2, ret_off - actual_fsize, STACK_POINTER_REGNUM)); load_reg (2, ret_off - actual_fsize, STACK_POINTER_REGNUM);
ret_off = 0; ret_off = 0;
} }
} }
...@@ -3408,7 +3428,7 @@ hppa_expand_epilogue () ...@@ -3408,7 +3428,7 @@ hppa_expand_epilogue ()
for (i = 18, offset = local_fsize; i >= 4; i--) for (i = 18, offset = local_fsize; i >= 4; i--)
if (regs_ever_live[i] && ! call_used_regs[i]) if (regs_ever_live[i] && ! call_used_regs[i])
{ {
FRP (load_reg (i, offset, FRAME_POINTER_REGNUM)); load_reg (i, offset, FRAME_POINTER_REGNUM);
offset += UNITS_PER_WORD; offset += UNITS_PER_WORD;
} }
} }
...@@ -3426,7 +3446,7 @@ hppa_expand_epilogue () ...@@ -3426,7 +3446,7 @@ hppa_expand_epilogue ()
&& VAL_14_BITS_P (-actual_fsize)) && VAL_14_BITS_P (-actual_fsize))
merge_sp_adjust_with_load = i; merge_sp_adjust_with_load = i;
else else
FRP (load_reg (i, offset, STACK_POINTER_REGNUM)); load_reg (i, offset, STACK_POINTER_REGNUM);
offset += UNITS_PER_WORD; offset += UNITS_PER_WORD;
} }
} }
...@@ -3440,9 +3460,9 @@ hppa_expand_epilogue () ...@@ -3440,9 +3460,9 @@ hppa_expand_epilogue ()
{ {
/* Adjust the register to index off of. */ /* Adjust the register to index off of. */
if (frame_pointer_needed) if (frame_pointer_needed)
FRP (set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset)); set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset);
else else
FRP (set_reg_plus_d (1, STACK_POINTER_REGNUM, offset)); set_reg_plus_d (1, STACK_POINTER_REGNUM, offset);
/* Actually do the restores now. */ /* Actually do the restores now. */
for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP) for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP)
...@@ -3451,7 +3471,7 @@ hppa_expand_epilogue () ...@@ -3451,7 +3471,7 @@ hppa_expand_epilogue ()
{ {
rtx src = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg)); rtx src = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg));
rtx dest = gen_rtx_REG (DFmode, i); rtx dest = gen_rtx_REG (DFmode, i);
FRP (emit_move_insn (dest, src)); emit_move_insn (dest, src);
} }
} }
...@@ -3467,27 +3487,45 @@ hppa_expand_epilogue () ...@@ -3467,27 +3487,45 @@ hppa_expand_epilogue ()
if (frame_pointer_needed) if (frame_pointer_needed)
{ {
rtx delta = GEN_INT (-64); rtx delta = GEN_INT (-64);
FRP (set_reg_plus_d (STACK_POINTER_REGNUM, FRAME_POINTER_REGNUM, 64)); rtx insn;
FRP (emit_insn (gen_pre_load (frame_pointer_rtx, set_reg_plus_d (STACK_POINTER_REGNUM, FRAME_POINTER_REGNUM, 64);
stack_pointer_rtx, insn = emit_insn (gen_pre_load (frame_pointer_rtx, stack_pointer_rtx,
delta))); delta));
if (DO_FRAME_NOTES)
{
RTX_FRAME_RELATED_P (insn) = 1;
REG_NOTES (insn)
= gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
gen_rtx_PLUS (word_mode, stack_pointer_rtx,
delta)),
REG_NOTES (insn));
}
} }
/* If we were deferring a callee register restore, do it now. */ /* If we were deferring a callee register restore, do it now. */
else if (merge_sp_adjust_with_load) else if (merge_sp_adjust_with_load)
{ {
rtx delta = GEN_INT (-actual_fsize); rtx delta = GEN_INT (-actual_fsize);
rtx dest = gen_rtx_REG (word_mode, merge_sp_adjust_with_load); rtx dest = gen_rtx_REG (word_mode, merge_sp_adjust_with_load);
FRP (emit_insn (gen_pre_load (dest, stack_pointer_rtx, delta))); rtx insn = emit_insn (gen_pre_load (dest, stack_pointer_rtx, delta));
if (DO_FRAME_NOTES)
{
RTX_FRAME_RELATED_P (insn) = 1;
REG_NOTES (insn)
= gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
gen_rtx_PLUS (word_mode, stack_pointer_rtx,
delta)),
REG_NOTES (insn));
}
} }
else if (actual_fsize != 0) else if (actual_fsize != 0)
FRP (set_reg_plus_d (STACK_POINTER_REGNUM, set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM, - actual_fsize);
STACK_POINTER_REGNUM,
- actual_fsize));
/* If we haven't restored %r2 yet (no frame pointer, and a stack /* If we haven't restored %r2 yet (no frame pointer, and a stack
frame greater than 8k), do so now. */ frame greater than 8k), do so now. */
if (ret_off != 0) if (ret_off != 0)
FRP (load_reg (2, ret_off, STACK_POINTER_REGNUM)); load_reg (2, ret_off, STACK_POINTER_REGNUM);
} }
rtx rtx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment