aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@redhat.com>2003-05-29 08:33:25 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2003-05-29 08:33:25 +0000
commitc8520e562eedd1e487d669fa698cf4b77a45ef39 (patch)
treef27432c7a64e8823b13fac7da771937ce39734ba /gcc
parent39d85b61e34fb239650e78b2e276d234902274f5 (diff)
downloadgcc-c8520e562eedd1e487d669fa698cf4b77a45ef39.zip
gcc-c8520e562eedd1e487d669fa698cf4b77a45ef39.tar.gz
gcc-c8520e562eedd1e487d669fa698cf4b77a45ef39.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/mips/mips-protos.h1
-rw-r--r--gcc/config/mips/mips.c35
-rw-r--r--gcc/config/mips/mips.md7
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 <rsandifo@redhat.com>
+
+ * 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 <bob.wilson@acm.org>
* 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\";