1 #include <lightning.h>
2 #include <stdarg.h>
3 #include <stdio.h>
4 
5 #define W		jit_word_t
6 #define D		jit_float64_t
7 #define VASTART(A)							\
8     va_list		ap;						\
9     va_start(ap, A)
10 #define VARG2()		a2 = va_arg(ap, jit_word_t);	VARG3()
11 #define VARG3()		a3 = va_arg(ap, jit_word_t);	VARG4()
12 #define VARG4()		a4 = va_arg(ap, jit_word_t);	VARG5()
13 #define VARG5()		a5 = va_arg(ap, jit_word_t);	VARG6()
14 #define VARG6()		a6 = va_arg(ap, jit_word_t);	VARG7()
15 #define VARG7()		a7 = va_arg(ap, jit_word_t);	VARG8()
16 #define VARG8()		a8 = va_arg(ap, jit_word_t);	VARG9()
17 #define VARG9()		a9 = va_arg(ap, jit_word_t);	VARG10()
18 #define VARG10()	a10 = va_arg(ap, jit_word_t);	va_end(ap)
19 
20 #define VARGD2()	a2 = va_arg(ap, jit_float64_t);	VARGD3()
21 #define VARGD3()	a3 = va_arg(ap, jit_float64_t);	VARGD4()
22 #define VARGD4()	a4 = va_arg(ap, jit_float64_t);	VARGD5()
23 #define VARGD5()	a5 = va_arg(ap, jit_float64_t);	VARGD6()
24 #define VARGD6()	a6 = va_arg(ap, jit_float64_t);	VARGD7()
25 #define VARGD7()	a7 = va_arg(ap, jit_float64_t);	VARGD8()
26 #define VARGD8()	a8 = va_arg(ap, jit_float64_t);	VARGD9()
27 #define VARGD9()	a9 = va_arg(ap, jit_float64_t);	VARGD10()
28 #define VARGD10()	a10 = va_arg(ap, jit_float64_t);va_end(ap)
29 
30 #define IDVARG2()	a2 = va_arg(ap, jit_float64_t);	IDVARG3()
31 #define IDVARG3()	a3 = va_arg(ap, jit_word_t);	IDVARG4()
32 #define IDVARG4()	a4 = va_arg(ap, jit_float64_t);	IDVARG5()
33 #define IDVARG5()	a5 = va_arg(ap, jit_word_t);	IDVARG6()
34 #define IDVARG6()	a6 = va_arg(ap, jit_float64_t);	IDVARG7()
35 #define IDVARG7()	a7 = va_arg(ap, jit_word_t);	IDVARG8()
36 #define IDVARG8()	a8 = va_arg(ap, jit_float64_t);	IDVARG9()
37 #define IDVARG9()	a9 = va_arg(ap, jit_word_t);	IDVARG10()
38 #define IDVARG10()	a10 = va_arg(ap, jit_float64_t);va_end(ap)
39 
40 #define DIVARG2()	a2 = va_arg(ap, jit_word_t);	DIVARG3()
41 #define DIVARG3()	a3 = va_arg(ap, jit_float64_t);	DIVARG4()
42 #define DIVARG4()	a4 = va_arg(ap, jit_word_t);	DIVARG5()
43 #define DIVARG5()	a5 = va_arg(ap, jit_float64_t);	DIVARG6()
44 #define DIVARG6()	a6 = va_arg(ap, jit_word_t);	DIVARG7()
45 #define DIVARG7()	a7 = va_arg(ap, jit_float64_t);	DIVARG8()
46 #define DIVARG8()	a8 = va_arg(ap, jit_word_t);	DIVARG9()
47 #define DIVARG9()	a9 = va_arg(ap, jit_float64_t);	DIVARG10()
48 #define DIVARG10()	a10 = va_arg(ap, jit_word_t);	va_end(ap)
49 
50 #define CHECK()								\
51     do {								\
52 	if (a1 != 1 || a2 != 2 || a3 != 3 || a4 != 4 || a5 != 5 ||	\
53 	    a6 != 6 || a7 != 7 || a8 != 8 || a9 != 9 || a10 != 10)	\
54 	    abort();							\
55     } while (0)
56 
57 
i_iiiiiiiii(W a1,...)58 void i_iiiiiiiii(W a1, ...)
59 {
60     W		a2, a3, a4, a5, a6, a7, a8, a9, a10;
61     VASTART(a1);
62     VARG2();
63     CHECK();
64 }
65 
ii_iiiiiiii(W a1,W a2,...)66 void ii_iiiiiiii(W a1, W a2, ...)
67 {
68     W		a3, a4, a5, a6, a7, a8, a9, a10;
69     VASTART(a2);
70     VARG3();
71     CHECK();
72 }
73 
iii_iiiiiii(W a1,W a2,W a3,...)74 void iii_iiiiiii(W a1, W a2, W a3, ...)
75 {
76     W		a4, a5, a6, a7, a8, a9, a10;
77     VASTART(a3);
78     VARG4();
79     CHECK();
80 }
81 
iiii_iiiiii(W a1,W a2,W a3,W a4,...)82 void iiii_iiiiii(W a1, W a2, W a3, W a4, ...)
83 {
84     W		a5, a6, a7, a8, a9, a10;
85     VASTART(a4);
86     VARG5();
87     CHECK();
88 }
89 
iiiii_iiiii(W a1,W a2,W a3,W a4,W a5,...)90 void iiiii_iiiii(W a1, W a2, W a3, W a4, W a5, ...)
91 {
92     W		a6, a7, a8, a9, a10;
93     VASTART(a5);
94     VARG6();
95     CHECK();
96 }
97 
iiiiii_iiii(W a1,W a2,W a3,W a4,W a5,W a6,...)98 void iiiiii_iiii(W a1, W a2, W a3, W a4, W a5, W a6, ...)
99 {
100     W		a7, a8, a9, a10;
101     VASTART(a6);
102     VARG7();
103     CHECK();
104 }
105 
iiiiiii_iii(W a1,W a2,W a3,W a4,W a5,W a6,W a7,...)106 void iiiiiii_iii(W a1, W a2, W a3, W a4, W a5, W a6, W a7, ...)
107 {
108     W		a8, a9, a10;
109     VASTART(a7);
110     VARG8();
111     CHECK();
112 }
113 
iiiiiiii_ii(W a1,W a2,W a3,W a4,W a5,W a6,W a7,W a8,...)114 void iiiiiiii_ii(W a1, W a2, W a3, W a4, W a5, W a6, W a7, W a8, ...)
115 {
116     W		a9, a10;
117     VASTART(a8);
118     VARG9();
119     CHECK();
120 }
121 
iiiiiiiii_i(W a1,W a2,W a3,W a4,W a5,W a6,W a7,W a8,W a9,...)122 void iiiiiiiii_i(W a1, W a2, W a3, W a4, W a5, W a6, W a7, W a8, W a9, ...)
123 {
124     W		a10;
125     VASTART(a9);
126     VARG10();
127     CHECK();
128 }
129 
d_ddddddddd(D a1,...)130 void d_ddddddddd(D a1, ...)
131 {
132     D		a2, a3, a4, a5, a6, a7, a8, a9, a10;
133     VASTART(a1);
134     VARGD2();
135     CHECK();
136 }
137 
dd_dddddddd(D a1,D a2,...)138 void dd_dddddddd(D a1, D a2, ...)
139 {
140     D		a3, a4, a5, a6, a7, a8, a9, a10;
141     VASTART(a2);
142     VARGD3();
143     CHECK();
144 }
145 
ddd_ddddddd(D a1,D a2,D a3,...)146 void ddd_ddddddd(D a1, D a2, D a3, ...)
147 {
148     D		a4, a5, a6, a7, a8, a9, a10;
149     VASTART(a3);
150     VARGD4();
151     CHECK();
152 }
153 
dddd_dddddd(D a1,D a2,D a3,D a4,...)154 void dddd_dddddd(D a1, D a2, D a3, D a4, ...)
155 {
156     D		a5, a6, a7, a8, a9, a10;
157     VASTART(a4);
158     VARGD5();
159     CHECK();
160 }
161 
ddddd_ddddd(D a1,D a2,D a3,D a4,D a5,...)162 void ddddd_ddddd(D a1, D a2, D a3, D a4, D a5, ...)
163 {
164     D		a6, a7, a8, a9, a10;
165     VASTART(a5);
166     VARGD6();
167     CHECK();
168 }
169 
dddddd_dddd(D a1,D a2,D a3,D a4,D a5,D a6,...)170 void dddddd_dddd(D a1, D a2, D a3, D a4, D a5, D a6, ...)
171 {
172     D		a7, a8, a9, a10;
173     VASTART(a6);
174     VARGD7();
175     CHECK();
176 }
177 
ddddddd_ddd(D a1,D a2,D a3,D a4,D a5,D a6,D a7,...)178 void ddddddd_ddd(D a1, D a2, D a3, D a4, D a5, D a6, D a7, ...)
179 {
180     D		a8, a9, a10;
181     VASTART(a7);
182     VARGD8();
183     CHECK();
184 }
185 
dddddddd_dd(D a1,D a2,D a3,D a4,D a5,D a6,D a7,D a8,...)186 void dddddddd_dd(D a1, D a2, D a3, D a4, D a5, D a6, D a7, D a8, ...)
187 {
188     D		a9, a10;
189     VASTART(a8);
190     VARGD9();
191     CHECK();
192 }
193 
ddddddddd_d(D a1,D a2,D a3,D a4,D a5,D a6,D a7,D a8,D a9,...)194 void ddddddddd_d(D a1, D a2, D a3, D a4, D a5, D a6, D a7, D a8, D a9, ...)
195 {
196     D		a10;
197     VASTART(a9);
198     VARGD10();
199     CHECK();
200 }
201 
i_didididid(W a1,...)202 void i_didididid(W a1, ...)
203 {
204     W		a3, a5, a7, a9;
205     D		a2, a4, a6, a8, a10;
206     VASTART(a1);
207     IDVARG2();
208     CHECK();
209 }
210 
id_idididid(W a1,D a2,...)211 void id_idididid(W a1, D a2, ...)
212 {
213     W		a3, a5, a7, a9;
214     D		a4, a6, a8, a10;
215     VASTART(a2);
216     IDVARG3();
217     CHECK();
218 }
219 
idi_dididid(W a1,D a2,W a3,...)220 void idi_dididid(W a1, D a2, W a3, ...)
221 {
222     W		a5, a7, a9;
223     D		a4, a6, a8, a10;
224     VASTART(a3);
225     IDVARG4();
226     CHECK();
227 }
228 
idid_ididid(W a1,D a2,W a3,D a4,...)229 void idid_ididid(W a1, D a2, W a3, D a4, ...)
230 {
231     W		a5, a7, a9;
232     D		a6, a8, a10;
233     VASTART(a4);
234     IDVARG5();
235     CHECK();
236 }
237 
ididi_didid(W a1,D a2,W a3,D a4,W a5,...)238 void ididi_didid(W a1, D a2, W a3, D a4, W a5, ...)
239 {
240     W		a7, a9;
241     D		a6, a8, a10;
242     VASTART(a5);
243     IDVARG6();
244     CHECK();
245 }
246 
ididid_idid(W a1,D a2,W a3,D a4,W a5,D a6,...)247 void ididid_idid(W a1, D a2, W a3, D a4, W a5, D a6, ...)
248 {
249     W		a7, a9;
250     D		a8, a10;
251     VASTART(a6);
252     IDVARG7();
253     CHECK();
254 }
255 
idididi_did(W a1,D a2,W a3,D a4,W a5,D a6,W a7,...)256 void idididi_did(W a1, D a2, W a3, D a4, W a5, D a6, W a7, ...)
257 {
258     W		a9;
259     D		a8, a10;
260     VASTART(a7);
261     IDVARG8();
262     CHECK();
263 }
264 
idididid_id(W a1,D a2,W a3,D a4,W a5,D a6,W a7,D a8,...)265 void idididid_id(W a1, D a2, W a3, D a4, W a5, D a6, W a7, D a8, ...)
266 {
267     W		a9;
268     D		a10;
269     VASTART(a8);
270     IDVARG9();
271     CHECK();
272 }
273 
ididididi_d(W a1,D a2,W a3,D a4,W a5,D a6,W a7,D a8,W a9,...)274 void ididididi_d(W a1, D a2, W a3, D a4, W a5, D a6, W a7, D a8, W a9, ...)
275 {
276     D		a10;
277     VASTART(a9);
278     IDVARG10();
279     CHECK();
280 }
281 
d_ididididi(D a1,...)282 void d_ididididi(D a1, ...)
283 {
284     W		a2, a4, a6, a8, a10;
285     D		a3, a5, a7, a9;
286     VASTART(a1);
287     DIVARG2();
288     CHECK();
289 }
290 
di_didididi(D a1,W a2,...)291 void di_didididi(D a1, W a2, ...)
292 {
293     W		a4, a6, a8, a10;
294     D		a3, a5, a7, a9;
295     VASTART(a2);
296     DIVARG3();
297     CHECK();
298 }
299 
did_idididi(D a1,W a2,D a3,...)300 void did_idididi(D a1, W a2, D a3, ...)
301 {
302     W		a4, a6, a8, a10;
303     D		a5, a7, a9;
304     VASTART(a3);
305     DIVARG4();
306     CHECK();
307 }
308 
didi_dididi(D a1,W a2,D a3,W a4,...)309 void didi_dididi(D a1, W a2, D a3, W a4, ...)
310 {
311     W		a6, a8, a10;
312     D		a5, a7, a9;
313     VASTART(a4);
314     DIVARG5();
315     CHECK();
316 }
317 
didid_ididi(D a1,W a2,D a3,W a4,D a5,...)318 void didid_ididi(D a1, W a2, D a3, W a4, D a5, ...)
319 {
320     W		a6, a8, a10;
321     D		a7, a9;
322     VASTART(a5);
323     DIVARG6();
324     CHECK();
325 }
326 
dididi_didi(D a1,W a2,D a3,W a4,D a5,W a6,...)327 void dididi_didi(D a1, W a2, D a3, W a4, D a5, W a6, ...)
328 {
329     W		a8, a10;
330     D		a7, a9;
331     VASTART(a6);
332     DIVARG7();
333     CHECK();
334 }
335 
dididid_idi(D a1,W a2,D a3,W a4,D a5,W a6,D a7,...)336 void dididid_idi(D a1, W a2, D a3, W a4, D a5, W a6, D a7, ...)
337 {
338     W		a8, a10;
339     D		a9;
340     VASTART(a7);
341     DIVARG8();
342     CHECK();
343 }
344 
didididi_di(D a1,W a2,D a3,W a4,D a5,W a6,D a7,W a8,...)345 void didididi_di(D a1, W a2, D a3, W a4, D a5, W a6, D a7, W a8, ...)
346 {
347     W		a10;
348     D		a9;
349     VASTART(a8);
350     DIVARG9();
351     CHECK();
352 }
353 
didididid_i(D a1,W a2,D a3,W a4,D a5,W a6,D a7,W a8,D a9,...)354 void didididid_i(D a1, W a2, D a3, W a4, D a5, W a6, D a7, W a8, D a9, ...)
355 {
356     W		a10;
357     VASTART(a9);
358     DIVARG10();
359     CHECK();
360 }
361 
va_i_iiiiiiiii(W a1,va_list ap)362 void va_i_iiiiiiiii(W a1, va_list ap)
363 {
364     W		a2, a3, a4, a5, a6, a7, a8, a9, a10;
365     VARG2();
366     CHECK();
367 }
368 
va_ii_iiiiiiii(W a1,W a2,va_list ap)369 void va_ii_iiiiiiii(W a1, W a2, va_list ap)
370 {
371     W		a3, a4, a5, a6, a7, a8, a9, a10;
372     VARG3();
373     CHECK();
374 }
375 
va_iii_iiiiiii(W a1,W a2,W a3,va_list ap)376 void va_iii_iiiiiii(W a1, W a2, W a3, va_list ap)
377 {
378     W		a4, a5, a6, a7, a8, a9, a10;
379     VARG4();
380     CHECK();
381 }
382 
va_iiii_iiiiii(W a1,W a2,W a3,W a4,va_list ap)383 void va_iiii_iiiiii(W a1, W a2, W a3, W a4, va_list ap)
384 {
385     W		a5, a6, a7, a8, a9, a10;
386     VARG5();
387     CHECK();
388 }
389 
390 
va_d_ddddddddd(D a1,va_list ap)391 void va_d_ddddddddd(D a1, va_list ap)
392 {
393     D		a2, a3, a4, a5, a6, a7, a8, a9, a10;
394     VARGD2();
395     CHECK();
396 }
397 
va_dd_dddddddd(D a1,D a2,va_list ap)398 void va_dd_dddddddd(D a1, D a2, va_list ap)
399 {
400     D		a3, a4, a5, a6, a7, a8, a9, a10;
401     VARGD3();
402     CHECK();
403 }
404 
va_ddd_ddddddd(D a1,D a2,D a3,va_list ap)405 void va_ddd_ddddddd(D a1, D a2, D a3, va_list ap)
406 {
407     D		a4, a5, a6, a7, a8, a9, a10;
408     VARGD4();
409     CHECK();
410 }
411 
va_dddd_dddddd(D a1,D a2,D a3,D a4,va_list ap)412 void va_dddd_dddddd(D a1, D a2, D a3, D a4, va_list ap)
413 {
414     D		a5, a6, a7, a8, a9, a10;
415     VARGD5();
416     CHECK();
417 }
418 
va_i_didididid(W a1,va_list ap)419 void va_i_didididid(W a1, va_list ap)
420 {
421     W		a3, a5, a7, a9;
422     D		a2, a4, a6, a8, a10;
423     IDVARG2();
424     CHECK();
425 }
426 
va_id_idididid(W a1,D a2,va_list ap)427 void va_id_idididid(W a1, D a2, va_list ap)
428 {
429     W		a3, a5, a7, a9;
430     D		a4, a6, a8, a10;
431     IDVARG3();
432     CHECK();
433 }
434 
va_idi_dididid(W a1,D a2,W a3,va_list ap)435 void va_idi_dididid(W a1, D a2, W a3, va_list ap)
436 {
437     W		a5, a7, a9;
438     D		a4, a6, a8, a10;
439     IDVARG4();
440     CHECK();
441 }
442 
va_idid_ididid(W a1,D a2,W a3,D a4,va_list ap)443 void va_idid_ididid(W a1, D a2, W a3, D a4, va_list ap)
444 {
445     W		a5, a7, a9;
446     D		a6, a8, a10;
447     IDVARG5();
448     CHECK();
449 }
450 
va_d_ididididi(D a1,va_list ap)451 void va_d_ididididi(D a1, va_list ap)
452 {
453     W		a2, a4, a6, a8, a10;
454     D		a3, a5, a7, a9;
455     DIVARG2();
456     CHECK();
457 }
458 
va_di_didididi(D a1,W a2,va_list ap)459 void va_di_didididi(D a1, W a2, va_list ap)
460 {
461     W		a4, a6, a8, a10;
462     D		a3, a5, a7, a9;
463     DIVARG3();
464     CHECK();
465 }
466 
va_did_idididi(D a1,W a2,D a3,va_list ap)467 void va_did_idididi(D a1, W a2, D a3, va_list ap)
468 {
469     W		a4, a6, a8, a10;
470     D		a5, a7, a9;
471     DIVARG4();
472     CHECK();
473 }
474 
va_didi_dididi(D a1,W a2,D a3,W a4,va_list ap)475 void va_didi_dididi(D a1, W a2, D a3, W a4, va_list ap)
476 {
477     W		a6, a8, a10;
478     D		a5, a7, a9;
479     DIVARG5();
480     CHECK();
481 }
482 
483 #define PUSH1()					jit_pushargi(1)
484 #define PUSH2()		PUSH1();		jit_pushargi(2)
485 #define PUSH3()		PUSH2();		jit_pushargi(3)
486 #define PUSH4()		PUSH3();		jit_pushargi(4)
487 #define PUSH5()		PUSH4();		jit_pushargi(5)
488 #define PUSH6()		PUSH5();		jit_pushargi(6)
489 #define PUSH7()		PUSH6();		jit_pushargi(7)
490 #define PUSH8()		PUSH7();		jit_pushargi(8)
491 #define PUSH9()		PUSH8();		jit_pushargi(9)
492 #define VPUSH2()	jit_pushargi(2);	VPUSH3()
493 #define VPUSH3()	jit_pushargi(3);	VPUSH4()
494 #define VPUSH4()	jit_pushargi(4);	VPUSH5()
495 #define VPUSH5()	jit_pushargi(5);	VPUSH6()
496 #define VPUSH6()	jit_pushargi(6);	VPUSH7()
497 #define VPUSH7()	jit_pushargi(7);	VPUSH8()
498 #define VPUSH8()	jit_pushargi(8);	VPUSH9()
499 #define VPUSH9()	jit_pushargi(9);	VPUSH10()
500 #define VPUSH10()	jit_pushargi(10);
501 #define PUSHD1()				jit_pushargi_d(1)
502 #define PUSHD2()	PUSHD1();		jit_pushargi_d(2)
503 #define PUSHD3()	PUSHD2();		jit_pushargi_d(3)
504 #define PUSHD4()	PUSHD3();		jit_pushargi_d(4)
505 #define PUSHD5()	PUSHD4();		jit_pushargi_d(5)
506 #define PUSHD6()	PUSHD5();		jit_pushargi_d(6)
507 #define PUSHD7()	PUSHD6();		jit_pushargi_d(7)
508 #define PUSHD8()	PUSHD7();		jit_pushargi_d(8)
509 #define PUSHD9()	PUSHD8();		jit_pushargi_d(9)
510 #define VPUSHD2()	jit_pushargi_d(2);	VPUSHD3()
511 #define VPUSHD3()	jit_pushargi_d(3);	VPUSHD4()
512 #define VPUSHD4()	jit_pushargi_d(4);	VPUSHD5()
513 #define VPUSHD5()	jit_pushargi_d(5);	VPUSHD6()
514 #define VPUSHD6()	jit_pushargi_d(6);	VPUSHD7()
515 #define VPUSHD7()	jit_pushargi_d(7);	VPUSHD8()
516 #define VPUSHD8()	jit_pushargi_d(8);	VPUSHD9()
517 #define VPUSHD9()	jit_pushargi_d(9);	VPUSHD10()
518 #define VPUSHD10()	jit_pushargi_d(10);
519 #define IDPUSH1()				jit_pushargi(1)
520 #define IDPUSH2()	IDPUSH1();		jit_pushargi_d(2)
521 #define IDPUSH3()	IDPUSH2();		jit_pushargi(3)
522 #define IDPUSH4()	IDPUSH3();		jit_pushargi_d(4)
523 #define IDPUSH5()	IDPUSH4();		jit_pushargi(5)
524 #define IDPUSH6()	IDPUSH5();		jit_pushargi_d(6)
525 #define IDPUSH7()	IDPUSH6();		jit_pushargi(7)
526 #define IDPUSH8()	IDPUSH7();		jit_pushargi_d(8)
527 #define IDPUSH9()	IDPUSH8();		jit_pushargi(9)
528 #define IDVPUSH2()	jit_pushargi_d(2);	IDVPUSH3()
529 #define IDVPUSH3()	jit_pushargi(3);	IDVPUSH4()
530 #define IDVPUSH4()	jit_pushargi_d(4);	IDVPUSH5()
531 #define IDVPUSH5()	jit_pushargi(5);	IDVPUSH6()
532 #define IDVPUSH6()	jit_pushargi_d(6);	IDVPUSH7()
533 #define IDVPUSH7()	jit_pushargi(7);	IDVPUSH8()
534 #define IDVPUSH8()	jit_pushargi_d(8);	IDVPUSH9()
535 #define IDVPUSH9()	jit_pushargi(9);	IDVPUSH10()
536 #define IDVPUSH10()	jit_pushargi_d(10);
537 #define DIPUSH1()				jit_pushargi_d(1)
538 #define DIPUSH2()	DIPUSH1();		jit_pushargi(2)
539 #define DIPUSH3()	DIPUSH2();		jit_pushargi_d(3)
540 #define DIPUSH4()	DIPUSH3();		jit_pushargi(4)
541 #define DIPUSH5()	DIPUSH4();		jit_pushargi_d(5)
542 #define DIPUSH6()	DIPUSH5();		jit_pushargi(6)
543 #define DIPUSH7()	DIPUSH6();		jit_pushargi_d(7)
544 #define DIPUSH8()	DIPUSH7();		jit_pushargi(8)
545 #define DIPUSH9()	DIPUSH8();		jit_pushargi_d(9)
546 #define DIVPUSH2()	jit_pushargi(2);	DIVPUSH3()
547 #define DIVPUSH3()	jit_pushargi_d(3);	DIVPUSH4()
548 #define DIVPUSH4()	jit_pushargi(4);	DIVPUSH5()
549 #define DIVPUSH5()	jit_pushargi_d(5);	DIVPUSH6()
550 #define DIVPUSH6()	jit_pushargi(6);	DIVPUSH7()
551 #define DIVPUSH7()	jit_pushargi_d(7);	DIVPUSH8()
552 #define DIVPUSH8()	jit_pushargi(8);	DIVPUSH9()
553 #define DIVPUSH9()	jit_pushargi_d(9);	DIVPUSH10()
554 #define DIVPUSH10()	jit_pushargi(10);
555 
556 jit_state_t	 *_jit;
557 
main(int argc,char * argv[])558 int main(int argc, char *argv[])
559 {
560     void		(*function)(void);
561     jit_node_t		*jmpi_main;
562     jit_node_t		*a1, *a2, *node;
563     jit_node_t		*jva_i_iiiiiiiii, *jva_ii_iiiiiiii;
564     jit_node_t		*jva_d_ddddddddd, *jva_dd_dddddddd;
565     jit_node_t		*jva_i_didididid, *jva_id_idididid;
566     jit_node_t		*jva_d_ididididi, *jva_di_didididi;
567     jit_node_t		*jva_iii_iiiiiii, *jva_iiii_iiiiii;
568     jit_node_t		*jva_ddd_ddddddd, *jva_dddd_dddddd;
569     jit_node_t		*jva_idi_dididid, *jva_idid_ididid;
570     jit_node_t		*jva_did_idididi, *jva_didi_dididi;
571 
572     init_jit(argv[0]);
573     _jit = jit_new_state();
574 
575     jmpi_main = jit_jmpi();
576 
577     /* Define simple functions to validate a jit_va_list_t
578      * is a valid va_list; these do not fetch arguments from
579      * the va_list. */
580     jva_i_iiiiiiiii = jit_label();
581     jit_name("va_i_iiiiiiiii");
582     jit_prolog();
583     a1 = jit_arg();
584     jit_getarg(JIT_V1, a1);
585     jit_ellipsis();
586     jit_va_start(JIT_V0);
587     jit_prepare();
588     jit_pushargr(JIT_V1);
589     jit_va_push(JIT_V0);
590     jit_finishi(va_i_iiiiiiiii);
591     jit_va_end(JIT_V0);
592     jit_ret();
593     jit_epilog();
594     jva_ii_iiiiiiii = jit_label();
595     jit_name("va_ii_iiiiiiii");
596     jit_prolog();
597     a1 = jit_arg();
598     a2 = jit_arg();
599     jit_getarg(JIT_V1, a1);
600     jit_getarg(JIT_V2, a2);
601     jit_ellipsis();
602     jit_va_start(JIT_V0);
603     jit_prepare();
604     jit_pushargr(JIT_V1);
605     jit_pushargr(JIT_V2);
606     jit_va_push(JIT_V0);
607     jit_finishi(va_ii_iiiiiiii);
608     jit_va_end(JIT_V0);
609     jit_ret();
610     jit_epilog();
611     jva_d_ddddddddd = jit_label();
612     jit_name("va_d_ddddddddd");
613     jit_prolog();
614     a1 = jit_arg_d();
615     jit_getarg_d(JIT_F3, a1);
616     jit_ellipsis();
617     jit_va_start(JIT_V0);
618     jit_prepare();
619     jit_pushargr_d(JIT_F3);
620     jit_va_push(JIT_V0);
621     jit_finishi(va_d_ddddddddd);
622     jit_va_end(JIT_V0);
623     jit_ret();
624     jit_epilog();
625     jva_dd_dddddddd = jit_label();
626     jit_name("va_dd_dddddddd");
627     jit_prolog();
628     a1 = jit_arg_d();
629     a2 = jit_arg_d();
630     jit_getarg_d(JIT_F3, a1);
631     jit_getarg_d(JIT_F4, a2);
632     jit_ellipsis();
633     jit_va_start(JIT_V0);
634     jit_prepare();
635     jit_pushargr_d(JIT_F3);
636     jit_pushargr_d(JIT_F4);
637     jit_va_push(JIT_V0);
638     jit_finishi(va_dd_dddddddd);
639     jit_va_end(JIT_V0);
640     jit_ret();
641     jit_epilog();
642     jva_i_didididid = jit_label();
643     jit_name("va_i_didididid");
644     jit_prolog();
645     a1 = jit_arg();
646     jit_getarg(JIT_V1, a1);
647     jit_ellipsis();
648     jit_va_start(JIT_V0);
649     jit_prepare();
650     jit_pushargr(JIT_V1);
651     jit_va_push(JIT_V0);
652     jit_finishi(va_i_didididid);
653     jit_va_end(JIT_V0);
654     jit_ret();
655     jit_epilog();
656     jva_id_idididid = jit_label();
657     jit_name("va_id_idididid");
658     jit_prolog();
659     a1 = jit_arg();
660     a2 = jit_arg_d();
661     jit_getarg(JIT_V1, a1);
662     jit_getarg_d(JIT_F3, a2);
663     jit_ellipsis();
664     jit_va_start(JIT_V0);
665     jit_prepare();
666     jit_pushargr(JIT_V1);
667     jit_pushargr_d(JIT_F3);
668     jit_va_push(JIT_V0);
669     jit_finishi(va_id_idididid);
670     jit_va_end(JIT_V0);
671     jit_ret();
672     jit_epilog();
673     jva_d_ididididi = jit_label();
674     jit_name("va_d_ididididi");
675     jit_prolog();
676     a1 = jit_arg_d();
677     jit_getarg_d(JIT_F3, a1);
678     jit_ellipsis();
679     jit_va_start(JIT_V0);
680     jit_prepare();
681     jit_pushargr_d(JIT_F3);
682     jit_va_push(JIT_V0);
683     jit_finishi(va_d_ididididi);
684     jit_va_end(JIT_V0);
685     jit_ret();
686     jit_epilog();
687     jva_di_didididi = jit_label();
688     jit_name("va_di_didididi");
689     jit_prolog();
690     a1 = jit_arg_d();
691     a2 = jit_arg();
692     jit_getarg_d(JIT_F3, a1);
693     jit_getarg(JIT_V1, a2);
694     jit_ellipsis();
695     jit_va_start(JIT_V0);
696     jit_prepare();
697     jit_pushargr_d(JIT_F3);
698     jit_pushargr(JIT_V1);
699     jit_va_push(JIT_V0);
700     jit_finishi(va_di_didididi);
701     jit_va_end(JIT_V0);
702     jit_ret();
703     jit_epilog();
704 
705     /* Define complex functions to validate a jit_va_list_t
706      * is a valid va_list; these do fetch arguments from
707      * the va_list, to ensure it does the correct operations
708      * fetching arguments, and pass a valid va_list to the
709      * C function. */
710     jva_iii_iiiiiii = jit_label();
711     jit_name("va_iii_iiiiiii");
712     jit_prolog();
713     a1 = jit_arg();
714     jit_getarg(JIT_V1, a1);
715     node = jit_beqi(JIT_V1, 1);
716     jit_calli(abort);
717     jit_patch(node);
718     jit_ellipsis();
719     jit_va_start(JIT_V0);
720     jit_va_arg(JIT_V1, JIT_V0);
721     jit_va_arg(JIT_V2, JIT_V0);
722     jit_prepare();
723     jit_pushargi(1);
724     jit_pushargr(JIT_V1);
725     jit_pushargr(JIT_V2);
726     jit_va_push(JIT_V0);
727     jit_finishi(va_iii_iiiiiii);
728     jit_va_end(JIT_V0);
729     jit_ret();
730     jit_epilog();
731     jva_iiii_iiiiii = jit_label();
732     jit_name("va_iiii_iiiiii");
733     jit_prolog();
734     a1 = jit_arg();
735     a2 = jit_arg();
736     jit_getarg(JIT_V1, a1);
737     node = jit_beqi(JIT_V1, 1);
738     jit_calli(abort);
739     jit_patch(node);
740     jit_getarg(JIT_V1, a2);
741     node = jit_beqi(JIT_V1, 2);
742     jit_calli(abort);
743     jit_patch(node);
744     jit_ellipsis();
745     jit_va_start(JIT_V0);
746     jit_va_arg(JIT_V1, JIT_V0);
747     jit_va_arg(JIT_V2, JIT_V0);
748     jit_prepare();
749     jit_pushargi(1);
750     jit_pushargi(2);
751     jit_pushargr(JIT_V1);
752     jit_pushargr(JIT_V2);
753     jit_va_push(JIT_V0);
754     jit_finishi(va_iiii_iiiiii);
755     jit_va_end(JIT_V0);
756     jit_ret();
757     jit_epilog();
758     jva_ddd_ddddddd = jit_label();
759     jit_name("va_ddd_ddddddd");
760     jit_prolog();
761     a1 = jit_arg_d();
762     jit_getarg_d(JIT_F3, a1);
763     node = jit_beqi_d(JIT_F3, 1);
764     jit_calli(abort);
765     jit_patch(node);
766     jit_ellipsis();
767     jit_va_start(JIT_V0);
768     jit_va_arg_d(JIT_F3, JIT_V0);
769     jit_va_arg_d(JIT_F4, JIT_V0);
770     jit_prepare();
771     jit_pushargi_d(1);
772     jit_pushargr_d(JIT_F3);
773     jit_pushargr_d(JIT_F4);
774     jit_va_push(JIT_V0);
775     jit_finishi(va_ddd_ddddddd);
776     jit_va_end(JIT_V0);
777     jit_ret();
778     jit_epilog();
779     jva_dddd_dddddd = jit_label();
780     jit_name("va_dddd_dddddd");
781     jit_prolog();
782     a1 = jit_arg_d();
783     a2 = jit_arg_d();
784     jit_getarg_d(JIT_F3, a1);
785     node = jit_beqi_d(JIT_F3, 1);
786     jit_calli(abort);
787     jit_patch(node);
788     jit_getarg_d(JIT_F3, a2);
789     node = jit_beqi_d(JIT_F3, 2);
790     jit_calli(abort);
791     jit_patch(node);
792     jit_ellipsis();
793     jit_va_start(JIT_V0);
794     jit_va_arg_d(JIT_F3, JIT_V0);
795     jit_va_arg_d(JIT_F4, JIT_V0);
796     jit_prepare();
797     jit_pushargi_d(1);
798     jit_pushargi_d(2);
799     jit_pushargr_d(JIT_F3);
800     jit_pushargr_d(JIT_F4);
801     jit_va_push(JIT_V0);
802     jit_finishi(va_dddd_dddddd);
803     jit_va_end(JIT_V0);
804     jit_ret();
805     jit_epilog();
806     jva_idi_dididid = jit_label();
807     jit_name("va_idi_dididid");
808     jit_prolog();
809     a1 = jit_arg();
810     jit_getarg(JIT_V1, a1);
811     node = jit_beqi(JIT_V1, 1);
812     jit_calli(abort);
813     jit_patch(node);
814     jit_ellipsis();
815     jit_va_start(JIT_V0);
816     jit_va_arg_d(JIT_F3, JIT_V0);
817     jit_va_arg(JIT_V1, JIT_V0);
818     jit_prepare();
819     jit_pushargi(1);
820     jit_pushargr_d(JIT_F3);
821     jit_pushargr(JIT_V1);
822     jit_va_push(JIT_V0);
823     jit_finishi(va_idi_dididid);
824     jit_va_end(JIT_V0);
825     jit_ret();
826     jit_epilog();
827     jva_idid_ididid = jit_label();
828     jit_name("va_idid_ididid");
829     jit_prolog();
830     a1 = jit_arg();
831     a2 = jit_arg_d();
832     jit_getarg(JIT_V1, a1);
833     node = jit_beqi(JIT_V1, 1);
834     jit_calli(abort);
835     jit_patch(node);
836     jit_getarg_d(JIT_F3, a2);
837     node = jit_beqi_d(JIT_F3, 2);
838     jit_calli(abort);
839     jit_patch(node);
840     jit_ellipsis();
841     jit_va_start(JIT_V0);
842     jit_va_arg(JIT_V1, JIT_V0);
843     jit_va_arg_d(JIT_F3, JIT_V0);
844     jit_prepare();
845     jit_pushargi(1);
846     jit_pushargi_d(2);
847     jit_pushargr(JIT_V1);
848     jit_pushargr_d(JIT_F3);
849     jit_va_push(JIT_V0);
850     jit_finishi(va_idid_ididid);
851     jit_va_end(JIT_V0);
852     jit_ret();
853     jit_epilog();
854     jva_did_idididi = jit_label();
855     jit_name("va_did_idididi");
856     jit_prolog();
857     a1 = jit_arg_d();
858     jit_getarg_d(JIT_F3, a1);
859     node = jit_beqi_d(JIT_F3, 1);
860     jit_calli(abort);
861     jit_patch(node);
862     jit_ellipsis();
863     jit_va_start(JIT_V0);
864     jit_va_arg(JIT_V1, JIT_V0);
865     jit_va_arg_d(JIT_F3, JIT_V0);
866     jit_prepare();
867     jit_pushargi_d(1);
868     jit_pushargr(JIT_V1);
869     jit_pushargr_d(JIT_F3);
870     jit_va_push(JIT_V0);
871     jit_finishi(va_did_idididi);
872     jit_va_end(JIT_V0);
873     jit_ret();
874     jit_epilog();
875     jva_didi_dididi = jit_label();
876     jit_name("va_didi_dididi");
877     jit_prolog();
878     a1 = jit_arg_d();
879     a2 = jit_arg();
880     jit_getarg_d(JIT_F3, a1);
881     node = jit_beqi_d(JIT_F3, 1);
882     jit_calli(abort);
883     jit_patch(node);
884     jit_getarg(JIT_V1, a2);
885     node = jit_beqi(JIT_V1, 2);
886     jit_calli(abort);
887     jit_patch(node);
888     jit_ellipsis();
889     jit_va_start(JIT_V0);
890     jit_va_arg_d(JIT_F3, JIT_V0);
891     jit_va_arg(JIT_V1, JIT_V0);
892     jit_prepare();
893     jit_pushargi_d(1);
894     jit_pushargi(2);
895     jit_pushargr_d(JIT_F3);
896     jit_pushargr(JIT_V1);
897     jit_va_push(JIT_V0);
898     jit_finishi(va_didi_dididi);
899     jit_va_end(JIT_V0);
900     jit_ret();
901     jit_epilog();
902 
903     jit_patch(jmpi_main);
904     jit_name("main");
905     jit_prolog();
906 
907     /* Check that lightning properly calls vararg functions */
908     jit_prepare();
909     PUSH1();
910     jit_ellipsis();
911     VPUSH2();
912     jit_finishi(i_iiiiiiiii);
913     jit_prepare();
914     PUSH2();
915     jit_ellipsis();
916     VPUSH3();
917     jit_finishi(ii_iiiiiiii);
918     jit_prepare();
919     PUSH3();
920     jit_ellipsis();
921     VPUSH4();
922     jit_finishi(iii_iiiiiii);
923     jit_prepare();
924     PUSH4();
925     jit_ellipsis();
926     VPUSH5();
927     jit_finishi(iiii_iiiiii);
928     jit_prepare();
929     PUSH5();
930     jit_ellipsis();
931     VPUSH6();
932     jit_finishi(iiiii_iiiii);
933     jit_prepare();
934     PUSH6();
935     jit_ellipsis();
936     VPUSH7();
937     jit_finishi(iiiiii_iiii);
938     jit_prepare();
939     PUSH7();
940     jit_ellipsis();
941     VPUSH8();
942     jit_finishi(iiiiiii_iii);
943     jit_prepare();
944     PUSH8();
945     jit_ellipsis();
946     VPUSH9();
947     jit_finishi(iiiiiiii_ii);
948     jit_prepare();
949     PUSH9();
950     jit_ellipsis();
951     VPUSH10();
952     jit_finishi(iiiiiiiii_i);
953     jit_prepare();
954     PUSHD1();
955     jit_ellipsis();
956     VPUSHD2();
957     jit_finishi(d_ddddddddd);
958     jit_prepare();
959     PUSHD2();
960     jit_ellipsis();
961     VPUSHD3();
962     jit_finishi(dd_dddddddd);
963     jit_prepare();
964     PUSHD3();
965     jit_ellipsis();
966     VPUSHD4();
967     jit_finishi(ddd_ddddddd);
968     jit_prepare();
969     PUSHD4();
970     jit_ellipsis();
971     VPUSHD5();
972     jit_finishi(dddd_dddddd);
973     jit_prepare();
974     PUSHD5();
975     jit_ellipsis();
976     VPUSHD6();
977     jit_finishi(ddddd_ddddd);
978     jit_prepare();
979     PUSHD6();
980     jit_ellipsis();
981     VPUSHD7();
982     jit_finishi(dddddd_dddd);
983     jit_prepare();
984     PUSHD7();
985     jit_ellipsis();
986     VPUSHD8();
987     jit_finishi(ddddddd_ddd);
988     jit_prepare();
989     PUSHD8();
990     jit_ellipsis();
991     VPUSHD9();
992     jit_finishi(dddddddd_dd);
993     jit_prepare();
994     PUSHD9();
995     jit_ellipsis();
996     VPUSHD10();
997     jit_finishi(ddddddddd_d);
998     jit_prepare();
999     IDPUSH1();
1000     jit_ellipsis();
1001     IDVPUSH2();
1002     jit_finishi(i_didididid);
1003     jit_prepare();
1004     IDPUSH2();
1005     jit_ellipsis();
1006     IDVPUSH3();
1007     jit_finishi(id_idididid);
1008     jit_prepare();
1009     IDPUSH3();
1010     jit_ellipsis();
1011     IDVPUSH4();
1012     jit_finishi(idi_dididid);
1013     jit_prepare();
1014     IDPUSH4();
1015     jit_ellipsis();
1016     IDVPUSH5();
1017     jit_finishi(idid_ididid);
1018     jit_prepare();
1019     IDPUSH5();
1020     jit_ellipsis();
1021     IDVPUSH6();
1022     jit_finishi(ididi_didid);
1023     jit_prepare();
1024     IDPUSH6();
1025     jit_ellipsis();
1026     IDVPUSH7();
1027     jit_finishi(ididid_idid);
1028     jit_prepare();
1029     IDPUSH7();
1030     jit_ellipsis();
1031     IDVPUSH8();
1032     jit_finishi(idididi_did);
1033     jit_prepare();
1034     IDPUSH8();
1035     jit_ellipsis();
1036     IDVPUSH9();
1037     jit_finishi(idididid_id);
1038     jit_prepare();
1039     IDPUSH9();
1040     jit_ellipsis();
1041     IDVPUSH10();
1042     jit_finishi(ididididi_d);
1043     jit_prepare();
1044     DIPUSH1();
1045     jit_ellipsis();
1046     DIVPUSH2();
1047     jit_finishi(d_ididididi);
1048     jit_prepare();
1049     DIPUSH2();
1050     jit_ellipsis();
1051     DIVPUSH3();
1052     jit_finishi(di_didididi);
1053     jit_prepare();
1054     DIPUSH3();
1055     jit_ellipsis();
1056     DIVPUSH4();
1057     jit_finishi(did_idididi);
1058     jit_prepare();
1059     DIPUSH4();
1060     jit_ellipsis();
1061     DIVPUSH5();
1062     jit_finishi(didi_dididi);
1063     jit_prepare();
1064     DIPUSH5();
1065     jit_ellipsis();
1066     DIVPUSH6();
1067     jit_finishi(didid_ididi);
1068     jit_prepare();
1069     DIPUSH6();
1070     jit_ellipsis();
1071     DIVPUSH7();
1072     jit_finishi(dididi_didi);
1073     jit_prepare();
1074     DIPUSH7();
1075     jit_ellipsis();
1076     DIVPUSH8();
1077     jit_finishi(dididid_idi);
1078     jit_prepare();
1079     DIPUSH8();
1080     jit_ellipsis();
1081     DIVPUSH9();
1082     jit_finishi(didididi_di);
1083     jit_prepare();
1084     DIPUSH9();
1085     jit_ellipsis();
1086     DIVPUSH10();
1087     jit_finishi(didididid_i);
1088 
1089     /* Check that unmodified jit_va_list_t is a valid va_list */
1090     jit_prepare();
1091     PUSH1();
1092     jit_ellipsis();
1093     VPUSH2();
1094     jit_patch_at(jit_finishi(NULL), jva_i_iiiiiiiii);
1095     jit_prepare();
1096     PUSH2();
1097     jit_ellipsis();
1098     VPUSH3();
1099     jit_patch_at(jit_finishi(NULL), jva_ii_iiiiiiii);
1100     jit_prepare();
1101     PUSHD1();
1102     jit_ellipsis();
1103     VPUSHD2();
1104     jit_patch_at(jit_finishi(NULL), jva_d_ddddddddd);
1105     jit_prepare();
1106     PUSHD2();
1107     jit_ellipsis();
1108     VPUSHD3();
1109     jit_patch_at(jit_finishi(NULL), jva_dd_dddddddd);
1110     jit_prepare();
1111     IDPUSH1();
1112     jit_ellipsis();
1113     IDVPUSH2();
1114     jit_patch_at(jit_finishi(NULL), jva_i_didididid);
1115     jit_prepare();
1116     IDPUSH2();
1117     jit_ellipsis();
1118     IDVPUSH3();
1119     jit_patch_at(jit_finishi(NULL), jva_id_idididid);
1120     jit_prepare();
1121     DIPUSH1();
1122     jit_ellipsis();
1123     DIVPUSH2();
1124     jit_patch_at(jit_finishi(NULL), jva_d_ididididi);
1125     jit_prepare();
1126     DIPUSH2();
1127     jit_ellipsis();
1128     DIVPUSH3();
1129     jit_patch_at(jit_finishi(NULL), jva_di_didididi);
1130 
1131     /* Check that modified jit_va_list_t is a valid va_list */
1132     jit_prepare();
1133     PUSH1();
1134     jit_ellipsis();
1135     VPUSH2();
1136     jit_patch_at(jit_finishi(NULL), jva_iii_iiiiiii);
1137     jit_prepare();
1138     PUSH2();
1139     jit_ellipsis();
1140     VPUSH3();
1141     jit_patch_at(jit_finishi(NULL), jva_iiii_iiiiii);
1142     jit_prepare();
1143     PUSHD1();
1144     jit_ellipsis();
1145     VPUSHD2();
1146     jit_patch_at(jit_finishi(NULL), jva_ddd_ddddddd);
1147     jit_prepare();
1148     PUSHD2();
1149     jit_ellipsis();
1150     VPUSHD3();
1151     jit_patch_at(jit_finishi(NULL), jva_dddd_dddddd);
1152     jit_prepare();
1153     IDPUSH1();
1154     jit_ellipsis();
1155     IDVPUSH2();
1156     jit_patch_at(jit_finishi(NULL), jva_idi_dididid);
1157     jit_prepare();
1158     IDPUSH2();
1159     jit_ellipsis();
1160     IDVPUSH3();
1161     jit_patch_at(jit_finishi(NULL), jva_idid_ididid);
1162     jit_prepare();
1163     DIPUSH1();
1164     jit_ellipsis();
1165     DIVPUSH2();
1166     jit_patch_at(jit_finishi(NULL), jva_did_idididi);
1167     jit_prepare();
1168     DIPUSH2();
1169     jit_ellipsis();
1170     DIVPUSH3();
1171     jit_patch_at(jit_finishi(NULL), jva_didi_dididi);
1172 
1173     jit_ret();
1174     jit_epilog();
1175 
1176 
1177     function = jit_emit();
1178     jit_clear_state();
1179     //jit_disassemble();
1180     (*function)();
1181     jit_destroy_state();
1182 
1183     finish_jit();
1184 
1185     printf("ok\n");
1186     return 0;
1187 }
1188