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