Commit | Line | Data |
---|---|---|
4a71579b PC |
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 | /* | |
136 | * Types | |
137 | */ | |
138 | typedef signed char _c; | |
139 | typedef unsigned char _uc; | |
140 | typedef signed short _s; | |
141 | typedef unsigned short _us; | |
142 | typedef signed int _i; | |
143 | #if __WORDSIZE == 64 | |
144 | typedef unsigned int _ui; | |
145 | typedef jit_word_t _l; | |
146 | #endif | |
147 | typedef float _f; | |
148 | typedef double _d; | |
149 | ||
150 | #define prt0(T) T C##T##0(void); | |
151 | #define prt1(T) prt0(T) \ | |
152 | T C##T##1(T); | |
153 | #define prt2(T) prt1(T) \ | |
154 | T C##T##2(T,T); | |
155 | #define prt3(T) prt2(T) \ | |
156 | T C##T##3(T,T,T); | |
157 | #define prt4(T) prt3(T) \ | |
158 | T C##T##4(T,T,T,T); | |
159 | #define prt5(T) prt4(T) \ | |
160 | T C##T##5(T,T,T,T,T); | |
161 | #define prt6(T) prt5(T) \ | |
162 | T C##T##6(T,T,T,T,T,T); | |
163 | #define prt7(T) prt6(T) \ | |
164 | T C##T##7(T,T,T,T,T,T,T); | |
165 | #define prt8(T) prt7(T) \ | |
166 | T C##T##8(T,T,T,T,T,T,T,T); | |
167 | #define prt9(T) prt8(T) \ | |
168 | T C##T##9(T,T,T,T,T,T,T,T,T); | |
169 | #define prt10(T) prt9(T) \ | |
170 | T C##T##10(T,T,T,T,T,T,T,T,T,T); | |
171 | #define prt11(T) prt10(T) \ | |
172 | T C##T##11(T,T,T,T,T,T,T,T,T,T,T); | |
173 | #define prt12(T) prt11(T) \ | |
174 | T C##T##12(T,T,T,T,T,T,T,T,T,T,T,T); | |
175 | #define prt13(T) prt12(T) \ | |
176 | T C##T##13(T,T,T,T,T,T,T,T,T,T,T,T,T); | |
177 | #define prt14(T) prt13(T) \ | |
178 | T C##T##14(T,T,T,T,T,T,T,T,T,T,T,T,T,T); | |
179 | #define prt15(T) prt14(T) \ | |
180 | T C##T##15(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T); | |
181 | #define prt(T) prt15(T) | |
182 | prt(_c) | |
183 | prt(_uc) | |
184 | prt(_s) | |
185 | prt(_us) | |
186 | prt(_i) | |
187 | #if __WORDSIZE == 64 | |
188 | prt(_ui) | |
189 | prt(_l) | |
190 | #endif | |
191 | prt(_f) | |
192 | prt(_d) | |
193 | #undef prt | |
194 | #undef prt15 | |
195 | #undef prt14 | |
196 | #undef prt13 | |
197 | #undef prt12 | |
198 | #undef prt11 | |
199 | #undef prt10 | |
200 | #undef prt9 | |
201 | #undef prt8 | |
202 | #undef prt7 | |
203 | #undef prt6 | |
204 | #undef prt5 | |
205 | #undef prt4 | |
206 | #undef prt3 | |
207 | #undef prt2 | |
208 | #undef prt1 | |
209 | #undef prt0 | |
210 | ||
211 | #define prtn(N,T) T J##T##n(void); | |
212 | #define prt0(T) prtn(0,T) | |
213 | #define prt1(T) prt0(T) prtn(1,T) | |
214 | #define prt2(T) prt1(T) prtn(2,T) | |
215 | #define prt3(T) prt2(T) prtn(3,T) | |
216 | #define prt4(T) prt3(T) prtn(4,T) | |
217 | #define prt5(T) prt4(T) prtn(5,T) | |
218 | #define prt6(T) prt5(T) prtn(6,T) | |
219 | #define prt7(T) prt6(T) prtn(7,T) | |
220 | #define prt8(T) prt7(T) prtn(8,T) | |
221 | #define prt9(T) prt8(T) prtn(9,T) | |
222 | #define prt10(T) prt9(T) prtn(10,T) | |
223 | #define prt11(T) prt10(T) prtn(11,T) | |
224 | #define prt12(T) prt11(T) prtn(12,T) | |
225 | #define prt13(T) prt12(T) prtn(13,T) | |
226 | #define prt14(T) prt13(T) prtn(14,T) | |
227 | #define prt15(T) prt14(T) prtn(15,T) | |
228 | #define prt(T) prt15(T) | |
229 | prt(_c) | |
230 | prt(_uc) | |
231 | prt(_s) | |
232 | prt(_us) | |
233 | prt(_i) | |
234 | #if __WORDSIZE == 64 | |
235 | prt(_ui) | |
236 | prt(_l) | |
237 | #endif | |
238 | prt(_f) | |
239 | prt(_d) | |
240 | #undef prt | |
241 | #undef prt15 | |
242 | #undef prt14 | |
243 | #undef prt13 | |
244 | #undef prt12 | |
245 | #undef prt11 | |
246 | #undef prt10 | |
247 | #undef prt9 | |
248 | #undef prt8 | |
249 | #undef prt7 | |
250 | #undef prt6 | |
251 | #undef prt5 | |
252 | #undef prt4 | |
253 | #undef prt3 | |
254 | #undef prt2 | |
255 | #undef prt1 | |
256 | #undef prt0 | |
257 | #undef prtn | |
258 | ||
259 | /* | |
260 | * Initialization | |
261 | */ | |
262 | ||
263 | #define dat0(T) T (*j##T##0)(void); \ | |
264 | jit_node_t *n##T##0; | |
265 | #define dat1(T) dat0(T) \ | |
266 | T (*j##T##1)(T); \ | |
267 | jit_node_t *n##T##1; | |
268 | #define dat2(T) dat1(T) \ | |
269 | T (*j##T##2)(T,T); \ | |
270 | jit_node_t *n##T##2; | |
271 | #define dat3(T) dat2(T) \ | |
272 | T (*j##T##3)(T,T,T); \ | |
273 | jit_node_t *n##T##3; | |
274 | #define dat4(T) dat3(T) \ | |
275 | T (*j##T##4)(T,T,T,T); \ | |
276 | jit_node_t *n##T##4; | |
277 | #define dat5(T) dat4(T) \ | |
278 | T (*j##T##5)(T,T,T,T,T); \ | |
279 | jit_node_t *n##T##5; | |
280 | #define dat6(T) dat5(T) \ | |
281 | T (*j##T##6)(T,T,T,T,T,T); \ | |
282 | jit_node_t *n##T##6; | |
283 | #define dat7(T) dat6(T) \ | |
284 | T (*j##T##7)(T,T,T,T,T,T,T); \ | |
285 | jit_node_t *n##T##7; | |
286 | #define dat8(T) dat7(T) \ | |
287 | T (*j##T##8)(T,T,T,T,T,T,T,T); \ | |
288 | jit_node_t *n##T##8; | |
289 | #define dat9(T) dat8(T) \ | |
290 | T (*j##T##9)(T,T,T,T,T,T,T,T,T); \ | |
291 | jit_node_t *n##T##9; | |
292 | #define dat10(T) dat9(T) \ | |
293 | T (*j##T##10)(T,T,T,T,T,T,T,T,T,T); \ | |
294 | jit_node_t *n##T##10; | |
295 | #define dat11(T) dat10(T) \ | |
296 | T (*j##T##11)(T,T,T,T,T,T,T,T,T,T,T); \ | |
297 | jit_node_t *n##T##11; | |
298 | #define dat12(T) dat11(T) \ | |
299 | T (*j##T##12)(T,T,T,T,T,T,T,T,T,T,T,T); \ | |
300 | jit_node_t *n##T##12; | |
301 | #define dat13(T) dat12(T) \ | |
302 | T (*j##T##13)(T,T,T,T,T,T,T,T,T,T,T,T,T);\ | |
303 | jit_node_t *n##T##13; | |
304 | #define dat14(T) dat13(T) \ | |
305 | T (*j##T##14)(T,T,T,T,T,T,T,T,T,T,T,T,T,T);\ | |
306 | jit_node_t *n##T##14; | |
307 | #define dat15(T) dat14(T) \ | |
308 | T (*j##T##15)(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);\ | |
309 | jit_node_t *n##T##15; | |
310 | #define dat(T) dat15(T) | |
311 | dat(_c) | |
312 | dat(_uc) | |
313 | dat(_s) | |
314 | dat(_us) | |
315 | dat(_i) | |
316 | #if __WORDSIZE == 64 | |
317 | dat(_ui) | |
318 | dat(_l) | |
319 | #endif | |
320 | dat(_f) | |
321 | dat(_d) | |
322 | #undef dat | |
323 | #undef dat15 | |
324 | #undef dat14 | |
325 | #undef dat13 | |
326 | #undef dat12 | |
327 | #undef dat11 | |
328 | #undef dat10 | |
329 | #undef dat9 | |
330 | #undef dat8 | |
331 | #undef dat7 | |
332 | #undef dat6 | |
333 | #undef dat5 | |
334 | #undef dat4 | |
335 | #undef dat3 | |
336 | #undef dat2 | |
337 | #undef dat1 | |
338 | #undef dat0 | |
339 | ||
340 | /* | |
341 | * Implementation | |
342 | */ | |
343 | #define dcl0(T) \ | |
344 | T C##T##0(void) \ | |
345 | { \ | |
346 | return (0); \ | |
347 | } | |
348 | #define dcl1(T) \ | |
349 | dcl0(T) \ | |
350 | T C##T##1(T A) \ | |
351 | { \ | |
352 | return (A); \ | |
353 | } | |
354 | #define dcl2(T) \ | |
355 | dcl1(T) \ | |
356 | T C##T##2(T A,T B) \ | |
357 | { \ | |
358 | return (A-B); \ | |
359 | } | |
360 | #define dcl3(T) \ | |
361 | dcl2(T) \ | |
362 | T C##T##3(T A,T B,T C) \ | |
363 | { \ | |
364 | return (A-B-C); \ | |
365 | } | |
366 | #define dcl4(T) \ | |
367 | dcl3(T) \ | |
368 | T C##T##4(T A,T B,T C,T D) \ | |
369 | { \ | |
370 | return (A-B-C-D); \ | |
371 | } | |
372 | #define dcl5(T) \ | |
373 | dcl4(T) \ | |
374 | T C##T##5(T A,T B,T C,T D,T E) \ | |
375 | { \ | |
376 | return (A-B-C-D-E); \ | |
377 | } | |
378 | #define dcl6(T) \ | |
379 | dcl5(T) \ | |
380 | T C##T##6(T A,T B,T C,T D,T E,T F) \ | |
381 | { \ | |
382 | return (A-B-C-D-E-F); \ | |
383 | } | |
384 | #define dcl7(T) \ | |
385 | dcl6(T) \ | |
386 | T C##T##7(T A,T B,T C,T D,T E,T F,T G) \ | |
387 | { \ | |
388 | return (A-B-C-D-E-F-G); \ | |
389 | } | |
390 | #define dcl8(T) \ | |
391 | dcl7(T) \ | |
392 | T C##T##8(T A,T B,T C,T D,T E,T F,T G,T H) \ | |
393 | { \ | |
394 | return (A-B-C-D-E-F-G-H); \ | |
395 | } | |
396 | #define dcl9(T) \ | |
397 | dcl8(T) \ | |
398 | T C##T##9(T A,T B,T C,T D,T E,T F,T G,T H,T I) \ | |
399 | { \ | |
400 | return (A-B-C-D-E-F-G-H-I); \ | |
401 | } | |
402 | #define dcl10(T) \ | |
403 | dcl9(T) \ | |
404 | T C##T##10(T A,T B,T C,T D,T E,T F,T G,T H,T I,T J) \ | |
405 | { \ | |
406 | return (A-B-C-D-E-F-G-H-I-J); \ | |
407 | } | |
408 | #define dcl11(T) \ | |
409 | dcl10(T) \ | |
410 | 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) \ | |
411 | { \ | |
412 | return (A-B-C-D-E-F-G-H-I-J-K); \ | |
413 | } | |
414 | #define dcl12(T) \ | |
415 | dcl11(T) \ | |
416 | 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) \ | |
417 | { \ | |
418 | return (A-B-C-D-E-F-G-H-I-J-K-L); \ | |
419 | } | |
420 | #define dcl13(T) \ | |
421 | dcl12(T) \ | |
422 | 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) \ | |
423 | { \ | |
424 | return (A-B-C-D-E-F-G-H-I-J-K-L-M); \ | |
425 | } | |
426 | #define dcl14(T) \ | |
427 | dcl13(T) \ | |
428 | 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) \ | |
429 | { \ | |
430 | return (A-B-C-D-E-F-G-H-I-J-K-L-M-N); \ | |
431 | } | |
432 | #define dcl15(T) \ | |
433 | dcl14(T) \ | |
434 | 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) \ | |
435 | { \ | |
436 | return (A-B-C-D-E-F-G-H-I-J-K-L-M-N-O); \ | |
437 | } | |
438 | #define dcl(T) dcl15(T) | |
439 | dcl(_c) | |
440 | dcl(_uc) | |
441 | dcl(_s) | |
442 | dcl(_us) | |
443 | dcl(_i) | |
444 | #if __WORDSIZE == 64 | |
445 | dcl(_ui) | |
446 | dcl(_l) | |
447 | #endif | |
448 | dcl(_f) | |
449 | dcl(_d) | |
450 | #undef dcl | |
451 | #undef dcl15 | |
452 | #undef dcl14 | |
453 | #undef dcl13 | |
454 | #undef dcl12 | |
455 | #undef dcl11 | |
456 | #undef dcl10 | |
457 | #undef dcl9 | |
458 | #undef dcl8 | |
459 | #undef dcl7 | |
460 | #undef dcl6 | |
461 | #undef dcl5 | |
462 | #undef dcl4 | |
463 | #undef dcl3 | |
464 | #undef dcl2 | |
465 | #undef dcl1 | |
466 | #undef dcl0 | |
467 | ||
468 | #define dcl0(T) \ | |
469 | T CJ##T##0(void) \ | |
470 | { \ | |
471 | return ((*j##T##0)()); \ | |
472 | } | |
473 | #define dcl1(T) \ | |
474 | dcl0(T) \ | |
475 | T CJ##T##1(void) \ | |
476 | { \ | |
477 | return ((*j##T##1)(1)); \ | |
478 | } | |
479 | #define dcl2(T) \ | |
480 | dcl1(T) \ | |
481 | T CJ##T##2(void) \ | |
482 | { \ | |
483 | return ((*j##T##2)(1,2)); \ | |
484 | } | |
485 | #define dcl3(T) \ | |
486 | dcl2(T) \ | |
487 | T CJ##T##3(void) \ | |
488 | { \ | |
489 | return ((*j##T##3)(1,2,3)); \ | |
490 | } | |
491 | #define dcl4(T) \ | |
492 | dcl3(T) \ | |
493 | T CJ##T##4(void) \ | |
494 | { \ | |
495 | return ((*j##T##4)(1,2,3,4)); \ | |
496 | } | |
497 | #define dcl5(T) \ | |
498 | dcl4(T) \ | |
499 | T CJ##T##5(void) \ | |
500 | { \ | |
501 | return ((*j##T##5)(1,2,3,4,5)); \ | |
502 | } | |
503 | #define dcl6(T) \ | |
504 | dcl5(T) \ | |
505 | T CJ##T##6(void) \ | |
506 | { \ | |
507 | return ((*j##T##6)(1,2,3,4,5,6)); \ | |
508 | } | |
509 | #define dcl7(T) \ | |
510 | dcl6(T) \ | |
511 | T CJ##T##7(void) \ | |
512 | { \ | |
513 | return ((*j##T##7)(1,2,3,4,5,6,7)); \ | |
514 | } | |
515 | #define dcl8(T) \ | |
516 | dcl7(T) \ | |
517 | T CJ##T##8(void) \ | |
518 | { \ | |
519 | return ((*j##T##8)(1,2,3,4,5,6,7,8)); \ | |
520 | } | |
521 | #define dcl9(T) \ | |
522 | dcl8(T) \ | |
523 | T CJ##T##9(void) \ | |
524 | { \ | |
525 | return ((*j##T##9)(1,2,3,4,5,6,7,8,9)); \ | |
526 | } | |
527 | #define dcl10(T) \ | |
528 | dcl9(T) \ | |
529 | T CJ##T##10(void) \ | |
530 | { \ | |
531 | return ((*j##T##10)(1,2,3,4,5,6,7,8,9,10)); \ | |
532 | } | |
533 | #define dcl11(T) \ | |
534 | dcl10(T) \ | |
535 | T CJ##T##11(void) \ | |
536 | { \ | |
537 | return ((*j##T##11)(1,2,3,4,5,6,7,8,9,10,11)); \ | |
538 | } | |
539 | #define dcl12(T) \ | |
540 | dcl11(T) \ | |
541 | T CJ##T##12(void) \ | |
542 | { \ | |
543 | return ((*j##T##12)(1,2,3,4,5,6,7,8,9,10,11,12)); \ | |
544 | } | |
545 | #define dcl13(T) \ | |
546 | dcl12(T) \ | |
547 | T CJ##T##13(void) \ | |
548 | { \ | |
549 | return ((*j##T##13)(1,2,3,4,5,6,7,8,9,10,11,12,13)); \ | |
550 | } | |
551 | #define dcl14(T) \ | |
552 | dcl13(T) \ | |
553 | T CJ##T##14(void) \ | |
554 | { \ | |
555 | return ((*j##T##14)(1,2,3,4,5,6,7,8,9,10,11,12,13,14)); \ | |
556 | } | |
557 | #define dcl15(T) \ | |
558 | dcl14(T) \ | |
559 | T CJ##T##15(void) \ | |
560 | { \ | |
561 | return ((*j##T##15)(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)); \ | |
562 | } | |
563 | #define dcl(t) dcl15(t) | |
564 | dcl(_c) | |
565 | dcl(_uc) | |
566 | dcl(_s) | |
567 | dcl(_us) | |
568 | dcl(_i) | |
569 | #if __WORDSIZE == 64 | |
570 | dcl(_ui) | |
571 | dcl(_l) | |
572 | #endif | |
573 | dcl(_f) | |
574 | dcl(_d) | |
575 | #undef dcl | |
576 | #undef dcl15 | |
577 | #undef dcl14 | |
578 | #undef dcl13 | |
579 | #undef dcl12 | |
580 | #undef dcl11 | |
581 | #undef dcl10 | |
582 | #undef dcl9 | |
583 | #undef dcl8 | |
584 | #undef dcl7 | |
585 | #undef dcl6 | |
586 | #undef dcl5 | |
587 | #undef dcl4 | |
588 | #undef dcl3 | |
589 | #undef dcl2 | |
590 | #undef dcl1 | |
591 | #undef dcl0 | |
592 | ||
593 | int | |
594 | main(int argc, char *argv[]) | |
595 | { | |
596 | jit_state_t *_jit; | |
597 | jit_node_t *jmpi_main; | |
598 | void (*function)(void); | |
599 | jit_node_t *a1,*a2,*a3,*a4,*a5,*a6,*a7,*a8,*a9; | |
600 | jit_node_t *a10,*a11,*a12,*a13,*a14,*a15; | |
601 | jit_node_t *jmp; | |
602 | ||
603 | init_jit(argv[0]); | |
604 | _jit = jit_new_state(); | |
605 | ||
606 | jmpi_main = jit_jmpi(); | |
607 | ||
608 | ||
609 | #define arg0(T) /**/ | |
610 | #define arg1(T) a1 = jit_arg##T(); | |
611 | #define arg2(T) arg1(T) a2 = jit_arg##T(); | |
612 | #define arg3(T) arg2(T) a3 = jit_arg##T(); | |
613 | #define arg4(T) arg3(T) a4 = jit_arg##T(); | |
614 | #define arg5(T) arg4(T) a5 = jit_arg##T(); | |
615 | #define arg6(T) arg5(T) a6 = jit_arg##T(); | |
616 | #define arg7(T) arg6(T) a7 = jit_arg##T(); | |
617 | #define arg8(T) arg7(T) a8 = jit_arg##T(); | |
618 | #define arg9(T) arg8(T) a9 = jit_arg##T(); | |
619 | #define arg10(T) arg9(T) a10 = jit_arg##T(); | |
620 | #define arg11(T) arg10(T) a11 = jit_arg##T(); | |
621 | #define arg12(T) arg11(T) a12 = jit_arg##T(); | |
622 | #define arg13(T) arg12(T) a13 = jit_arg##T(); | |
623 | #define arg14(T) arg13(T) a14 = jit_arg##T(); | |
624 | #define arg15(T) arg14(T) a15 = jit_arg##T(); | |
625 | ||
626 | #define get0(B,T,R) jit_movi##B(R##0,0); | |
627 | #define get1(B,T,R) jit_getarg##B(R##0,a##1); | |
628 | #define get2(B,T,R) \ | |
629 | get1(B,T,R); \ | |
630 | jit_movr##B(R##1, R##0); \ | |
631 | jit_getarg##T(R##0, a##2); \ | |
632 | jit_subr##B(R##0, R##1, R##0); | |
633 | #define get3(B,T,R) \ | |
634 | get2(B,T,R); \ | |
635 | jit_movr##B(R##1, R##0); \ | |
636 | jit_getarg##T(R##0, a##3); \ | |
637 | jit_subr##B(R##0, R##1, R##0); | |
638 | #define get4(B,T,R) \ | |
639 | get3(B,T,R); \ | |
640 | jit_movr##B(R##1, R##0); \ | |
641 | jit_getarg##T(R##0, a##4); \ | |
642 | jit_subr##B(R##0, R##1, R##0); | |
643 | #define get5(B,T,R) \ | |
644 | get4(B,T,R); \ | |
645 | jit_movr##B(R##1, R##0); \ | |
646 | jit_getarg##T(R##0, a##5); \ | |
647 | jit_subr##B(R##0, R##1, R##0); | |
648 | #define get6(B,T,R) \ | |
649 | get5(B,T,R); \ | |
650 | jit_movr##B(R##1, R##0); \ | |
651 | jit_getarg##T(R##0, a##6); \ | |
652 | jit_subr##B(R##0, R##1, R##0); | |
653 | #define get7(B,T,R) \ | |
654 | get6(B,T,R); \ | |
655 | jit_movr##B(R##1, R##0); \ | |
656 | jit_getarg##T(R##0, a##7); \ | |
657 | jit_subr##B(R##0, R##1, R##0); | |
658 | #define get8(B,T,R) \ | |
659 | get7(B,T,R); \ | |
660 | jit_movr##B(R##1, R##0); \ | |
661 | jit_getarg##T(R##0, a##8); \ | |
662 | jit_subr##B(R##0, R##1, R##0); | |
663 | #define get9(B,T,R) \ | |
664 | get8(B,T,R); \ | |
665 | jit_movr##B(R##1, R##0); \ | |
666 | jit_getarg##T(R##0, a##9); \ | |
667 | jit_subr##B(R##0, R##1, R##0); | |
668 | #define get10(B,T,R) \ | |
669 | get9(B,T,R); \ | |
670 | jit_movr##B(R##1, R##0); \ | |
671 | jit_getarg##T(R##0, a##10); \ | |
672 | jit_subr##B(R##0, R##1, R##0); | |
673 | #define get11(B,T,R) \ | |
674 | get10(B,T,R); \ | |
675 | jit_movr##B(R##1, R##0); \ | |
676 | jit_getarg##T(R##0, a##11); \ | |
677 | jit_subr##B(R##0, R##1, R##0); | |
678 | #define get12(B,T,R) \ | |
679 | get11(B,T,R); \ | |
680 | jit_movr##B(R##1, R##0); \ | |
681 | jit_getarg##T(R##0, a##12); \ | |
682 | jit_subr##B(R##0, R##1, R##0); | |
683 | #define get13(B,T,R) \ | |
684 | get12(B,T,R); \ | |
685 | jit_movr##B(R##1, R##0); \ | |
686 | jit_getarg##T(R##0, a##13); \ | |
687 | jit_subr##B(R##0, R##1, R##0); | |
688 | #define get14(B,T,R) \ | |
689 | get13(B,T,R); \ | |
690 | jit_movr##B(R##1, R##0); \ | |
691 | jit_getarg##T(R##0, a##14); \ | |
692 | jit_subr##B(R##0, R##1, R##0); | |
693 | #define get15(B,T,R) \ | |
694 | get14(B,T,R); \ | |
695 | jit_movr##B(R##1, R##0); \ | |
696 | jit_getarg##T(R##0, a##15); \ | |
697 | jit_subr##B(R##0, R##1, R##0); | |
698 | ||
699 | #if __WORDSIZE == 32 | |
700 | # define jit_extr_i(u, v) /**/ | |
701 | #else | |
702 | # define jit_extr_l(u, v) /**/ | |
703 | #endif | |
704 | ||
705 | #define strfy(n) #n | |
706 | #define defi(T, N) \ | |
707 | n##T##N = jit_name(strfy(n##T##N)); \ | |
708 | jit_note("ccall.c", __LINE__); \ | |
709 | jit_prolog(); \ | |
710 | arg##N(); \ | |
711 | get##N(,T,JIT_R) \ | |
712 | jit_extr##T(JIT_R0, JIT_R0); \ | |
713 | jit_retr(JIT_R0); \ | |
714 | jit_epilog(); | |
715 | #define deff(T, N) \ | |
716 | n##T##N = jit_name(strfy(n##T##N)); \ | |
717 | jit_note("ccall.c", __LINE__); \ | |
718 | jit_prolog(); \ | |
719 | arg##N(T); \ | |
720 | get##N(T,T,JIT_F); \ | |
721 | jit_retr##T(JIT_F0); \ | |
722 | jit_epilog(); | |
723 | ||
724 | #define def0(X, T) def##X(T, 0) | |
725 | #define def1(X, T) def0(X, T) def##X(T, 1) | |
726 | #define def2(X, T) def1(X, T) def##X(T, 2) | |
727 | #define def3(X, T) def2(X, T) def##X(T, 3) | |
728 | #define def4(X, T) def3(X, T) def##X(T, 4) | |
729 | #define def5(X, T) def4(X, T) def##X(T, 5) | |
730 | #define def6(X, T) def5(X, T) def##X(T, 6) | |
731 | #define def7(X, T) def6(X, T) def##X(T, 7) | |
732 | #define def8(X, T) def7(X, T) def##X(T, 8) | |
733 | #define def9(X, T) def8(X, T) def##X(T, 9) | |
734 | #define def10(X, T) def9(X, T) def##X(T, 10) | |
735 | #define def11(X, T) def10(X, T) def##X(T, 11) | |
736 | #define def12(X, T) def11(X, T) def##X(T, 12) | |
737 | #define def13(X, T) def12(X, T) def##X(T, 13) | |
738 | #define def14(X, T) def13(X, T) def##X(T, 14) | |
739 | #define def15(X, T) def14(X, T) def##X(T, 15) | |
740 | #define def(T) def15(i, T) | |
741 | def(_c) | |
742 | def(_uc) | |
743 | def(_s) | |
744 | def(_us) | |
745 | def(_i) | |
746 | #if __WORDSIZE == 64 | |
747 | def(_ui) | |
748 | def(_l) | |
749 | #endif | |
750 | #undef def | |
751 | #define def(T) def15(f, T) | |
752 | def(_f) | |
753 | def(_d) | |
754 | #undef def | |
755 | ||
756 | jit_patch(jmpi_main); | |
757 | jit_name("main"); | |
758 | jit_note("ccall.c", __LINE__); | |
759 | jit_prolog(); | |
760 | ||
761 | #define push0(T) /**/ | |
762 | #define push1(T) jit_pushargi##T(1); | |
763 | #define push2(T) push1(T) jit_pushargi##T(2); | |
764 | #define push3(T) push2(T) jit_pushargi##T(3); | |
765 | #define push4(T) push3(T) jit_pushargi##T(4); | |
766 | #define push5(T) push4(T) jit_pushargi##T(5); | |
767 | #define push6(T) push5(T) jit_pushargi##T(6); | |
768 | #define push7(T) push6(T) jit_pushargi##T(7); | |
769 | #define push8(T) push7(T) jit_pushargi##T(8); | |
770 | #define push9(T) push8(T) jit_pushargi##T(9); | |
771 | #define push10(T) push9(T) jit_pushargi##T(10); | |
772 | #define push11(T) push10(T) jit_pushargi##T(11); | |
773 | #define push12(T) push11(T) jit_pushargi##T(12); | |
774 | #define push13(T) push12(T) jit_pushargi##T(13); | |
775 | #define push14(T) push13(T) jit_pushargi##T(14); | |
776 | #define push15(T) push14(T) jit_pushargi##T(15); | |
777 | ||
778 | #define calin(T,N) \ | |
779 | jit_prepare(); \ | |
780 | push##N() \ | |
781 | jit_finishi(C##T##N); \ | |
782 | jit_retval##T(JIT_R0); \ | |
783 | jmp = jit_beqi(JIT_R0, T##N); \ | |
784 | jit_calli(abort); \ | |
785 | jit_patch(jmp); | |
786 | #define calfn(T,N) \ | |
787 | jit_prepare(); \ | |
788 | push##N(T) \ | |
789 | jit_finishi(C##T##N); \ | |
790 | jit_retval##T(JIT_F0); \ | |
791 | jmp = jit_beqi##T(JIT_F0, _w##N); \ | |
792 | jit_calli(abort); \ | |
793 | jit_patch(jmp); | |
794 | #define calx0(X,T) cal##X##n(T,0) | |
795 | #define calx1(X,T) calx0(X,T) cal##X##n(T,1) | |
796 | #define calx2(X,T) calx1(X,T) cal##X##n(T,2) | |
797 | #define calx3(X,T) calx2(X,T) cal##X##n(T,3) | |
798 | #define calx4(X,T) calx3(X,T) cal##X##n(T,4) | |
799 | #define calx5(X,T) calx4(X,T) cal##X##n(T,5) | |
800 | #define calx6(X,T) calx5(X,T) cal##X##n(T,6) | |
801 | #define calx7(X,T) calx6(X,T) cal##X##n(T,7) | |
802 | #define calx8(X,T) calx7(X,T) cal##X##n(T,8) | |
803 | #define calx9(X,T) calx8(X,T) cal##X##n(T,9) | |
804 | #define calx10(X,T) calx9(X,T) cal##X##n(T,10) | |
805 | #define calx11(X,T) calx10(X,T) cal##X##n(T,11) | |
806 | #define calx12(X,T) calx11(X,T) cal##X##n(T,12) | |
807 | #define calx13(X,T) calx12(X,T) cal##X##n(T,13) | |
808 | #define calx14(X,T) calx13(X,T) cal##X##n(T,14) | |
809 | #define calx15(X,T) calx14(X,T) cal##X##n(T,15) | |
810 | #define cali(T) calx15(i,T) | |
811 | #define calf(T) calx15(f,T) | |
812 | ||
813 | cali(_c) | |
814 | cali(_uc) | |
815 | cali(_s) | |
816 | cali(_us) | |
817 | cali(_i) | |
818 | #if __WORDSIZE == 64 | |
819 | cali(_ui) | |
820 | cali(_l) | |
821 | #endif | |
822 | calf(_f) | |
823 | calf(_d) | |
824 | ||
825 | #undef calin | |
826 | #undef calfn | |
827 | #define calin(T,N) \ | |
828 | jit_prepare(); \ | |
829 | push##N() \ | |
830 | jit_finishi(CJ##T##N); \ | |
831 | jit_retval##T(JIT_R0); \ | |
832 | jmp = jit_beqi(JIT_R0, T##N); \ | |
833 | jit_calli(abort); \ | |
834 | jit_patch(jmp); | |
835 | #define calfn(T,N) \ | |
836 | jit_prepare(); \ | |
837 | push##N(T) \ | |
838 | jit_finishi(CJ##T##N); \ | |
839 | jit_retval##T(JIT_F0); \ | |
840 | jmp = jit_beqi##T(JIT_F0, _w##N); \ | |
841 | jit_calli(abort); \ | |
842 | jit_patch(jmp); | |
843 | cali(_c) | |
844 | cali(_uc) | |
845 | cali(_s) | |
846 | cali(_us) | |
847 | cali(_i) | |
848 | #if __WORDSIZE == 64 | |
849 | cali(_ui) | |
850 | cali(_l) | |
851 | #endif | |
852 | calf(_f) | |
853 | calf(_d) | |
854 | ||
855 | jit_ret(); | |
856 | ||
857 | function = jit_emit(); | |
858 | ||
859 | #define initn(T,N) j##T##N = jit_address(n##T##N); | |
860 | #define init0(T) initn(T,0) | |
861 | #define init1(T) init0(T) initn(T,1) | |
862 | #define init2(T) init1(T) initn(T,2) | |
863 | #define init3(T) init2(T) initn(T,3) | |
864 | #define init4(T) init3(T) initn(T,4) | |
865 | #define init5(T) init4(T) initn(T,5) | |
866 | #define init6(T) init5(T) initn(T,6) | |
867 | #define init7(T) init6(T) initn(T,7) | |
868 | #define init8(T) init7(T) initn(T,8) | |
869 | #define init9(T) init8(T) initn(T,9) | |
870 | #define init10(T) init9(T) initn(T,10) | |
871 | #define init11(T) init10(T) initn(T,11) | |
872 | #define init12(T) init11(T) initn(T,12) | |
873 | #define init13(T) init12(T) initn(T,13) | |
874 | #define init14(T) init13(T) initn(T,14) | |
875 | #define init15(T) init14(T) initn(T,15) | |
876 | #define init(T) init15(T) | |
877 | init(_c) | |
878 | init(_uc) | |
879 | init(_s) | |
880 | init(_us) | |
881 | init(_i) | |
882 | #if __WORDSIZE == 64 | |
883 | init(_ui) | |
884 | init(_l) | |
885 | #endif | |
886 | init(_f) | |
887 | init(_d) | |
888 | ||
889 | #if 0 | |
890 | jit_print(); | |
891 | jit_disassemble(); | |
892 | #endif | |
893 | ||
894 | jit_clear_state(); | |
895 | (*function)(); | |
896 | jit_destroy_state(); | |
897 | ||
898 | finish_jit(); | |
899 | ||
900 | printf("ok\n"); | |
901 | ||
902 | return (0); | |
903 | } |