about summary refs log tree commit diff
path: root/sysdeps/mips
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mips')
-rw-r--r--sysdeps/mips/dl-machine.h19
1 files changed, 16 insertions, 3 deletions
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
index a8df58efd6..d63238a4fe 100644
--- a/sysdeps/mips/dl-machine.h
+++ b/sysdeps/mips/dl-machine.h
@@ -30,6 +30,7 @@
 #endif
 
 #include <sgidefs.h>
+#include <sysdep.h>
 #include <sys/asm.h>
 #include <dl-tls.h>
 
@@ -143,9 +144,14 @@ elf_machine_load_address (void)
 #ifndef __mips16
   asm ("	.set noreorder\n"
        "	" STRINGXP (PTR_LA) " %0, 0f\n"
+# if __mips_isa_rev < 6
        "	bltzal $0, 0f\n"
        "	nop\n"
        "0:	" STRINGXP (PTR_SUBU) " %0, $31, %0\n"
+# else
+       "0:	addiupc $31, 0\n"
+       "	" STRINGXP (PTR_SUBU) " %0, $31, %0\n"
+# endif
        "	.set reorder\n"
        :	"=r" (addr)
        :	/* No inputs */
@@ -246,6 +252,13 @@ do {									\
       and not just plain _start.  */
 
 #ifndef __mips16
+# if __mips_isa_rev < 6
+#  define LCOFF STRINGXP(.Lcof2)
+#  define LOAD_31 STRINGXP(bltzal $8) "," STRINGXP(.Lcof2)
+# else
+#  define LCOFF STRINGXP(.Lcof1)
+#  define LOAD_31 "addiupc $31, 0"
+# endif
 # define RTLD_START asm (\
 	".text\n\
 	" _RTLD_PROLOGUE(ENTRY_POINT) "\
@@ -260,9 +273,9 @@ do {									\
 	move $4, $29\n\
 	" STRINGXP(PTR_SUBIU) " $29, 16\n\
 	\n\
-	" STRINGXP(PTR_LA) " $8, .Lcoff\n\
-	bltzal $8, .Lcoff\n\
-.Lcoff:	" STRINGXP(PTR_SUBU) " $8, $31, $8\n\
+	" STRINGXP(PTR_LA) " $8, " LCOFF "\n\
+.Lcof1:	" LOAD_31 "\n\
+.Lcof2:	" STRINGXP(PTR_SUBU) " $8, $31, $8\n\
 	\n\
 	" STRINGXP(PTR_LA) " $25, _dl_start\n\
 	" STRINGXP(PTR_ADDU) " $25, $8\n\