From: Jeffrey A Law Date: Wed, 10 Jun 1998 09:15:39 +0000 (+0000) Subject: mips.c (gpr_mode): New variable. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bfed8dac97d8d0e53c2556d791b7806cb1e782b4;p=gcc.git mips.c (gpr_mode): New variable. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4376465c9aa..24fa34aafaf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -6,6 +6,12 @@ Wed Jun 10 08:56:27 1998 John Carr 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. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 35b4d505faf..9bda30fe40e 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -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))),