diff options
author | Richard Henderson <rth@redhat.com> | 2001-11-08 11:20:38 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-11-08 11:20:38 -0800 |
commit | c8a14e0e9aa678c6bd3eb62fe658eea8424432ba (patch) | |
tree | a78c39185ae75a11970520f0dfa0e5eae8dbe5c2 | |
parent | 8ac9ea616e01991beb4164c1a44647763d33302c (diff) | |
download | gcc-c8a14e0e9aa678c6bd3eb62fe658eea8424432ba.zip gcc-c8a14e0e9aa678c6bd3eb62fe658eea8424432ba.tar.gz gcc-c8a14e0e9aa678c6bd3eb62fe658eea8424432ba.tar.bz2 |
mips.c (save_restore_insns): Remove GP from the restore registers mask early instead of special casing it...
* config/mips/mips.c (save_restore_insns): Remove GP from the
restore registers mask early instead of special casing it inside
the loop.
From-SVN: r46853
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 85 |
2 files changed, 51 insertions, 40 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b410b51..7c5c124 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-11-08 Richard Henderson <rth@redhat.com> + + * config/mips/mips.c (save_restore_insns): Remove GP from the + restore registers mask early instead of special casing it inside + the loop. + 2001-11-08 Neil Booth <neil@daikokuya.demon.co.uk> * cp/decl.c (shadow_warning): New function. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 8fac84c..284ed92 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -6659,6 +6659,7 @@ save_restore_insns (store_p, large_reg, large_offset, file) { long mask = current_frame_info.mask; long fmask = current_frame_info.fmask; + long real_mask = mask; int regno; rtx base_reg_rtx; HOST_WIDE_INT base_offset; @@ -6671,6 +6672,12 @@ save_restore_insns (store_p, large_reg, large_offset, file) && ! BITSET_P (mask, HARD_FRAME_POINTER_REGNUM - GP_REG_FIRST)) abort (); + /* Do not restore GP under certain conditions. */ + if (! store_p + && TARGET_ABICALLS + && (mips_abi == ABI_32 || mips_abi == ABI_O64)) + mask &= ~(1 << (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST)); + if (mask == 0 && fmask == 0) return; @@ -6785,9 +6792,7 @@ save_restore_insns (store_p, large_reg, large_offset, file) if (store_p) mips_emit_frame_related_store (mem_rtx, reg_rtx, gp_offset); - else if (!TARGET_ABICALLS - || (mips_abi != ABI_32 && mips_abi != ABI_O64) - || regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST)) + else { emit_move_insn (reg_rtx, mem_rtx); if (TARGET_MIPS16 @@ -6799,50 +6804,50 @@ save_restore_insns (store_p, large_reg, large_offset, file) } else { - if (store_p || !TARGET_ABICALLS - || (mips_abi != ABI_32 && mips_abi != ABI_O64) - || regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST)) + int r = regno; + + /* The mips16 does not have an instruction to + load $31, so we load $7 instead, and work + things out in the caller. */ + if (TARGET_MIPS16 && ! store_p && r == GP_REG_FIRST + 31) + r = GP_REG_FIRST + 7; + /* The mips16 sometimes needs to save $18. */ + if (TARGET_MIPS16 + && regno != GP_REG_FIRST + 31 + && ! M16_REG_P (regno)) { - int r = regno; - - /* The mips16 does not have an instruction to - load $31, so we load $7 instead, and work - things out in the caller. */ - if (TARGET_MIPS16 && ! store_p && r == GP_REG_FIRST + 31) - r = GP_REG_FIRST + 7; - /* The mips16 sometimes needs to save $18. */ - if (TARGET_MIPS16 - && regno != GP_REG_FIRST + 31 - && ! M16_REG_P (regno)) + if (! store_p) + r = GP_REG_FIRST + 6; + else { - if (! store_p) - r = GP_REG_FIRST + 6; - else - { - r = GP_REG_FIRST + 3; - fprintf (file, "\tmove\t%s,%s\n", - reg_names[r], reg_names[regno]); - } + r = GP_REG_FIRST + 3; + fprintf (file, "\tmove\t%s,%s\n", + reg_names[r], reg_names[regno]); } - fprintf (file, "\t%s\t%s,", - (TARGET_64BIT - ? (store_p) ? "sd" : "ld" - : (store_p) ? "sw" : "lw"), - reg_names[r]); - fprintf (file, HOST_WIDE_INT_PRINT_DEC, - gp_offset - base_offset); - fprintf (file, "(%s)\n", reg_names[REGNO(base_reg_rtx)]); - if (! store_p - && TARGET_MIPS16 - && regno != GP_REG_FIRST + 31 - && ! M16_REG_P (regno)) - fprintf (file, "\tmove\t%s,%s\n", - reg_names[regno], reg_names[r]); } - + fprintf (file, "\t%s\t%s,", + (TARGET_64BIT + ? (store_p) ? "sd" : "ld" + : (store_p) ? "sw" : "lw"), + reg_names[r]); + fprintf (file, HOST_WIDE_INT_PRINT_DEC, + gp_offset - base_offset); + fprintf (file, "(%s)\n", reg_names[REGNO(base_reg_rtx)]); + if (! store_p + && TARGET_MIPS16 + && regno != GP_REG_FIRST + 31 + && ! M16_REG_P (regno)) + fprintf (file, "\tmove\t%s,%s\n", + reg_names[regno], reg_names[r]); } gp_offset -= GET_MODE_SIZE (gpr_mode); } + /* If the restore is being supressed, still take into account + the offset at which it is stored. */ + else if (BITSET_P (real_mask, regno - GP_REG_FIRST)) + { + gp_offset -= GET_MODE_SIZE (gpr_mode); + } } else base_reg_rtx = 0, base_offset = 0; |