diff options
Diffstat (limited to 'sysdeps/mips/nptl/tls.h')
-rw-r--r-- | sysdeps/mips/nptl/tls.h | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/sysdeps/mips/nptl/tls.h b/sysdeps/mips/nptl/tls.h index ef11457..e69c397 100644 --- a/sysdeps/mips/nptl/tls.h +++ b/sysdeps/mips/nptl/tls.h @@ -25,6 +25,8 @@ # include <stdbool.h> # include <stddef.h> # include <stdint.h> +/* Get system call information. */ +# include <sysdep.h> /* Type for the dtv. */ typedef union dtv @@ -42,29 +44,37 @@ typedef union dtv # define READ_THREAD_POINTER() (__builtin_thread_pointer ()) #else /* Note: rd must be $v1 to be ABI-conformant. */ -# define READ_THREAD_POINTER() \ - ({ void *__result; \ - asm volatile (".set\tpush\n\t.set\tmips32r2\n\t" \ - "rdhwr\t%0, $29\n\t.set\tpop" : "=v" (__result)); \ - __result; }) +# if __mips_isa_rev >= 2 +# define READ_THREAD_POINTER() \ + ({ void *__result; \ + asm volatile ("rdhwr\t%0, $29" : "=v" (__result)); \ + __result; }) +# else +# define READ_THREAD_POINTER() \ + ({ void *__result; \ + asm volatile (".set\tpush\n\t.set\tmips32r2\n\t" \ + "rdhwr\t%0, $29\n\t.set\tpop" : "=v" (__result)); \ + __result; }) +# endif #endif #else /* __ASSEMBLER__ */ # include <tcb-offsets.h> -# define READ_THREAD_POINTER(rd) \ - .set push; \ - .set mips32r2; \ - rdhwr rd, $29; \ - .set pop +# if __mips_isa_rev >= 2 +# define READ_THREAD_POINTER(rd) rdhwr rd, $29 +# else +# define READ_THREAD_POINTER(rd) \ + .set push; \ + .set mips32r2; \ + rdhwr rd, $29; \ + .set pop +# endif #endif /* __ASSEMBLER__ */ #ifndef __ASSEMBLER__ -/* Get system call information. */ -# include <sysdep.h> - /* The TP points to the start of the thread blocks. */ # define TLS_DTV_AT_TP 1 # define TLS_TCB_AT_TP 0 |