summary refs log tree commit diff
path: root/test/abi4.ssa
blob: 47255bf9ea08c3b1019d4c060815e929e136468c (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
# return a large struct to C

type :mem = { b 17 }

function $alpha(l %p, w %l, l %n) {
@ini
	%pe =l add %p, %n
@lop
	%p1 =l phi @ini %p, @lop %p2
	%l1 =w phi @ini %l, @lop %l2
	storeb %l1, %p1
	%p2 =l add %p1, 1
	%l2 =w add %l1, 1
	%c1 =w ceql %p1, %pe
	jnz %c1, @end, @lop
@end
	storeb 0, %pe
	ret
}

export
function :mem $test() {
@ini
	%p =l alloc4 17
	%r0 =w call $alpha(l %p, w 65, l 16)
	ret %p
}


# >>> driver
# #include <stdio.h>
# typedef struct { char t[17]; } mem;
# extern mem test(void);
# int main() { mem m = test(); printf("%s\n", m.t); return 0; }
# <<<

# >>> output
# ABCDEFGHIJKLMNOP
# <<<