XCore target: Fix Vararg handling
[oota-llvm.git] / test / CodeGen / XCore / varargs.ll
1 ; RUN: llc < %s -march=xcore | FileCheck %s
2
3 define void @_Z1fz(...) {
4 entry:
5 ; CHECK-LABEL: _Z1fz:
6 ; CHECK: extsp 3
7 ; CHECK: stw r[[REG:[0-3]{1,1}]]
8 ; CHECK: , sp{{\[}}[[REG]]{{\]}}
9 ; CHECK: stw r[[REG:[0-3]{1,1}]]
10 ; CHECK: , sp{{\[}}[[REG]]{{\]}}
11 ; CHECK: stw r[[REG:[0-3]{1,1}]]
12 ; CHECK: , sp{{\[}}[[REG]]{{\]}}
13 ; CHECK: stw r[[REG:[0-3]{1,1}]]
14 ; CHECK: , sp{{\[}}[[REG]]{{\]}}
15 ; CHECK: ldaw sp, sp[3]
16 ; CHECK: retsp 0
17   ret void
18 }
19
20
21 declare void @llvm.va_start(i8*) nounwind
22 declare void @llvm.va_end(i8*) nounwind
23 declare void @f(i32) nounwind
24 define void @test_vararg(...) nounwind {
25 entry:
26 ; CHECK-LABEL: test_vararg
27 ; CHECK: extsp 6
28 ; CHECK: stw lr, sp[1]
29 ; CHECK: stw r0, sp[3]
30 ; CHECK: stw r1, sp[4]
31 ; CHECK: stw r2, sp[5]
32 ; CHECK: stw r3, sp[6]
33 ; CHECK: ldaw r0, sp[3]
34 ; CHECK: stw r0, sp[2]
35   %list = alloca i8*, align 4
36   %list1 = bitcast i8** %list to i8*
37   call void @llvm.va_start(i8* %list1)
38   br label %for.cond
39
40 ; CHECK-LABEL: .LBB1_1
41 ; CHECK: ldw r0, sp[2]
42 ; CHECK: add r1, r0, 4
43 ; CHECK: stw r1, sp[2]
44 ; CHECK: ldw r0, r0[0]
45 ; CHECK: bl f
46 ; CHECK: bu .LBB1_1
47 for.cond:
48   %0 = va_arg i8** %list, i32
49   call void @f(i32 %0)
50   br label %for.cond
51
52   call void @llvm.va_end(i8* %list1)
53   ret void
54 }
55