[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / PowerPC / aix-tls-gd-longlong.ll
blob47813b59ba804c2c5cf62af299fc9703b8dd4782
1 ; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec \
2 ; RUN:      -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s \
3 ; RUN:      --check-prefix=SMALL32
4 ; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec \
5 ; RUN:      -mtriple powerpc-ibm-aix-xcoff --code-model=large < %s \
6 ; RUN:      | FileCheck %s --check-prefix=LARGE32
7 ; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec \
8 ; RUN:      -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s \
9 ; RUN:      --check-prefix=SMALL64
10 ; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec \
11 ; RUN:      -mtriple powerpc64-ibm-aix-xcoff --code-model=large < %s \
12 ; RUN:      | FileCheck %s --check-prefix=LARGE64
14 @TGInit = thread_local global i64 1, align 8
15 @TWInit = weak thread_local global i64 1, align 8
16 @GInit = global i64 1, align 8
17 @TIUninit = internal thread_local global i64 0, align 8
18 @TIInit = internal thread_local global i64 1, align 8
20 ; Function Attrs: nofree norecurse nounwind willreturn writeonly
21 define void @storesTGInit(i64 %Val) #0 {
22 ; SMALL32-LABEL: storesTGInit:
23 ; SMALL32:       # %bb.0: # %entry
24 ; SMALL32-NEXT:    mflr 0
25 ; SMALL32-NEXT:    stwu 1, -32(1)
26 ; SMALL32-NEXT:    mr 6, 4
27 ; SMALL32-NEXT:    mr 7, 3
28 ; SMALL32-NEXT:    lwz 3, L..C0(2)
29 ; SMALL32-NEXT:    lwz 4, L..C1(2)
30 ; SMALL32-NEXT:    stw 0, 40(1)
31 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
32 ; SMALL32-NEXT:    stw 6, 4(3)
33 ; SMALL32-NEXT:    stw 7, 0(3)
34 ; SMALL32-NEXT:    addi 1, 1, 32
35 ; SMALL32-NEXT:    lwz 0, 8(1)
36 ; SMALL32-NEXT:    mtlr 0
37 ; SMALL32-NEXT:    blr
39 ; LARGE32-LABEL: storesTGInit:
40 ; LARGE32:       # %bb.0: # %entry
41 ; LARGE32-NEXT:    mflr 0
42 ; LARGE32-NEXT:    stwu 1, -32(1)
43 ; LARGE32-NEXT:    stw 0, 40(1)
44 ; LARGE32-NEXT:    mr 6, 4
45 ; LARGE32-NEXT:    mr 7, 3
46 ; LARGE32-NEXT:    addis 3, L..C0@u(2)
47 ; LARGE32-NEXT:    addis 4, L..C1@u(2)
48 ; LARGE32-NEXT:    lwz 3, L..C0@l(3)
49 ; LARGE32-NEXT:    lwz 4, L..C1@l(4)
50 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
51 ; LARGE32-NEXT:    stw 6, 4(3)
52 ; LARGE32-NEXT:    stw 7, 0(3)
53 ; LARGE32-NEXT:    addi 1, 1, 32
54 ; LARGE32-NEXT:    lwz 0, 8(1)
55 ; LARGE32-NEXT:    mtlr 0
56 ; LARGE32-NEXT:    blr
58 ; SMALL64-LABEL: storesTGInit:
59 ; SMALL64:       # %bb.0: # %entry
60 ; SMALL64-NEXT:    mflr 0
61 ; SMALL64-NEXT:    stdu 1, -48(1)
62 ; SMALL64-NEXT:    mr 6, 3
63 ; SMALL64-NEXT:    ld 3, L..C0(2)
64 ; SMALL64-NEXT:    ld 4, L..C1(2)
65 ; SMALL64-NEXT:    std 0, 64(1)
66 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
67 ; SMALL64-NEXT:    std 6, 0(3)
68 ; SMALL64-NEXT:    addi 1, 1, 48
69 ; SMALL64-NEXT:    ld 0, 16(1)
70 ; SMALL64-NEXT:    mtlr 0
71 ; SMALL64-NEXT:    blr
73 ; LARGE64-LABEL: storesTGInit:
74 ; LARGE64:       # %bb.0: # %entry
75 ; LARGE64-NEXT:    mflr 0
76 ; LARGE64-NEXT:    stdu 1, -48(1)
77 ; LARGE64-NEXT:    mr 6, 3
78 ; LARGE64-NEXT:    addis 3, L..C0@u(2)
79 ; LARGE64-NEXT:    addis 4, L..C1@u(2)
80 ; LARGE64-NEXT:    std 0, 64(1)
81 ; LARGE64-NEXT:    ld 3, L..C0@l(3)
82 ; LARGE64-NEXT:    ld 4, L..C1@l(4)
83 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
84 ; LARGE64-NEXT:    std 6, 0(3)
85 ; LARGE64-NEXT:    addi 1, 1, 48
86 ; LARGE64-NEXT:    ld 0, 16(1)
87 ; LARGE64-NEXT:    mtlr 0
88 ; LARGE64-NEXT:    blr
89 entry:
90   store i64 %Val, ptr @TGInit, align 8
91   ret void
94 ; Function Attrs: nofree norecurse nounwind willreturn writeonly
95 define void @storesTIUninit(i64 %Val) #0 {
96 ; SMALL32-LABEL: storesTIUninit:
97 ; SMALL32:       # %bb.0: # %entry
98 ; SMALL32-NEXT:    mflr 0
99 ; SMALL32-NEXT:    stwu 1, -32(1)
100 ; SMALL32-NEXT:    mr 6, 4
101 ; SMALL32-NEXT:    mr 7, 3
102 ; SMALL32-NEXT:    lwz 3, L..C2(2)
103 ; SMALL32-NEXT:    lwz 4, L..C3(2)
104 ; SMALL32-NEXT:    stw 0, 40(1)
105 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
106 ; SMALL32-NEXT:    stw 6, 4(3)
107 ; SMALL32-NEXT:    stw 7, 0(3)
108 ; SMALL32-NEXT:    addi 1, 1, 32
109 ; SMALL32-NEXT:    lwz 0, 8(1)
110 ; SMALL32-NEXT:    mtlr 0
111 ; SMALL32-NEXT:    blr
113 ; LARGE32-LABEL: storesTIUninit:
114 ; LARGE32:       # %bb.0: # %entry
115 ; LARGE32-NEXT:    mflr 0
116 ; LARGE32-NEXT:    stwu 1, -32(1)
117 ; LARGE32-NEXT:    stw 0, 40(1)
118 ; LARGE32-NEXT:    mr 6, 4
119 ; LARGE32-NEXT:    mr 7, 3
120 ; LARGE32-NEXT:    addis 3, L..C2@u(2)
121 ; LARGE32-NEXT:    addis 4, L..C3@u(2)
122 ; LARGE32-NEXT:    lwz 3, L..C2@l(3)
123 ; LARGE32-NEXT:    lwz 4, L..C3@l(4)
124 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
125 ; LARGE32-NEXT:    stw 6, 4(3)
126 ; LARGE32-NEXT:    stw 7, 0(3)
127 ; LARGE32-NEXT:    addi 1, 1, 32
128 ; LARGE32-NEXT:    lwz 0, 8(1)
129 ; LARGE32-NEXT:    mtlr 0
130 ; LARGE32-NEXT:    blr
132 ; SMALL64-LABEL: storesTIUninit:
133 ; SMALL64:       # %bb.0: # %entry
134 ; SMALL64-NEXT:    mflr 0
135 ; SMALL64-NEXT:    stdu 1, -48(1)
136 ; SMALL64-NEXT:    mr 6, 3
137 ; SMALL64-NEXT:    ld 3, L..C2(2)
138 ; SMALL64-NEXT:    ld 4, L..C3(2)
139 ; SMALL64-NEXT:    std 0, 64(1)
140 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
141 ; SMALL64-NEXT:    std 6, 0(3)
142 ; SMALL64-NEXT:    addi 1, 1, 48
143 ; SMALL64-NEXT:    ld 0, 16(1)
144 ; SMALL64-NEXT:    mtlr 0
145 ; SMALL64-NEXT:    blr
147 ; LARGE64-LABEL: storesTIUninit:
148 ; LARGE64:       # %bb.0: # %entry
149 ; LARGE64-NEXT:    mflr 0
150 ; LARGE64-NEXT:    stdu 1, -48(1)
151 ; LARGE64-NEXT:    mr 6, 3
152 ; LARGE64-NEXT:    addis 3, L..C2@u(2)
153 ; LARGE64-NEXT:    addis 4, L..C3@u(2)
154 ; LARGE64-NEXT:    std 0, 64(1)
155 ; LARGE64-NEXT:    ld 3, L..C2@l(3)
156 ; LARGE64-NEXT:    ld 4, L..C3@l(4)
157 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
158 ; LARGE64-NEXT:    std 6, 0(3)
159 ; LARGE64-NEXT:    addi 1, 1, 48
160 ; LARGE64-NEXT:    ld 0, 16(1)
161 ; LARGE64-NEXT:    mtlr 0
162 ; LARGE64-NEXT:    blr
163 entry:
164   store i64 %Val, ptr @TIUninit, align 8
165   ret void
168 ; Function Attrs: nofree norecurse nounwind willreturn writeonly
169 define void @storesTIInit(i64 %Val) #0 {
170 ; SMALL32-LABEL: storesTIInit:
171 ; SMALL32:       # %bb.0: # %entry
172 ; SMALL32-NEXT:    mflr 0
173 ; SMALL32-NEXT:    stwu 1, -32(1)
174 ; SMALL32-NEXT:    mr 6, 4
175 ; SMALL32-NEXT:    mr 7, 3
176 ; SMALL32-NEXT:    lwz 3, L..C4(2)
177 ; SMALL32-NEXT:    lwz 4, L..C5(2)
178 ; SMALL32-NEXT:    stw 0, 40(1)
179 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
180 ; SMALL32-NEXT:    stw 6, 4(3)
181 ; SMALL32-NEXT:    stw 7, 0(3)
182 ; SMALL32-NEXT:    addi 1, 1, 32
183 ; SMALL32-NEXT:    lwz 0, 8(1)
184 ; SMALL32-NEXT:    mtlr 0
185 ; SMALL32-NEXT:    blr
187 ; LARGE32-LABEL: storesTIInit:
188 ; LARGE32:       # %bb.0: # %entry
189 ; LARGE32-NEXT:    mflr 0
190 ; LARGE32-NEXT:    stwu 1, -32(1)
191 ; LARGE32-NEXT:    stw 0, 40(1)
192 ; LARGE32-NEXT:    mr 6, 4
193 ; LARGE32-NEXT:    mr 7, 3
194 ; LARGE32-NEXT:    addis 3, L..C4@u(2)
195 ; LARGE32-NEXT:    addis 4, L..C5@u(2)
196 ; LARGE32-NEXT:    lwz 3, L..C4@l(3)
197 ; LARGE32-NEXT:    lwz 4, L..C5@l(4)
198 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
199 ; LARGE32-NEXT:    stw 6, 4(3)
200 ; LARGE32-NEXT:    stw 7, 0(3)
201 ; LARGE32-NEXT:    addi 1, 1, 32
202 ; LARGE32-NEXT:    lwz 0, 8(1)
203 ; LARGE32-NEXT:    mtlr 0
204 ; LARGE32-NEXT:    blr
206 ; SMALL64-LABEL: storesTIInit:
207 ; SMALL64:       # %bb.0: # %entry
208 ; SMALL64-NEXT:    mflr 0
209 ; SMALL64-NEXT:    stdu 1, -48(1)
210 ; SMALL64-NEXT:    mr 6, 3
211 ; SMALL64-NEXT:    ld 3, L..C4(2)
212 ; SMALL64-NEXT:    ld 4, L..C5(2)
213 ; SMALL64-NEXT:    std 0, 64(1)
214 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
215 ; SMALL64-NEXT:    std 6, 0(3)
216 ; SMALL64-NEXT:    addi 1, 1, 48
217 ; SMALL64-NEXT:    ld 0, 16(1)
218 ; SMALL64-NEXT:    mtlr 0
219 ; SMALL64-NEXT:    blr
221 ; LARGE64-LABEL: storesTIInit:
222 ; LARGE64:       # %bb.0: # %entry
223 ; LARGE64-NEXT:    mflr 0
224 ; LARGE64-NEXT:    stdu 1, -48(1)
225 ; LARGE64-NEXT:    mr 6, 3
226 ; LARGE64-NEXT:    addis 3, L..C4@u(2)
227 ; LARGE64-NEXT:    addis 4, L..C5@u(2)
228 ; LARGE64-NEXT:    std 0, 64(1)
229 ; LARGE64-NEXT:    ld 3, L..C4@l(3)
230 ; LARGE64-NEXT:    ld 4, L..C5@l(4)
231 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
232 ; LARGE64-NEXT:    std 6, 0(3)
233 ; LARGE64-NEXT:    addi 1, 1, 48
234 ; LARGE64-NEXT:    ld 0, 16(1)
235 ; LARGE64-NEXT:    mtlr 0
236 ; LARGE64-NEXT:    blr
237 entry:
238   store i64 %Val, ptr @TIInit, align 8
239   ret void
242 ; Function Attrs: nofree norecurse nounwind willreturn writeonly
243 define void @storesTWInit(i64 %Val) #0 {
244 ; SMALL32-LABEL: storesTWInit:
245 ; SMALL32:       # %bb.0: # %entry
246 ; SMALL32-NEXT:    mflr 0
247 ; SMALL32-NEXT:    stwu 1, -32(1)
248 ; SMALL32-NEXT:    mr 6, 4
249 ; SMALL32-NEXT:    mr 7, 3
250 ; SMALL32-NEXT:    lwz 3, L..C6(2)
251 ; SMALL32-NEXT:    lwz 4, L..C7(2)
252 ; SMALL32-NEXT:    stw 0, 40(1)
253 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
254 ; SMALL32-NEXT:    stw 6, 4(3)
255 ; SMALL32-NEXT:    stw 7, 0(3)
256 ; SMALL32-NEXT:    addi 1, 1, 32
257 ; SMALL32-NEXT:    lwz 0, 8(1)
258 ; SMALL32-NEXT:    mtlr 0
259 ; SMALL32-NEXT:    blr
261 ; LARGE32-LABEL: storesTWInit:
262 ; LARGE32:       # %bb.0: # %entry
263 ; LARGE32-NEXT:    mflr 0
264 ; LARGE32-NEXT:    stwu 1, -32(1)
265 ; LARGE32-NEXT:    stw 0, 40(1)
266 ; LARGE32-NEXT:    mr 6, 4
267 ; LARGE32-NEXT:    mr 7, 3
268 ; LARGE32-NEXT:    addis 3, L..C6@u(2)
269 ; LARGE32-NEXT:    addis 4, L..C7@u(2)
270 ; LARGE32-NEXT:    lwz 3, L..C6@l(3)
271 ; LARGE32-NEXT:    lwz 4, L..C7@l(4)
272 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
273 ; LARGE32-NEXT:    stw 6, 4(3)
274 ; LARGE32-NEXT:    stw 7, 0(3)
275 ; LARGE32-NEXT:    addi 1, 1, 32
276 ; LARGE32-NEXT:    lwz 0, 8(1)
277 ; LARGE32-NEXT:    mtlr 0
278 ; LARGE32-NEXT:    blr
280 ; SMALL64-LABEL: storesTWInit:
281 ; SMALL64:       # %bb.0: # %entry
282 ; SMALL64-NEXT:    mflr 0
283 ; SMALL64-NEXT:    stdu 1, -48(1)
284 ; SMALL64-NEXT:    mr 6, 3
285 ; SMALL64-NEXT:    ld 3, L..C6(2)
286 ; SMALL64-NEXT:    ld 4, L..C7(2)
287 ; SMALL64-NEXT:    std 0, 64(1)
288 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
289 ; SMALL64-NEXT:    std 6, 0(3)
290 ; SMALL64-NEXT:    addi 1, 1, 48
291 ; SMALL64-NEXT:    ld 0, 16(1)
292 ; SMALL64-NEXT:    mtlr 0
293 ; SMALL64-NEXT:    blr
295 ; LARGE64-LABEL: storesTWInit:
296 ; LARGE64:       # %bb.0: # %entry
297 ; LARGE64-NEXT:    mflr 0
298 ; LARGE64-NEXT:    stdu 1, -48(1)
299 ; LARGE64-NEXT:    mr 6, 3
300 ; LARGE64-NEXT:    addis 3, L..C6@u(2)
301 ; LARGE64-NEXT:    addis 4, L..C7@u(2)
302 ; LARGE64-NEXT:    std 0, 64(1)
303 ; LARGE64-NEXT:    ld 3, L..C6@l(3)
304 ; LARGE64-NEXT:    ld 4, L..C7@l(4)
305 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
306 ; LARGE64-NEXT:    std 6, 0(3)
307 ; LARGE64-NEXT:    addi 1, 1, 48
308 ; LARGE64-NEXT:    ld 0, 16(1)
309 ; LARGE64-NEXT:    mtlr 0
310 ; LARGE64-NEXT:    blr
311 entry:
312   store i64 %Val, ptr @TWInit, align 8
313   ret void
316 ; Function Attrs: norecurse nounwind readonly willreturn
317 define i64 @loadsTGInit() #1 {
318 ; SMALL32-LABEL: loadsTGInit:
319 ; SMALL32:       # %bb.0: # %entry
320 ; SMALL32-NEXT:    mflr 0
321 ; SMALL32-NEXT:    stwu 1, -32(1)
322 ; SMALL32-NEXT:    lwz 3, L..C0(2)
323 ; SMALL32-NEXT:    lwz 4, L..C1(2)
324 ; SMALL32-NEXT:    stw 0, 40(1)
325 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
326 ; SMALL32-NEXT:    lwz 4, L..C8(2)
327 ; SMALL32-NEXT:    lwz 5, 4(3)
328 ; SMALL32-NEXT:    lwz 6, 4(4)
329 ; SMALL32-NEXT:    lwz 3, 0(3)
330 ; SMALL32-NEXT:    lwz 7, 0(4)
331 ; SMALL32-NEXT:    addc 4, 6, 5
332 ; SMALL32-NEXT:    adde 3, 7, 3
333 ; SMALL32-NEXT:    addi 1, 1, 32
334 ; SMALL32-NEXT:    lwz 0, 8(1)
335 ; SMALL32-NEXT:    mtlr 0
336 ; SMALL32-NEXT:    blr
338 ; LARGE32-LABEL: loadsTGInit:
339 ; LARGE32:       # %bb.0: # %entry
340 ; LARGE32-NEXT:    mflr 0
341 ; LARGE32-NEXT:    stwu 1, -32(1)
342 ; LARGE32-NEXT:    stw 0, 40(1)
343 ; LARGE32-NEXT:    addis 3, L..C0@u(2)
344 ; LARGE32-NEXT:    addis 4, L..C1@u(2)
345 ; LARGE32-NEXT:    lwz 3, L..C0@l(3)
346 ; LARGE32-NEXT:    lwz 4, L..C1@l(4)
347 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
348 ; LARGE32-NEXT:    lwz 4, 4(3)
349 ; LARGE32-NEXT:    lwz 3, 0(3)
350 ; LARGE32-NEXT:    addis 5, L..C8@u(2)
351 ; LARGE32-NEXT:    lwz 5, L..C8@l(5)
352 ; LARGE32-NEXT:    lwz 6, 4(5)
353 ; LARGE32-NEXT:    lwz 5, 0(5)
354 ; LARGE32-NEXT:    addc 4, 6, 4
355 ; LARGE32-NEXT:    adde 3, 5, 3
356 ; LARGE32-NEXT:    addi 1, 1, 32
357 ; LARGE32-NEXT:    lwz 0, 8(1)
358 ; LARGE32-NEXT:    mtlr 0
359 ; LARGE32-NEXT:    blr
361 ; SMALL64-LABEL: loadsTGInit:
362 ; SMALL64:       # %bb.0: # %entry
363 ; SMALL64-NEXT:    mflr 0
364 ; SMALL64-NEXT:    stdu 1, -48(1)
365 ; SMALL64-NEXT:    ld 3, L..C0(2)
366 ; SMALL64-NEXT:    ld 4, L..C1(2)
367 ; SMALL64-NEXT:    std 0, 64(1)
368 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
369 ; SMALL64-NEXT:    ld 4, L..C8(2)
370 ; SMALL64-NEXT:    ld 3, 0(3)
371 ; SMALL64-NEXT:    ld 4, 0(4)
372 ; SMALL64-NEXT:    add 3, 4, 3
373 ; SMALL64-NEXT:    addi 1, 1, 48
374 ; SMALL64-NEXT:    ld 0, 16(1)
375 ; SMALL64-NEXT:    mtlr 0
376 ; SMALL64-NEXT:    blr
378 ; LARGE64-LABEL: loadsTGInit:
379 ; LARGE64:       # %bb.0: # %entry
380 ; LARGE64-NEXT:    mflr 0
381 ; LARGE64-NEXT:    stdu 1, -48(1)
382 ; LARGE64-NEXT:    addis 3, L..C0@u(2)
383 ; LARGE64-NEXT:    addis 4, L..C1@u(2)
384 ; LARGE64-NEXT:    std 0, 64(1)
385 ; LARGE64-NEXT:    ld 3, L..C0@l(3)
386 ; LARGE64-NEXT:    ld 4, L..C1@l(4)
387 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
388 ; LARGE64-NEXT:    addis 4, L..C8@u(2)
389 ; LARGE64-NEXT:    ld 3, 0(3)
390 ; LARGE64-NEXT:    ld 4, L..C8@l(4)
391 ; LARGE64-NEXT:    ld 4, 0(4)
392 ; LARGE64-NEXT:    add 3, 4, 3
393 ; LARGE64-NEXT:    addi 1, 1, 48
394 ; LARGE64-NEXT:    ld 0, 16(1)
395 ; LARGE64-NEXT:    mtlr 0
396 ; LARGE64-NEXT:    blr
397 entry:
398   %0 = load i64, ptr @TGInit, align 8
399   %1 = load i64, ptr @GInit, align 8
400   %add = add nsw i64 %1, %0
401   ret i64 %add
404 ; Function Attrs: norecurse nounwind readonly willreturn
405 define i64 @loadsTIUninit() #1 {
406 ; SMALL32-LABEL: loadsTIUninit:
407 ; SMALL32:       # %bb.0: # %entry
408 ; SMALL32-NEXT:    mflr 0
409 ; SMALL32-NEXT:    stwu 1, -32(1)
410 ; SMALL32-NEXT:    lwz 3, L..C2(2)
411 ; SMALL32-NEXT:    lwz 4, L..C3(2)
412 ; SMALL32-NEXT:    stw 0, 40(1)
413 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
414 ; SMALL32-NEXT:    lwz 4, L..C8(2)
415 ; SMALL32-NEXT:    lwz 5, 4(3)
416 ; SMALL32-NEXT:    lwz 6, 4(4)
417 ; SMALL32-NEXT:    lwz 3, 0(3)
418 ; SMALL32-NEXT:    lwz 7, 0(4)
419 ; SMALL32-NEXT:    addc 4, 6, 5
420 ; SMALL32-NEXT:    adde 3, 7, 3
421 ; SMALL32-NEXT:    addi 1, 1, 32
422 ; SMALL32-NEXT:    lwz 0, 8(1)
423 ; SMALL32-NEXT:    mtlr 0
424 ; SMALL32-NEXT:    blr
426 ; LARGE32-LABEL: loadsTIUninit:
427 ; LARGE32:       # %bb.0: # %entry
428 ; LARGE32-NEXT:    mflr 0
429 ; LARGE32-NEXT:    stwu 1, -32(1)
430 ; LARGE32-NEXT:    stw 0, 40(1)
431 ; LARGE32-NEXT:    addis 3, L..C2@u(2)
432 ; LARGE32-NEXT:    addis 4, L..C3@u(2)
433 ; LARGE32-NEXT:    lwz 3, L..C2@l(3)
434 ; LARGE32-NEXT:    lwz 4, L..C3@l(4)
435 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
436 ; LARGE32-NEXT:    lwz 4, 4(3)
437 ; LARGE32-NEXT:    lwz 3, 0(3)
438 ; LARGE32-NEXT:    addis 5, L..C8@u(2)
439 ; LARGE32-NEXT:    lwz 5, L..C8@l(5)
440 ; LARGE32-NEXT:    lwz 6, 4(5)
441 ; LARGE32-NEXT:    lwz 5, 0(5)
442 ; LARGE32-NEXT:    addc 4, 6, 4
443 ; LARGE32-NEXT:    adde 3, 5, 3
444 ; LARGE32-NEXT:    addi 1, 1, 32
445 ; LARGE32-NEXT:    lwz 0, 8(1)
446 ; LARGE32-NEXT:    mtlr 0
447 ; LARGE32-NEXT:    blr
449 ; SMALL64-LABEL: loadsTIUninit:
450 ; SMALL64:       # %bb.0: # %entry
451 ; SMALL64-NEXT:    mflr 0
452 ; SMALL64-NEXT:    stdu 1, -48(1)
453 ; SMALL64-NEXT:    ld 3, L..C2(2)
454 ; SMALL64-NEXT:    ld 4, L..C3(2)
455 ; SMALL64-NEXT:    std 0, 64(1)
456 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
457 ; SMALL64-NEXT:    ld 4, L..C8(2)
458 ; SMALL64-NEXT:    ld 3, 0(3)
459 ; SMALL64-NEXT:    ld 4, 0(4)
460 ; SMALL64-NEXT:    add 3, 4, 3
461 ; SMALL64-NEXT:    addi 1, 1, 48
462 ; SMALL64-NEXT:    ld 0, 16(1)
463 ; SMALL64-NEXT:    mtlr 0
464 ; SMALL64-NEXT:    blr
466 ; LARGE64-LABEL: loadsTIUninit:
467 ; LARGE64:       # %bb.0: # %entry
468 ; LARGE64-NEXT:    mflr 0
469 ; LARGE64-NEXT:    stdu 1, -48(1)
470 ; LARGE64-NEXT:    addis 3, L..C2@u(2)
471 ; LARGE64-NEXT:    addis 4, L..C3@u(2)
472 ; LARGE64-NEXT:    std 0, 64(1)
473 ; LARGE64-NEXT:    ld 3, L..C2@l(3)
474 ; LARGE64-NEXT:    ld 4, L..C3@l(4)
475 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
476 ; LARGE64-NEXT:    addis 4, L..C8@u(2)
477 ; LARGE64-NEXT:    ld 3, 0(3)
478 ; LARGE64-NEXT:    ld 4, L..C8@l(4)
479 ; LARGE64-NEXT:    ld 4, 0(4)
480 ; LARGE64-NEXT:    add 3, 4, 3
481 ; LARGE64-NEXT:    addi 1, 1, 48
482 ; LARGE64-NEXT:    ld 0, 16(1)
483 ; LARGE64-NEXT:    mtlr 0
484 ; LARGE64-NEXT:    blr
485 entry:
486   %0 = load i64, ptr @TIUninit, align 8
487   %1 = load i64, ptr @GInit, align 8
488   %add = add nsw i64 %1, %0
489   ret i64 %add
492 ; Function Attrs: norecurse nounwind readonly willreturn
493 define i64 @loadsTIInit() #1 {
494 ; SMALL32-LABEL: loadsTIInit:
495 ; SMALL32:       # %bb.0: # %entry
496 ; SMALL32-NEXT:    mflr 0
497 ; SMALL32-NEXT:    stwu 1, -32(1)
498 ; SMALL32-NEXT:    lwz 3, L..C4(2)
499 ; SMALL32-NEXT:    lwz 4, L..C5(2)
500 ; SMALL32-NEXT:    stw 0, 40(1)
501 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
502 ; SMALL32-NEXT:    lwz 4, L..C8(2)
503 ; SMALL32-NEXT:    lwz 5, 4(3)
504 ; SMALL32-NEXT:    lwz 6, 4(4)
505 ; SMALL32-NEXT:    lwz 3, 0(3)
506 ; SMALL32-NEXT:    lwz 7, 0(4)
507 ; SMALL32-NEXT:    addc 4, 6, 5
508 ; SMALL32-NEXT:    adde 3, 7, 3
509 ; SMALL32-NEXT:    addi 1, 1, 32
510 ; SMALL32-NEXT:    lwz 0, 8(1)
511 ; SMALL32-NEXT:    mtlr 0
512 ; SMALL32-NEXT:    blr
514 ; LARGE32-LABEL: loadsTIInit:
515 ; LARGE32:       # %bb.0: # %entry
516 ; LARGE32-NEXT:    mflr 0
517 ; LARGE32-NEXT:    stwu 1, -32(1)
518 ; LARGE32-NEXT:    stw 0, 40(1)
519 ; LARGE32-NEXT:    addis 3, L..C4@u(2)
520 ; LARGE32-NEXT:    addis 4, L..C5@u(2)
521 ; LARGE32-NEXT:    lwz 3, L..C4@l(3)
522 ; LARGE32-NEXT:    lwz 4, L..C5@l(4)
523 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
524 ; LARGE32-NEXT:    lwz 4, 4(3)
525 ; LARGE32-NEXT:    lwz 3, 0(3)
526 ; LARGE32-NEXT:    addis 5, L..C8@u(2)
527 ; LARGE32-NEXT:    lwz 5, L..C8@l(5)
528 ; LARGE32-NEXT:    lwz 6, 4(5)
529 ; LARGE32-NEXT:    lwz 5, 0(5)
530 ; LARGE32-NEXT:    addc 4, 6, 4
531 ; LARGE32-NEXT:    adde 3, 5, 3
532 ; LARGE32-NEXT:    addi 1, 1, 32
533 ; LARGE32-NEXT:    lwz 0, 8(1)
534 ; LARGE32-NEXT:    mtlr 0
535 ; LARGE32-NEXT:    blr
537 ; SMALL64-LABEL: loadsTIInit:
538 ; SMALL64:       # %bb.0: # %entry
539 ; SMALL64-NEXT:    mflr 0
540 ; SMALL64-NEXT:    stdu 1, -48(1)
541 ; SMALL64-NEXT:    ld 3, L..C4(2)
542 ; SMALL64-NEXT:    ld 4, L..C5(2)
543 ; SMALL64-NEXT:    std 0, 64(1)
544 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
545 ; SMALL64-NEXT:    ld 4, L..C8(2)
546 ; SMALL64-NEXT:    ld 3, 0(3)
547 ; SMALL64-NEXT:    ld 4, 0(4)
548 ; SMALL64-NEXT:    add 3, 4, 3
549 ; SMALL64-NEXT:    addi 1, 1, 48
550 ; SMALL64-NEXT:    ld 0, 16(1)
551 ; SMALL64-NEXT:    mtlr 0
552 ; SMALL64-NEXT:    blr
554 ; LARGE64-LABEL: loadsTIInit:
555 ; LARGE64:       # %bb.0: # %entry
556 ; LARGE64-NEXT:    mflr 0
557 ; LARGE64-NEXT:    stdu 1, -48(1)
558 ; LARGE64-NEXT:    addis 3, L..C4@u(2)
559 ; LARGE64-NEXT:    addis 4, L..C5@u(2)
560 ; LARGE64-NEXT:    std 0, 64(1)
561 ; LARGE64-NEXT:    ld 3, L..C4@l(3)
562 ; LARGE64-NEXT:    ld 4, L..C5@l(4)
563 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
564 ; LARGE64-NEXT:    addis 4, L..C8@u(2)
565 ; LARGE64-NEXT:    ld 3, 0(3)
566 ; LARGE64-NEXT:    ld 4, L..C8@l(4)
567 ; LARGE64-NEXT:    ld 4, 0(4)
568 ; LARGE64-NEXT:    add 3, 4, 3
569 ; LARGE64-NEXT:    addi 1, 1, 48
570 ; LARGE64-NEXT:    ld 0, 16(1)
571 ; LARGE64-NEXT:    mtlr 0
572 ; LARGE64-NEXT:    blr
573 entry:
574   %0 = load i64, ptr @TIInit, align 8
575   %1 = load i64, ptr @GInit, align 8
576   %add = add nsw i64 %1, %0
577   ret i64 %add
580 ; Function Attrs: norecurse nounwind readonly willreturn
581 define i64 @loadsTWInit() #1 {
582 ; SMALL32-LABEL: loadsTWInit:
583 ; SMALL32:       # %bb.0: # %entry
584 ; SMALL32-NEXT:    mflr 0
585 ; SMALL32-NEXT:    stwu 1, -32(1)
586 ; SMALL32-NEXT:    lwz 3, L..C6(2)
587 ; SMALL32-NEXT:    lwz 4, L..C7(2)
588 ; SMALL32-NEXT:    stw 0, 40(1)
589 ; SMALL32-NEXT:    bla .__tls_get_addr[PR]
590 ; SMALL32-NEXT:    lwz 4, L..C8(2)
591 ; SMALL32-NEXT:    lwz 5, 4(3)
592 ; SMALL32-NEXT:    lwz 6, 4(4)
593 ; SMALL32-NEXT:    lwz 3, 0(3)
594 ; SMALL32-NEXT:    lwz 7, 0(4)
595 ; SMALL32-NEXT:    addc 4, 6, 5
596 ; SMALL32-NEXT:    adde 3, 7, 3
597 ; SMALL32-NEXT:    addi 1, 1, 32
598 ; SMALL32-NEXT:    lwz 0, 8(1)
599 ; SMALL32-NEXT:    mtlr 0
600 ; SMALL32-NEXT:    blr
602 ; LARGE32-LABEL: loadsTWInit:
603 ; LARGE32:       # %bb.0: # %entry
604 ; LARGE32-NEXT:    mflr 0
605 ; LARGE32-NEXT:    stwu 1, -32(1)
606 ; LARGE32-NEXT:    stw 0, 40(1)
607 ; LARGE32-NEXT:    addis 3, L..C6@u(2)
608 ; LARGE32-NEXT:    addis 4, L..C7@u(2)
609 ; LARGE32-NEXT:    lwz 3, L..C6@l(3)
610 ; LARGE32-NEXT:    lwz 4, L..C7@l(4)
611 ; LARGE32-NEXT:    bla .__tls_get_addr[PR]
612 ; LARGE32-NEXT:    lwz 4, 4(3)
613 ; LARGE32-NEXT:    lwz 3, 0(3)
614 ; LARGE32-NEXT:    addis 5, L..C8@u(2)
615 ; LARGE32-NEXT:    lwz 5, L..C8@l(5)
616 ; LARGE32-NEXT:    lwz 6, 4(5)
617 ; LARGE32-NEXT:    lwz 5, 0(5)
618 ; LARGE32-NEXT:    addc 4, 6, 4
619 ; LARGE32-NEXT:    adde 3, 5, 3
620 ; LARGE32-NEXT:    addi 1, 1, 32
621 ; LARGE32-NEXT:    lwz 0, 8(1)
622 ; LARGE32-NEXT:    mtlr 0
623 ; LARGE32-NEXT:    blr
625 ; SMALL64-LABEL: loadsTWInit:
626 ; SMALL64:       # %bb.0: # %entry
627 ; SMALL64-NEXT:    mflr 0
628 ; SMALL64-NEXT:    stdu 1, -48(1)
629 ; SMALL64-NEXT:    ld 3, L..C6(2)
630 ; SMALL64-NEXT:    ld 4, L..C7(2)
631 ; SMALL64-NEXT:    std 0, 64(1)
632 ; SMALL64-NEXT:    bla .__tls_get_addr[PR]
633 ; SMALL64-NEXT:    ld 4, L..C8(2)
634 ; SMALL64-NEXT:    ld 3, 0(3)
635 ; SMALL64-NEXT:    ld 4, 0(4)
636 ; SMALL64-NEXT:    add 3, 4, 3
637 ; SMALL64-NEXT:    addi 1, 1, 48
638 ; SMALL64-NEXT:    ld 0, 16(1)
639 ; SMALL64-NEXT:    mtlr 0
640 ; SMALL64-NEXT:    blr
642 ; LARGE64-LABEL: loadsTWInit:
643 ; LARGE64:       # %bb.0: # %entry
644 ; LARGE64-NEXT:    mflr 0
645 ; LARGE64-NEXT:    stdu 1, -48(1)
646 ; LARGE64-NEXT:    addis 3, L..C6@u(2)
647 ; LARGE64-NEXT:    addis 4, L..C7@u(2)
648 ; LARGE64-NEXT:    std 0, 64(1)
649 ; LARGE64-NEXT:    ld 3, L..C6@l(3)
650 ; LARGE64-NEXT:    ld 4, L..C7@l(4)
651 ; LARGE64-NEXT:    bla .__tls_get_addr[PR]
652 ; LARGE64-NEXT:    addis 4, L..C8@u(2)
653 ; LARGE64-NEXT:    ld 3, 0(3)
654 ; LARGE64-NEXT:    ld 4, L..C8@l(4)
655 ; LARGE64-NEXT:    ld 4, 0(4)
656 ; LARGE64-NEXT:    add 3, 4, 3
657 ; LARGE64-NEXT:    addi 1, 1, 48
658 ; LARGE64-NEXT:    ld 0, 16(1)
659 ; LARGE64-NEXT:    mtlr 0
660 ; LARGE64-NEXT:    blr
661 entry:
662   %0 = load i64, ptr @TWInit, align 8
663   %1 = load i64, ptr @GInit, align 8
664   %add = add nsw i64 %1, %0
665   ret i64 %add
668 ; External symbol reference checks for .__tls_get_addr
670 ; SMALL32: .extern .__tls_get_addr[PR]
671 ; SMALL64: .extern .__tls_get_addr[PR]
672 ; LARGE32: .extern .__tls_get_addr[PR]
673 ; LARGE64: .extern .__tls_get_addr[PR]
675 ; TOC entry checks
677 ; SMALL32-LABEL:        .toc
678 ; SMALL32-LABEL:  L..C0:
679 ; SMALL32-NEXT:  .tc .TGInit[TC],TGInit[TL]@m
680 ; SMALL32-LABEL:  L..C1:
681 ; SMALL32-NEXT:  .tc TGInit[TC],TGInit[TL]@gd
682 ; SMALL32-LABEL:  L..C2:
683 ; SMALL32-NEXT:  .tc .TIUninit[TC],TIUninit[UL]@m
684 ; SMALL32-LABEL:  L..C3:
685 ; SMALL32-NEXT:  .tc TIUninit[TC],TIUninit[UL]@gd
686 ; SMALL32-LABEL:  L..C4:
687 ; SMALL32-NEXT:  .tc .TIInit[TC],TIInit[TL]@m
688 ; SMALL32-LABEL:  L..C5:
689 ; SMALL32-NEXT:  .tc TIInit[TC],TIInit[TL]@gd
690 ; SMALL32-LABEL:  L..C6:
691 ; SMALL32-NEXT:  .tc .TWInit[TC],TWInit[TL]@m
692 ; SMALL32-LABEL:  L..C7:
693 ; SMALL32-NEXT:  .tc TWInit[TC],TWInit[TL]@gd
694 ; SMALL32-LABEL:  L..C8:
695 ; SMALL32-NEXT:  .tc GInit[TC],GInit[RW]
697 ; LARGE32-LABEL:  .toc
698 ; LARGE32-LABEL:  L..C0:
699 ; LARGE32-NEXT:  .tc .TGInit[TE],TGInit[TL]@m
700 ; LARGE32-LABEL:  L..C1:
701 ; LARGE32-NEXT:  .tc TGInit[TE],TGInit[TL]@gd
702 ; LARGE32-LABEL:  L..C2:
703 ; LARGE32-NEXT:  .tc .TIUninit[TE],TIUninit[UL]@m
704 ; LARGE32-LABEL:  L..C3:
705 ; LARGE32-NEXT:  .tc TIUninit[TE],TIUninit[UL]@gd
706 ; LARGE32-LABEL:  L..C4:
707 ; LARGE32-NEXT:  .tc .TIInit[TE],TIInit[TL]@m
708 ; LARGE32-LABEL:  L..C5:
709 ; LARGE32-NEXT:  .tc TIInit[TE],TIInit[TL]@gd
710 ; LARGE32-LABEL:  L..C6:
711 ; LARGE32-NEXT:  .tc .TWInit[TE],TWInit[TL]@m
712 ; LARGE32-LABEL:  L..C7:
713 ; LARGE32-NEXT:  .tc TWInit[TE],TWInit[TL]@gd
714 ; LARGE32-LABEL:  L..C8:
715 ; LARGE32-NEXT:  .tc GInit[TE],GInit[RW]
717 ; SMALL64-LABEL:  .toc
718 ; SMALL64-LABEL:  L..C0:
719 ; SMALL64-NEXT:  .tc .TGInit[TC],TGInit[TL]@m
720 ; SMALL64-LABEL:  L..C1:
721 ; SMALL64-NEXT:  .tc TGInit[TC],TGInit[TL]@gd
722 ; SMALL64-LABEL:  L..C2:
723 ; SMALL64-NEXT:  .tc .TIUninit[TC],TIUninit[UL]@m
724 ; SMALL64-LABEL:  L..C3:
725 ; SMALL64-NEXT:  .tc TIUninit[TC],TIUninit[UL]@gd
726 ; SMALL64-LABEL:  L..C4:
727 ; SMALL64-NEXT:  .tc .TIInit[TC],TIInit[TL]@m
728 ; SMALL64-LABEL:  L..C5:
729 ; SMALL64-NEXT:  .tc TIInit[TC],TIInit[TL]@gd
730 ; SMALL64-LABEL:  L..C6:
731 ; SMALL64-NEXT:  .tc .TWInit[TC],TWInit[TL]@m
732 ; SMALL64-LABEL:  L..C7:
733 ; SMALL64-NEXT:  .tc TWInit[TC],TWInit[TL]@gd
734 ; SMALL64-LABEL:  L..C8:
735 ; SMALL64-NEXT:  .tc GInit[TC],GInit[RW]
737 ; LARGE64-LABEL:  .toc
738 ; LARGE64-LABEL:  L..C0:
739 ; LARGE64-NEXT:  .tc .TGInit[TE],TGInit[TL]@m
740 ; LARGE64-LABEL:  L..C1:
741 ; LARGE64-NEXT:  .tc TGInit[TE],TGInit[TL]@gd
742 ; LARGE64-LABEL:  L..C2:
743 ; LARGE64-NEXT:  .tc .TIUninit[TE],TIUninit[UL]@m
744 ; LARGE64-LABEL:  L..C3:
745 ; LARGE64-NEXT:  .tc TIUninit[TE],TIUninit[UL]@gd
746 ; LARGE64-LABEL:  L..C4:
747 ; LARGE64-NEXT:  .tc .TIInit[TE],TIInit[TL]@m
748 ; LARGE64-LABEL:  L..C5:
749 ; LARGE64-NEXT:  .tc TIInit[TE],TIInit[TL]@gd
750 ; LARGE64-LABEL:  L..C6:
751 ; LARGE64-NEXT:  .tc .TWInit[TE],TWInit[TL]@m
752 ; LARGE64-LABEL:  L..C7:
753 ; LARGE64-NEXT:  .tc TWInit[TE],TWInit[TL]@gd
754 ; LARGE64-LABEL:  L..C8:
755 ; LARGE64-NEXT:  .tc GInit[TE],GInit[RW]
757 attributes #0 = { nofree norecurse nounwind willreturn writeonly "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="pwr4" "target-features"="-altivec,-bpermd,-crypto,-direct-move,-extdiv,-float128,-htm,-mma,-paired-vector-memops,-power10-vector,-power8-vector,-power9-vector,-spe,-vsx" }
758 attributes #1 = { norecurse nounwind readonly willreturn "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="pwr4" "target-features"="-altivec,-bpermd,-crypto,-direct-move,-extdiv,-float128,-htm,-mma,-paired-vector-memops,-power10-vector,-power8-vector,-power9-vector,-spe,-vsx" }