mips-protos.h (mips_output_load_label): Declare.
authorRichard Sandiford <rsandifo@redhat.com>
Thu, 29 May 2003 08:33:25 +0000 (08:33 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 29 May 2003 08:33:25 +0000 (08:33 +0000)
* 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
gcc/config/mips/mips-protos.h
gcc/config/mips/mips.c
gcc/config/mips/mips.md

index 3998831dc96ccc9c2e7d1c43f3ef6a4421ad4ca6..9e316929f6d67777d4260fe1b959a9dac4126f37 100644 (file)
@@ -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.
index ab760caec318515ae507a4e14ab7bc5552ae7ed8..d74cfbc57468719e1a499f317b17e9d1ee22952e 100644 (file)
@@ -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));
index b487f2b14861c3e6a4207ac68d80d28a7d6108d8..e795a85dfa0d2e9c2cf0785913f72989d7e1d433 100644 (file)
@@ -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)
index 7fff5a37aecbfbeef436b3c7a9568f54fbf24353..07b629c44ff8126510f840fd5fc9710d3d3826e4 100644 (file)
@@ -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\";