mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 11:20:07 +00:00
2ad7600be7
I've moved the MIPS port from ports to the main sysdeps hierarchy. Beyond the README update, the move of the files was simply git mv ports/sysdeps/mips sysdeps/mips git mv ports/sysdeps/unix/mips sysdeps/unix/mips git mv ports/sysdeps/unix/sysv/linux/mips sysdeps/unix/sysv/linux/mips and in addition to the ChangeLog entries here, I put a note at the top of ports/ChangeLog.mips similar to those in other files. Tested that disassembly of installed shared libraries for mips is the same before and after this patch (except for ld.so where paths in assertions are involved, as for arm). * sysdeps/mips: Move directory from ports/sysdeps/mips. * sysdeps/unix/mips: Move directory from ports/sysdeps/unix/mips. * sysdeps/unix/sysv/linux/mips: Move directory from ports/sysdeps/unix/sysv/linux/mips. * README: Update listing for mips-*-linux-gnu and mips64-*-linux-gnu. * sysdeps/mips: Move directory to ../sysdeps/mips. * sysdeps/unix/mips: Move directory to ../sysdeps/unix/mips. * sysdeps/unix/sysv/linux/mips: Move directory to ../sysdeps/unix/sysv/linux/mips.
124 lines
3.8 KiB
C
124 lines
3.8 KiB
C
/* Macros to support TLS testing in times of missing compiler support. */
|
|
|
|
#include <sys/cdefs.h>
|
|
#include <sys/asm.h>
|
|
|
|
#define __STRING2(X) __STRING(X)
|
|
#define ADDU __STRING2(PTR_ADDU)
|
|
#define ADDIU __STRING2(PTR_ADDIU)
|
|
#define LW __STRING2(PTR_L)
|
|
|
|
/* Load the GOT pointer, which may not be in $28 in a non-PIC
|
|
(abicalls pic0) function. */
|
|
#ifndef __PIC__
|
|
# if _MIPS_SIM != _ABI64
|
|
# ifndef __mips16
|
|
# define LOAD_GP "move %[tmp], $28\n\tla $28, __gnu_local_gp\n\t"
|
|
# else
|
|
# define LOAD_GP \
|
|
"li %[tmp], %%hi(__gnu_local_gp)\n\t" \
|
|
"sll %[tmp], 16\n\t" \
|
|
"addiu %[tmp], %%lo(__gnu_local_gp)\n\t"
|
|
# endif
|
|
# else
|
|
# define LOAD_GP "move %[tmp], $28\n\tdla $28, __gnu_local_gp\n\t"
|
|
# endif
|
|
# define UNLOAD_GP "\n\tmove $28, %[tmp]"
|
|
#else
|
|
/* MIPS16 (re)creates the GP value using PC-relative instructions. */
|
|
# ifdef __mips16
|
|
# define LOAD_GP \
|
|
"li %[tmp], %%hi(_gp_disp)\n\t" \
|
|
"addiu %0, $pc, %%lo(_gp_disp)\n\t" \
|
|
"sll %[tmp], 16\n\t" \
|
|
"addu %[tmp], %0\n\t"
|
|
# else
|
|
# define LOAD_GP
|
|
# endif
|
|
# define UNLOAD_GP
|
|
#endif
|
|
|
|
#ifndef __mips16
|
|
# define TLS_GD(x) \
|
|
({ void *__result, *__tmp; \
|
|
extern void *__tls_get_addr (void *); \
|
|
asm (LOAD_GP ADDIU " %0, $28, %%tlsgd(" #x ")" \
|
|
UNLOAD_GP \
|
|
: "=r" (__result), [tmp] "=&r" (__tmp)); \
|
|
(int *)__tls_get_addr (__result); })
|
|
# define TLS_LD(x) \
|
|
({ void *__result, *__tmp; \
|
|
extern void *__tls_get_addr (void *); \
|
|
asm (LOAD_GP ADDIU " %0, $28, %%tlsldm(" #x ")" \
|
|
UNLOAD_GP \
|
|
: "=r" (__result), [tmp] "=&r" (__tmp)); \
|
|
__result = __tls_get_addr (__result); \
|
|
asm ("lui $3,%%dtprel_hi(" #x ")\n\t" \
|
|
"addiu $3,$3,%%dtprel_lo(" #x ")\n\t" \
|
|
ADDU " %0,%0,$3" \
|
|
: "+r" (__result) : : "$3"); \
|
|
__result; })
|
|
# define TLS_IE(x) \
|
|
({ void *__result, *__tmp; \
|
|
asm (".set push\n\t.set mips32r2\n\t" \
|
|
"rdhwr\t%0,$29\n\t.set pop" \
|
|
: "=v" (__result)); \
|
|
asm (LOAD_GP LW " $3,%%gottprel(" #x ")($28)\n\t" \
|
|
ADDU " %0,%0,$3" \
|
|
UNLOAD_GP \
|
|
: "+r" (__result), [tmp] "=&r" (__tmp) \
|
|
: : "$3"); \
|
|
__result; })
|
|
# define TLS_LE(x) \
|
|
({ void *__result; \
|
|
asm (".set push\n\t.set mips32r2\n\t" \
|
|
"rdhwr\t%0,$29\n\t.set pop" \
|
|
: "=v" (__result)); \
|
|
asm ("lui $3,%%tprel_hi(" #x ")\n\t" \
|
|
"addiu $3,$3,%%tprel_lo(" #x ")\n\t" \
|
|
ADDU " %0,%0,$3" \
|
|
: "+r" (__result) : : "$3"); \
|
|
__result; })
|
|
|
|
#else /* __mips16 */
|
|
/* MIPS16 version. */
|
|
# define TLS_GD(x) \
|
|
({ void *__result, *__tmp; \
|
|
extern void *__tls_get_addr (void *); \
|
|
asm (LOAD_GP ADDIU " %1, %%tlsgd(" #x ")" \
|
|
"\n\tmove %0, %1" \
|
|
: "=d" (__result), [tmp] "=&d" (__tmp)); \
|
|
(int *) __tls_get_addr (__result); })
|
|
# define TLS_LD(x) \
|
|
({ void *__result, *__tmp; \
|
|
extern void *__tls_get_addr (void *); \
|
|
asm (LOAD_GP ADDIU " %1, %%tlsldm(" #x ")" \
|
|
"\n\tmove %0, %1" \
|
|
: "=d" (__result), [tmp] "=&d" (__tmp)); \
|
|
__result = __tls_get_addr (__result); \
|
|
asm ("li $3,%%dtprel_hi(" #x ")\n\t" \
|
|
"sll $3,16\n\t" \
|
|
"addiu $3,%%dtprel_lo(" #x ")\n\t" \
|
|
ADDU " %0,%0,$3" \
|
|
: "+d" (__result) : : "$3"); \
|
|
__result; })
|
|
# define TLS_IE(x) \
|
|
({ void *__result, *__tmp, *__tp; \
|
|
__tp = __builtin_thread_pointer (); \
|
|
asm (LOAD_GP LW " $3,%%gottprel(" #x ")(%1)\n\t" \
|
|
ADDU " %0,%[tp],$3" \
|
|
: "=&d" (__result), [tmp] "=&d" (__tmp) \
|
|
: [tp] "d" (__tp) : "$3"); \
|
|
__result; })
|
|
# define TLS_LE(x) \
|
|
({ void *__result, *__tp; \
|
|
__tp = __builtin_thread_pointer (); \
|
|
asm ("li $3,%%tprel_hi(" #x ")\n\t" \
|
|
"sll $3,16\n\t" \
|
|
"addiu $3,%%tprel_lo(" #x ")\n\t" \
|
|
ADDU " %0,%[tp],$3" \
|
|
: "=d" (__result) : [tp] "d" (__tp) : "$3"); \
|
|
__result; })
|
|
|
|
#endif /* __mips16 */
|