[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / emutls.ll
bloba7fbc2d8531d3e4440747d8caaa9f992eb3bee81
1 ; RUN: llc < %s -emulated-tls -mtriple=i386-linux-gnu | FileCheck -check-prefix=X86 %s
2 ; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=X64 %s
3 ; RUN: llc < %s -emulated-tls -mtriple=i386-linux-android | FileCheck -check-prefix=X86 %s
4 ; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android | FileCheck -check-prefix=X64 %s
6 ; RUN: llc < %s -mtriple=i386-linux-gnu | FileCheck -check-prefix=NoEMU %s
7 ; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=NoEMU %s
8 ; RUN: llc < %s -mtriple=i386-linux-android | FileCheck -check-prefix=X86 %s
9 ; RUN: llc < %s -mtriple=x86_64-linux-android | FileCheck -check-prefix=X64 %s
11 ; Copied from tls.ll; emulated TLS model is not implemented
12 ; for *-pc-win32 and *-pc-windows targets yet.
14 ; NoEMU-NOT: __emutls
16 ; Use my_emutls_get_address like __emutls_get_address.
17 @my_emutls_v_xyz = external global ptr, align 4
18 declare ptr @my_emutls_get_address(ptr)
20 define dso_local i32 @my_get_xyz() {
21 ; X86-LABEL: my_get_xyz:
22 ; X86:         movl $my_emutls_v_xyz, (%esp)
23 ; X86-NEXT:    calll my_emutls_get_address
24 ; X86-NEXT:    movl (%eax), %eax
25 ; X86-NEXT:    addl $12, %esp
26 ; X86-NEXT:    .cfi_def_cfa_offset 4
27 ; X86-NEXT:    retl
29 ; X64-LABEL: my_get_xyz:
30 ; X64:         movq my_emutls_v_xyz@GOTPCREL(%rip), %rdi
31 ; X64-NEXT:    callq my_emutls_get_address
32 ; X64-NEXT:    movl (%rax), %eax
33 ; X64-NEXT:    popq %rcx
34 ; X64-NEXT:    .cfi_def_cfa_offset 8
35 ; X64-NEXT:    retq
36 entry:
37   %call = call ptr @my_emutls_get_address(ptr @my_emutls_v_xyz)
38   %0 = load i32, ptr %call, align 4
39   ret i32 %0
42 @i1 = dso_local thread_local global i32 15
43 @i2 = external thread_local global i32
44 @i3 = internal thread_local global i32 15
45 @i4 = hidden thread_local global i32 15
46 @i5 = external hidden thread_local global i32
47 @s1 = dso_local thread_local global i16 15
48 @b1 = dso_local thread_local global i8 0
50 define dso_local i32 @f1() {
51 ; X86-LABEL: f1:
52 ; X86:         movl $__emutls_v.i1, (%esp)
53 ; X86-NEXT:    calll __emutls_get_address
54 ; X86-NEXT:    movl (%eax), %eax
55 ; X86-NEXT:    addl $12, %esp
56 ; X86-NEXT:    .cfi_def_cfa_offset 4
57 ; X86-NEXT:    retl
59 ; X64-LABEL: f1:
60 ; X64:         movl $__emutls_v.i1, %edi
61 ; X64-NEXT:    callq __emutls_get_address
62 ; X64-NEXT:    movl (%rax), %eax
63 ; X64-NEXT:    popq %rcx
64 ; X64-NEXT:    .cfi_def_cfa_offset 8
65 ; X64-NEXT:    retq
66 entry:
67   %tmp1 = load i32, ptr @i1
68   ret i32 %tmp1
71 define dso_local ptr @f2() {
72 ; X86-LABEL: f2:
73 ; X86:         movl $__emutls_v.i1, (%esp)
74 ; X86-NEXT:    calll __emutls_get_address
75 ; X86-NEXT:    addl $12, %esp
76 ; X86-NEXT:    .cfi_def_cfa_offset 4
77 ; X86-NEXT:    retl
79 ; X64-LABEL: f2:
80 ; X64:         movl $__emutls_v.i1, %edi
81 ; X64-NEXT:    callq __emutls_get_address
82 ; X64-NEXT:    popq %rcx
83 ; X64-NEXT:    .cfi_def_cfa_offset 8
84 ; X64-NEXT:    retq
85 entry:
86   ret ptr @i1
89 define dso_local i32 @f3() nounwind {
90 ; X86-LABEL: f3:
91 ; X86:         movl $__emutls_v.i2, (%esp)
92 ; X86-NEXT:    calll __emutls_get_address
93 ; X86-NEXT:    movl (%eax), %eax
94 ; X86-NEXT:    addl $12, %esp
95 ; X86-NEXT:    retl
96 entry:
97   %tmp1 = load i32, ptr @i2
98   ret i32 %tmp1
101 define dso_local ptr @f4() {
102 ; X86-LABEL: f4:
103 ; X86:         movl $__emutls_v.i2, (%esp)
104 ; X86-NEXT:    calll __emutls_get_address
105 ; X86-NEXT:    addl $12, %esp
106 ; X86-NEXT:    .cfi_def_cfa_offset 4
107 ; X86-NEXT:    retl
108 entry:
109   ret ptr @i2
112 define dso_local i32 @f5() nounwind {
113 ; X86-LABEL: f5:
114 ; X86:         movl $__emutls_v.i3, (%esp)
115 ; X86-NEXT:    calll __emutls_get_address
116 ; X86-NEXT:    movl (%eax), %eax
117 ; X86-NEXT:    addl $12, %esp
118 ; X86-NEXT:    retl
119 entry:
120   %tmp1 = load i32, ptr @i3
121   ret i32 %tmp1
124 define dso_local ptr @f6() {
125 ; X86-LABEL: f6:
126 ; X86:         movl $__emutls_v.i3, (%esp)
127 ; X86-NEXT:    calll __emutls_get_address
128 ; X86-NEXT:    addl $12, %esp
129 ; X86-NEXT:    .cfi_def_cfa_offset 4
130 ; X86-NEXT:    retl
131 entry:
132   ret ptr @i3
135 define dso_local i32 @f7() {
136 ; X86-LABEL: f7:
137 ; X86:         movl $__emutls_v.i4, (%esp)
138 ; X86-NEXT:    calll __emutls_get_address
139 ; X86-NEXT:    movl (%eax), %eax
140 ; X86-NEXT:    addl $12, %esp
141 ; X86-NEXT:    .cfi_def_cfa_offset 4
142 ; X86-NEXT:    retl
143 entry:
144   %tmp1 = load i32, ptr @i4
145   ret i32 %tmp1
148 define dso_local ptr @f8() {
149 ; X86-LABEL: f8:
150 ; X86:         movl $__emutls_v.i4, (%esp)
151 ; X86-NEXT:    calll __emutls_get_address
152 ; X86-NEXT:    addl $12, %esp
153 ; X86-NEXT:    .cfi_def_cfa_offset 4
154 ; X86-NEXT:    retl
155 entry:
156   ret ptr @i4
159 define dso_local i32 @f9() {
160 ; X86-LABEL: f9:
161 ; X86:         movl $__emutls_v.i5, (%esp)
162 ; X86-NEXT:    calll __emutls_get_address
163 ; X86-NEXT:    movl (%eax), %eax
164 ; X86-NEXT:    addl $12, %esp
165 ; X86-NEXT:    .cfi_def_cfa_offset 4
166 ; X86-NEXT:    retl
167 entry:
168   %tmp1 = load i32, ptr @i5
169   ret i32 %tmp1
172 define dso_local ptr @f10() {
173 ; X86-LABEL: f10:
174 ; X86:         movl $__emutls_v.i5, (%esp)
175 ; X86-NEXT:    calll __emutls_get_address
176 ; X86-NEXT:    addl $12, %esp
177 ; X86-NEXT:    .cfi_def_cfa_offset 4
178 ; X86-NEXT:    retl
179 entry:
180   ret ptr @i5
183 define dso_local i16 @f11() {
184 ; X86-LABEL: f11:
185 ; X86:         movl $__emutls_v.s1, (%esp)
186 ; X86-NEXT:    calll __emutls_get_address
187 ; X86-NEXT:    movzwl (%eax), %eax
188 ; X86-NEXT:    addl $12, %esp
189 ; X86-NEXT:    .cfi_def_cfa_offset 4
190 ; X86-NEXT:    retl
191 entry:
192   %tmp1 = load i16, ptr @s1
193   ret i16 %tmp1
196 define dso_local i32 @f12() {
197 ; X86-LABEL: f12:
198 ; X86:         movl $__emutls_v.s1, (%esp)
199 ; X86-NEXT:    calll __emutls_get_address
200 ; X86-NEXT:    movswl (%eax), %eax
201 ; X86-NEXT:    addl $12, %esp
202 ; X86-NEXT:    .cfi_def_cfa_offset 4
203 ; X86-NEXT:    retl
204 entry:
205   %tmp1 = load i16, ptr @s1
206   %tmp2 = sext i16 %tmp1 to i32
207   ret i32 %tmp2
210 define dso_local i8 @f13() {
211 ; X86-LABEL: f13:
212 ; X86:         movl $__emutls_v.b1, (%esp)
213 ; X86-NEXT:    calll __emutls_get_address
214 ; X86-NEXT:    movzbl (%eax), %eax
215 ; X86-NEXT:    addl $12, %esp
216 ; X86-NEXT:    .cfi_def_cfa_offset 4
217 ; X86-NEXT:    retl
218 entry:
219   %tmp1 = load i8, ptr @b1
220   ret i8 %tmp1
223 define dso_local i32 @f14() {
224 ; X86-LABEL: f14:
225 ; X86:         movl $__emutls_v.b1, (%esp)
226 ; X86-NEXT:    calll __emutls_get_address
227 ; X86-NEXT:    movsbl (%eax), %eax
228 ; X86-NEXT:    addl $12, %esp
229 ; X86-NEXT:    .cfi_def_cfa_offset 4
230 ; X86-NEXT:    retl
231 entry:
232   %tmp1 = load i8, ptr @b1
233   %tmp2 = sext i8 %tmp1 to i32
234   ret i32 %tmp2
237 ;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t.
239 ; X86-LABEL: __emutls_v.i1:
240 ; X86-NEXT: .long 4
241 ; X86-NEXT: .long 4
242 ; X86-NEXT: .long 0
243 ; X86-NEXT: .long __emutls_t.i1
245 ; X86-LABEL: __emutls_t.i1:
246 ; X86-NEXT: .long 15
248 ; X86-NOT:   __emutls_v.i2
250 ; X86-LABEL: __emutls_v.i3:
251 ; X86-NEXT: .long 4
252 ; X86-NEXT: .long 4
253 ; X86-NEXT: .long 0
254 ; X86-NEXT: .long __emutls_t.i3
256 ; X86-LABEL: __emutls_t.i3:
257 ; X86-NEXT: .long 15
259 ; X86-LABEL: __emutls_v.i4:
260 ; X86-NEXT: .long 4
261 ; X86-NEXT: .long 4
262 ; X86-NEXT: .long 0
263 ; X86-NEXT: .long __emutls_t.i4
265 ; X86-LABEL: __emutls_t.i4:
266 ; X86-NEXT: .long 15
268 ; X86-NOT:   __emutls_v.i5:
269 ; X86:      .hidden __emutls_v.i5
270 ; X86-NOT:   __emutls_v.i5:
272 ; X86-LABEL: __emutls_v.s1:
273 ; X86-NEXT: .long 2
274 ; X86-NEXT: .long 2
275 ; X86-NEXT: .long 0
276 ; X86-NEXT: .long __emutls_t.s1
278 ; X86-LABEL: __emutls_t.s1:
279 ; X86-NEXT: .short 15
281 ; X86-LABEL: __emutls_v.b1:
282 ; X86-NEXT: .long 1
283 ; X86-NEXT: .long 1
284 ; X86-NEXT: .long 0
285 ; X86-NEXT: .long 0
287 ; X86-NOT:   __emutls_t.b1
289 ;;;;;;;;;;;;;; 64-bit __emutls_v. and __emutls_t.
291 ; X64-LABEL: __emutls_v.i1:
292 ; X64-NEXT: .quad 4
293 ; X64-NEXT: .quad 4
294 ; X64-NEXT: .quad 0
295 ; X64-NEXT: .quad __emutls_t.i1
297 ; X64-LABEL: __emutls_t.i1:
298 ; X64-NEXT: .long 15
300 ; X64-NOT:   __emutls_v.i2
302 ; X64-LABEL: __emutls_v.i3:
303 ; X64-NEXT: .quad 4
304 ; X64-NEXT: .quad 4
305 ; X64-NEXT: .quad 0
306 ; X64-NEXT: .quad __emutls_t.i3
308 ; X64-LABEL: __emutls_t.i3:
309 ; X64-NEXT: .long 15
311 ; X64-LABEL: __emutls_v.i4:
312 ; X64-NEXT: .quad 4
313 ; X64-NEXT: .quad 4
314 ; X64-NEXT: .quad 0
315 ; X64-NEXT: .quad __emutls_t.i4
317 ; X64-LABEL: __emutls_t.i4:
318 ; X64-NEXT: .long 15
320 ; X64-NOT:   __emutls_v.i5:
321 ; X64:      .hidden __emutls_v.i5
322 ; X64-NOT:   __emutls_v.i5:
324 ; X64-LABEL: __emutls_v.s1:
325 ; X64-NEXT: .quad 2
326 ; X64-NEXT: .quad 2
327 ; X64-NEXT: .quad 0
328 ; X64-NEXT: .quad __emutls_t.s1
330 ; X64-LABEL: __emutls_t.s1:
331 ; X64-NEXT: .short 15
333 ; X64-LABEL: __emutls_v.b1:
334 ; X64-NEXT: .quad 1
335 ; X64-NEXT: .quad 1
336 ; X64-NEXT: .quad 0
337 ; X64-NEXT: .quad 0
339 ; X64-NOT:  __emutls_t.b1