| ; 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) |
| |