/* Macros to support TLS testing in times of missing compiler support. */ #if _MIPS_SIM != _ABI64 /* These versions are for o32 and n32. */ # define TLS_GD(x) \ ({ void *__result; \ extern void *__tls_get_addr (void *); \ __asm__ ("addiu %0, $28, %%tlsgd(" #x ")" \ : "=r" (__result)); \ (int *)__tls_get_addr (__result); }) #else # define TLS_GD(x) \ ({ void *__result; \ extern void *__tls_get_addr (void *); \ __asm__ ("daddiu %0, $28, %%tlsgd(" #x ")" \ : "=r" (__result)); \ (int *)__tls_get_addr (__result); }) #endif #if _MIPS_SIM != _ABI64 # define TLS_LD(x) \ ({ void *__result; \ extern void *__tls_get_addr (void *); \ __asm__ ("addiu %0, $28, %%tlsldm(" #x ")" \ : "=r" (__result)); \ __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; \ __asm__ (".set push\n\t.set mips32r2\n\t" \ "rdhwr\t%0,$29\n\t.set pop" \ : "=v" (__result)); \ __asm__ ("lw $3,%%gottprel(" #x ")($28)\n\t" \ "addu %0,%0,$3" \ : "+r" (__result) : : "$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 /* These versions are for n64. */ # define TLS_LD(x) \ ({ void *__result; \ extern void *__tls_get_addr (void *); \ __asm__ ("daddiu %0, $28, %%tlsldm(" #x ")" \ : "=r" (__result)); \ __result = __tls_get_addr (__result); \ __asm__ ("lui $3,%%dtprel_hi(" #x ")\n\t" \ "daddiu $3,$3,%%dtprel_lo(" #x ")\n\t" \ "daddu %0,%0,$3" \ : "+r" (__result) : : "$3"); \ __result; }) # define TLS_IE(x) \ ({ void *__result; \ __asm__ (".set push\n\t.set mips32r2\n\t" \ "rdhwr\t%0,$29\n\t.set pop" \ : "=v" (__result)); \ __asm__ ("ld $3,%%gottprel(" #x ")($28)\n\t" \ "daddu %0,%0,$3" \ : "+r" (__result) : : "$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" \ "daddiu $3,$3,%%tprel_lo(" #x ")\n\t" \ "daddu %0,%0,$3" \ : "+r" (__result) : : "$3"); \ __result; }) #endif