summary refs log tree commit diff
path: root/src/test/abi3.ssa
blob: 608d1dbff92856a9f37e193c99601c2ae78a8b4a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
type :four = {l, b, w}

data $z = { w 0 }

function $test() {
 @start
	%a  =w loadw $z
	%y  =w add %a, %a

	%s  =l alloc8 16   # allocate a :four struct
	%s1 =l add %s, 12  # get address of the w
	storel 4, %s       # set the l
	storew 5, %s1      # set the w

	# only the last argument should be on the stack
	%f  =l add $F, %y
	%x  =w call %f(w %y, w 1, w 2, w 3, :four %s, w 6)

	# store the result in the
	# global variable a

	%x1 =w add %y, %x
	storew %x1, $a
	ret
}

# >>> driver
# #include <stdio.h>
# struct four { long l; char c; int i; };
# extern void test(void);
# int F(int a0, int a1, int a2, int a3, struct four s, int a6) {
# 	printf("%d %d %d %d %d %d %d\n",
# 		a0, a1, a2, a3, (int)s.l, s.i, a6);
# 	return 42;
# }
# int a;
# int main() { test(); printf("%d\n", a); return 0; }
# <<<

# >>> output
# 0 1 2 3 4 5 6
# 42
# <<<