From c8520e562eedd1e487d669fa698cf4b77a45ef39 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 29 May 2003 08:33:25 +0000 Subject: [PATCH] mips-protos.h (mips_output_load_label): Declare. * config/mips/mips-protos.h (mips_output_load_label): Declare. * config/mips/mips.c (mips_output_load_label): New function. (mips_output_conditional_branch): Use it. * config/mips/mips.md (jump): And here. From-SVN: r67220 --- gcc/ChangeLog | 7 +++++++ gcc/config/mips/mips-protos.h | 1 + gcc/config/mips/mips.c | 35 +++++++++++++++++++++++++++++++---- gcc/config/mips/mips.md | 7 ++++--- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3998831..9e31692 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-05-29 Richard Sandiford + + * config/mips/mips-protos.h (mips_output_load_label): Declare. + * config/mips/mips.c (mips_output_load_label): New function. + (mips_output_conditional_branch): Use it. + * config/mips/mips.md (jump): And here. + 2003-05-28 Bob Wilson * config/xtensa/xtensa-protos.h (smalloffset_double_mem_p): Delete. diff --git a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h index ab760ca..d74cfbc 100644 --- a/gcc/config/mips/mips-protos.h +++ b/gcc/config/mips/mips-protos.h @@ -108,6 +108,7 @@ extern void print_operand_address PARAMS ((FILE *, rtx)); extern void print_operand PARAMS ((FILE *, rtx, int)); extern struct rtx_def * embedded_pic_offset PARAMS ((rtx)); extern int build_mips16_call_stub PARAMS ((rtx, rtx, rtx, int)); +extern const char *mips_output_load_label PARAMS ((void)); extern const char *mips_output_conditional_branch PARAMS ((rtx, rtx *, int, int, int, int)); diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index b487f2b..e795a85 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -9932,6 +9932,35 @@ mips_adjust_insn_length (insn, length) return length; } + +/* Return an asm sequence to start a noat block and load the address + of a label into $1. */ + +const char * +mips_output_load_label () +{ + if (TARGET_EXPLICIT_RELOCS) + switch (mips_abi) + { + case ABI_N32: + return "%[lw\t%@,%%got_page(%0)(%+)\n\taddiu\t%@,%@,%%got_ofst(%0)"; + + case ABI_64: + return "%[ld\t%@,%%got_page(%0)(%+)\n\tdaddiu\t%@,%@,%%got_ofst(%0)"; + + default: + return "%[lw\t%@,%%got(%0)(%+)\n\taddiu\t%@,%@,%%lo(%0)"; + } + else + { + if (Pmode == DImode) + return "%[dla\t%@,%0"; + else + return "%[la\t%@,%0"; + } +} + + /* Output assembly instructions to peform a conditional branch. INSN is the branch instruction. OPERANDS[0] is the condition. @@ -10125,10 +10154,8 @@ mips_output_conditional_branch (insn, output_asm_insn ("j\t%0", &orig_target); else { - if (Pmode == DImode) - output_asm_insn ("%[dla\t%@,%0\n\tjr\t%@%]", &orig_target); - else - output_asm_insn ("%[la\t%@,%0\n\tjr\t%@%]", &orig_target); + output_asm_insn (mips_output_load_label (), &orig_target); + output_asm_insn ("jr\t%@%]", 0); } if (length != 16 && length != 28 && mips_branch_likely) diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 7fff5a3..07b629c 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -9350,10 +9350,11 @@ move\\t%0,%z4\\n\\ { if (get_attr_length (insn) <= 8) return \"%*b\\t%l0\"; - else if (Pmode == DImode) - return \"%[dla\\t%@,%l0\;%*jr\\t%@%]\"; else - return \"%[la\\t%@,%l0\;%*jr\\t%@%]\"; + { + output_asm_insn (mips_output_load_label (), operands); + return \"%*jr\\t%@%]\"; + } } else return \"%*j\\t%l0\"; -- 2.7.4