shared linkage logic for func/data
[qbe.git] / test / abi5.ssa
blob1d823b1fdf8d52a83c4cea2e3e78565fca9afec9
1 # returning structs from C
3 type :st1 = { b 17 }
4 type :st2 = { w }
5 type :st3 = { s, w }
6 type :st4 = { w, d }
7 type :st5 = { s, l }
8 type :st6 = { b 16 }
9 type :st7 = { s, d }
10 type :st8 = { w 4 }
11 type :un9 = { { b } { s } }
12 type :st9 = { w, :un9 }
14 data $fmt1 = { b "t1: %s\n", b 0 }
15 data $fmt2 = { b "t2: %d\n", b 0 }
16 data $fmt3 = { b "t3: %f %d\n", b 0 }
17 data $fmt4 = { b "t4: %d %f\n", b 0 }
18 data $fmt5 = { b "t5: %f %lld\n", b 0 }
19 data $fmt6 = { b "t6: %s\n", b 0 }
20 data $fmt7 = { b "t7: %f %f\n", b 0 }
21 data $fmt8 = { b "t8: %d %d %d %d\n", b 0 }
22 data $fmt9 = { b "t9: %d %f\n", b 0 }
24 export
25 function $test() {
26 @start
27         %r1 =:st1 call $t1()
28         %i1 =w call $printf(l $fmt1, ..., l %r1)
30         %r2 =:st2 call $t2()
31         %w2 =w loadw %r2
32         %i2 =w call $printf(l $fmt2, ..., w %w2)
34         %r3 =:st3 call $t3()
35         %s3 =s loads %r3
36         %r34 =l add %r3, 4
37         %w3 =w loadw %r34
38         %p3 =d exts %s3
39         %i3 =w call $printf(l $fmt3, ..., d %p3, w %w3)
41         %r4 =:st4 call $t4()
42         %w4 =w loadw %r4
43         %r48 =l add 8, %r4
44         %d4 =d loadd %r48
45         %i4 =w call $printf(l $fmt4, ..., w %w4, d %d4)
47         %r5 =:st5 call $t5()
48         %s5 =s loads %r5
49         %d5 =d exts %s5
50         %r58 =l add %r5, 8
51         %l5 =l loadl %r58
52         %i5 =w call $printf(l $fmt5, ..., d %d5, l %l5)
54         %r6 =:st6 call $t6()
55         %i6 =w call $printf(l $fmt6, ..., l %r6)
57         %r7 =:st7 call $t7()
58         %s7 =s loads %r7
59         %d71 =d exts %s7
60         %r78 =l add %r7, 8
61         %d72 =d loadd %r78
62         %i7 =w call $printf(l $fmt7, ..., d %d71, d %d72)
64         %r8 =:st8 call $t8()
65         %r84 =l add 4, %r8
66         %r88 =l add 4, %r84
67         %r812 =l add 4, %r88
68         %w81 =w loadw %r8
69         %w82 =w loadw %r84
70         %w83 =w loadw %r88
71         %w84 =w loadw %r812
72         %i8 =w call $printf(l $fmt8, ..., w %w81, w %w82, w %w83, w %w84)
74         %r9 =:st9 call $t9()
75         %r94 =l add 4, %r9
76         %w9 =w loadw %r9
77         %s9 =s loads %r94
78         %d9 =d exts %s9
79         %i9 =w call $printf(l $fmt9, ..., w %w9, d %d9)
81         ret
85 # >>> driver
86 # #include <stdio.h>
87 # typedef struct { char t[17]; } st1;
88 # typedef struct { int i; } st2;
89 # typedef struct { float f; int i; } st3;
90 # typedef struct { int i; double d; } st4;
91 # typedef struct { float f; long l; } st5;
92 # typedef struct { char t[16]; } st6;
93 # typedef struct { float f; double d; } st7;
94 # typedef struct { int i[4]; } st8;
95 # typedef struct { int i; union { char c; float f; } u; } st9;
96 # extern void test(void);
97 # st1 t1() { return (st1){"abcdefghijklmnop"}; }
98 # st2 t2() { return (st2){2}; }
99 # st3 t3() { return (st3){3.0,30}; }
100 # st4 t4() { return (st4){4,-40}; }
101 # st5 t5() { return (st5){5.5,-55}; }
102 # st6 t6() { return (st6){"abcdefghijklmno"}; }
103 # st7 t7() { return (st7){7.77,77.7}; }
104 # st8 t8() { return (st8){-8,88,-888,8888}; }
105 # st9 t9() { return (st9){9,{.f=9.9}}; }
106 # int main() { test(); return 0; }
107 # <<<
109 # >>> output
110 # t1: abcdefghijklmnop
111 # t2: 2
112 # t3: 3.000000 30
113 # t4: 4 -40.000000
114 # t5: 5.500000 -55
115 # t6: abcdefghijklmno
116 # t7: 7.770000 77.700000
117 # t8: -8 88 -888 8888
118 # t9: 9 9.900000
119 # <<<