Fix bug when large stack frames (> 32k) are used, and saving both GP and FP registers.
authorMichael Meissner <meissner@gcc.gnu.org>
Sun, 6 Dec 1992 12:55:14 +0000 (12:55 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Sun, 6 Dec 1992 12:55:14 +0000 (12:55 +0000)
From-SVN: r2840

gcc/config/mips/mips.c

index 912a8eb40d36a17bc08dc5dc5ec84a224f7ac4a4..018e9ab9cdb4f8c0ad30375a356e604392250a61 100644 (file)
@@ -3914,7 +3914,7 @@ save_restore (file, gp_op, gp_2word_op, fp_op)
   unsigned long fmask    = current_frame_info.fmask;
   unsigned long gp_offset;
   unsigned long fp_offset;
-  unsigned long max_offset;
+  unsigned long min_offset;
   char *base_reg;
 
   if (mask == 0 && fmask == 0)
@@ -3923,17 +3923,17 @@ save_restore (file, gp_op, gp_2word_op, fp_op)
   base_reg   = reg_names[STACK_POINTER_REGNUM];
   gp_offset  = current_frame_info.gp_sp_offset;
   fp_offset  = current_frame_info.fp_sp_offset;
-  max_offset = (gp_offset > fp_offset) ? gp_offset : fp_offset;
+  min_offset = (gp_offset < fp_offset && mask != 0) ? gp_offset : fp_offset;
 
   /* Deal with calling functions with a large structure.  */
-  if (max_offset >= 32768)
+  if (min_offset >= 32768)
     {
       char *temp = reg_names[MIPS_TEMP2_REGNUM];
-      fprintf (file, "\tli\t%s,%ld\n", temp, max_offset);
+      fprintf (file, "\tli\t%s,%ld\n", temp, min_offset);
       fprintf (file, "\taddu\t%s,%s,%s\n", temp, temp, base_reg);
       base_reg = temp;
-      gp_offset = max_offset - gp_offset;
-      fp_offset = max_offset - fp_offset;
+      gp_offset = min_offset - gp_offset;
+      fp_offset = min_offset - fp_offset;
     }
 
   /* Save registers starting from high to low.  The debuggers prefer
@@ -3982,28 +3982,28 @@ save_restore_insns (store_p)
      int store_p;              /* true if this is prologue */
 {
   int regno;
-  rtx base_reg_rtx       = stack_pointer_rtx;
-  unsigned long mask     = current_frame_info.mask;
-  unsigned long fmask    = current_frame_info.fmask;
+  rtx base_reg_rtx             = stack_pointer_rtx;
+  unsigned long mask           = current_frame_info.mask;
+  unsigned long fmask          = current_frame_info.fmask;
   unsigned long gp_offset;
   unsigned long fp_offset;
-  unsigned long max_offset;
+  unsigned long min_offset;
 
   if (mask == 0 && fmask == 0)
     return;
 
   gp_offset  = current_frame_info.gp_sp_offset;
   fp_offset  = current_frame_info.fp_sp_offset;
-  max_offset = (gp_offset > fp_offset) ? gp_offset : fp_offset;
+  min_offset = (gp_offset < fp_offset && mask != 0) ? gp_offset : fp_offset;
 
   /* Deal with calling functions with a large structure.  */
-  if (max_offset >= 32768)
+  if (min_offset >= 32768)
     {
       base_reg_rtx = gen_rtx (REG, Pmode, MIPS_TEMP2_REGNUM);
-      emit_move_insn (base_reg_rtx, GEN_INT (max_offset));
+      emit_move_insn (base_reg_rtx, GEN_INT (min_offset));
       emit_insn (gen_addsi3 (base_reg_rtx, base_reg_rtx, stack_pointer_rtx));
-      gp_offset = max_offset - gp_offset;
-      fp_offset = max_offset - fp_offset;
+      gp_offset = min_offset - gp_offset;
+      fp_offset = min_offset - fp_offset;
     }
 
   /* Save registers starting from high to low.  The debuggers prefer