mips.c (gpr_mode): New variable.
authorJeffrey A Law <law@cygnus.com>
Wed, 10 Jun 1998 09:15:39 +0000 (09:15 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 10 Jun 1998 09:15:39 +0000 (03:15 -0600)
        * mips.c (gpr_mode): New variable.
        (override_options): Initialize gpr_mode.
        (compute_frame_size): Use "gpr_mode" instead of "word_mode" to
        determine size and offset of general purpose registers save slots.
        (save_restore_insns, mips_expand_prologue): Similarly.

From-SVN: r20403

gcc/ChangeLog
gcc/config/mips/mips.c

index 4376465c9aae8b1e501608b9f2633d2e88a9ca2a..24fa34aafafe95d8ed2efa19eeefc203ddb07134 100644 (file)
@@ -6,6 +6,12 @@ Wed Jun 10 08:56:27 1998  John Carr  <jfc@mit.edu>
 
 Wed Jun 10 02:11:55 1998  Jeffrey A Law  (law@cygnus.com)
 
+       * mips.c (gpr_mode): New variable.
+       (override_options): Initialize gpr_mode.
+       (compute_frame_size): Use "gpr_mode" instead of "word_mode" to
+       determine size and offset of general purpose registers save slots.
+       (save_restore_insns, mips_expand_prologue): Similarly.
+
        * reload.c (find_reloads_toplev): Use gen_lowpart common to convert
        between constant representations when we have (SUBREG (REG)) with
        REG equivalent to a constant.
index 35b4d505faf8fe488eebff207bfe5729f130cd00..9bda30fe40efd227794a5082403d977e8c5d70ce 100644 (file)
@@ -244,6 +244,9 @@ enum mips_abicalls_type mips_abicalls;
    initialized in override_options.  */
 REAL_VALUE_TYPE dfhigh, dflow, sfhigh, sflow;
 
+/* Mode used for saving/restoring general purpose registers.  */
+static static enum machine_mode gpr_mode;
+
 /* Array giving truth value on whether or not a given hard register
    can support a given mode.  */
 char mips_hard_regno_mode_ok[(int)MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
@@ -4449,6 +4452,9 @@ override_options ()
          mips_hard_regno_mode_ok[(int)mode][regno] = temp;
        }
     }
+
+  /* Save GPR registers in word_mode sized hunks.  */
+  gpr_mode = word_mode;
 }
 
 /* On the mips16, we want to allocate $24 (T_REG) before other
@@ -5495,7 +5501,7 @@ compute_frame_size (size)
                  || (GET_MODE_SIZE (DECL_MODE (DECL_RESULT (current_function_decl)))
                      <= 4))))
        {
-         gp_reg_size += UNITS_PER_WORD;
+         gp_reg_size += GET_MODE_SIZE (gpr_mode);
          mask |= 1L << (regno - GP_REG_FIRST);
 
          /* The entry and exit pseudo instructions can not save $17
@@ -5582,9 +5588,10 @@ compute_frame_size (size)
          top of the stack.  */
       if (! mips_entry)
        offset = (args_size + extra_size + var_size
-                 + gp_reg_size - UNITS_PER_WORD);
+                 + gp_reg_size - GET_MODE_SIZE (gpr_mode));
       else
-       offset = total_size - UNITS_PER_WORD;
+       offset = total_size - GET_MODE_SIZE (gpr_mode);
+
       current_frame_info.gp_sp_offset = offset;
       current_frame_info.gp_save_offset = offset - total_size;
     }
@@ -5660,7 +5667,8 @@ save_restore_insns (store_p, large_reg, large_offset, file)
 
       gp_offset = current_frame_info.gp_sp_offset;
       end_offset
