Move all files into ports/ subdirectory in preparation for merge with glibc
[glibc.git] / ports / sysdeps / arm / tls-macros.h
blobe41d3bc5aadb2ff3d1adfc30b7de5831eaf8ebee
1 #ifdef __thumb2__
2 #define ARM_PC_OFFSET "4"
3 #else
4 #define ARM_PC_OFFSET "8"
5 #endif
7 #define TLS_LE(x) \
8 ({ int *__result; \
9 void *tp = __builtin_thread_pointer (); \
10 asm ("ldr %0, 1f; " \
11 "add %0, %1, %0; " \
12 "b 2f; " \
13 ".align 2; " \
14 "1: .word " #x "(tpoff); " \
15 "2: " \
16 : "=&r" (__result) : "r" (tp)); \
17 __result; })
19 #ifdef __thumb2__
20 #define TLS_IE(x) \
21 ({ int *__result; \
22 void *tp = __builtin_thread_pointer (); \
23 asm ("ldr %0, 1f; " \
24 "3: add %0, pc, %0;" \
25 "ldr %0, [%0];" \
26 "add %0, %1, %0; " \
27 "b 2f; " \
28 ".align 2; " \
29 "1: .word " #x "(gottpoff) + (. - 3b - 4); " \
30 "2: " \
31 : "=&r" (__result) : "r" (tp)); \
32 __result; })
33 #else
34 #define TLS_IE(x) \
35 ({ int *__result; \
36 void *tp = __builtin_thread_pointer (); \
37 asm ("ldr %0, 1f; " \
38 "3: ldr %0, [pc, %0];" \
39 "add %0, %1, %0; " \
40 "b 2f; " \
41 ".align 2; " \
42 "1: .word " #x "(gottpoff) + (. - 3b - 8); " \
43 "2: " \
44 : "=&r" (__result) : "r" (tp)); \
45 __result; })
46 #endif
48 #define TLS_LD(x) \
49 ({ char *__result; \
50 int __offset; \
51 extern void *__tls_get_addr (void *); \
52 asm ("ldr %0, 2f; " \
53 "1: add %0, pc, %0; " \
54 "b 3f; " \
55 ".align 2; " \
56 "2: .word " #x "(tlsldm) + (. - 1b - "ARM_PC_OFFSET"); " \
57 "3: " \
58 : "=r" (__result)); \
59 __result = (char *)__tls_get_addr (__result); \
60 asm ("ldr %0, 1f; " \
61 "b 2f; " \
62 ".align 2; " \
63 "1: .word " #x "(tlsldo); " \
64 "2: " \
65 : "=r" (__offset)); \
66 (int *) (__result + __offset); })
68 #define TLS_GD(x) \
69 ({ int *__result; \
70 extern void *__tls_get_addr (void *); \
71 asm ("ldr %0, 2f; " \
72 "1: add %0, pc, %0; " \
73 "b 3f; " \
74 ".align 2; " \
75 "2: .word " #x "(tlsgd) + (. - 1b - "ARM_PC_OFFSET"); " \
76 "3: " \
77 : "=r" (__result)); \
78 (int *)__tls_get_addr (__result); })