handle large hfas correctly on arm64
[qbe.git] / test / abi8.ssa
blobe1e6c42aa853444f70bfe38a648eeaca2f4b86c2
1 # riscv64 ABI stress
2 # see tools/abi8.py
4 type :fi1 = { h, s }   # in a gp & fp pair
5 type :fi2 = { s, w }   # ditto
6 type :uw = { { w } }
7 type :fi3 = { s, :uw } # in a single gp reg
8 type :ss = { s, s }    # in two fp regs
9 type :sd = { s, d }    # ditto
10 type :ww = { w, w }    # in a single gp reg
11 type :lb = { l, b }    # in two gp regs
12 type :big = { b 17 }   # by reference
13 type :ddd = { d, d, d} # big hfa on arm64
15 data $ctoqbestr = { b "c->qbe(%d)", b 0 }
16 data $emptystr = { b 0 }
18 export
19 function $qfn0(s %p0, s %p1, s %p2, s %p3, s %p4, s %p5, s %p6, s %p7, s %p8) {
20 @start
21         %r0 =w call $printf(l $ctoqbestr, ..., w 0)
22         call $ps(s %p8)
23         %r1 =w call $puts(l $emptystr)
24         ret
26 export
27 function $qfn1(w %p0, s %p1, :fi1 %p2) {
28 @start
29         %r0 =w call $printf(l $ctoqbestr, ..., w 1)
30         call $pw(w %p0)
31         call $ps(s %p1)
32         call $pfi1(l %p2)
33         %r1 =w call $puts(l $emptystr)
34         ret
36 export
37 function $qfn2(w %p0, :fi2 %p1, s %p2) {
38 @start
39         %r0 =w call $printf(l $ctoqbestr, ..., w 2)
40         call $pw(w %p0)
41         call $pfi2(l %p1)
42         call $ps(s %p2)
43         %r1 =w call $puts(l $emptystr)
44         ret
46 export
47 function $qfn3(w %p0, s %p1, :fi3 %p2) {
48 @start
49         %r0 =w call $printf(l $ctoqbestr, ..., w 3)
50         call $pw(w %p0)
51         call $ps(s %p1)
52         call $pfi3(l %p2)
53         %r1 =w call $puts(l $emptystr)
54         ret
56 export
57 function $qfn4(:ss %p0) {
58 @start
59         %r0 =w call $printf(l $ctoqbestr, ..., w 4)
60         call $pss(l %p0)
61         %r1 =w call $puts(l $emptystr)
62         ret
64 export
65 function $qfn5(d %p0, d %p1, d %p2, d %p3, d %p4, d %p5, d %p6, :ss %p7, s %p8, l %p9) {
66 @start
67         %r0 =w call $printf(l $ctoqbestr, ..., w 5)
68         call $pss(l %p7)
69         call $ps(s %p8)
70         call $pl(l %p9)
71         %r1 =w call $puts(l $emptystr)
72         ret
74 export
75 function $qfn6(:lb %p0) {
76 @start
77         %r0 =w call $printf(l $ctoqbestr, ..., w 6)
78         call $plb(l %p0)
79         %r1 =w call $puts(l $emptystr)
80         ret
82 export
83 function $qfn7(w %p0, w %p1, w %p2, w %p3, w %p4, w %p5, w %p6, :lb %p7) {
84 @start
85         %r0 =w call $printf(l $ctoqbestr, ..., w 7)
86         call $plb(l %p7)
87         %r1 =w call $puts(l $emptystr)
88         ret
90 export
91 function $qfn8(w %p0, w %p1, w %p2, w %p3, w %p4, w %p5, w %p6, w %p7, :lb %p8) {
92 @start
93         %r0 =w call $printf(l $ctoqbestr, ..., w 8)
94         call $plb(l %p8)
95         %r1 =w call $puts(l $emptystr)
96         ret
98 export
99 function $qfn9(:big %p0) {
100 @start
101         %r0 =w call $printf(l $ctoqbestr, ..., w 9)
102         call $pbig(l %p0)
103         %r1 =w call $puts(l $emptystr)
104         ret
106 export
107 function $qfn10(w %p0, w %p1, w %p2, w %p3, w %p4, w %p5, w %p6, w %p7, :big %p8, s %p9, l %p10) {
108 @start
109         %r0 =w call $printf(l $ctoqbestr, ..., w 10)
110         call $pbig(l %p8)
111         call $ps(s %p9)
112         call $pl(l %p10)
113         %r1 =w call $puts(l $emptystr)
114         ret
116 export
117 function $qfn11(:ddd %p0) {
118 @start
119         %r0 =w call $printf(l $ctoqbestr, ..., w 11)
120         call $pddd(l %p0)
121         %r1 =w call $puts(l $emptystr)
122         ret
125 export
126 function w $main() {
127 @start
129         call $cfn0(s 0, s 0, s 0, s 0, s 0, s 0, s 0, s 0, s s_9.9)
130         call $cfn1(w 1, s s_2.2, :fi1 $fi1)
131         call $cfn2(w 1, :fi2 $fi2, s s_3.3)
132         call $cfn3(w 1, s s_2.2, :fi3 $fi3)
133         call $cfn4(:ss $ss)
134         call $cfn5(d 0, d 0, d 0, d 0, d 0, d 0, d 0, :ss $ss, s s_9.9, l 10)
135         call $cfn6(:lb $lb)
136         call $cfn7(w 0, w 0, w 0, w 0, w 0, w 0, w 0, :lb $lb)
137         call $cfn8(w 0, w 0, w 0, w 0, w 0, w 0, w 0, w 0, :lb $lb)
138         call $cfn9(:big $big)
139         call $cfn10(w 0, w 0, w 0, w 0, w 0, w 0, w 0, w 0, :big $big, s s_10.10, l 11)
140         call $cfn11(:ddd $ddd)
142         ret 0
145 # >>> driver
146 # #include <stdio.h>
147 # typedef struct { short h; float s; } Sfi1;
148 # typedef struct { float s; int w; } Sfi2;
149 # typedef struct { float s; union { int w; } u; } Sfi3;
150 # typedef struct { float s0, s1; } Sss;
151 # typedef struct { float s; double d; } Ssd;
152 # typedef struct { int w0, w1; } Sww;
153 # typedef struct { long l; char b; } Slb;
154 # typedef struct { char b[17]; } Sbig;
155 # typedef struct { double d0, d1, d2; } Sddd;
156 # Sfi1 zfi1, fi1 = { -123, 4.56 };
157 # Sfi2 zfi2, fi2 = { 1.23, 456 };
158 # Sfi3 zfi3, fi3 = { 3.45, 567 };
159 # Sss zss, ss = { 1.23, 45.6 };
160 # Ssd zsd, sd = { 2.34, 5.67 };
161 # Sww zww, ww = { -123, -456 };
162 # Slb zlb, lb = { 123, 'z' };
163 # Sbig zbig, big = { "abcdefhijklmnopqr" };
164 # Sddd zddd, ddd = { 1.23, 45.6, 7.89 };
165 # void pfi1(Sfi1 *s) { printf(" { %d, %g }", s->h, s->s); }
166 # void pfi2(Sfi2 *s) { printf(" { %g, %d }", s->s, s->w); }
167 # void pfi3(Sfi3 *s) { printf(" { %g, %d }", s->s, s->u.w); }
168 # void pss(Sss *s) { printf(" { %g, %g }", s->s0, s->s1); }
169 # void psd(Ssd *s) { printf(" { %g, %g }", s->s, s->d); }
170 # void pww(Sww *s) { printf(" { %d, %d }", s->w0, s->w1); }
171 # void plb(Slb *s) { printf(" { %ld, '%c' }", s->l, s->b); }
172 # void pbig(Sbig *s) { printf(" \"%.17s\"", s->b); }
173 # void pddd(Sddd *s) { printf(" { %g, %g, %g }", s->d0, s->d1, s->d2); }
174 # void pw(int w) { printf(" %d", w); }
175 # void pl(long l) { printf(" %ld", l); }
176 # void ps(float s) { printf(" %g", s); }
177 # void pd(double d) { printf(" %g", d); }
178 # /* --------------------------- */
179 # extern void qfn0(float, float, float, float, float, float, float, float, float);
180 # void cfn0(float p0, float p1, float p2, float p3, float p4, float p5, float p6, float p7, float p8) {
181 #       printf("qbe->c(%d)", 0);
182 #       ps(p8); puts("");
183 #       qfn0(p0, p1, p2, p3, p4, p5, p6, p7, p8);
184 # }
185 # extern void qfn1(int, float, Sfi1);
186 # void cfn1(int p0, float p1, Sfi1 p2) {
187 #       printf("qbe->c(%d)", 1);
188 #       pw(p0); ps(p1); pfi1(&p2); puts("");
189 #       qfn1(p0, p1, p2);
190 # }
191 # extern void qfn2(int, Sfi2, float);
192 # void cfn2(int p0, Sfi2 p1, float p2) {
193 #       printf("qbe->c(%d)", 2);
194 #       pw(p0); pfi2(&p1); ps(p2); puts("");
195 #       qfn2(p0, p1, p2);
196 # }
197 # extern void qfn3(int, float, Sfi3);
198 # void cfn3(int p0, float p1, Sfi3 p2) {
199 #       printf("qbe->c(%d)", 3);
200 #       pw(p0); ps(p1); pfi3(&p2); puts("");
201 #       qfn3(p0, p1, p2);
202 # }
203 # extern void qfn4(Sss);
204 # void cfn4(Sss p0) {
205 #       printf("qbe->c(%d)", 4);
206 #       pss(&p0); puts("");
207 #       qfn4(p0);
208 # }
209 # extern void qfn5(double, double, double, double, double, double, double, Sss, float, long);
210 # void cfn5(double p0, double p1, double p2, double p3, double p4, double p5, double p6, Sss p7, float p8, long p9) {
211 #       printf("qbe->c(%d)", 5);
212 #       pss(&p7); ps(p8); pl(p9); puts("");
213 #       qfn5(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
214 # }
215 # extern void qfn6(Slb);
216 # void cfn6(Slb p0) {
217 #       printf("qbe->c(%d)", 6);
218 #       plb(&p0); puts("");
219 #       qfn6(p0);
220 # }
221 # extern void qfn7(int, int, int, int, int, int, int, Slb);
222 # void cfn7(int p0, int p1, int p2, int p3, int p4, int p5, int p6, Slb p7) {
223 #       printf("qbe->c(%d)", 7);
224 #       plb(&p7); puts("");
225 #       qfn7(p0, p1, p2, p3, p4, p5, p6, p7);
226 # }
227 # extern void qfn8(int, int, int, int, int, int, int, int, Slb);
228 # void cfn8(int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, Slb p8) {
229 #       printf("qbe->c(%d)", 8);
230 #       plb(&p8); puts("");
231 #       qfn8(p0, p1, p2, p3, p4, p5, p6, p7, p8);
232 # }
233 # extern void qfn9(Sbig);
234 # void cfn9(Sbig p0) {
235 #       printf("qbe->c(%d)", 9);
236 #       pbig(&p0); puts("");
237 #       qfn9(p0);
238 # }
239 # extern void qfn10(int, int, int, int, int, int, int, int, Sbig, float, long);
240 # void cfn10(int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, Sbig p8, float p9, long p10) {
241 #       printf("qbe->c(%d)", 10);
242 #       pbig(&p8); ps(p9); pl(p10); puts("");
243 #       qfn10(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
244 # }
245 # extern void qfn11(Sddd);
246 # void cfn11(Sddd p0) {
247 #       printf("qbe->c(%d)", 11);
248 #       pddd(&p0); puts("");
249 #       qfn11(p0);
250 # }
251 # <<<
253 # >>> output
254 # qbe->c(0) 9.9
255 # c->qbe(0) 9.9
256 # qbe->c(1) 1 2.2 { -123, 4.56 }
257 # c->qbe(1) 1 2.2 { -123, 4.56 }
258 # qbe->c(2) 1 { 1.23, 456 } 3.3
259 # c->qbe(2) 1 { 1.23, 456 } 3.3
260 # qbe->c(3) 1 2.2 { 3.45, 567 }
261 # c->qbe(3) 1 2.2 { 3.45, 567 }
262 # qbe->c(4) { 1.23, 45.6 }
263 # c->qbe(4) { 1.23, 45.6 }
264 # qbe->c(5) { 1.23, 45.6 } 9.9 10
265 # c->qbe(5) { 1.23, 45.6 } 9.9 10
266 # qbe->c(6) { 123, 'z' }
267 # c->qbe(6) { 123, 'z' }
268 # qbe->c(7) { 123, 'z' }
269 # c->qbe(7) { 123, 'z' }
270 # qbe->c(8) { 123, 'z' }
271 # c->qbe(8) { 123, 'z' }
272 # qbe->c(9) "abcdefhijklmnopqr"
273 # c->qbe(9) "abcdefhijklmnopqr"
274 # qbe->c(10) "abcdefhijklmnopqr" 10.1 11
275 # c->qbe(10) "abcdefhijklmnopqr" 10.1 11
276 # qbe->c(11) { 1.23, 45.6, 7.89 }
277 # c->qbe(11) { 1.23, 45.6, 7.89 }
278 # <<<