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; CHECK-NEXT: ldr [[TLS_POINTER:r[0-9]]], {{\[}}[[TEB]], #44] 22; CHECK-NEXT: ldr{{.w}} [[TLS:r[0-9]]], {{\[}}[[TLS_POINTER]], [[INDEX]], lsl #2] 23 24; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] 25 26; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]] 27 28; CHECK: [[CPI]]: 29; CHECK-NEXT: .long i(SECREL32) 30 31define i32 @e() { 32 %1 = load i32, i32* @j 33 ret i32 %1 34} 35 36; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 37 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] 43 44; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] 45 46; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]] 47 48; CHECK: [[CPI]]: 49; CHECK-NEXT: .long j(SECREL32) 50 51define i32 @d() { 52 %1 = load i32, i32* @k 53 ret i32 %1 54} 55 56; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 57 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] 63 64; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] 65 66; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]] 67 68; CHECK: [[CPI]]: 69; CHECK-NEXT: .long k(SECREL32) 70 71define i32 @c() { 72 %1 = load i32, i32* @l 73 ret i32 %1 74} 75 76; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 77 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] 83 84; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] 85 86; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]] 87 88; CHECK: [[CPI]]: 89; CHECK-NEXT: .long l(SECREL32) 90 91define i32 @b() { 92 %1 = load i32, i32* @m 93 ret i32 %1 94} 95 96; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 97 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] 103 104; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] 105 106; CHECK-NEXT: ldr r0, {{\[}}[[TLS]], [[SLOT]]] 107 108; CHECK: [[CPI]]: 109; CHECK: .long m(SECREL32) 110 111define i16 @a() { 112 %1 = load i16, i16* @n 113 ret i16 %1 114} 115 116; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 117 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] 123 124; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] 125 126; CHECK-NEXT: ldrh r0, {{\[}}[[TLS]], [[SLOT]]] 127 128; CHECK: [[CPI]]: 129; CHECK: .long n(SECREL32) 130 131define i8 @Z() { 132 %1 = load i8, i8* @o 133 ret i8 %1 134} 135 136; CHECK: mrc p15, #0, [[TEB:r[0-9]]], c13, c0, #2 137 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] 143 144; CHECK-NEXT: ldr [[SLOT:r[0-9]]], [[CPI:\.LCPI[0-9]+_[0-9]+]] 145 146; CHECK-NEXT: ldrb r0, {{\[}}[[TLS]], [[SLOT]]] 147 148; CHECK: [[CPI]]: 149; CHECK-NEXT: .long o(SECREL32) 150 151