mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-25 14:32:53 +00:00
71537c1783
Fix XCoreLowerThreadLocal trying to initialise globals which have no initializer. Add handling of const expressions containing thread local variables. These need to be replaced with instructions, as the thread ID is used to access the thread local variable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190300 91177308-0d34-0410-b5e6-96231b3b80d8
107 lines
3.1 KiB
LLVM
107 lines
3.1 KiB
LLVM
; RUN: llc -march=xcore < %s | FileCheck %s
|
|
|
|
declare i8 addrspace(1)* @llvm.xcore.getst.p1i8.p1i8(i8 addrspace(1)* %r)
|
|
declare void @llvm.xcore.msync.p1i8(i8 addrspace(1)* %r)
|
|
declare void @llvm.xcore.ssync()
|
|
declare void @llvm.xcore.mjoin.p1i8(i8 addrspace(1)* %r)
|
|
declare void @llvm.xcore.initsp.p1i8(i8 addrspace(1)* %r, i8* %value)
|
|
declare void @llvm.xcore.initpc.p1i8(i8 addrspace(1)* %r, i8* %value)
|
|
declare void @llvm.xcore.initlr.p1i8(i8 addrspace(1)* %r, i8* %value)
|
|
declare void @llvm.xcore.initcp.p1i8(i8 addrspace(1)* %r, i8* %value)
|
|
declare void @llvm.xcore.initdp.p1i8(i8 addrspace(1)* %r, i8* %value)
|
|
|
|
define i8 addrspace(1)* @test_getst(i8 addrspace(1)* %r) {
|
|
; CHECK-LABEL: test_getst:
|
|
; CHECK: getst r0, res[r0]
|
|
%result = call i8 addrspace(1)* @llvm.xcore.getst.p1i8.p1i8(i8 addrspace(1)* %r)
|
|
ret i8 addrspace(1)* %result
|
|
}
|
|
|
|
define void @test_ssync() {
|
|
; CHECK-LABEL: test_ssync:
|
|
; CHECK: ssync
|
|
call void @llvm.xcore.ssync()
|
|
ret void
|
|
}
|
|
|
|
define void @test_mjoin(i8 addrspace(1)* %r) {
|
|
; CHECK-LABEL: test_mjoin:
|
|
; CHECK: mjoin res[r0]
|
|
call void @llvm.xcore.mjoin.p1i8(i8 addrspace(1)* %r)
|
|
ret void
|
|
}
|
|
|
|
define void @test_initsp(i8 addrspace(1)* %t, i8* %src) {
|
|
; CHECK-LABEL: test_initsp:
|
|
; CHECK: init t[r0]:sp, r1
|
|
call void @llvm.xcore.initsp.p1i8(i8 addrspace(1)* %t, i8* %src)
|
|
ret void
|
|
}
|
|
|
|
define void @test_initpc(i8 addrspace(1)* %t, i8* %src) {
|
|
; CHECK-LABEL: test_initpc:
|
|
; CHECK: init t[r0]:pc, r1
|
|
call void @llvm.xcore.initpc.p1i8(i8 addrspace(1)* %t, i8* %src)
|
|
ret void
|
|
}
|
|
|
|
define void @test_initlr(i8 addrspace(1)* %t, i8* %src) {
|
|
; CHECK-LABEL: test_initlr:
|
|
; CHECK: init t[r0]:lr, r1
|
|
call void @llvm.xcore.initlr.p1i8(i8 addrspace(1)* %t, i8* %src)
|
|
ret void
|
|
}
|
|
|
|
define void @test_initcp(i8 addrspace(1)* %t, i8* %src) {
|
|
; CHECK-LABEL: test_initcp:
|
|
; CHECK: init t[r0]:cp, r1
|
|
call void @llvm.xcore.initcp.p1i8(i8 addrspace(1)* %t, i8* %src)
|
|
ret void
|
|
}
|
|
|
|
define void @test_initdp(i8 addrspace(1)* %t, i8* %src) {
|
|
; CHECK-LABEL: test_initdp:
|
|
; CHECK: init t[r0]:dp, r1
|
|
call void @llvm.xcore.initdp.p1i8(i8 addrspace(1)* %t, i8* %src)
|
|
ret void
|
|
}
|
|
|
|
@tl = thread_local global [3 x i32] zeroinitializer
|
|
@tle = external thread_local global [2 x i32]
|
|
|
|
define i32* @f_tl() {
|
|
; CHECK-LABEL: f_tl:
|
|
; CHECK: get r11, id
|
|
; CHECK: ldaw [[R0:r[0-9]]], dp[tl]
|
|
; CHECK: ldc [[R1:r[0-9]]], 8
|
|
; CHECK: ldc [[R2:r[0-9]]], 12
|
|
; r0 = id*12 + 8 + &tl
|
|
; CHECK: lmul {{r[0-9]}}, r0, r11, [[R2]], [[R0]], [[R1]]
|
|
ret i32* getelementptr inbounds ([3 x i32]* @tl, i32 0, i32 2)
|
|
}
|
|
|
|
define i32* @f_tle() {
|
|
; CHECK-LABEL: f_tle:
|
|
; CHECK: get r11, id
|
|
; CHECK: shl [[R0:r[0-9]]], r11, 3
|
|
; CHECK: ldaw [[R1:r[0-9]]], dp[tle]
|
|
; r0 = &tl + id*8
|
|
; CHECK: add r0, [[R1]], [[R0]]
|
|
ret i32* getelementptr inbounds ([2 x i32]* @tle, i32 0, i32 0)
|
|
}
|
|
|
|
define i32 @f_tlExpr () {
|
|
; CHECK-LABEL: f_tlExpr:
|
|
; CHECK: get r11, id
|
|
; CHECK: shl [[R0:r[0-9]]], r11, 3
|
|
; CHECK: ldaw [[R1:r[0-9]]], dp[tle]
|
|
; CHECK: add [[R2:r[0-9]]], [[R1]], [[R0]]
|
|
; CHECK: add r0, [[R2]], [[R2]]
|
|
ret i32 add(
|
|
i32 ptrtoint( i32* getelementptr inbounds ([2 x i32]* @tle, i32 0, i32 0) to i32),
|
|
i32 ptrtoint( i32* getelementptr inbounds ([2 x i32]* @tle, i32 0, i32 0) to i32))
|
|
}
|
|
|
|
; CHECK-LABEL: tl:
|
|
; CHECK: .space 96
|