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>
* 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.
2002-02-04 Jakub Jelinek <jakub@redhat.com>
......
......@@ -55,6 +55,18 @@ Boston, MA 02111-1307, USA. */
#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
#define FUNC_BEGIN_PROLOG_LABEL "LFBP"
#endif
......@@ -70,9 +82,9 @@ static void compute_zdepwi_operands PARAMS ((unsigned HOST_WIDE_INT, unsigned *)
static int compute_movstrsi_length PARAMS ((rtx));
static bool pa_assemble_integer PARAMS ((rtx, unsigned int, int));
static void remove_useless_addtr_insns PARAMS ((rtx, int));
static rtx store_reg PARAMS ((int, int, int));
static rtx load_reg PARAMS ((int, int, int));
static rtx set_reg_plus_d PARAMS ((int, int, int));
static void store_reg PARAMS ((int, int, int));
static void load_reg 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 int pa_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static int pa_adjust_priority PARAMS ((rtx, int));
......@@ -2879,18 +2891,18 @@ static int local_fsize, save_fregs;
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.*/
static rtx
static void
store_reg (reg, disp, base)
int reg, disp, base;
{
rtx i, dest, src, basereg;
rtx insn, dest, src, basereg;
src = gen_rtx_REG (word_mode, reg);
basereg = gen_rtx_REG (Pmode, base);
if (VAL_14_BITS_P (disp))
{
dest = gen_rtx_MEM (word_mode, plus_constant (basereg, disp));
i = emit_move_insn (dest, src);
insn = emit_move_insn (dest, src);
}
else
{
......@@ -2899,9 +2911,22 @@ store_reg (reg, disp, base)
rtx tmpreg = gen_rtx_REG (Pmode, 1);
emit_move_insn (tmpreg, high);
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.
......@@ -2910,28 +2935,32 @@ store_reg (reg, disp, base)
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.*/
static rtx
static void
set_reg_plus_d (reg, base, disp)
int reg, base, disp;
{
rtx i;
rtx insn;
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));
}
else
{
rtx basereg = gen_rtx_REG (Pmode, base);
rtx delta = GEN_INT (disp);
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)));
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),
delta));
}
return i;
if (DO_FRAME_NOTES && reg == STACK_POINTER_REGNUM)
RTX_FRAME_RELATED_P (insn) = 1;
}
int
......@@ -3069,18 +3098,6 @@ pa_output_function_prologue (file, size)
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
hppa_expand_prologue ()
{
......@@ -3111,7 +3128,7 @@ hppa_expand_prologue ()
always be stored into the caller's frame at sp - 20 or sp - 16
depending on which ABI is in use. */
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. */
if (actual_fsize != 0)
......@@ -3183,9 +3200,8 @@ hppa_expand_prologue ()
REG_NOTES (insn));
}
FRP (set_reg_plus_d (STACK_POINTER_REGNUM,
STACK_POINTER_REGNUM,
adjust2));
set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
adjust2);
}
/* Prevent register spills from being scheduled before the
stack pointer is raised. Necessary as we will be storing
......@@ -3205,9 +3221,8 @@ hppa_expand_prologue ()
/* Can not optimize. Adjust the stack frame by actual_fsize
bytes. */
else
FRP (set_reg_plus_d (STACK_POINTER_REGNUM,
STACK_POINTER_REGNUM,
actual_fsize));
set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
actual_fsize);
}
}
......@@ -3220,7 +3235,7 @@ hppa_expand_prologue ()
for (i = 18, offset = local_fsize; i >= 4; 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;
gr_saved++;
}
......@@ -3244,7 +3259,7 @@ hppa_expand_prologue ()
delta)));
}
else
FRP (store_reg (i, offset, STACK_POINTER_REGNUM));
store_reg (i, offset, STACK_POINTER_REGNUM);
offset += UNITS_PER_WORD;
gr_saved++;
}
......@@ -3252,9 +3267,8 @@ hppa_expand_prologue ()
/* 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. */
if (merge_sp_adjust_with_store)
FRP (set_reg_plus_d (STACK_POINTER_REGNUM,
STACK_POINTER_REGNUM,
actual_fsize));
set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
actual_fsize);
}
/* The hppa calling conventions say that %r19, the pic offset
......@@ -3275,9 +3289,9 @@ hppa_expand_prologue ()
/* First get the frame or stack pointer to the start of the FP register
save area. */
if (frame_pointer_needed)
FRP (set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset));
set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset);
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. */
for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP)
......@@ -3285,37 +3299,44 @@ hppa_expand_prologue ()
if (regs_ever_live[i]
|| (! 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));
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++;
}
}
}
}
/* ?!? 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.
Handle case where DISP > 8k by using the add_high_const patterns. */
static rtx
static void
load_reg (reg, disp, base)
int reg, disp, base;
{
rtx i, src, dest, basereg;
rtx src, dest, basereg;
dest = gen_rtx_REG (word_mode, reg);
basereg = gen_rtx_REG (Pmode, base);
if (VAL_14_BITS_P (disp))
{
src = gen_rtx_MEM (word_mode, plus_constant (basereg, disp));
i = emit_move_insn (dest, src);
emit_move_insn (dest, src);
}
else
{
......@@ -3324,9 +3345,8 @@ load_reg (reg, disp, base)
rtx tmpreg = gen_rtx_REG (Pmode, 1);
emit_move_insn (tmpreg, high);
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.
......@@ -3388,7 +3408,7 @@ hppa_expand_epilogue ()
ret_off = TARGET_64BIT ? -16 : -20;
if (frame_pointer_needed)
{
FRP (load_reg (2, ret_off, FRAME_POINTER_REGNUM));
load_reg (2, ret_off, FRAME_POINTER_REGNUM);
ret_off = 0;
}
else
......@@ -3396,7 +3416,7 @@ hppa_expand_epilogue ()
/* No frame pointer, and stack is smaller than 8k. */
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;
}
}
......@@ -3408,7 +3428,7 @@ hppa_expand_epilogue ()
for (i = 18, offset = local_fsize; i >= 4; 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;
}
}
......@@ -3426,7 +3446,7 @@ hppa_expand_epilogue ()
&& VAL_14_BITS_P (-actual_fsize))
merge_sp_adjust_with_load = i;
else
FRP (load_reg (i, offset, STACK_POINTER_REGNUM));
load_reg (i, offset, STACK_POINTER_REGNUM);
offset += UNITS_PER_WORD;
}
}
......@@ -3440,9 +3460,9 @@ hppa_expand_epilogue ()
{
/* Adjust the register to index off of. */
if (frame_pointer_needed)
FRP (set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset));
set_reg_plus_d (1, FRAME_POINTER_REGNUM, offset);
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. */
for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP)
......@@ -3451,7 +3471,7 @@ hppa_expand_epilogue ()
{
rtx src = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg));
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 ()
if (frame_pointer_needed)
{
rtx delta = GEN_INT (-64);
FRP (set_reg_plus_d (STACK_POINTER_REGNUM, FRAME_POINTER_REGNUM, 64));
FRP (emit_insn (gen_pre_load (frame_pointer_rtx,
stack_pointer_rtx,
delta)));
rtx insn;
set_reg_plus_d (STACK_POINTER_REGNUM, FRAME_POINTER_REGNUM, 64);
insn = emit_insn (gen_pre_load (frame_pointer_rtx, 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));
}
}
/* If we were deferring a callee register restore, do it now. */
else if (merge_sp_adjust_with_load)
{
rtx delta = GEN_INT (-actual_fsize);
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)
FRP (set_reg_plus_d (STACK_POINTER_REGNUM,
STACK_POINTER_REGNUM,
- actual_fsize));
set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM, - actual_fsize);
/* If we haven't restored %r2 yet (no frame pointer, and a stack
frame greater than 8k), do so now. */
if (ret_off != 0)
FRP (load_reg (2, ret_off, STACK_POINTER_REGNUM));
load_reg (2, ret_off, STACK_POINTER_REGNUM);
}
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