1; RUN: llc -mtriple thumbv7--windows-itanium %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: ldr [[SLOT:r[0-9]]], [[CPI:LCPI[0-9]+_[0-9]+]]
26
27; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
28
29; CHECK: [[CPI]]:
30; CHECK-NEXT: .long i(SECREL32)
31
32define i32 @e() {
33  %1 = load i32, i32* @j
34  ret i32 %1
35}
36
37; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
38
39; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
40; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
41; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
42
43; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
44; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
45
46; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:LCPI[0-9]+_[0-9]+]]
47
48; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
49
50; CHECK: [[CPI]]:
51; CHECK-NEXT: .long j(SECREL32)
52
53define i32 @d() {
54  %1 = load i32, i32* @k
55  ret i32 %1
56}
57
58; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
59
60; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
61; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
62; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
63
64; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
65; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
66
67; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:LCPI[0-9]+_[0-9]+]]
68
69; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
70
71; CHECK: [[CPI]]:
72; CHECK-NEXT: .long k(SECREL32)
73
74define i32 @c() {
75  %1 = load i32, i32* @l
76  ret i32 %1
77}
78
79; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
80
81; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
82; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
83; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
84
85; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
86; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
87
88; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:LCPI[0-9]+_[0-9]+]]
89
90; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
91
92; CHECK: [[CPI]]:
93; CHECK-NEXT: .long l(SECREL32)
94
95define i32 @b() {
96  %1 = load i32, i32* @m
97  ret i32 %1
98}
99
100; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
101
102; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
103; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
104; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
105
106; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
107; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
108
109; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:LCPI[0-9]+_[0-9]+]]
110
111; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
112
113; CHECK: [[CPI]]:
114; CHECK: .long m(SECREL32)
115
116define i16 @a() {
117  %1 = load i16, i16* @n
118  ret i16 %1
119}
120
121; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
122
123; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
124; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
125; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
126
127; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
128; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
129
130; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:LCPI[0-9]+_[0-9]+]]
131
132; CHECK-NEXT: ldrh r0, {{\[}}[[TLS]], [[SLOT]]]
133
134; CHECK: [[CPI]]:
135; CHECK: .long n(SECREL32)
136
137define i8 @Z() {
138  %1 = load i8, i8* @o
139  ret i8 %1
140}
141
142; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
143
144; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
145; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
146; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
147
148; CHECK:      ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
149; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
150
151; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:LCPI[0-9]+_[0-9]+]]
152
153; CHECK-NEXT: ldrb r0, {{\[}}[[TLS]], [[SLOT]]]
154
155; CHECK: [[CPI]]:
156; CHECK-NEXT: .long o(SECREL32)
157
158