summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-13 07:56:19 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-13 07:56:19 +0000
commit937b20588517d8e28fe15dcb8fc28855e3c2e79d (patch)
treef24c9e8242be1410ea02b25be13e9bd998a25d46
parent5e60cbe4248e8b6ee061e00052945628e766950d (diff)
downloadgcc-937b20588517d8e28fe15dcb8fc28855e3c2e79d.tar.gz
* config/sparc/sparc.h (INITIAL_FRAME_POINTER_OFFSET): Remove.
(ELIMINABLE_REGS): Add sfp->sp. (INITIAL_ELIMINATION_OFFSET): Compute sfp->sp offset too. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50725 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/sparc/sparc.h30
2 files changed, 25 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7127531117c..d78dd6c6248 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,10 @@
-2002-03-12 Jakub Jelinek <jakub@redhat.com>
+2002-03-13 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/sparc.h (INITIAL_FRAME_POINTER_OFFSET): Remove.
+ (ELIMINABLE_REGS): Add sfp->sp.
+ (INITIAL_ELIMINATION_OFFSET): Compute sfp->sp offset too.
+
+2002-03-13 Jakub Jelinek <jakub@redhat.com>
PR optimization/5892
* config/ia64/ia64.c (rotate_one_bundle): Update current packet.
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 92c8ace9e13..8caa9328acd 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -1139,16 +1139,6 @@ extern int sparc_mode_class[];
|| !leaf_function_p ()) \
: ! (leaf_function_p () && only_leaf_regs_used ()))
-/* C statement to store the difference between the frame pointer
- and the stack pointer values immediately after the function prologue.
-
- Note, we always pretend that this is a leaf function because if
- it's not, there's no point in trying to eliminate the
- frame pointer. If it is a leaf function, we guessed right! */
-#define INITIAL_FRAME_POINTER_OFFSET(VAR) \
- ((VAR) = (TARGET_FLAT ? sparc_flat_compute_frame_size (get_frame_size ()) \
- : compute_frame_size (get_frame_size (), 1)))
-
/* Base register for access to arguments of the function. */
#define ARG_POINTER_REGNUM FRAME_POINTER_REGNUM
@@ -1577,12 +1567,28 @@ extern const char leaf_reg_remap[];
/* ??? In TARGET_FLAT mode we needn't have a hard frame pointer. */
#define ELIMINABLE_REGS \
- {{ FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
+ {{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
+ { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM} }
#define CAN_ELIMINATE(FROM, TO) 1
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
- ((OFFSET) = SPARC_STACK_BIAS)
+ do { \
+ (OFFSET) = 0; \
+ if ((TO) == STACK_POINTER_REGNUM) \
+ { \
+ /* Note, we always pretend that this is a leaf function \
+ because if it's not, there's no point in trying to \
+ eliminate the frame pointer. If it is a leaf \
+ function, we guessed right! */ \
+ if (TARGET_FLAT) \
+ (OFFSET) = \
+ sparc_flat_compute_frame_size (get_frame_size ()); \
+ else \
+ (OFFSET) = compute_frame_size (get_frame_size (), 1); \
+ } \
+ (OFFSET) += SPARC_STACK_BIAS; \
+ } while (0)
/* Keep the stack pointer constant throughout the function.
This is both an optimization and a necessity: longjmp