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