[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / ARM / Windows / tls.ll
blob931621a5d39305518f89a64736d06fc535ed0569
1 ; RUN: llc -mtriple thumbv7--windows-itanium %s -o - | FileCheck %s
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
11 define i32 @f() {
12   %1 = load i32, i32* @i
13   ret i32 %1
16 ; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
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 ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
22 ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
24 ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]]
26 ; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
28 ; CHECK: [[CPI]]:
29 ; CHECK-NEXT: .long i(SECREL32)
31 define i32 @e() {
32   %1 = load i32, i32* @j
33   ret i32 %1
36 ; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
38 ; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
39 ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
40 ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
41 ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
42 ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
44 ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]]
46 ; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
48 ; CHECK: [[CPI]]:
49 ; CHECK-NEXT: .long j(SECREL32)
51 define i32 @d() {
52   %1 = load i32, i32* @k
53   ret i32 %1
56 ; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
58 ; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
59 ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
60 ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
61 ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
62 ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
64 ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]]
66 ; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
68 ; CHECK: [[CPI]]:
69 ; CHECK-NEXT: .long k(SECREL32)
71 define i32 @c() {
72   %1 = load i32, i32* @l
73   ret i32 %1
76 ; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
78 ; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
79 ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
80 ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
81 ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
82 ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
84 ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]]
86 ; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
88 ; CHECK: [[CPI]]:
89 ; CHECK-NEXT: .long l(SECREL32)
91 define i32 @b() {
92   %1 = load i32, i32* @m
93   ret i32 %1
96 ; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
98 ; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
99 ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
100 ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
101 ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
102 ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
104 ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]]
106 ; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]]
108 ; CHECK: [[CPI]]:
109 ; CHECK: .long m(SECREL32)
111 define i16 @a() {
112   %1 = load i16, i16* @n
113   ret i16 %1
116 ; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
118 ; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
119 ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
120 ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
121 ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
122 ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
124 ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]]
126 ; CHECK-NEXT: ldrh r0, {{\[}}[[TLS]], [[SLOT]]]
128 ; CHECK: [[CPI]]:
129 ; CHECK: .long n(SECREL32)
131 define i8 @Z() {
132   %1 = load i8, i8* @o
133   ret i8 %1
136 ; CHECK:      mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2
138 ; CHECK:      movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index
139 ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index
140 ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], {{\[}}[[TLS_INDEX]]]
141 ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44]
142 ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2]
144 ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]]
146 ; CHECK-NEXT: ldrb r0, {{\[}}[[TLS]], [[SLOT]]]
148 ; CHECK: [[CPI]]:
149 ; CHECK-NEXT: .long o(SECREL32)