-       = gp_offset - (current_frame_info.gp_reg_size - UNITS_PER_WORD);
+       = gp_offset - (current_frame_info.gp_reg_size
+                      - GET_MODE_SIZE (gpr_mode));
 
       if (gp_offset < 0 || end_offset < 0)
        fatal ("gp_offset (%ld) or end_offset (%ld) is less than zero.",
@@ -5771,7 +5779,7 @@ save_restore_insns (store_p, large_reg, large_offset, file)
              {
                rtx reg_rtx;
                rtx mem_rtx
-                 = gen_rtx (MEM, word_mode,
+                 = gen_rtx (MEM, gpr_mode,
                             gen_rtx (PLUS, Pmode, base_reg_rtx,
                                      GEN_INT (gp_offset - base_offset)));
 
@@ -5781,23 +5789,23 @@ save_restore_insns (store_p, large_reg, large_offset, file)
                    $31, so we load $7 instead, and work things out
                    in the caller.  */
                if (TARGET_MIPS16 && ! store_p && regno == GP_REG_FIRST + 31)
-                 reg_rtx = gen_rtx (REG, word_mode, GP_REG_FIRST + 7);
+                 reg_rtx = gen_rtx (REG, gpr_mode, GP_REG_FIRST + 7);
                /* The mips16 sometimes needs to save $18.  */
                else if (TARGET_MIPS16
                         && regno != GP_REG_FIRST + 31
                         && ! M16_REG_P (regno))
                  {
                    if (! store_p)
-                     reg_rtx = gen_rtx (REG, word_mode, 6);
+                     reg_rtx = gen_rtx (REG, gpr_mode, 6);
                    else
                      {
-                       reg_rtx = gen_rtx (REG, word_mode, 3);
+                       reg_rtx = gen_rtx (REG, gpr_mode, 3);
                        emit_move_insn (reg_rtx,
-                                       gen_rtx (REG, word_mode, regno));
+                                       gen_rtx (REG, gpr_mode, regno));
                      }
                  }
                else
-                 reg_rtx = gen_rtx (REG, word_mode, regno);
+                 reg_rtx = gen_rtx (REG, gpr_mode, regno);
 
                if (store_p)
                  {
@@ -5811,7 +5819,7 @@ save_restore_insns (store_p, large_reg, large_offset, file)
                    if (TARGET_MIPS16
                        && regno != GP_REG_FIRST + 31
                        && ! M16_REG_P (regno))
-                     emit_move_insn (gen_rtx (REG, word_mode, regno),
+                     emit_move_insn (gen_rtx (REG, gpr_mode, regno),
                                      reg_rtx);
                  }
              }
@@ -5857,7 +5865,7 @@ save_restore_insns (store_p, large_reg, large_offset, file)
                  }
 
              }
-           gp_offset -= UNITS_PER_WORD;
+           gp_offset -= GET_MODE_SIZE (gpr_mode);
          }
     }
   else
@@ -6331,9 +6339,10 @@ mips_expand_prologue ()
        {
          if (offset != 0)
            ptr = gen_rtx (PLUS, Pmode, stack_pointer_rtx, GEN_INT (offset));
-         emit_move_insn (gen_rtx (MEM, word_mode, ptr),
-                         gen_rtx (REG, word_mode, regno));
-         offset += UNITS_PER_WORD;
+         emit_move_insn (gen_rtx (MEM, gpr_mode, ptr),
+                         gen_rtx (REG, gpr_mode, regno));
+
+         offset += GET_MODE_SIZE (gpr_mode);
        }
     }
 
@@ -6378,7 +6387,7 @@ mips_expand_prologue ()
         moment.  */
       if (TARGET_MIPS16 && BITSET_P (current_frame_info.mask, 18))
        {
-         rtx reg_rtx = gen_rtx (REG, word_mode, GP_REG_FIRST + 3);
+         rtx reg_rtx = gen_rtx (REG, gpr_mode, GP_REG_FIRST + 3);
          long gp_offset, base_offset;
 
          gp_offset = current_frame_info.gp_sp_offset;
@@ -6394,8 +6403,8 @@ mips_expand_prologue ()
            base_offset = 0;
          start_sequence ();
          emit_move_insn (reg_rtx,
-                         gen_rtx (REG, word_mode, GP_REG_FIRST + 18));
-         emit_move_insn (gen_rtx (MEM, word_mode,
+                         gen_rtx (REG, gpr_mode, GP_REG_FIRST + 18));
+         emit_move_insn (gen_rtx (MEM, gpr_mode,
                                   gen_rtx (PLUS, Pmode, stack_pointer_rtx,
                                            GEN_INT (gp_offset
                                                     - base_offset))),