OSDN Git Service

store LR in caller's frame, not current frame for V.4
authormeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jul 1995 14:17:45 +0000 (14:17 +0000)
committermeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jul 1995 14:17:45 +0000 (14:17 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@10154 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/config/rs6000/eabi.asm
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 81788a3..38674dd 100644 (file)
@@ -110,91 +110,270 @@ __eabi:  mflr    0
 # Called with r11 pointing to the stack header word of the caller of the
 # function, just beyond the end of the floating point save area.
 
-       .globl  _savefpr_14_l
-       .globl  _savefpr_15_l
-       .globl  _savefpr_16_l
-       .globl  _savefpr_17_l
-       .globl  _savefpr_18_l
-       .globl  _savefpr_19_l
-       .globl  _savefpr_20_l
-       .globl  _savefpr_21_l
-       .globl  _savefpr_22_l
-       .globl  _savefpr_23_l
-       .globl  _savefpr_24_l
-       .globl  _savefpr_25_l
-       .globl  _savefpr_26_l
-       .globl  _savefpr_27_l
-       .globl  _savefpr_28_l
-       .globl  _savefpr_29_l
-       .globl  _savefpr_30_l
-       .globl  _savefpr_31_l
+       .globl  _savefpr_14
+       .globl  _savefpr_15
+       .globl  _savefpr_16
+       .globl  _savefpr_17
+       .globl  _savefpr_18
+       .globl  _savefpr_19
+       .globl  _savefpr_20
+       .globl  _savefpr_21
+       .globl  _savefpr_22
+       .globl  _savefpr_23
+       .globl  _savefpr_24
+       .globl  _savefpr_25
+       .globl  _savefpr_26
+       .globl  _savefpr_27
+       .globl  _savefpr_28
+       .globl  _savefpr_29
+       .globl  _savefpr_30
+       .globl  _savefpr_31
 
                .long   0x00400000      # traceback tag
-_savefpr_14_l: stfd    14,-144(11)     # save fp registers
-_savefpr_15_l:  stfd   15,-136(11)
-_savefpr_16_l:  stfd   16,-128(11)
-_savefpr_17_l:  stfd   17,-120(11)
-_savefpr_18_l:  stfd   18,-112(11)
-_savefpr_19_l:  stfd   19,-104(11)
-_savefpr_20_l:  stfd   20,-96(11)
-_savefpr_21_l:  stfd   21,-88(11)
-_savefpr_22_l:  stfd   22,-80(11)
-_savefpr_23_l:  stfd   23,-72(11)
-_savefpr_24_l:  stfd   24,-64(11)
-_savefpr_25_l:  stfd   25,-56(11)
-_savefpr_26_l:  stfd   26,-48(11)
-_savefpr_27_l:  stfd   27,-40(11)
-_savefpr_28_l:  stfd   28,-32(11)
-_savefpr_29_l:  stfd   29,-24(11)
-_savefpr_30_l:  stfd   30,-16(11)
-_savefpr_31_l:  stfd   31,-8(11)
-               stw     0,4(11)         # save return address also
+_savefpr_14:   stfd    14,-144(11)     # save fp registers
+_savefpr_15:   stfd    15,-136(11)
+_savefpr_16:   stfd    16,-128(11)
+_savefpr_17:   stfd    17,-120(11)
+_savefpr_18:   stfd    18,-112(11)
+_savefpr_19:   stfd    19,-104(11)
+_savefpr_20:   stfd    20,-96(11)
+_savefpr_21:   stfd    21,-88(11)
+_savefpr_22:   stfd    22,-80(11)
+_savefpr_23:   stfd    23,-72(11)
+_savefpr_24:   stfd    24,-64(11)
+_savefpr_25:   stfd    25,-56(11)
+_savefpr_26:   stfd    26,-48(11)
+_savefpr_27:   stfd    27,-40(11)
+_savefpr_28:   stfd    28,-32(11)
+_savefpr_29:   stfd    29,-24(11)
+_savefpr_30:   stfd    30,-16(11)
+_savefpr_31:   stfd    31,-8(11)
                blr
 
+# Routines for saving integer registers, called by the compiler.
+# Called with r11 pointing to the stack header word of the caller of the
+# function, just beyond the end of the integer save area.
+
+       .globl  _savegpr_14
+       .globl  _savegpr_15
+       .globl  _savegpr_16
+       .globl  _savegpr_17
+       .globl  _savegpr_18
+       .globl  _savegpr_19
+       .globl  _savegpr_20
+       .globl  _savegpr_21
+       .globl  _savegpr_22
+       .globl  _savegpr_23
+       .globl  _savegpr_24
+       .globl  _savegpr_25
+       .globl  _savegpr_26
+       .globl  _savegpr_27
+       .globl  _savegpr_28
+       .globl  _savegpr_29
+       .globl  _savegpr_30
+       .globl  _savegpr_31
+
+               .long   0x00400000      # traceback tag
+_savegpr_14:   stw     14,-72(11)      # save gp registers
+_savegpr_15:   stw     15,-68(11)
+_savegpr_16:   stw     16,-64(11)
+_savegpr_17:   stw     17,-60(11)
+_savegpr_18:   stw     18,-56(11)
+_savegpr_19:   stw     19,-52(11)
+_savegpr_20:   stw     20,-48(11)
+_savegpr_21:   stw     21,-44(11)
+_savegpr_22:   stw     22,-40(11)
+_savegpr_23:   stw     23,-36(11)
+_savegpr_24:   stw     24,-32(11)
+_savegpr_25:   stw     25,-28(11)
+_savegpr_26:   stw     26,-24(11)
+_savegpr_27:   stw     27,-20(11)
+_savegpr_28:   stw     28,-16(11)
+_savegpr_29:   stw     29,-12(11)
+_savegpr_30:   stw     30,-8(11)
+_savegpr_31:   stw     31,-4(11)
+               blr
 
 # Routines for restoring floating point registers, called by the compiler.
 # Called with r11 pointing to the stack header word of the caller of the
 # function, just beyond the end of the floating point save area.
 
-       .globl  _restfpr_14_l
-       .globl  _restfpr_15_l
-       .globl  _restfpr_16_l
-       .globl  _restfpr_17_l
-       .globl  _restfpr_18_l
-       .globl  _restfpr_19_l
-       .globl  _restfpr_20_l
-       .globl  _restfpr_21_l
-       .globl  _restfpr_22_l
-       .globl  _restfpr_23_l
-       .globl  _restfpr_24_l
-       .globl  _restfpr_25_l
-       .globl  _restfpr_26_l
-       .globl  _restfpr_27_l
-       .globl  _restfpr_28_l
-       .globl  _restfpr_29_l
-       .globl  _restfpr_30_l
-       .globl  _restfpr_31_l
+       .globl  _restfpr_14
+       .globl  _restfpr_15
+       .globl  _restfpr_16
+       .globl  _restfpr_17
+       .globl  _restfpr_18
+       .globl  _restfpr_19
+       .globl  _restfpr_20
+       .globl  _restfpr_21
+       .globl  _restfpr_22
+       .globl  _restfpr_23
+       .globl  _restfpr_24
+       .globl  _restfpr_25
+       .globl  _restfpr_26
+       .globl  _restfpr_27
+       .globl  _restfpr_28
+       .globl  _restfpr_29
+       .globl  _restfpr_30
+       .globl  _restfpr_31
+
+               .long   0x00600000      # traceback tag
+_restfpr_14:   lfd     14,-144(11)     # restore fp registers
+_restfpr_15:   lfd     15,-136(11)
+_restfpr_16:   lfd     16,-128(11)
+_restfpr_17:   lfd     17,-120(11)
+_restfpr_18:   lfd     18,-112(11)
+_restfpr_19:   lfd     19,-104(11)
+_restfpr_20:   lfd     20,-96(11)
+_restfpr_21:   lfd     21,-88(11)
+_restfpr_22:   lfd     22,-80(11)
+_restfpr_23:   lfd     23,-72(11)
+_restfpr_24:   lfd     24,-64(11)
+_restfpr_25:   lfd     25,-56(11)
+_restfpr_26:   lfd     26,-48(11)
+_restfpr_27:   lfd     27,-40(11)
+_restfpr_28:   lfd     28,-32(11)
+_restfpr_29:   lfd     29,-24(11)
+_restfpr_30:   lfd     30,-16(11)
+_restfpr_31:   lfd     31,-8(11)
+               blr
+
+# Routines for restoring integer registers, called by the compiler.
+# Called with r11 pointing to the stack header word of the caller of the
+# function, just beyond the end of the integer restore area.
+
+       .globl  _restgpr_14
+       .globl  _restgpr_15
+       .globl  _restgpr_16
+       .globl  _restgpr_17
+       .globl  _restgpr_18
+       .globl  _restgpr_19
+       .globl  _restgpr_20
+       .globl  _restgpr_21
+       .globl  _restgpr_22
+       .globl  _restgpr_23
+       .globl  _restgpr_24
+       .globl  _restgpr_25
+       .globl  _restgpr_26
+       .globl  _restgpr_27
+       .globl  _restgpr_28
+       .globl  _restgpr_29
+       .globl  _restgpr_30
+       .globl  _restgpr_31
 
                .long   0x00600000      # traceback tag
-_restfpr_14_l: lfd     14,-144(11)     # restore fp registers
-_restfpr_15_l:  lfd    15,-136(11)
-_restfpr_16_l:  lfd    16,-128(11)
-_restfpr_17_l:  lfd    17,-120(11)
-_restfpr_18_l:  lfd    18,-112(11)
-_restfpr_19_l:  lfd    19,-104(11)
-_restfpr_20_l:  lfd    20,-96(11)
-_restfpr_21_l:  lfd    21,-88(11)
-_restfpr_22_l:  lfd    22,-80(11)
-_restfpr_23_l:  lfd    23,-72(11)
-_restfpr_24_l:  lfd    24,-64(11)
-_restfpr_25_l:  lfd    25,-56(11)
-_restfpr_26_l:  lfd    26,-48(11)
-_restfpr_27_l:  lfd    27,-40(11)
-_restfpr_28_l:  lfd    28,-32(11)
-_restfpr_29_l:  lfd    29,-24(11)
-_restfpr_30_l:  lfd    30,-16(11)
-_restfpr_31_l:  lwz    0,4(11)         # caller's caller address
+_restgpr_14:   lwz     14,-72(11)      # rest gp registers
+_restgpr_15:   lwz     15,-68(11)
+_restgpr_16:   lwz     16,-64(11)
+_restgpr_17:   lwz     17,-60(11)
+_restgpr_18:   lwz     18,-56(11)
+_restgpr_19:   lwz     19,-52(11)
+_restgpr_20:   lwz     20,-48(11)
+_restgpr_21:   lwz     21,-44(11)
+_restgpr_22:   lwz     22,-40(11)
+_restgpr_23:   lwz     23,-36(11)
+_restgpr_24:   lwz     24,-32(11)
+_restgpr_25:   lwz     25,-28(11)
+_restgpr_26:   lwz     26,-24(11)
+_restgpr_27:   lwz     27,-20(11)
+_restgpr_28:   lwz     28,-16(11)
+_restgpr_29:   lwz     29,-12(11)
+_restgpr_30:   lwz     30,-8(11)
+_restgpr_31:   lwz     31,-4(11)
+               blr
+
+# Routines for restoring floating point registers, called by the compiler.
+# Called with r11 pointing to the stack header word of the caller of the
+# function, just beyond the end of the floating point save area.
+# In addition to restoring the fp registers, it will return to the caller's
+# caller
+
+       .globl  _restfpr_14_x
+       .globl  _restfpr_15_x
+       .globl  _restfpr_16_x
+       .globl  _restfpr_17_x
+       .globl  _restfpr_18_x
+       .globl  _restfpr_19_x
+       .globl  _restfpr_20_x
+       .globl  _restfpr_21_x
+       .globl  _restfpr_22_x
+       .globl  _restfpr_23_x
+       .globl  _restfpr_24_x
+       .globl  _restfpr_25_x
+       .globl  _restfpr_26_x
+       .globl  _restfpr_27_x
+       .globl  _restfpr_28_x
+       .globl  _restfpr_29_x
+       .globl  _restfpr_30_x
+       .globl  _restfpr_31_x
+
+               .long   0x00600000      # traceback tag
+_restfpr_14_x: lfd     14,-144(11)     # restore fp registers
+_restfpr_15_x: lfd     15,-136(11)
+_restfpr_16_x: lfd     16,-128(11)
+_restfpr_17_x: lfd     17,-120(11)
+_restfpr_18_x: lfd     18,-112(11)
+_restfpr_19_x: lfd     19,-104(11)
+_restfpr_20_x: lfd     20,-96(11)
+_restfpr_21_x: lfd     21,-88(11)
+_restfpr_22_x: lfd     22,-80(11)
+_restfpr_23_x: lfd     23,-72(11)
+_restfpr_24_x: lfd     24,-64(11)
+_restfpr_25_x: lfd     25,-56(11)
+_restfpr_26_x: lfd     26,-48(11)
+_restfpr_27_x: lfd     27,-40(11)
+_restfpr_28_x: lfd     28,-32(11)
+_restfpr_29_x: lfd     29,-24(11)
+_restfpr_30_x: lfd     30,-16(11)
+_restfpr_31_x: lwz     0,4(11)
                lfd     31,-8(11)
                mtlr    0
                mr      1,11
                blr
+
+# Routines for restoring integer registers, called by the compiler.
+# Called with r11 pointing to the stack header word of the caller of the
+# function, just beyond the end of the integer restore area.
+
+       .globl  _restgpr_14_x
+       .globl  _restgpr_15_x
+       .globl  _restgpr_16_x
+       .globl  _restgpr_17_x
+       .globl  _restgpr_18_x
+       .globl  _restgpr_19_x
+       .globl  _restgpr_20_x
+       .globl  _restgpr_21_x
+       .globl  _restgpr_22_x
+       .globl  _restgpr_23_x
+       .globl  _restgpr_24_x
+       .globl  _restgpr_25_x
+       .globl  _restgpr_26_x
+       .globl  _restgpr_27_x
+       .globl  _restgpr_28_x
+       .globl  _restgpr_29_x
+       .globl  _restgpr_30_x
+       .globl  _restgpr_31_x
+
+               .long   0x00600000      # traceback tag
+_restgpr_14_x: lwz     14,-72(11)      # rest gp registers
+_restgpr_15_x: lwz     15,-68(11)
+_restgpr_16_x: lwz     16,-64(11)
+_restgpr_17_x: lwz     17,-60(11)
+_restgpr_18_x: lwz     18,-56(11)
+_restgpr_19_x: lwz     19,-52(11)
+_restgpr_20_x: lwz     20,-48(11)
+_restgpr_21_x: lwz     21,-44(11)
+_restgpr_22_x: lwz     22,-40(11)
+_restgpr_23_x: lwz     23,-36(11)
+_restgpr_24_x: lwz     24,-32(11)
+_restgpr_25_x: lwz     25,-28(11)
+_restgpr_26_x: lwz     26,-24(11)
+_restgpr_27_x: lwz     27,-20(11)
+_restgpr_28_x: lwz     28,-16(11)
+_restgpr_29_x: lwz     29,-12(11)
+_restgpr_30_x: lwz     30,-8(11)
+_restgpr_31_x: lwz     0,4(11)
+               lwz     31,-4(11)
+               mtlr    0
+               mr      1,11
+               blr
index 424b025..bb87a78 100644 (file)
@@ -2166,7 +2166,7 @@ rs6000_makes_calls ()
        SP----> +---------------------------------------+
                | back chain to caller                  | 0
                +---------------------------------------+
-               | saved LR                              | 4
+               | caller's saved LR                     | 4
                +---------------------------------------+
                | Parameter save area (P)               | 8
                +---------------------------------------+
@@ -2274,7 +2274,7 @@ rs6000_stack_info ()
   if (v4_call_p)
     {
       info_ptr->cr_save_offset = info_ptr->gp_save_offset - reg_size;
-      info_ptr->lr_save_offset = - info_ptr->total_size + reg_size;
+      info_ptr->lr_save_offset = reg_size;
     }
   else
     {
index 06de488..cda871b 100644 (file)
 { rtx chain = gen_reg_rtx (Pmode);
   rtx stack_bot = gen_rtx (MEM, Pmode, stack_pointer_rtx);
   rtx neg_op0;
-  rtx lr_addr = NULL_RTX;
-  rtx lr = NULL_RTX;
 
   emit_move_insn (chain, stack_bot);
 
-#ifdef TARGET_V4_CALLS
-  if (TARGET_V4_CALLS)
-    {
-      lr = gen_reg_rtx (Pmode);
-      lr_addr = gen_rtx (MEM, Pmode, gen_rtx (PLUS, Pmode,
-                                             stack_pointer_rtx,
-                                             GEN_INT (4)));
-      emit_move_insn (lr, lr_addr);
-    }
-#endif
-
   if (GET_CODE (operands[0]) != CONST_INT
       || INTVAL (operands[0]) < -32767
       || INTVAL (operands[0]) > 32768)
   else
     emit_insn (gen_movsi_update (stack_pointer_rtx, stack_pointer_rtx, neg_op0, chain));
 
-#ifdef TARGET_V4_CALLS
-  if (TARGET_V4_CALLS)
-    emit_move_insn (lr_addr, lr);
-#endif
-
   DONE;
 }")