From 68ba34f361d5287404bde9283b9df315f4a2c147 Mon Sep 17 00:00:00 2001 From: Alexey Starovoytov Date: Fri, 14 Apr 2006 07:01:38 +0000 Subject: [PATCH] sparc.c (emit_and_preserve): Allocate space for the register save area. * config/sparc/sparc.c (emit_and_preserve): Allocate space for the register save area. Co-Authored-By: Eric Botcazou From-SVN: r112950 --- gcc/ChangeLog | 6 ++++++ gcc/config/sparc/sparc.c | 20 ++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f8fdd81962a..d063df8311e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-04-14 Alexey Starovoytov + Eric Botcazou + + * config/sparc/sparc.c (emit_and_preserve): Allocate space for the + register save area. + 2005-04-13 Uros Bizjak PR middle-end/27134 diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 578f91668b1..692e46e5584 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -8487,16 +8487,24 @@ sparc_rtx_costs (rtx x, int code, int outer_code, int *total) } } -/* Emit the sequence of insns SEQ while preserving the registers. */ +/* Emit the sequence of insns SEQ while preserving the registers REG and REG2. + This is achieved by means of a manual dynamic stack space allocation in + the current frame. We make the assumption that SEQ doesn't contain any + function calls, with the possible exception of calls to the PIC helper. */ static void emit_and_preserve (rtx seq, rtx reg, rtx reg2) { - /* STACK_BOUNDARY guarantees that this is a 2-word slot. */ - rtx slot = gen_rtx_MEM (word_mode, - plus_constant (stack_pointer_rtx, SPARC_STACK_BIAS)); + /* We must preserve the lowest 16 words for the register save area. */ + HOST_WIDE_INT offset = 16*UNITS_PER_WORD; + /* We really need only 2 words of fresh stack space. */ + HOST_WIDE_INT size = SPARC_STACK_ALIGN (offset + 2*UNITS_PER_WORD); - emit_insn (gen_stack_pointer_dec (GEN_INT (STACK_BOUNDARY/BITS_PER_UNIT))); + rtx slot + = gen_rtx_MEM (word_mode, plus_constant (stack_pointer_rtx, + SPARC_STACK_BIAS + offset)); + + emit_insn (gen_stack_pointer_dec (GEN_INT (size))); emit_insn (gen_rtx_SET (VOIDmode, slot, reg)); if (reg2) emit_insn (gen_rtx_SET (VOIDmode, @@ -8508,7 +8516,7 @@ emit_and_preserve (rtx seq, rtx reg, rtx reg2) reg2, adjust_address (slot, word_mode, UNITS_PER_WORD))); emit_insn (gen_rtx_SET (VOIDmode, reg, slot)); - emit_insn (gen_stack_pointer_inc (GEN_INT (STACK_BOUNDARY/BITS_PER_UNIT))); + emit_insn (gen_stack_pointer_inc (GEN_INT (size))); } /* Output the assembler code for a thunk function. THUNK_DECL is the