1 ; RUN: llc < %s -march=xcore | FileCheck %s
3 declare i8* @llvm.frameaddress(i32) nounwind readnone
4 declare i8* @llvm.returnaddress(i32) nounwind
5 declare i8* @llvm.eh.dwarf.cfa(i32) nounwind
6 declare void @llvm.eh.return.i32(i32, i8*) nounwind
7 declare void @llvm.eh.unwind.init() nounwind
9 define i8* @FA0() nounwind {
12 ; CHECK: ldaw r0, sp[0]
14 %0 = call i8* @llvm.frameaddress(i32 0)
18 define i8* @FA1() nounwind {
22 ; CHECK-NEXT: ldaw r0, sp[0]
23 ; CHECK-NEXT: retsp 100
24 %0 = alloca [100 x i32]
25 %1 = call i8* @llvm.frameaddress(i32 0)
29 define i8* @RA0() nounwind {
32 ; CHECK: stw lr, sp[0]
33 ; CHECK-NEXT: ldw r0, sp[0]
34 ; CHECK-NEXT: ldw lr, sp[0]
36 %0 = call i8* @llvm.returnaddress(i32 0)
40 define i8* @RA1() nounwind {
44 ; CHECK-NEXT: ldw r0, sp[100]
45 ; CHECK-NEXT: retsp 100
46 %0 = alloca [100 x i32]
47 %1 = call i8* @llvm.returnaddress(i32 0)
51 ; test FRAME_TO_ARGS_OFFSET lowering
52 define i8* @FTAO0() nounwind {
56 ; CHECK-NEXT: ldaw r1, sp[0]
57 ; CHECK-NEXT: add r0, r1, r0
59 %0 = call i8* @llvm.eh.dwarf.cfa(i32 0)
63 define i8* @FTAO1() nounwind {
67 ; CHECK-NEXT: ldc r0, 400
68 ; CHECK-NEXT: ldaw r1, sp[0]
69 ; CHECK-NEXT: add r0, r1, r0
70 ; CHECK-NEXT: retsp 100
71 %0 = alloca [100 x i32]
72 %1 = call i8* @llvm.eh.dwarf.cfa(i32 0)
76 define i8* @EH0(i32 %offset, i8* %handler) {
80 ; CHECK-NEXT: ldaw r3, sp[0]
81 ; CHECK-NEXT: add r2, r3, r2
82 ; CHECK-NEXT: add r2, r2, r0
83 ; CHECK-NEXT: mov r3, r1
84 ; CHECK-NEXT: set sp, r2
86 call void @llvm.eh.return.i32(i32 %offset, i8* %handler)
90 declare void @foo(...)
91 define i8* @EH1(i32 %offset, i8* %handler) {
95 ; CHECK: stw r4, sp[2]
96 ; CHECK: stw r5, sp[1]
98 ; CHECK-NEXT: mov r5, r0
100 ; CHECK-NEXT: ldc r0, 12
101 ; CHECK-NEXT: ldaw r1, sp[0]
102 ; CHECK-NEXT: add r0, r1, r0
103 ; CHECK-NEXT: add r2, r0, r5
104 ; CHECK-NEXT: mov r3, r4
105 ; CHECK-NEXT: ldw r5, sp[1]
106 ; CHECK-NEXT: ldw r4, sp[2]
107 ; CHECK-NEXT: set sp, r2
109 call void (...)* @foo()
110 call void @llvm.eh.return.i32(i32 %offset, i8* %handler)
114 @offset = external constant i32
115 @handler = external constant i8
116 define i8* @EH2(i32 %r0, i32 %r1, i32 %r2, i32 %r3) {
121 ; CHECK-NEXT: ldw r0, cp[offset]
122 ; CHECK-NEXT: ldc r1, 4
123 ; CHECK-NEXT: ldaw r2, sp[0]
124 ; CHECK-NEXT: add r1, r2, r1
125 ; CHECK-NEXT: add r2, r1, r0
126 ; CHECK-NEXT: ldaw r11, cp[handler]
127 ; CHECK-NEXT: mov r3, r11
128 ; CHECK-NEXT: set sp, r2
130 call void (...)* @foo()
131 %0 = load i32* @offset
132 call void @llvm.eh.return.i32(i32 %0, i8* @handler)
137 ; FP: spill FP+SR+R4:9 = entsp 2 + 6
138 ; CHECKFP-LABEL: Unwind0:
140 ; CHECKFP: stw r10, sp[1]
141 ; CHECKFP: ldaw r10, sp[0]
142 ; CHECKFP: stw r4, r10[7]
143 ; CHECKFP: stw r5, r10[6]
144 ; CHECKFP: stw r6, r10[5]`
145 ; CHECKFP: stw r7, r10[4]
146 ; CHECKFP: stw r8, r10[3]
147 ; CHECKFP: stw r9, r10[2]
148 ; CHECKFP: ldw r9, r10[2]
149 ; CHECKFP: ldw r8, r10[3]
150 ; CHECKFP: ldw r7, r10[4]
151 ; CHECKFP: ldw r6, r10[5]
152 ; CHECKFP: ldw r5, r10[6]
153 ; CHECKFP: ldw r4, r10[7]
154 ; CHECKFP: set sp, r10
155 ; CHECKFP: ldw r10, sp[1]
158 ; !FP: spill R4:10 = entsp 7
159 ; CHECK-LABEL: Unwind0:
161 ; CHECK: stw r4, sp[6]
162 ; CHECK: stw r5, sp[5]
163 ; CHECK: stw r6, sp[4]
164 ; CHECK: stw r7, sp[3]
165 ; CHECK: stw r8, sp[2]
166 ; CHECK: stw r9, sp[1]
167 ; CHECK: stw r10, sp[0]
168 ; CHECK: ldw r10, sp[0]
169 ; CHECK: ldw r9, sp[1]
170 ; CHECK: ldw r8, sp[2]
171 ; CHECK: ldw r7, sp[3]
172 ; CHECK: ldw r6, sp[4]
173 ; CHECK: ldw r5, sp[5]
174 ; CHECK: ldw r4, sp[6]
176 define void @Unwind0() {
177 call void @llvm.eh.unwind.init()
182 ; FP: spill FP+SR+R4:9+LR = entsp 2 + 6 + extsp 1
183 ; CHECKFP-LABEL: Unwind1:
185 ; CHECKFP: stw r10, sp[1]
186 ; CHECKFP: ldaw r10, sp[0]
187 ; CHECKFP: stw r4, r10[7]
188 ; CHECKFP: stw r5, r10[6]
189 ; CHECKFP: stw r6, r10[5]
190 ; CHECKFP: stw r7, r10[4]
191 ; CHECKFP: stw r8, r10[3]
192 ; CHECKFP: stw r9, r10[2]
195 ; CHECKFP: ldaw sp, sp[1]
196 ; CHECKFP: ldw r9, r10[2]
197 ; CHECKFP: ldw r8, r10[3]
198 ; CHECKFP: ldw r7, r10[4]
199 ; CHECKFP: ldw r6, r10[5]
200 ; CHECKFP: ldw r5, r10[6]
201 ; CHECKFP: ldw r4, r10[7]
202 ; CHECKFP: set sp, r10
203 ; CHECKFP: ldw r10, sp[1]
206 ; !FP: spill R4:10+LR = entsp 7 + 1
207 ; CHECK-LABEL: Unwind1:
209 ; CHECK: stw r4, sp[7]
210 ; CHECK: stw r5, sp[6]
211 ; CHECK: stw r6, sp[5]
212 ; CHECK: stw r7, sp[4]
213 ; CHECK: stw r8, sp[3]
214 ; CHECK: stw r9, sp[2]
215 ; CHECK: stw r10, sp[1]
217 ; CHECK: ldw r10, sp[1]
218 ; CHECK: ldw r9, sp[2]
219 ; CHECK: ldw r8, sp[3]
220 ; CHECK: ldw r7, sp[4]
221 ; CHECK: ldw r6, sp[5]
222 ; CHECK: ldw r5, sp[6]
223 ; CHECK: ldw r4, sp[7]
225 define void @Unwind1() {
226 call void (...)* @foo()
227 call void @llvm.eh.unwind.init()