xref: /llvm-project/llvm/test/CodeGen/ARM/Windows/tls.ll (revision f36005a358472f99da74de37bbf1a3e6661694f3)
1; RUN: llc -mtriple thumbv7--windows %s -o - | FileCheck %s
2
3@i = thread_local global i32 0
4@j = external thread_local global i32
5@k = internal thread_local global i32 0
6@l = hidden thread_local global i32 0
7@m = external hidden thread_local global i32
8@n = thread_local global i16 0
9@o = thread_local global i8 0
10
11define i32 @f() {
12  %1 = load i32, i32* @i
13  ret i32 %1
14}
15
16; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
17
18; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
19; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
20; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
21
22; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
23; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
24
25; CHECK-NEXT: movw [[SLOT:r[0-9]]], :lower16:i
26; CHECK-NEXT: movt [[SLOT]], :upper16:i
27
28; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
29
30define i32 @e() {
31  %1 = load i32, i32* @j
32  ret i32 %1
33}
34
35; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
36
37; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
38; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
39; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
40
41; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
42; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
43
44; CHECK-NEXT: movw [[SLOT:r[0-9]]], :lower16:j
45; CHECK-NEXT: movt [[SLOT]], :upper16:j
46
47; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
48
49define i32 @d() {
50  %1 = load i32, i32* @k
51  ret i32 %1
52}
53
54; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
55
56; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
57; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
58; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
59
60; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
61; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
62
63; CHECK-NEXT: movw [[SLOT:r[0-9]]], :lower16:k
64; CHECK-NEXT: movt [[SLOT]], :upper16:k
65
66; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
67
68define i32 @c() {
69  %1 = load i32, i32* @l
70  ret i32 %1
71}
72
73; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
74
75; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
76; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
77; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
78
79; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
80; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
81
82; CHECK-NEXT: movw [[SLOT:r[0-9]]], :lower16:l
83; CHECK-NEXT: movt [[SLOT]], :upper16:l
84
85; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
86
87define i32 @b() {
88  %1 = load i32, i32* @m
89  ret i32 %1
90}
91
92; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
93
94; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
95; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
96; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
97
98; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
99; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
100
101; CHECK-NEXT: movw [[SLOT:r[0-9]]], :lower16:m
102; CHECK-NEXT: movt [[SLOT]], :upper16:m
103
104; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
105
106define i16 @a() {
107  %1 = load i16, i16* @n
108  ret i16 %1
109}
110
111; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
112
113; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
114; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
115; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
116
117; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
118; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
119
120; CHECK-NEXT: movw [[SLOT:r[0-9]]], :lower16:n
121; CHECK-NEXT: movt [[SLOT]], :upper16:n
122
123; CHECK-NEXT: ldrh r0, {{\[}}[[TLS]], [[SLOT]]]
124
125define i8 @Z() {
126  %1 = load i8, i8* @o
127  ret i8 %1
128}
129
130; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
131
132; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
133; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
134; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
135
136; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
137; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
138
139; CHECK-NEXT: movw [[SLOT:r[0-9]]], :lower16:o
140; CHECK-NEXT: movt [[SLOT]], :upper16:o
141
142; CHECK-NEXT: ldrb r0, {{\[}}[[TLS]], [[SLOT]]]
143
144