summaryrefslogtreecommitdiff
path: root/test/tls/tls-macros-xtensa.h
blob: 6b2621c221cbffa1a1501253966738c1474f5716 (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#if defined(__XTENSA_WINDOWED_ABI__)
#define TLS_GD(x)							\
  ({ int *__l;								\
     __asm__ ("movi  a8, " #x "@TLSFUNC\n\t"				\
	  "movi a10, " #x "@TLSARG\n\t"					\
	  "callx8.tls a8, " #x "@TLSCALL\n\t"				\
	  "mov %0, a10\n\t"						\
	  : "=r" (__l)							\
	  :								\
	  : "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15");	\
      __l; })

#define TLS_LD(x)							\
  ({ int *__l;								\
     __asm__ ("movi  a8, _TLS_MODULE_BASE_@TLSFUNC\n\t"			\
	  "movi a10, _TLS_MODULE_BASE_@TLSARG\n\t"			\
	  "callx8.tls a8, _TLS_MODULE_BASE_@TLSCALL\n\t"		\
	  "movi %0, " #x "@DTPOFF\n\t"					\
	  "add %0, %0, a10\n\t"						\
	  : "=r" (__l)							\
	  :								\
	  : "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15");	\
      __l; })
#elif defined(__XTENSA_CALL0_ABI__)
#ifdef __FDPIC__
#define TLS_GD(x)							\
  ({ int *__l;								\
     int __t;								\
     extern unsigned long _GLOBAL_OFFSET_TABLE_[];			\
     __asm__ ("movi	%[tmp], " #x "@GOTTLSDESC\n\t"			\
	      ".reloc	., R_XTENSA_TLS_ARG, " #x "\n\t"		\
	      "add	a2, %[tmp], %[got]\n\t"				\
	      ".reloc	., R_XTENSA_TLS_FUNCDESC, " #x "\n\t"		\
	      "l32i	%[tmp], a2, 0\n\t"				\
	      "mov	a12, a11\n\t"					\
	      ".reloc	., R_XTENSA_TLS_GOT, " #x "\n\t"		\
	      "l32i	a11, %[tmp], 4\n\t"				\
	      ".reloc	., R_XTENSA_TLS_FUNC, " #x "\n\t"		\
	      "_l32i	%[tmp], %[tmp], 0\n\t"				\
	      ".reloc	., R_XTENSA_TLS_CALL, " #x "\n\t"		\
	      "callx0	%[tmp]\n\t"					\
	      "mov	a11, a12\n\t"					\
	      "mov	%[res], a2\n\t"					\
	      : [res] "=r" (__l), [tmp] "=&r" (__t)			\
	      : [got] "r" (_GLOBAL_OFFSET_TABLE_)			\
	      : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
	      __l; })

#define TLS_LD(x)							\
  ({ int *__l;								\
     int __t;								\
     extern unsigned long _GLOBAL_OFFSET_TABLE_[];			\
     __asm__ ("movi	%[tmp], _TLS_MODULE_BASE_@GOTTLSDESC\n\t"	\
	      ".reloc	., R_XTENSA_TLS_ARG, _TLS_MODULE_BASE_\n\t"	\
	      "add	a2, %[tmp], %[got]\n\t"				\
	      ".reloc	., R_XTENSA_TLS_FUNCDESC, _TLS_MODULE_BASE_\n\t"\
	      "l32i	%[tmp], a2, 0\n\t"				\
	      "mov	a12, a11\n\t"					\
	      ".reloc	., R_XTENSA_TLS_GOT, _TLS_MODULE_BASE_\n\t"	\
	      "l32i	a11, %[tmp], 4\n\t"				\
	      ".reloc	., R_XTENSA_TLS_FUNC, _TLS_MODULE_BASE_\n\t"	\
	      "_l32i	%[tmp], %[tmp], 0\n\t"				\
	      ".reloc	., R_XTENSA_TLS_CALL, _TLS_MODULE_BASE_\n\t"	\
	      "callx0	%[tmp]\n\t"					\
	      "mov	a11, a12\n\t"					\
	      "movi	%[res], " #x "@DTPOFF\n\t"			\
	      "add	%[res], %[res], a2\n\t"				\
	      : [res] "=r" (__l), [tmp] "=&r" (__t)			\
	      : [got] "r" (_GLOBAL_OFFSET_TABLE_)			\
	      : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
	      __l; })

#define TLS_IE(x)							\
  ({ int *__l;								\
     int __t;								\
     extern unsigned long _GLOBAL_OFFSET_TABLE_[];			\
     __asm__ ("movi	%[tmp], " #x "@GOTTPOFF\n\t"			\
	      ".reloc	., R_XTENSA_TLS_TPOFF_PTR, " #x "\n\t"		\
	      "add	%[tmp], %[tmp], %[got]\n\t"			\
	      ".reloc	., R_XTENSA_TLS_TPOFF_LOAD, " #x "\n\t"		\
	      "l32i	%[tmp], %[tmp], 0\n\t"				\
	      "rur	%[res], threadptr\n\t"				\
	      "add	%[res], %[res], %[tmp]\n\t"			\
	      : [res] "=r" (__l), [tmp] "=&r" (__t)			\
	      : [got] "r" (_GLOBAL_OFFSET_TABLE_));			\
     __l; })

#define TLS_LE(x)							\
  ({ int *__l;								\
     int __t;								\
     __asm__ ("rur	%0, threadptr\n\t"				\
	      "movi	%1, " #x "@TPOFF\n\t"				\
	      "add	%0, %0, %1\n\t"					\
	      : "=r" (__l), "=r" (__t) );				\
     __l; })
#else
#define TLS_GD(x)							\
  ({ int *__l;								\
     __asm__ ("movi  a0, " #x "@TLSFUNC\n\t"				\
	  "movi a2, " #x "@TLSARG\n\t"					\
	  "callx0.tls a0, " #x "@TLSCALL\n\t"				\
	  "mov %0, a2\n\t"						\
	  : "=r" (__l)							\
	  :								\
	  : "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11");\
      __l; })

#define TLS_LD(x)							\
  ({ int *__l;								\
     __asm__ ("movi  a0, _TLS_MODULE_BASE_@TLSFUNC\n\t"			\
	  "movi a2, _TLS_MODULE_BASE_@TLSARG\n\t"			\
	  "callx0.tls a0, _TLS_MODULE_BASE_@TLSCALL\n\t"		\
	  "movi %0, " #x "@DTPOFF\n\t"					\
	  "add %0, %0, a2\n\t"						\
	  : "=r" (__l)							\
	  :								\
	  : "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11");\
      __l; })
#endif
#else
#error Unsupported Xtensa ABI
#endif

#ifndef __FDPIC__
#define TLS_IE(x) TLS_LE(x)

#define TLS_LE(x)							\
  ({ int *__l;								\
     int __t;								\
     __asm__ ("rur %0, threadptr\n\t"					\
	  "movi %1, " #x "@TPOFF\n\t"					\
	  "add %0, %0, %1\n\t"						\
	  : "=r" (__l), "=r" (__t) );					\
     __l; })
#endif