12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- #define TLS_LE(x) \
- ({ int *__result; \
- asm ("addi %0, r23, %%tls_le(" #x ")" \
- : "=r" (__result)); \
- __result; })
- #define TLS_IE(x) \
- ({ int *__result; \
- int __tmp; \
- asm ("nextpc %0 ; " \
- "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
- "addi %1, %1, %%lo(_gp_got - 1b) ; " \
- "add %0, %0, %1 ; " \
- "ldw %1, %%tls_ie(" #x ")(%0) ; " \
- "add %1, r23, %1" \
- : "=&r" (__tmp), "=&r" (__result)); \
- __result; })
- #define TLS_LD(x) \
- ({ char *__result; \
- char *__result2; \
- int *__result3; \
- int __tmp; \
- extern void *__tls_get_addr (void *); \
- asm ("nextpc %0 ; " \
- "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
- "addi %1, %1, %%lo(_gp_got - 1b) ; " \
- "add %0, %0, %1 ; " \
- "addi %0, %0, %%tls_ldm(" #x ")" \
- : "=r" (__result), "=r" (__tmp)); \
- __result2 = (char *)__tls_get_addr (__result); \
- asm ("addi %0, %1, %%tls_ldo(" #x ")" \
- : "=r" (__result3) : "r" (__result2)); \
- __result3; })
- #define TLS_GD(x) \
- ({ int *__result; \
- int __tmp; \
- extern void *__tls_get_addr (void *); \
- asm ("nextpc %0 ; " \
- "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
- "addi %1, %1, %%lo(_gp_got - 1b) ; " \
- "add %0, %0, %1 ; " \
- "addi %0, %0, %%tls_gd(" #x ")" \
- : "=r" (__result), "=r" (__tmp)); \
- (int *)__tls_get_addr (__result); })
|