sparc.h (INITIAL_FRAME_POINTER_OFFSET): Remove.
authorJakub Jelinek <jakub@redhat.com>
Wed, 13 Mar 2002 07:56:19 +0000 (08:56 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 13 Mar 2002 07:56:19 +0000 (08:56 +0100)
* config/sparc/sparc.h (INITIAL_FRAME_POINTER_OFFSET): Remove.
(ELIMINABLE_REGS): Add sfp->sp.
(INITIAL_ELIMINATION_OFFSET): Compute sfp->sp offset too.

From-SVN: r50725

gcc/ChangeLog
gcc/config/sparc/sparc.h

index 7127531117c4dddbb4c8b1f64bb3f19d93a1accb..d78dd6c62489a5363345b80ab2839d831d602889 100644 (file)
@@ -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.
index 92c8ace9e1396358858777ca9b701ddffd3a0dd2..8caa9328acdca919f783975dddf636d405b45b40 100644 (file)
@@ -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