| ; RUN: llc -mtriple thumbv7--windows-itanium %s -o - | FileCheck %s | |
| @i = thread_local global i32 0 | |
| @j = external thread_local global i32 | |
| @k = internal thread_local global i32 0 | |
| @l = hidden thread_local global i32 0 | |
| @m = external hidden thread_local global i32 | |
| @n = thread_local global i16 0 | |
| @o = thread_local global i8 0 | |
| define i32 @f() { | |
| %1 = load i32, ptr @i | |
| ret i32 %1 | |
| } | |
| ; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 | |
| ; CHECK: movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index | |
| ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index | |
| ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], [[[TLS_INDEX]]] | |
| ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], [[[TEB]], #44] | |
| ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], [[[TLS_POINTER]], [[INDEX]], lsl #2] | |
| ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] | |
| ; CHECK-NEXT: ldr r0, [[[TLS]], [[SLOT]]] | |
| ; CHECK: [[CPI]]: | |
| ; CHECK-NEXT: .long i(SECREL32) | |
| define i32 @e() { | |
| %1 = load i32, ptr @j | |
| ret i32 %1 | |
| } | |
| ; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 | |
| ; CHECK: movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index | |
| ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index | |
| ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], [[[TLS_INDEX]]] | |
| ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], [[[TEB]], #44] | |
| ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], [[[TLS_POINTER]], [[INDEX]], lsl #2] | |
| ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] | |
| ; CHECK-NEXT: ldr r0, [[[TLS]], [[SLOT]]] | |
| ; CHECK: [[CPI]]: | |
| ; CHECK-NEXT: .long j(SECREL32) | |
| define i32 @d() { | |
| %1 = load i32, ptr @k | |
| ret i32 %1 | |
| } | |
| ; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 | |
| ; CHECK: movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index | |
| ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index | |
| ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], [[[TLS_INDEX]]] | |
| ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], [[[TEB]], #44] | |
| ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], [[[TLS_POINTER]], [[INDEX]], lsl #2] | |
| ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] | |
| ; CHECK-NEXT: ldr r0, [[[TLS]], [[SLOT]]] | |
| ; CHECK: [[CPI]]: | |
| ; CHECK-NEXT: .long k(SECREL32) | |
| define i32 @c() { | |
| %1 = load i32, ptr @l | |
| ret i32 %1 | |
| } | |
| ; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 | |
| ; CHECK: movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index | |
| ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index | |
| ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], [[[TLS_INDEX]]] | |
| ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], [[[TEB]], #44] | |
| ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], [[[TLS_POINTER]], [[INDEX]], lsl #2] | |
| ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] | |
| ; CHECK-NEXT: ldr r0, [[[TLS]], [[SLOT]]] | |
| ; CHECK: [[CPI]]: | |
| ; CHECK-NEXT: .long l(SECREL32) | |
| define i32 @b() { | |
| %1 = load i32, ptr @m | |
| ret i32 %1 | |
| } | |
| ; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 | |
| ; CHECK: movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index | |
| ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index | |
| ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], [[[TLS_INDEX]]] | |
| ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], [[[TEB]], #44] | |
| ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], [[[TLS_POINTER]], [[INDEX]], lsl #2] | |
| ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] | |
| ; CHECK-NEXT: ldr r0, [[[TLS]], [[SLOT]]] | |
| ; CHECK: [[CPI]]: | |
| ; CHECK: .long m(SECREL32) | |
| define i16 @a() { | |
| %1 = load i16, ptr @n | |
| ret i16 %1 | |
| } | |
| ; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 | |
| ; CHECK: movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index | |
| ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index | |
| ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], [[[TLS_INDEX]]] | |
| ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], [[[TEB]], #44] | |
| ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], [[[TLS_POINTER]], [[INDEX]], lsl #2] | |
| ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] | |
| ; CHECK-NEXT: ldrh r0, [[[TLS]], [[SLOT]]] | |
| ; CHECK: [[CPI]]: | |
| ; CHECK: .long n(SECREL32) | |
| define i8 @Z() { | |
| %1 = load i8, ptr @o | |
| ret i8 %1 | |
| } | |
| ; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 | |
| ; CHECK: movw [[TLS_INDEX:r[0-9]]], :lower16:_tls_index | |
| ; CHECK-NEXT: movt [[TLS_INDEX]], :upper16:_tls_index | |
| ; CHECK-NEXT: ldr [[INDEX:r[0-9]]], [[[TLS_INDEX]]] | |
| ; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], [[[TEB]], #44] | |
| ; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], [[[TLS_POINTER]], [[INDEX]], lsl #2] | |
| ; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] | |
| ; CHECK-NEXT: ldrb r0, [[[TLS]], [[SLOT]]] | |
| ; CHECK: [[CPI]]: | |
| ; CHECK-NEXT: .long o(SECREL32) | |