1 ; RUN: llc < %s -march=xcore | FileCheck %s
3 declare i8* @llvm.frameaddress(i32) nounwind readnone
4 define i8* @FA0() nounwind {
7 ; CHECK: ldaw r0, sp[0]
9 %0 = call i8* @llvm.frameaddress(i32 0)
13 define i8* @FA1() nounwind {
17 ; CHECK-NEXT: ldaw r0, sp[0]
18 ; CHECK-NEXT: retsp 100
19 %0 = alloca [100 x i32]
20 %1 = call i8* @llvm.frameaddress(i32 0)
24 declare i8* @llvm.returnaddress(i32) nounwind readnone
25 define i8* @RA0() nounwind {
28 ; CHECK: stw lr, sp[0]
29 ; CHECK-NEXT: ldw r0, sp[0]
30 ; CHECK-NEXT: ldw lr, sp[0]
32 %0 = call i8* @llvm.returnaddress(i32 0)
36 define i8* @RA1() nounwind {
40 ; CHECK-NEXT: ldw r0, sp[100]
41 ; CHECK-NEXT: retsp 100
42 %0 = alloca [100 x i32]
43 %1 = call i8* @llvm.returnaddress(i32 0)
47 ; test FRAME_TO_ARGS_OFFSET lowering
48 declare i8* @llvm.eh.dwarf.cfa(i32) nounwind
49 define i8* @FTAO0() nounwind {
53 ; CHECK-NEXT: ldaw r1, sp[0]
54 ; CHECK-NEXT: add r0, r1, r0
56 %0 = call i8* @llvm.eh.dwarf.cfa(i32 0)
60 define i8* @FTAO1() nounwind {
64 ; CHECK-NEXT: ldc r0, 400
65 ; CHECK-NEXT: ldaw r1, sp[0]
66 ; CHECK-NEXT: add r0, r1, r0
67 ; CHECK-NEXT: retsp 100
68 %0 = alloca [100 x i32]
69 %1 = call i8* @llvm.eh.dwarf.cfa(i32 0)
73 declare void @llvm.eh.return.i32(i32, i8*)
74 define i8* @EH0(i32 %offset, i8* %handler) {
78 ; CHECK-NEXT: ldaw r3, sp[0]
79 ; CHECK-NEXT: add r2, r3, r2
80 ; CHECK-NEXT: add r2, r2, r0
81 ; CHECK-NEXT: mov r3, r1
82 ; CHECK-NEXT: set sp, r2
84 call void @llvm.eh.return.i32(i32 %offset, i8* %handler)
88 declare void @foo(...)
89 define i8* @EH1(i32 %offset, i8* %handler) {
93 ; CHECK: stw r4, sp[2]
94 ; CHECK: stw r5, sp[1]
96 ; CHECK-NEXT: mov r5, r0
98 ; CHECK-NEXT: ldc r0, 12
99 ; CHECK-NEXT: ldaw r1, sp[0]
100 ; CHECK-NEXT: add r0, r1, r0
101 ; CHECK-NEXT: add r2, r0, r5
102 ; CHECK-NEXT: mov r3, r4
103 ; CHECK-NEXT: ldw r5, sp[1]
104 ; CHECK-NEXT: ldw r4, sp[2]
105 ; CHECK-NEXT: set sp, r2
107 call void (...)* @foo()
108 call void @llvm.eh.return.i32(i32 %offset, i8* %handler)
112 @offset = external constant i32
113 @handler = external constant i8
114 define i8* @EH2(i32 %r0, i32 %r1, i32 %r2, i32 %r3) {
119 ; CHECK-NEXT: ldw r0, cp[offset]
120 ; CHECK-NEXT: ldc r1, 4
121 ; CHECK-NEXT: ldaw r2, sp[0]
122 ; CHECK-NEXT: add r1, r2, r1
123 ; CHECK-NEXT: add r2, r1, r0
124 ; CHECK-NEXT: ldaw r11, cp[handler]
125 ; CHECK-NEXT: mov r3, r11
126 ; CHECK-NEXT: set sp, r2
128 call void (...)* @foo()
129 %0 = load i32* @offset
130 call void @llvm.eh.return.i32(i32 %0, i8* @handler)