1f5e63f8fSVitaly Cheptsov; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2f5e63f8fSVitaly Cheptsov; RUN: llc -mtriple=riscv32 -emulated-tls -relocation-model=pic < %s \ 3f5e63f8fSVitaly Cheptsov; RUN: | FileCheck -check-prefix=RV32 %s 4f5e63f8fSVitaly Cheptsov; RUN: llc -mtriple=riscv64 -emulated-tls -relocation-model=pic < %s \ 5f5e63f8fSVitaly Cheptsov; RUN: | FileCheck -check-prefix=RV64 %s 6f5e63f8fSVitaly Cheptsov 7f5e63f8fSVitaly Cheptsov@external_x = external thread_local global i32, align 8 8f5e63f8fSVitaly Cheptsov@y = thread_local global i8 7, align 2 9f5e63f8fSVitaly Cheptsov@internal_z = internal thread_local global i64 9, align 16 10f5e63f8fSVitaly Cheptsov 11f5e63f8fSVitaly Cheptsovdefine ptr @get_external_x() nounwind { 12f5e63f8fSVitaly Cheptsov; RV32-LABEL: get_external_x: 13f5e63f8fSVitaly Cheptsov; RV32: # %bb.0: # %entry 14f5e63f8fSVitaly Cheptsov; RV32-NEXT: addi sp, sp, -16 15f5e63f8fSVitaly Cheptsov; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 16f5e63f8fSVitaly Cheptsov; RV32-NEXT: .Lpcrel_hi0: 17f5e63f8fSVitaly Cheptsov; RV32-NEXT: auipc a0, %got_pcrel_hi(__emutls_v.external_x) 18f5e63f8fSVitaly Cheptsov; RV32-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi0)(a0) 19*eabaee0cSFangrui Song; RV32-NEXT: call __emutls_get_address 20f5e63f8fSVitaly Cheptsov; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21f5e63f8fSVitaly Cheptsov; RV32-NEXT: addi sp, sp, 16 22f5e63f8fSVitaly Cheptsov; RV32-NEXT: ret 23f5e63f8fSVitaly Cheptsov; 24f5e63f8fSVitaly Cheptsov; RV64-LABEL: get_external_x: 25f5e63f8fSVitaly Cheptsov; RV64: # %bb.0: # %entry 26f5e63f8fSVitaly Cheptsov; RV64-NEXT: addi sp, sp, -16 27f5e63f8fSVitaly Cheptsov; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 28f5e63f8fSVitaly Cheptsov; RV64-NEXT: .Lpcrel_hi0: 29f5e63f8fSVitaly Cheptsov; RV64-NEXT: auipc a0, %got_pcrel_hi(__emutls_v.external_x) 30f5e63f8fSVitaly Cheptsov; RV64-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0) 31*eabaee0cSFangrui Song; RV64-NEXT: call __emutls_get_address 32f5e63f8fSVitaly Cheptsov; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 33f5e63f8fSVitaly Cheptsov; RV64-NEXT: addi sp, sp, 16 34f5e63f8fSVitaly Cheptsov; RV64-NEXT: ret 35f5e63f8fSVitaly Cheptsoventry: 36f5e63f8fSVitaly Cheptsov ret ptr @external_x 37f5e63f8fSVitaly Cheptsov} 38f5e63f8fSVitaly Cheptsov 39f5e63f8fSVitaly Cheptsovdefine ptr @get_y() nounwind { 40f5e63f8fSVitaly Cheptsov; RV32-LABEL: get_y: 41f5e63f8fSVitaly Cheptsov; RV32: # %bb.0: # %entry 42f5e63f8fSVitaly Cheptsov; RV32-NEXT: addi sp, sp, -16 43f5e63f8fSVitaly Cheptsov; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 44f5e63f8fSVitaly Cheptsov; RV32-NEXT: .Lpcrel_hi1: 45f5e63f8fSVitaly Cheptsov; RV32-NEXT: auipc a0, %got_pcrel_hi(__emutls_v.y) 46f5e63f8fSVitaly Cheptsov; RV32-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi1)(a0) 47*eabaee0cSFangrui Song; RV32-NEXT: call __emutls_get_address 48f5e63f8fSVitaly Cheptsov; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 49f5e63f8fSVitaly Cheptsov; RV32-NEXT: addi sp, sp, 16 50f5e63f8fSVitaly Cheptsov; RV32-NEXT: ret 51f5e63f8fSVitaly Cheptsov; 52f5e63f8fSVitaly Cheptsov; RV64-LABEL: get_y: 53f5e63f8fSVitaly Cheptsov; RV64: # %bb.0: # %entry 54f5e63f8fSVitaly Cheptsov; RV64-NEXT: addi sp, sp, -16 55f5e63f8fSVitaly Cheptsov; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 56f5e63f8fSVitaly Cheptsov; RV64-NEXT: .Lpcrel_hi1: 57f5e63f8fSVitaly Cheptsov; RV64-NEXT: auipc a0, %got_pcrel_hi(__emutls_v.y) 58f5e63f8fSVitaly Cheptsov; RV64-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi1)(a0) 59*eabaee0cSFangrui Song; RV64-NEXT: call __emutls_get_address 60f5e63f8fSVitaly Cheptsov; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 61f5e63f8fSVitaly Cheptsov; RV64-NEXT: addi sp, sp, 16 62f5e63f8fSVitaly Cheptsov; RV64-NEXT: ret 63f5e63f8fSVitaly Cheptsoventry: 64f5e63f8fSVitaly Cheptsov ret ptr @y 65f5e63f8fSVitaly Cheptsov} 66f5e63f8fSVitaly Cheptsov 67f5e63f8fSVitaly Cheptsovdefine ptr @get_internal_z() nounwind { 68f5e63f8fSVitaly Cheptsov; RV32-LABEL: get_internal_z: 69f5e63f8fSVitaly Cheptsov; RV32: # %bb.0: # %entry 70f5e63f8fSVitaly Cheptsov; RV32-NEXT: addi sp, sp, -16 71f5e63f8fSVitaly Cheptsov; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 72f5e63f8fSVitaly Cheptsov; RV32-NEXT: .Lpcrel_hi2: 73f5e63f8fSVitaly Cheptsov; RV32-NEXT: auipc a0, %pcrel_hi(__emutls_v.internal_z) 74f5e63f8fSVitaly Cheptsov; RV32-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi2) 75*eabaee0cSFangrui Song; RV32-NEXT: call __emutls_get_address 76f5e63f8fSVitaly Cheptsov; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 77f5e63f8fSVitaly Cheptsov; RV32-NEXT: addi sp, sp, 16 78f5e63f8fSVitaly Cheptsov; RV32-NEXT: ret 79f5e63f8fSVitaly Cheptsov; 80f5e63f8fSVitaly Cheptsov; RV64-LABEL: get_internal_z: 81f5e63f8fSVitaly Cheptsov; RV64: # %bb.0: # %entry 82f5e63f8fSVitaly Cheptsov; RV64-NEXT: addi sp, sp, -16 83f5e63f8fSVitaly Cheptsov; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 84f5e63f8fSVitaly Cheptsov; RV64-NEXT: .Lpcrel_hi2: 85f5e63f8fSVitaly Cheptsov; RV64-NEXT: auipc a0, %pcrel_hi(__emutls_v.internal_z) 86f5e63f8fSVitaly Cheptsov; RV64-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi2) 87*eabaee0cSFangrui Song; RV64-NEXT: call __emutls_get_address 88f5e63f8fSVitaly Cheptsov; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 89f5e63f8fSVitaly Cheptsov; RV64-NEXT: addi sp, sp, 16 90f5e63f8fSVitaly Cheptsov; RV64-NEXT: ret 91f5e63f8fSVitaly Cheptsoventry: 92f5e63f8fSVitaly Cheptsov ret ptr @internal_z 93f5e63f8fSVitaly Cheptsov} 94f5e63f8fSVitaly Cheptsov 95f5e63f8fSVitaly Cheptsov; UTC_ARGS: --disable 96f5e63f8fSVitaly Cheptsov 97f5e63f8fSVitaly Cheptsov; RV32: .data 98f5e63f8fSVitaly Cheptsov; RV32: .globl __emutls_v.y 99f5e63f8fSVitaly Cheptsov; RV32: .p2align 2 100f5e63f8fSVitaly Cheptsov; RV32-LABEL: __emutls_v.y: 101f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word 1 102f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word 2 103f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word 0 104f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word __emutls_t.y 105f5e63f8fSVitaly Cheptsov; RV32: .section .rodata, 106f5e63f8fSVitaly Cheptsov; RV32-LABEL: __emutls_t.y: 107f5e63f8fSVitaly Cheptsov; RV32-NEXT: .byte 7 108f5e63f8fSVitaly Cheptsov; RV32: .data 109f5e63f8fSVitaly Cheptsov; RV32: .p2align 2 110f5e63f8fSVitaly Cheptsov; RV32-LABEL: __emutls_v.internal_z: 111f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word 8 112f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word 16 113f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word 0 114f5e63f8fSVitaly Cheptsov; RV32-NEXT: .word __emutls_t.internal_z 115f5e63f8fSVitaly Cheptsov; RV32: .section .rodata, 116f5e63f8fSVitaly Cheptsov; RV32-LABEL: __emutls_t.internal_z: 117f5e63f8fSVitaly Cheptsov; RV32-NEXT: .quad 9 118f5e63f8fSVitaly Cheptsov 119f5e63f8fSVitaly Cheptsov; RV64: .data 120f5e63f8fSVitaly Cheptsov; RV64: .globl __emutls_v.y 121f5e63f8fSVitaly Cheptsov; RV64: .p2align 3 122f5e63f8fSVitaly Cheptsov; RV64-LABEL: __emutls_v.y: 123f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad 1 124f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad 2 125f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad 0 126f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad __emutls_t.y 127f5e63f8fSVitaly Cheptsov; RV64: .section .rodata, 128f5e63f8fSVitaly Cheptsov; RV64-LABEL: __emutls_t.y: 129f5e63f8fSVitaly Cheptsov; RV64-NEXT: .byte 7 130f5e63f8fSVitaly Cheptsov; RV64: .data 131f5e63f8fSVitaly Cheptsov; RV64: .p2align 3 132f5e63f8fSVitaly Cheptsov; RV64-LABEL: __emutls_v.internal_z: 133f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad 8 134f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad 16 135f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad 0 136f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad __emutls_t.internal_z 137f5e63f8fSVitaly Cheptsov; RV64: .section .rodata, 138f5e63f8fSVitaly Cheptsov; RV64-LABEL: __emutls_t.internal_z: 139f5e63f8fSVitaly Cheptsov; RV64-NEXT: .quad 9 140