Merge pull request #698 from pcercuei/update-lightrec-20221012
[pcsx_rearmed.git] / deps / lightning / lib / jit_print.c
1 /*
2  * Copyright (C) 2012-2022  Free Software Foundation, Inc.
3  *
4  * This file is part of GNU lightning.
5  *
6  * GNU lightning is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published
8  * by the Free Software Foundation; either version 3, or (at your option)
9  * any later version.
10  *
11  * GNU lightning is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14  * License for more details.
15  *
16  * Authors:
17  *      Paulo Cesar Pereira de Andrade
18  */
19
20 #include <lightning.h>
21 #include <lightning/jit_private.h>
22
23 #if __WORDSIZE == 32
24 #  define MININT                0x80000000
25 #else
26 #  define MININT                0x8000000000000000
27 #endif
28
29
30 #define print_chr(value)                fputc(value, print_stream)
31 #define print_hex(value)                                                \
32     do {                                                                \
33         if (value < 0 && value != MININT)                               \
34             fprintf(print_stream, "-0x%lx", -value);                    \
35         else                                                            \
36             fprintf(print_stream, "0x%lx", value);                      \
37     } while (0)
38 #define print_dec(value)                fprintf(print_stream, "%ld", value)
39 #define print_flt(value)                fprintf(print_stream, "%g", value)
40 #define print_str(value)                fprintf(print_stream, "%s", value)
41 #define print_ptr(value)                fprintf(print_stream, "%p", value)
42 #define print_reg(value)                                                \
43     do {                                                                \
44         if ((value) & jit_regno_patch)                                  \
45             print_chr('?');                                             \
46         print_str(_rvs[jit_regno(value)].name);                         \
47     } while (0)
48 #define print_arg(value)                                                \
49     do {                                                                \
50         print_chr('#');                                                 \
51         if (value)                                                      \
52             print_dec((value)->v.w);                                    \
53         else                                                            \
54             print_chr('?');                                             \
55     } while (0)
56
57 /*
58  * Initialization
59  */
60 #include "jit_names.c"
61 /*
62  * Initialization
63  */
64 static FILE     *print_stream;
65
66
67 /*
68  * Implementation
69  */
70 void
71 jit_init_print(void)
72 {
73     if (!print_stream)
74         print_stream = stdout;
75 }
76
77 void
78 _jit_print(jit_state_t *_jit)
79 {
80     jit_node_t          *node;
81
82     if ((node = _jitc->head)) {
83         jit_print_node(node);
84         for (node = node->next; node; node = node->next) {
85             print_chr('\n');
86             jit_print_node(node);
87         }
88         print_chr('\n');
89     }
90 }
91
92 void
93 _jit_print_node(jit_state_t *_jit, jit_node_t *node)
94 {
95     jit_block_t         *block;
96     jit_int32_t          value;
97     jit_int32_t          offset;
98
99     if (node->code == jit_code_label ||
100         node->code == jit_code_prolog || node->code == jit_code_epilog) {
101         print_chr('L');
102         print_dec(node->v.w);
103         print_chr(':');
104         block = _jitc->blocks.ptr + node->v.w;
105         for (offset = 0; offset < _jitc->reglen; offset++) {
106             if (jit_regset_tstbit(&block->reglive, offset)) {
107                 print_chr(' ');
108                 print_reg(offset);
109             }
110         }
111         if (node->code == jit_code_prolog ||
112             node->code == jit_code_epilog) {
113             print_str(" /* ");
114             print_str(code_name[node->code]);
115             print_str(" */");
116         }
117         return;
118     }
119     value = jit_classify(node->code) &
120         (jit_cc_a0_int|jit_cc_a0_flt|jit_cc_a0_dbl|jit_cc_a0_jmp|
121          jit_cc_a0_reg|jit_cc_a0_rlh|jit_cc_a0_arg|
122          jit_cc_a1_reg|jit_cc_a1_int|jit_cc_a1_flt|jit_cc_a1_dbl|jit_cc_a1_arg|
123          jit_cc_a2_reg|jit_cc_a2_int|jit_cc_a2_flt|jit_cc_a2_dbl|jit_cc_a2_rlh);
124     if (!(node->flag & jit_flag_synth) && ((value & jit_cc_a0_jmp) ||
125                                            node->code == jit_code_finishr ||
126                                            node->code == jit_code_finishi))
127         print_str("    ");
128     else
129         print_chr('\t');
130     if (node->flag & jit_flag_synth)
131         print_str(" \\__ ");
132     print_str(code_name[node->code]);
133     switch (node->code) {
134         r:
135             print_chr(' ');     print_reg(node->u.w);   return;
136         w:
137             print_chr(' ');     print_hex(node->u.w);   return;
138         f:
139             print_chr(' ');
140             if (node->flag & jit_flag_data)
141                 print_flt(*(jit_float32_t *)node->u.n->u.w);
142             else
143                 print_flt(node->u.f);
144             return;
145         d:
146             print_chr(' ');
147             if (node->flag & jit_flag_data)
148                 print_flt(*(jit_float64_t *)node->u.n->u.w);
149             else
150                 print_flt(node->u.d);
151             return;
152         n:
153             print_chr(' ');
154             if (!(node->flag & jit_flag_node))
155                 print_ptr(node->u.p);
156             else {
157                 print_chr('L');
158                 print_dec(node->u.n->v.w);
159             }
160             return;
161         a:
162             print_chr(' ');     print_arg(node);        return;
163         r_r:
164             print_chr(' ');     print_reg(node->u.w);
165             print_chr(' ');     print_reg(node->v.w);   return;
166         r_w:
167             print_chr(' ');     print_reg(node->u.w);
168             print_chr(' ');     print_hex(node->v.w);   return;
169         r_f:
170             print_chr(' ');     print_reg(node->u.w);
171             print_chr(' ');
172             if (node->flag & jit_flag_data)
173                 print_flt(*(jit_float32_t *)node->v.n->u.w);
174             else
175                 print_flt(node->v.f);
176             return;
177         r_d:
178             print_chr(' ');     print_reg(node->u.w);
179             print_chr(' ');
180             if (node->flag & jit_flag_data)
181                 print_flt(*(jit_float64_t *)node->v.n->u.w);
182             else
183                 print_flt(node->v.d);
184             return;
185         r_a:
186             print_chr(' ');     print_reg(node->u.w);
187             print_chr(' ');     print_arg(node->v.n);
188             return;
189         w_r:
190             print_chr(' ');     print_hex(node->u.w);
191             print_chr(' ');     print_reg(node->v.w);   return;
192         w_w:
193             print_chr(' ');     print_hex(node->u.w);
194             print_chr(' ');     print_hex(node->v.w);   return;
195         w_a:
196             print_chr(' ');     print_hex(node->u.w);
197             print_chr(' ');     print_arg(node->v.n);
198             return;
199         f_a:
200             print_chr(' ');
201             if (node->flag & jit_flag_data)
202                 print_flt(*(jit_float32_t *)node->u.n->u.w);
203             else
204                 print_flt(node->u.f);
205             print_chr(' ');     print_arg(node->v.n);
206             return;
207         d_a:
208             print_chr(' ');
209             if (node->flag & jit_flag_data)
210                 print_flt(*(jit_float64_t *)node->u.n->u.w);
211             else
212                 print_flt(node->u.d);
213             print_chr(' ');     print_arg(node->v.n);
214             return;
215         r_r_r:
216             print_chr(' ');     print_reg(node->u.w);
217             print_chr(' ');     print_reg(node->v.w);
218             print_chr(' ');     print_reg(node->w.w);   return;
219         r_r_w:
220             print_chr(' ');     print_reg(node->u.w);
221             print_chr(' ');     print_reg(node->v.w);
222             print_chr(' ');     print_hex(node->w.w);   return;
223         q_r_r:
224             print_str(" (");    print_reg(node->u.q.l);
225             print_chr(' ');     print_reg(node->u.q.h);
226             print_str(") ");    print_reg(node->v.w);
227             print_chr(' ');     print_reg(node->w.w);   return;
228         q_r_w:
229             print_str(" (");    print_reg(node->u.q.l);
230             print_chr(' ');     print_reg(node->u.q.h);
231             print_str(") ");    print_reg(node->v.w);
232             print_chr(' ');     print_hex(node->w.w);   return;
233         r_r_q:
234             print_chr(' ');     print_reg(node->u.w);
235             print_chr(' ');     print_reg(node->v.w);
236             print_str(" (");    print_reg(node->w.q.l);
237             print_chr(' ');     print_reg(node->w.q.h);
238             print_str(") ");    return;
239         r_w_q:
240             print_chr(' ');     print_reg(node->u.w);
241             print_chr(' ');     print_hex(node->v.w);
242             print_str(" (");    print_reg(node->w.q.l);
243             print_chr(' ');     print_reg(node->w.q.h);
244             print_str(") ");    return;
245         r_r_f:
246             print_chr(' ');     print_reg(node->u.w);
247             print_chr(' ');     print_reg(node->v.w);
248             print_chr(' ');
249             if (node->flag & jit_flag_data)
250                 print_flt(*(jit_float32_t *)node->w.n->u.w);
251             else
252                 print_flt(node->w.f);
253             return;
254         r_r_d:
255             print_chr(' ');     print_reg(node->u.w);
256             print_chr(' ');     print_reg(node->v.w);
257             print_chr(' ');
258             if (node->flag & jit_flag_data)
259                 print_flt(*(jit_float64_t *)node->w.n->u.w);
260             else
261                 print_flt(node->w.d);
262             return;
263         w_r_r:
264             print_chr(' ');     print_hex(node->u.w);
265             print_chr(' ');     print_reg(node->v.w);
266             print_chr(' ');     print_reg(node->w.w);   return;
267         n_r_r:
268             print_chr(' ');
269             if (!(node->flag & jit_flag_node))
270                 print_ptr(node->u.p);
271             else {
272                 print_chr('L');
273                 print_dec(node->u.n->v.w);
274             }
275             print_chr(' ');     print_reg(node->v.w);
276             print_chr(' ');     print_reg(node->w.w);   return;
277         n_r_w:
278             print_chr(' ');
279             if (!(node->flag & jit_flag_node))
280                 print_ptr(node->u.p);
281             else {
282                 print_chr('L');
283                 print_dec(node->u.n->v.w);
284             }
285             print_chr(' ');     print_reg(node->v.w);
286             print_chr(' ');     print_hex(node->w.w);   return;
287         n_r_f:
288             print_chr(' ');
289             if (!(node->flag & jit_flag_node))
290                 print_ptr(node->u.p);
291             else{
292                 print_chr('L');
293                 print_dec(node->u.n->v.w);
294             }
295             print_chr(' ');     print_reg(node->v.w);
296             print_chr(' ');
297             if (node->flag & jit_flag_data)
298                 print_flt(*(jit_float32_t *)node->w.n->u.w);
299             else
300                 print_flt(node->w.f);
301             return;
302         n_r_d:
303             print_chr(' ');
304             if (!(node->flag & jit_flag_node))
305                 print_ptr(node->u.p);
306             else {
307                 print_chr('L');
308                 print_dec(node->u.n->v.w);
309             }
310             print_chr(' ');     print_reg(node->v.w);
311             print_chr(' ');
312             if (node->flag & jit_flag_data)
313                 print_flt(*(jit_float64_t *)node->w.n->u.w);
314             else
315                 print_flt(node->w.d);
316             return;
317         case jit_code_name:
318             print_chr(' ');
319             if (node->v.p && _jitc->emit)
320                 print_str((char *)node->v.n->u.p);
321             break;
322         case jit_code_note:
323             print_chr(' ');
324             if (node->v.p && _jitc->emit)
325                 print_str((char *)node->v.n->u.p);
326             if (node->v.p && _jitc->emit && node->w.w)
327                 print_chr(':');
328             if (node->w.w)
329                 print_dec(node->w.w);
330             break;
331         case jit_code_data:
332         case jit_code_label:
333         case jit_code_ellipsis:
334         case jit_code_prolog:   case jit_code_epilog:
335         case jit_code_ret:      case jit_code_prepare:
336             break;
337         case jit_code_save:     case jit_code_load:
338             goto r;
339         default:
340             switch (value) {
341                 case jit_cc_a0_reg:
342                 case jit_cc_a0_reg|jit_cc_a0_chg:
343                 case jit_cc_a0_reg|jit_cc_a0_jmp:
344                     goto r;
345                 case jit_cc_a0_int:
346                     goto w;
347                 case jit_cc_a0_flt:
348                     goto f;
349                 case jit_cc_a0_dbl:
350                     goto d;
351                 case jit_cc_a0_jmp:
352                     goto n;
353                 case jit_cc_a0_int|jit_cc_a0_arg:
354                     goto a;
355                 case jit_cc_a0_reg|jit_cc_a1_reg:
356                     goto r_r;
357                 case jit_cc_a0_reg|jit_cc_a1_int:
358                     goto r_w;
359                 case jit_cc_a0_reg|jit_cc_a1_flt:
360                     goto r_f;
361                 case jit_cc_a0_reg|jit_cc_a1_dbl:
362                     goto r_d;
363                 case jit_cc_a0_reg|jit_cc_a1_arg:
364                     goto r_a;
365                 case jit_cc_a0_int|jit_cc_a1_reg:
366                     goto w_r;
367                 case jit_cc_a0_int|jit_cc_a1_int:
368                     goto w_w;
369                 case jit_cc_a0_int|jit_cc_a1_arg:
370                     goto w_a;
371                 case jit_cc_a0_flt|jit_cc_a1_arg:
372                     goto f_a;
373                 case jit_cc_a0_dbl|jit_cc_a1_arg:
374                     goto d_a;
375                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_reg:
376                     goto r_r_r;
377                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_int:
378                     goto r_r_w;
379                 case jit_cc_a0_reg|jit_cc_a0_rlh|
380                      jit_cc_a1_reg|jit_cc_a2_reg:
381                     goto q_r_r;
382                 case jit_cc_a0_reg|jit_cc_a0_rlh|
383                      jit_cc_a1_reg|jit_cc_a2_int:
384                     goto q_r_w;
385                 case jit_cc_a0_reg|jit_cc_a1_reg|
386                     jit_cc_a2_reg|jit_cc_a2_rlh:
387                     goto r_r_q;
388                 case jit_cc_a0_reg|jit_cc_a1_int|
389                     jit_cc_a2_reg|jit_cc_a2_rlh:
390                     goto r_w_q;
391                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_flt:
392                     goto r_r_f;
393                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_dbl:
394                     goto r_r_d;
395                 case jit_cc_a0_int|jit_cc_a1_reg|jit_cc_a2_reg:
396                     goto w_r_r;
397                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_reg:
398                     goto n_r_r;
399                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_int:
400                     goto n_r_w;
401                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_flt:
402                     goto n_r_f;
403                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_dbl:
404                     goto n_r_d;
405                 default:
406                     abort();
407             }
408             break;
409     }
410 }