add a thp-based huge page alloc fallback
[pcsx_rearmed.git] / deps / lightning / check / ccall.c
1 #include <lightning.h>
2 #include <stdio.h>
3
4 #define _w0                     0
5 #define _w1                     1
6 #define _w2                     (_w1-2)
7 #define _w3                     (_w2-3)
8 #define _w4                     (_w3-4)
9 #define _w5                     (_w4-5)
10 #define _w6                     (_w5-6)
11 #define _w7                     (_w6-7)
12 #define _w8                     (_w7-8)
13 #define _w9                     (_w8-9)
14 #define _w10                    (_w9-10)
15 #define _w11                    (_w10-11)
16 #define _w12                    (_w11-12)
17 #define _w13                    (_w12-13)
18 #define _w14                    (_w13-14)
19 #define _w15                    (_w14-15)
20 #define _c0                     _w0
21 #define _c1                     _w1
22 #define _c2                     _w2
23 #define _c3                     _w3
24 #define _c4                     _w4
25 #define _c5                     _w5
26 #define _c6                     _w6
27 #define _c7                     _w7
28 #define _c8                     _w8
29 #define _c9                     _w9
30 #define _c10                    _w10
31 #define _c11                    _w11
32 #define _c12                    _w12
33 #define _c13                    _w13
34 #define _c14                    _w14
35 #define _c15                    _w15
36 #define _uc0                    (_w0&0xff)
37 #define _uc1                    (_w1&0xff)
38 #define _uc2                    (_w2&0xff)
39 #define _uc3                    (_w3&0xff)
40 #define _uc4                    (_w4&0xff)
41 #define _uc5                    (_w5&0xff)
42 #define _uc6                    (_w6&0xff)
43 #define _uc7                    (_w7&0xff)
44 #define _uc8                    (_w8&0xff)
45 #define _uc9                    (_w9&0xff)
46 #define _uc10                   (_w10&0xff)
47 #define _uc11                   (_w11&0xff)
48 #define _uc12                   (_w12&0xff)
49 #define _uc13                   (_w13&0xff)
50 #define _uc14                   (_w14&0xff)
51 #define _uc15                   (_w15&0xff)
52 #define _s0                     _w0
53 #define _s1                     _w1
54 #define _s2                     _w2
55 #define _s3                     _w3
56 #define _s4                     _w4
57 #define _s5                     _w5
58 #define _s6                     _w6
59 #define _s7                     _w7
60 #define _s8                     _w8
61 #define _s9                     _w9
62 #define _s10                    _w10
63 #define _s11                    _w11
64 #define _s12                    _w12
65 #define _s13                    _w13
66 #define _s14                    _w14
67 #define _s15                    _w15
68 #define _us0                    (_w0&0xffff)
69 #define _us1                    (_w1&0xffff)
70 #define _us2                    (_w2&0xffff)
71 #define _us3                    (_w3&0xffff)
72 #define _us4                    (_w4&0xffff)
73 #define _us5                    (_w5&0xffff)
74 #define _us6                    (_w6&0xffff)
75 #define _us7                    (_w7&0xffff)
76 #define _us8                    (_w8&0xffff)
77 #define _us9                    (_w9&0xffff)
78 #define _us10                   (_w10&0xffff)
79 #define _us11                   (_w11&0xffff)
80 #define _us12                   (_w12&0xffff)
81 #define _us13                   (_w13&0xffff)
82 #define _us14                   (_w14&0xffff)
83 #define _us15                   (_w15&0xffff)
84 #define _i0                     _w0
85 #define _i1                     _w1
86 #define _i2                     _w2
87 #define _i3                     _w3
88 #define _i4                     _w4
89 #define _i5                     _w5
90 #define _i6                     _w6
91 #define _i7                     _w7
92 #define _i8                     _w8
93 #define _i9                     _w9
94 #define _i10                    _w10
95 #define _i11                    _w11
96 #define _i12                    _w12
97 #define _i13                    _w13
98 #define _i14                    _w14
99 #define _i15                    _w15
100 #if __WORDSIZE == 64
101 #  define _ui0                  (_w0&0xffffffff)
102 #  define _ui1                  (_w1&0xffffffff)
103 #  define _ui2                  (_w2&0xffffffff)
104 #  define _ui3                  (_w3&0xffffffff)
105 #  define _ui4                  (_w4&0xffffffff)
106 #  define _ui5                  (_w5&0xffffffff)
107 #  define _ui6                  (_w6&0xffffffff)
108 #  define _ui7                  (_w7&0xffffffff)
109 #  define _ui8                  (_w8&0xffffffff)
110 #  define _ui9                  (_w9&0xffffffff)
111 #  define _ui10                 (_w10&0xffffffff)
112 #  define _ui11                 (_w11&0xffffffff)
113 #  define _ui12                 (_w12&0xffffffff)
114 #  define _ui13                 (_w13&0xffffffff)
115 #  define _ui14                 (_w14&0xffffffff)
116 #  define _ui15                 (_w15&0xffffffff)
117 #  define _l0                   _w0
118 #  define _l1                   _w1
119 #  define _l2                   _w2
120 #  define _l3                   _w3
121 #  define _l4                   _w4
122 #  define _l5                   _w5
123 #  define _l6                   _w6
124 #  define _l7                   _w7
125 #  define _l8                   _w8
126 #  define _l9                   _w9
127 #  define _l10                  _w10
128 #  define _l11                  _w11
129 #  define _l12                  _w12
130 #  define _l13                  _w13
131 #  define _l14                  _w14
132 #  define _l15                  _w15
133 #endif
134
135 #ifndef jit_arg_uc
136 #  define jit_arg_uc            jit_arg_c
137 #endif
138 #ifndef jit_arg_us
139 #  define jit_arg_us            jit_arg_s
140 #endif
141 #ifndef jit_arg_ui
142 #  define jit_arg_ui            jit_arg_i
143 #endif
144
145 /*
146  * Types
147  */
148 typedef signed char             _c;
149 typedef unsigned char           _uc;
150 typedef signed short            _s;
151 typedef unsigned short          _us;
152 typedef signed int              _i;
153 #if __WORDSIZE == 64
154 typedef unsigned int            _ui;
155 typedef jit_word_t              _l;
156 #endif
157 typedef float                   _f;
158 typedef double                  _d;
159
160 #define prt0(T)                 T C##T##0(void);
161 #define prt1(T)                 prt0(T)                                 \
162                                 T C##T##1(T);
163 #define prt2(T)                 prt1(T)                                 \
164                                 T C##T##2(T,T);
165 #define prt3(T)                 prt2(T)                                 \
166                                 T C##T##3(T,T,T);
167 #define prt4(T)                 prt3(T)                                 \
168                                 T C##T##4(T,T,T,T);
169 #define prt5(T)                 prt4(T)                                 \
170                                 T C##T##5(T,T,T,T,T);
171 #define prt6(T)                 prt5(T)                                 \
172                                 T C##T##6(T,T,T,T,T,T);
173 #define prt7(T)                 prt6(T)                                 \
174                                 T C##T##7(T,T,T,T,T,T,T);
175 #define prt8(T)                 prt7(T)                                 \
176                                 T C##T##8(T,T,T,T,T,T,T,T);
177 #define prt9(T)                 prt8(T)                                 \
178                                 T C##T##9(T,T,T,T,T,T,T,T,T);
179 #define prt10(T)                prt9(T)                                 \
180                                 T C##T##10(T,T,T,T,T,T,T,T,T,T);
181 #define prt11(T)                prt10(T)                                \
182                                 T C##T##11(T,T,T,T,T,T,T,T,T,T,T);
183 #define prt12(T)                prt11(T)                                \
184                                 T C##T##12(T,T,T,T,T,T,T,T,T,T,T,T);
185 #define prt13(T)                prt12(T)                                \
186                                 T C##T##13(T,T,T,T,T,T,T,T,T,T,T,T,T);
187 #define prt14(T)                prt13(T)                                \
188                                 T C##T##14(T,T,T,T,T,T,T,T,T,T,T,T,T,T);
189 #define prt15(T)                prt14(T)                                \
190                                 T C##T##15(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);
191 #define prt(T)                  prt15(T)
192 prt(_c)
193 prt(_uc)
194 prt(_s)
195 prt(_us)
196 prt(_i)
197 #if __WORDSIZE == 64
198 prt(_ui)
199 prt(_l)
200 #endif
201 prt(_f)
202 prt(_d)
203 #undef prt
204 #undef prt15
205 #undef prt14
206 #undef prt13
207 #undef prt12
208 #undef prt11
209 #undef prt10
210 #undef prt9
211 #undef prt8
212 #undef prt7
213 #undef prt6
214 #undef prt5
215 #undef prt4
216 #undef prt3
217 #undef prt2
218 #undef prt1
219 #undef prt0
220
221 #define prtn(N,T)               T J##T##n(void);
222 #define prt0(T)                 prtn(0,T)
223 #define prt1(T)                 prt0(T)                 prtn(1,T)
224 #define prt2(T)                 prt1(T)                 prtn(2,T)
225 #define prt3(T)                 prt2(T)                 prtn(3,T)
226 #define prt4(T)                 prt3(T)                 prtn(4,T)
227 #define prt5(T)                 prt4(T)                 prtn(5,T)
228 #define prt6(T)                 prt5(T)                 prtn(6,T)
229 #define prt7(T)                 prt6(T)                 prtn(7,T)
230 #define prt8(T)                 prt7(T)                 prtn(8,T)
231 #define prt9(T)                 prt8(T)                 prtn(9,T)
232 #define prt10(T)                prt9(T)                 prtn(10,T)
233 #define prt11(T)                prt10(T)                prtn(11,T)
234 #define prt12(T)                prt11(T)                prtn(12,T)
235 #define prt13(T)                prt12(T)                prtn(13,T)
236 #define prt14(T)                prt13(T)                prtn(14,T)
237 #define prt15(T)                prt14(T)                prtn(15,T)
238 #define prt(T)                  prt15(T)
239 prt(_c)
240 prt(_uc)
241 prt(_s)
242 prt(_us)
243 prt(_i)
244 #if __WORDSIZE == 64
245 prt(_ui)
246 prt(_l)
247 #endif
248 prt(_f)
249 prt(_d)
250 #undef prt
251 #undef prt15
252 #undef prt14
253 #undef prt13
254 #undef prt12
255 #undef prt11
256 #undef prt10
257 #undef prt9
258 #undef prt8
259 #undef prt7
260 #undef prt6
261 #undef prt5
262 #undef prt4
263 #undef prt3
264 #undef prt2
265 #undef prt1
266 #undef prt0
267 #undef prtn
268
269 /*
270  * Initialization
271  */
272
273 #define dat0(T)                 T (*j##T##0)(void);                     \
274                                 jit_node_t *n##T##0;
275 #define dat1(T)                 dat0(T)                                 \
276                                 T (*j##T##1)(T);                        \
277                                 jit_node_t *n##T##1;
278 #define dat2(T)                 dat1(T)                                 \
279                                 T (*j##T##2)(T,T);                      \
280                                 jit_node_t *n##T##2;
281 #define dat3(T)                 dat2(T)                                 \
282                                 T (*j##T##3)(T,T,T);                    \
283                                 jit_node_t *n##T##3;
284 #define dat4(T)                 dat3(T)                                 \
285                                 T (*j##T##4)(T,T,T,T);                  \
286                                 jit_node_t *n##T##4;
287 #define dat5(T)                 dat4(T)                                 \
288                                 T (*j##T##5)(T,T,T,T,T);                \
289                                 jit_node_t *n##T##5;
290 #define dat6(T)                 dat5(T)                                 \
291                                 T (*j##T##6)(T,T,T,T,T,T);              \
292                                 jit_node_t *n##T##6;
293 #define dat7(T)                 dat6(T)                                 \
294                                 T (*j##T##7)(T,T,T,T,T,T,T);            \
295                                 jit_node_t *n##T##7;
296 #define dat8(T)                 dat7(T)                                 \
297                                 T (*j##T##8)(T,T,T,T,T,T,T,T);          \
298                                 jit_node_t *n##T##8;
299 #define dat9(T)                 dat8(T)                                 \
300                                 T (*j##T##9)(T,T,T,T,T,T,T,T,T);        \
301                                 jit_node_t *n##T##9;
302 #define dat10(T)                dat9(T)                                 \
303                                 T (*j##T##10)(T,T,T,T,T,T,T,T,T,T);     \
304                                 jit_node_t *n##T##10;
305 #define dat11(T)                dat10(T)                                \
306                                 T (*j##T##11)(T,T,T,T,T,T,T,T,T,T,T);   \
307                                 jit_node_t *n##T##11;
308 #define dat12(T)                dat11(T)                                \
309                                 T (*j##T##12)(T,T,T,T,T,T,T,T,T,T,T,T); \
310                                 jit_node_t *n##T##12;
311 #define dat13(T)                dat12(T)                                \
312                                 T (*j##T##13)(T,T,T,T,T,T,T,T,T,T,T,T,T);\
313                                 jit_node_t *n##T##13;
314 #define dat14(T)                dat13(T)                                \
315                                 T (*j##T##14)(T,T,T,T,T,T,T,T,T,T,T,T,T,T);\
316                                 jit_node_t *n##T##14;
317 #define dat15(T)                dat14(T)                                \
318                                 T (*j##T##15)(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);\
319                                 jit_node_t *n##T##15;
320 #define dat(T)                  dat15(T)
321 dat(_c)
322 dat(_uc)
323 dat(_s)
324 dat(_us)
325 dat(_i)
326 #if __WORDSIZE == 64
327 dat(_ui)
328 dat(_l)
329 #endif
330 dat(_f)
331 dat(_d)
332 #undef dat
333 #undef dat15
334 #undef dat14
335 #undef dat13
336 #undef dat12
337 #undef dat11
338 #undef dat10
339 #undef dat9
340 #undef dat8
341 #undef dat7
342 #undef dat6
343 #undef dat5
344 #undef dat4
345 #undef dat3
346 #undef dat2
347 #undef dat1
348 #undef dat0
349
350 /*
351  * Implementation
352  */
353 #define dcl0(T)                                                         \
354 T C##T##0(void)                                                         \
355 {                                                                       \
356     return (0);                                                         \
357 }
358 #define dcl1(T)                                                         \
359 dcl0(T)                                                                 \
360 T C##T##1(T A)                                                          \
361 {                                                                       \
362     return (A);                                                         \
363 }
364 #define dcl2(T)                                                         \
365 dcl1(T)                                                                 \
366 T C##T##2(T A,T B)                                                      \
367 {                                                                       \
368     return (A-B);                                                       \
369 }
370 #define dcl3(T)                                                         \
371 dcl2(T)                                                                 \
372 T C##T##3(T A,T B,T C)                                                  \
373 {                                                                       \
374     return (A-B-C);                                                     \
375 }
376 #define dcl4(T)                                                         \
377 dcl3(T)                                                                 \
378 T C##T##4(T A,T B,T C,T D)                                              \
379 {                                                                       \
380     return (A-B-C-D);                                                   \
381 }
382 #define dcl5(T)                                                         \
383 dcl4(T)                                                                 \
384 T C##T##5(T A,T B,T C,T D,T E)                                          \
385 {                                                                       \
386     return (A-B-C-D-E);                                                 \
387 }
388 #define dcl6(T)                                                         \
389 dcl5(T)                                                                 \
390 T C##T##6(T A,T B,T C,T D,T E,T F)                                      \
391 {                                                                       \
392     return (A-B-C-D-E-F);                                               \
393 }
394 #define dcl7(T)                                                         \
395 dcl6(T)                                                                 \
396 T C##T##7(T A,T B,T C,T D,T E,T F,T G)                                  \
397 {                                                                       \
398     return (A-B-C-D-E-F-G);                                             \
399 }
400 #define dcl8(T)                                                         \
401 dcl7(T)                                                                 \
402 T C##T##8(T A,T B,T C,T D,T E,T F,T G,T H)                              \
403 {                                                                       \
404     return (A-B-C-D-E-F-G-H);                                           \
405 }
406 #define dcl9(T)                                                         \
407 dcl8(T)                                                                 \
408 T C##T##9(T A,T B,T C,T D,T E,T F,T G,T H,T I)                          \
409 {                                                                       \
410     return (A-B-C-D-E-F-G-H-I);                                         \
411 }
412 #define dcl10(T)                                                        \
413 dcl9(T)                                                                 \
414 T C##T##10(T A,T B,T C,T D,T E,T F,T G,T H,T I,T J)                     \
415 {                                                                       \
416     return (A-B-C-D-E-F-G-H-I-J);                                       \
417 }
418 #define dcl11(T)                                                        \
419 dcl10(T)                                                                \
420 T C##T##11(T A,T B,T C,T D,T E,T F,T G,T H,T I,T J,T K)                 \
421 {                                                                       \
422     return (A-B-C-D-E-F-G-H-I-J-K);                                     \
423 }
424 #define dcl12(T)                                                        \
425 dcl11(T)                                                                \
426 T C##T##12(T A,T B,T C,T D,T E,T F,T G,T H,T I,T J,T K,T L)             \
427 {                                                                       \
428     return (A-B-C-D-E-F-G-H-I-J-K-L);                                   \
429 }
430 #define dcl13(T)                                                        \
431 dcl12(T)                                                                \
432 T C##T##13(T A,T B,T C,T D,T E,T F,T G,T H,T I,T J,T K,T L,T M)         \
433 {                                                                       \
434     return (A-B-C-D-E-F-G-H-I-J-K-L-M);                                 \
435 }
436 #define dcl14(T)                                                        \
437 dcl13(T)                                                                \
438 T C##T##14(T A,T B,T C,T D,T E,T F,T G,T H,T I,T J,T K,T L,T M,T N)     \
439 {                                                                       \
440     return (A-B-C-D-E-F-G-H-I-J-K-L-M-N);                               \
441 }
442 #define dcl15(T)                                                        \
443 dcl14(T)                                                                \
444 T C##T##15(T A,T B,T C,T D,T E,T F,T G,T H,T I,T J,T K,T L,T M,T N,T O) \
445 {                                                                       \
446     return (A-B-C-D-E-F-G-H-I-J-K-L-M-N-O);                             \
447 }
448 #define dcl(T)  dcl15(T)
449 dcl(_c)
450 dcl(_uc)
451 dcl(_s)
452 dcl(_us)
453 dcl(_i)
454 #if __WORDSIZE == 64
455 dcl(_ui)
456 dcl(_l)
457 #endif
458 dcl(_f)
459 dcl(_d)
460 #undef dcl
461 #undef dcl15
462 #undef dcl14
463 #undef dcl13
464 #undef dcl12
465 #undef dcl11
466 #undef dcl10
467 #undef dcl9
468 #undef dcl8
469 #undef dcl7
470 #undef dcl6
471 #undef dcl5
472 #undef dcl4
473 #undef dcl3
474 #undef dcl2
475 #undef dcl1
476 #undef dcl0
477
478 #define dcl0(T)                                                         \
479 T CJ##T##0(void)                                                        \
480 {                                                                       \
481     return ((*j##T##0)());                                              \
482 }
483 #define dcl1(T)                                                         \
484 dcl0(T)                                                                 \
485 T CJ##T##1(void)                                                        \
486 {                                                                       \
487     return ((*j##T##1)(1));                                             \
488 }
489 #define dcl2(T)                                                         \
490 dcl1(T)                                                                 \
491 T CJ##T##2(void)                                                        \
492 {                                                                       \
493     return ((*j##T##2)(1,2));                                           \
494 }
495 #define dcl3(T)                                                         \
496 dcl2(T)                                                                 \
497 T CJ##T##3(void)                                                        \
498 {                                                                       \
499     return ((*j##T##3)(1,2,3));                                         \
500 }
501 #define dcl4(T)                                                         \
502 dcl3(T)                                                                 \
503 T CJ##T##4(void)                                                        \
504 {                                                                       \
505     return ((*j##T##4)(1,2,3,4));                                       \
506 }
507 #define dcl5(T)                                                         \
508 dcl4(T)                                                                 \
509 T CJ##T##5(void)                                                        \
510 {                                                                       \
511     return ((*j##T##5)(1,2,3,4,5));                                     \
512 }
513 #define dcl6(T)                                                         \
514 dcl5(T)                                                                 \
515 T CJ##T##6(void)                                                        \
516 {                                                                       \
517     return ((*j##T##6)(1,2,3,4,5,6));                                   \
518 }
519 #define dcl7(T)                                                         \
520 dcl6(T)                                                                 \
521 T CJ##T##7(void)                                                        \
522 {                                                                       \
523     return ((*j##T##7)(1,2,3,4,5,6,7));                                 \
524 }
525 #define dcl8(T)                                                         \
526 dcl7(T)                                                                 \
527 T CJ##T##8(void)                                                        \
528 {                                                                       \
529     return ((*j##T##8)(1,2,3,4,5,6,7,8));                               \
530 }
531 #define dcl9(T)                                                         \
532 dcl8(T)                                                                 \
533 T CJ##T##9(void)                                                        \
534 {                                                                       \
535     return ((*j##T##9)(1,2,3,4,5,6,7,8,9));                             \
536 }
537 #define dcl10(T)                                                        \
538 dcl9(T)                                                                 \
539 T CJ##T##10(void)                                                       \
540 {                                                                       \
541     return ((*j##T##10)(1,2,3,4,5,6,7,8,9,10));                         \
542 }
543 #define dcl11(T)                                                        \
544 dcl10(T)                                                                \
545 T CJ##T##11(void)                                                       \
546 {                                                                       \
547     return ((*j##T##11)(1,2,3,4,5,6,7,8,9,10,11));                      \
548 }
549 #define dcl12(T)                                                        \
550 dcl11(T)                                                                \
551 T CJ##T##12(void)                                                       \
552 {                                                                       \
553     return ((*j##T##12)(1,2,3,4,5,6,7,8,9,10,11,12));                   \
554 }
555 #define dcl13(T)                                                        \
556 dcl12(T)                                                                \
557 T CJ##T##13(void)                                                       \
558 {                                                                       \
559     return ((*j##T##13)(1,2,3,4,5,6,7,8,9,10,11,12,13));                \
560 }
561 #define dcl14(T)                                                        \
562 dcl13(T)                                                                \
563 T CJ##T##14(void)                                                       \
564 {                                                                       \
565     return ((*j##T##14)(1,2,3,4,5,6,7,8,9,10,11,12,13,14));             \
566 }
567 #define dcl15(T)                                                        \
568 dcl14(T)                                                                \
569 T CJ##T##15(void)                                                       \
570 {                                                                       \
571     return ((*j##T##15)(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15));          \
572 }
573 #define dcl(t)  dcl15(t)
574 dcl(_c)
575 dcl(_uc)
576 dcl(_s)
577 dcl(_us)
578 dcl(_i)
579 #if __WORDSIZE == 64
580 dcl(_ui)
581 dcl(_l)
582 #endif
583 dcl(_f)
584 dcl(_d)
585 #undef dcl
586 #undef dcl15
587 #undef dcl14
588 #undef dcl13
589 #undef dcl12
590 #undef dcl11
591 #undef dcl10
592 #undef dcl9
593 #undef dcl8
594 #undef dcl7
595 #undef dcl6
596 #undef dcl5
597 #undef dcl4
598 #undef dcl3
599 #undef dcl2
600 #undef dcl1
601 #undef dcl0
602
603 int
604 main(int argc, char *argv[])
605 {
606     jit_state_t          *_jit;
607     jit_node_t           *jmpi_main;
608     void                (*function)(void);
609     jit_node_t           *a1,*a2,*a3,*a4,*a5,*a6,*a7,*a8,*a9;
610     jit_node_t           *a10,*a11,*a12,*a13,*a14,*a15;
611     jit_node_t           *jmp;
612
613     init_jit(argv[0]);
614     _jit = jit_new_state();
615
616     jmpi_main = jit_jmpi();
617
618
619 #define arg0(T)                 /**/
620 #define arg1(T)                                         a1 = jit_arg##T();
621 #define arg2(T)                 arg1(T)                 a2 = jit_arg##T();
622 #define arg3(T)                 arg2(T)                 a3 = jit_arg##T();
623 #define arg4(T)                 arg3(T)                 a4 = jit_arg##T();
624 #define arg5(T)                 arg4(T)                 a5 = jit_arg##T();
625 #define arg6(T)                 arg5(T)                 a6 = jit_arg##T();
626 #define arg7(T)                 arg6(T)                 a7 = jit_arg##T();
627 #define arg8(T)                 arg7(T)                 a8 = jit_arg##T();
628 #define arg9(T)                 arg8(T)                 a9 = jit_arg##T();
629 #define arg10(T)                arg9(T)                 a10 = jit_arg##T();
630 #define arg11(T)                arg10(T)                a11 = jit_arg##T();
631 #define arg12(T)                arg11(T)                a12 = jit_arg##T();
632 #define arg13(T)                arg12(T)                a13 = jit_arg##T();
633 #define arg14(T)                arg13(T)                a14 = jit_arg##T();
634 #define arg15(T)                arg14(T)                a15 = jit_arg##T();
635
636 #define get0(B,T,R)             jit_movi##B(R##0,0);
637 #define get1(B,T,R)             jit_getarg##T(R##0,a##1);
638 #define get2(B,T,R)                                                     \
639         get1(B,T,R);                                                    \
640         jit_movr##B(R##1, R##0);                                        \
641         jit_getarg##T(R##0, a##2);                                      \
642         jit_subr##B(R##0, R##1, R##0);
643 #define get3(B,T,R)                                                     \
644         get2(B,T,R);                                                    \
645         jit_movr##B(R##1, R##0);                                        \
646         jit_getarg##T(R##0, a##3);                                      \
647         jit_subr##B(R##0, R##1, R##0);
648 #define get4(B,T,R)                                                     \
649         get3(B,T,R);                                                    \
650         jit_movr##B(R##1, R##0);                                        \
651         jit_getarg##T(R##0, a##4);                                      \
652         jit_subr##B(R##0, R##1, R##0);
653 #define get5(B,T,R)                                                     \
654         get4(B,T,R);                                                    \
655         jit_movr##B(R##1, R##0);                                        \
656         jit_getarg##T(R##0, a##5);                                      \
657         jit_subr##B(R##0, R##1, R##0);
658 #define get6(B,T,R)                                                     \
659         get5(B,T,R);                                                    \
660         jit_movr##B(R##1, R##0);                                        \
661         jit_getarg##T(R##0, a##6);                                      \
662         jit_subr##B(R##0, R##1, R##0);
663 #define get7(B,T,R)                                                     \
664         get6(B,T,R);                                                    \
665         jit_movr##B(R##1, R##0);                                        \
666         jit_getarg##T(R##0, a##7);                                      \
667         jit_subr##B(R##0, R##1, R##0);
668 #define get8(B,T,R)                                                     \
669         get7(B,T,R);                                                    \
670         jit_movr##B(R##1, R##0);                                        \
671         jit_getarg##T(R##0, a##8);                                      \
672         jit_subr##B(R##0, R##1, R##0);
673 #define get9(B,T,R)                                                     \
674         get8(B,T,R);                                                    \
675         jit_movr##B(R##1, R##0);                                        \
676         jit_getarg##T(R##0, a##9);                                      \
677         jit_subr##B(R##0, R##1, R##0);
678 #define get10(B,T,R)                                                    \
679         get9(B,T,R);                                                    \
680         jit_movr##B(R##1, R##0);                                        \
681         jit_getarg##T(R##0, a##10);                                     \
682         jit_subr##B(R##0, R##1, R##0);
683 #define get11(B,T,R)                                                    \
684         get10(B,T,R);                                                   \
685         jit_movr##B(R##1, R##0);                                        \
686         jit_getarg##T(R##0, a##11);                                     \
687         jit_subr##B(R##0, R##1, R##0);
688 #define get12(B,T,R)                                                    \
689         get11(B,T,R);                                                   \
690         jit_movr##B(R##1, R##0);                                        \
691         jit_getarg##T(R##0, a##12);                                     \
692         jit_subr##B(R##0, R##1, R##0);
693 #define get13(B,T,R)                                                    \
694         get12(B,T,R);                                                   \
695         jit_movr##B(R##1, R##0);                                        \
696         jit_getarg##T(R##0, a##13);                                     \
697         jit_subr##B(R##0, R##1, R##0);
698 #define get14(B,T,R)                                                    \
699         get13(B,T,R);                                                   \
700         jit_movr##B(R##1, R##0);                                        \
701         jit_getarg##T(R##0, a##14);                                     \
702         jit_subr##B(R##0, R##1, R##0);
703 #define get15(B,T,R)                                                    \
704         get14(B,T,R);                                                   \
705         jit_movr##B(R##1, R##0);                                        \
706         jit_getarg##T(R##0, a##15);                                     \
707         jit_subr##B(R##0, R##1, R##0);
708
709 #if __WORDSIZE == 32
710 #  define jit_extr_i(u, v)                      /**/
711 #else
712 #  define jit_extr_l(u, v)                      /**/
713 #endif
714
715 #define strfy(n)                                #n
716 #define defi(T, N)                                                      \
717     n##T##N = jit_name(strfy(n##T##N));                                 \
718     jit_note("ccall.c", __LINE__);                                      \
719     jit_prolog();                                                       \
720     arg##N(T);                                                          \
721     get##N(,T,JIT_R)                                                    \
722     jit_extr##T(JIT_R0, JIT_R0);                                        \
723     jit_retr(JIT_R0);                                                   \
724     jit_epilog();
725 #define deff(T, N)                                                      \
726     n##T##N = jit_name(strfy(n##T##N));                                 \
727     jit_note("ccall.c", __LINE__);                                      \
728     jit_prolog();                                                       \
729     arg##N(T);                                                          \
730     get##N(T,T,JIT_F);                                                  \
731     jit_retr##T(JIT_F0);                                                \
732     jit_epilog();
733
734 #define  def0(X, T)                             def##X(T, 0)
735 #define  def1(X, T)     def0(X, T)              def##X(T, 1)
736 #define  def2(X, T)     def1(X, T)              def##X(T, 2)
737 #define  def3(X, T)     def2(X, T)              def##X(T, 3)
738 #define  def4(X, T)     def3(X, T)              def##X(T, 4)
739 #define  def5(X, T)     def4(X, T)              def##X(T, 5)
740 #define  def6(X, T)     def5(X, T)              def##X(T, 6)
741 #define  def7(X, T)     def6(X, T)              def##X(T, 7)
742 #define  def8(X, T)     def7(X, T)              def##X(T, 8)
743 #define  def9(X, T)     def8(X, T)              def##X(T, 9)
744 #define def10(X, T)     def9(X, T)              def##X(T, 10)
745 #define def11(X, T)     def10(X, T)             def##X(T, 11)
746 #define def12(X, T)     def11(X, T)             def##X(T, 12)
747 #define def13(X, T)     def12(X, T)             def##X(T, 13)
748 #define def14(X, T)     def13(X, T)             def##X(T, 14)
749 #define def15(X, T)     def14(X, T)             def##X(T, 15)
750 #define def(T)          def15(i, T)
751         def(_c)
752         def(_uc)
753         def(_s)
754         def(_us)
755         def(_i)
756 #if __WORDSIZE == 64
757         def(_ui)
758         def(_l)
759 #endif
760 #undef def
761 #define def(T)          def15(f, T)
762         def(_f)
763         def(_d)
764 #undef def
765
766     jit_patch(jmpi_main);
767     jit_name("main");
768     jit_note("ccall.c", __LINE__);
769     jit_prolog();
770
771 #define  push0(T)       /**/
772 #define  push1(T)                               jit_pushargi##T(1);
773 #define  push2(T)       push1(T)                jit_pushargi##T(2);
774 #define  push3(T)       push2(T)                jit_pushargi##T(3);
775 #define  push4(T)       push3(T)                jit_pushargi##T(4);
776 #define  push5(T)       push4(T)                jit_pushargi##T(5);
777 #define  push6(T)       push5(T)                jit_pushargi##T(6);
778 #define  push7(T)       push6(T)                jit_pushargi##T(7);
779 #define  push8(T)       push7(T)                jit_pushargi##T(8);
780 #define  push9(T)       push8(T)                jit_pushargi##T(9);
781 #define  push10(T)      push9(T)                jit_pushargi##T(10);
782 #define  push11(T)      push10(T)               jit_pushargi##T(11);
783 #define  push12(T)      push11(T)               jit_pushargi##T(12);
784 #define  push13(T)      push12(T)               jit_pushargi##T(13);
785 #define  push14(T)      push13(T)               jit_pushargi##T(14);
786 #define  push15(T)      push14(T)               jit_pushargi##T(15);
787
788 #define calin(T,N)                                                      \
789         jit_prepare();                                                  \
790                 push##N(T)                                              \
791         jit_finishi(C##T##N);                                           \
792         jit_retval##T(JIT_R0);                                          \
793         jmp = jit_beqi(JIT_R0, T##N);                                   \
794         jit_calli(abort);                                               \
795         jit_patch(jmp);
796 #define calfn(T,N)                                                      \
797         jit_prepare();                                                  \
798                 push##N(T)                                              \
799         jit_finishi(C##T##N);                                           \
800         jit_retval##T(JIT_F0);                                          \
801         jmp = jit_beqi##T(JIT_F0, _w##N);                               \
802         jit_calli(abort);                                               \
803         jit_patch(jmp);
804 #define  calx0(X,T)                             cal##X##n(T,0)
805 #define  calx1(X,T)     calx0(X,T)              cal##X##n(T,1)
806 #define  calx2(X,T)     calx1(X,T)              cal##X##n(T,2)
807 #define  calx3(X,T)     calx2(X,T)              cal##X##n(T,3)
808 #define  calx4(X,T)     calx3(X,T)              cal##X##n(T,4)
809 #define  calx5(X,T)     calx4(X,T)              cal##X##n(T,5)
810 #define  calx6(X,T)     calx5(X,T)              cal##X##n(T,6)
811 #define  calx7(X,T)     calx6(X,T)              cal##X##n(T,7)
812 #define  calx8(X,T)     calx7(X,T)              cal##X##n(T,8)
813 #define  calx9(X,T)     calx8(X,T)              cal##X##n(T,9)
814 #define calx10(X,T)     calx9(X,T)              cal##X##n(T,10)
815 #define calx11(X,T)     calx10(X,T)             cal##X##n(T,11)
816 #define calx12(X,T)     calx11(X,T)             cal##X##n(T,12)
817 #define calx13(X,T)     calx12(X,T)             cal##X##n(T,13)
818 #define calx14(X,T)     calx13(X,T)             cal##X##n(T,14)
819 #define calx15(X,T)     calx14(X,T)             cal##X##n(T,15)
820 #define cali(T)         calx15(i,T)
821 #define calf(T)         calx15(f,T)
822
823     cali(_c)
824     cali(_uc)
825     cali(_s)
826     cali(_us)
827     cali(_i)
828 #if __WORDSIZE == 64
829     cali(_ui)
830     cali(_l)
831 #endif
832     calf(_f)
833     calf(_d)
834
835 #undef calin
836 #undef calfn
837 #define calin(T,N)                                                      \
838         jit_prepare();                                                  \
839                 push##N(T)                                              \
840         jit_finishi(CJ##T##N);                                          \
841         jit_retval##T(JIT_R0);                                          \
842         jmp = jit_beqi(JIT_R0, T##N);                                   \
843         jit_calli(abort);                                               \
844         jit_patch(jmp);
845 #define calfn(T,N)                                                      \
846         jit_prepare();                                                  \
847                 push##N(T)                                              \
848         jit_finishi(CJ##T##N);                                          \
849         jit_retval##T(JIT_F0);                                          \
850         jmp = jit_beqi##T(JIT_F0, _w##N);                               \
851         jit_calli(abort);                                               \
852         jit_patch(jmp);
853     cali(_c)
854     cali(_uc)
855     cali(_s)
856     cali(_us)
857     cali(_i)
858 #if __WORDSIZE == 64
859     cali(_ui)
860     cali(_l)
861 #endif
862     calf(_f)
863     calf(_d)
864
865     jit_ret();
866
867     function = jit_emit();
868
869 #define initn(T,N)      j##T##N = jit_address(n##T##N);
870 #define init0(T)                        initn(T,0)
871 #define init1(T)         init0(T)       initn(T,1)
872 #define init2(T)         init1(T)       initn(T,2)
873 #define init3(T)         init2(T)       initn(T,3)
874 #define init4(T)         init3(T)       initn(T,4)
875 #define init5(T)         init4(T)       initn(T,5)
876 #define init6(T)         init5(T)       initn(T,6)
877 #define init7(T)         init6(T)       initn(T,7)
878 #define init8(T)         init7(T)       initn(T,8)
879 #define init9(T)         init8(T)       initn(T,9)
880 #define init10(T)        init9(T)       initn(T,10)
881 #define init11(T)       init10(T)       initn(T,11)
882 #define init12(T)       init11(T)       initn(T,12)
883 #define init13(T)       init12(T)       initn(T,13)
884 #define init14(T)       init13(T)       initn(T,14)
885 #define init15(T)       init14(T)       initn(T,15)
886 #define init(T)         init15(T)
887     init(_c)
888     init(_uc)
889     init(_s)
890     init(_us)
891     init(_i)
892 #if __WORDSIZE == 64
893     init(_ui)
894     init(_l)
895 #endif
896     init(_f)
897     init(_d)
898
899 #if 0
900     jit_print();
901     jit_disassemble();
902 #endif
903
904     jit_clear_state();
905     (*function)();
906     jit_destroy_state();
907
908     finish_jit();
909
910     printf("ok\n");
911
912     return (0);
913 }