summaryrefslogtreecommitdiff
path: root/test/tls/tls-macros-metag.h
blob: 5533ecd7618dcf18f238a57bd8755f97c44df0b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define TLS_GD(x)					\
  ({ void *__result;					\
     extern void *__tls_get_addr (void *);		\
     __asm__ ("MOV %0, A1LbP\n\t"			\
	  "ADD %0, %0, #(" #x "@TLSGD)"			\
	  : "=d" (__result));				\
     (int *)__tls_get_addr (__result); })

#define TLS_LD(x)					\
  ({ void *__result;					\
     extern void *__tls_get_addr (void *);		\
     __asm__ ("MOV %0, A1LbP\n\t"			\
	  "ADD %0, %0, #(" #x "@TLSLDM)"		\
	  : "=d" (__result));				\
     __result = __tls_get_addr (__result);		\
     __asm__ ("ADDT %0,%0,#HI(" #x "@TLSLDO)\n\t"	\
	  "ADD %0,%0,#LO(" #x "@TLSLDO)"		\
	  : "+d" (__result));				\
     __result; })

#define TLS_IE(x)					\
  ({ void *__result;					\
     unsigned long __rel;				\
     extern void *__metag_load_tp (void);		\
     __asm__ ("GETD %0,[A1LbP+#(" #x "@TLSIE)]"		\
	  : "=d" (__rel));				\
     __result = __metag_load_tp();			\
     __result + __rel; })

#define TLS_LE(x)					\
  ({ void *__result;					\
     extern void *__metag_load_tp (void);		\
     __result = __metag_load_tp();			\
     __asm__ ("ADDT %0,%0,#HI(" #x "@TLSLE)\n\t"	\
	  "ADD %0,%0,#LO(" #x "@TLSLE)"			\
	  : "+d" (__result));				\
     __result; })