From f6bcf44c5e6d91f3db56fc60b94f9157ae0ede92 Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Mon, 4 Feb 2002 22:41:59 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++ gcc/config/pa/pa.c | 182 +++++++++++++++++++++++++++------------------ 2 files changed, 119 insertions(+), 72 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b16f06d025d..85d8be72747 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2002-02-04 John David Anglin + + * 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 * unwind-dw2-fde-glibc.c: Define _GNU_SOURCE if not defined. diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 40fe3dab139..423ee62c9cd 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -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), - plus_constant (gen_rtx_REG (Pmode, base), disp)); + 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), - gen_rtx_LO_SUM (Pmode, gen_rtx_REG (Pmode, 1), - delta)); + 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 -- 2.30.2