1; Test each TLS size option 2; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -tls-size=12 < %s | FileCheck %s --check-prefix=CHECK-12 3; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -tls-size=12 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-12-RELOC %s 4; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=tiny -tls-size=24 < %s | FileCheck %s --check-prefix=CHECK-24 5; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=tiny -tls-size=24 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s 6; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=small -tls-size=32 < %s | FileCheck %s --check-prefix=CHECK-32 7; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=small -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s 8; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=large -tls-size=48 < %s | FileCheck %s --check-prefix=CHECK-48 9; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=large -tls-size=48 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-48-RELOC %s 10; 11; Test the maximum TLS size for each code model (fallback to a smaller size from the specified size) 12; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -tls-size=32 < %s | FileCheck %s --check-prefix=CHECK-32 13; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s 14; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=tiny -tls-size=32 < %s | FileCheck %s --check-prefix=CHECK-24 15; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=tiny -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s 16; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=small -tls-size=48 < %s | FileCheck %s --check-prefix=CHECK-32 17; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=small -tls-size=48 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s 18; 19; Test the default TLS size for each code model 20; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding < %s | FileCheck --check-prefix=CHECK-24 %s 21; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s 22; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=tiny < %s | FileCheck %s --check-prefix=CHECK-24 23; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=tiny | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s 24; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=small < %s | FileCheck %s --check-prefix=CHECK-24 25; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=small | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s 26; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=large < %s | FileCheck %s --check-prefix=CHECK-24 27; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=large | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s 28 29@local_exec_var = thread_local(localexec) global i32 0 30 31define i32 @test_local_exec() { 32; CHECK-LABEL: test_local_exec: 33 %val = load i32, ptr @local_exec_var 34 35; CHECK-12: mrs x[[R1:[0-9]+]], TPIDR_EL0 36; CHECK-12: add x[[R2:[0-9]+]], x[[R1]], :tprel_lo12:local_exec_var 37; CHECK-12: ldr w0, [x[[R2]]] 38 39; CHECK-12-RELOC: R_AARCH64_TLSLE_ADD_TPREL_LO12 40 41; CHECK-24: mrs x[[R1:[0-9]+]], TPIDR_EL0 42; CHECK-24: add x[[R2:[0-9]+]], x[[R1]], :tprel_hi12:local_exec_var 43; CHECK-24: add x[[R3:[0-9]+]], x[[R2]], :tprel_lo12_nc:local_exec_var 44; CHECK-24: ldr w0, [x[[R3]]] 45 46; CHECK-24-RELOC: R_AARCH64_TLSLE_ADD_TPREL_HI12 47; CHECK-24-RELOC: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 48 49; CHECK-32: movz x[[R2:[0-9]+]], #:tprel_g1:local_exec_var 50; CHECK-32: mrs x[[R1:[0-9]+]], TPIDR_EL0 51; CHECK-32: movk x[[R2]], #:tprel_g0_nc:local_exec_var 52; CHECK-32: ldr w0, [x[[R1]], x[[R2]]] 53 54; CHECK-32-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G1 55; CHECK-32-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 56 57; CHECK-48: movz x[[R2:[0-9]+]], #:tprel_g2:local_exec_var 58; CHECK-48: mrs x[[R1:[0-9]+]], TPIDR_EL0 59; CHECK-48: movk x[[R2]], #:tprel_g1_nc:local_exec_var 60; CHECK-48: movk x[[R2]], #:tprel_g0_nc:local_exec_var 61; CHECK-48: ldr w0, [x[[R1]], x[[R2]]] 62 63; CHECK-48-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G2 64; CHECK-48-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 65; CHECK-48-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 66 ret i32 %val 67} 68 69define ptr @test_local_exec_addr() { 70; CHECK-LABEL: test_local_exec_addr: 71 ret ptr @local_exec_var 72 73; CHECK-12: mrs x[[R1:[0-9]+]], TPIDR_EL0 74; CHECK-12: add x0, x[[R1]], :tprel_lo12:local_exec_var 75; CHECK-12: ret 76 77; CHECK-12-RELOC: R_AARCH64_TLSLE_ADD_TPREL_LO12 78 79; CHECK-24: mrs x[[R1:[0-9]+]], TPIDR_EL0 80; CHECK-24: add x[[R2:[0-9]+]], x[[R1]], :tprel_hi12:local_exec_var 81; CHECK-24: add x0, x[[R2]], :tprel_lo12_nc:local_exec_var 82; CHECK-24: ret 83 84; CHECK-24-RELOC: R_AARCH64_TLSLE_ADD_TPREL_HI12 85; CHECK-24-RELOC: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 86 87; CHECK-32: movz x[[R2:[0-9]+]], #:tprel_g1:local_exec_var 88; CHECK-32: mrs x[[R1:[0-9]+]], TPIDR_EL0 89; CHECK-32: movk x[[R2]], #:tprel_g0_nc:local_exec_var 90; CHECK-32: add x0, x[[R1]], x[[R2]] 91; CHECK-32: ret 92 93; CHECK-32-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G1 94; CHECK-32-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 95 96; CHECK-48: movz x[[R2:[0-9]+]], #:tprel_g2:local_exec_var 97; CHECK-48: mrs x[[R1:[0-9]+]], TPIDR_EL0 98; CHECK-48: movk x[[R2]], #:tprel_g1_nc:local_exec_var 99; CHECK-48: movk x[[R2]], #:tprel_g0_nc:local_exec_var 100; CHECK-48: add x0, x[[R1]], x[[R2]] 101; CHECK-48: ret 102 103; CHECK-48-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G2 104; CHECK-48-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 105; CHECK-48-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 106} 107