Merge pull request #537 from embercold/warningless-build
[pcsx_rearmed.git] / deps / lightning / lib / jit_print.c
1 /*
2  * Copyright (C) 2012-2019  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 #define print_chr(value)                fputc(value, stdout)
24 #define print_hex(value)                fprintf(stdout, "0x%lx", value)
25 #define print_dec(value)                fprintf(stdout, "%ld", value)
26 #define print_flt(value)                fprintf(stdout, "%g", value)
27 #define print_str(value)                fprintf(stdout, "%s", value)
28 #define print_ptr(value)                fprintf(stdout, "%p", value)
29 #define print_reg(value)                                                \
30     do {                                                                \
31         if ((value) & jit_regno_patch)                                  \
32             print_chr('?');                                             \
33         print_str(_rvs[jit_regno(value)].name);                         \
34     } while (0)
35 #define print_arg(value)                                                \
36     do {                                                                \
37         print_chr('#');                                                 \
38         if (value)                                                      \
39             print_dec((value)->v.w);                                    \
40         else                                                            \
41             print_chr('?');                                             \
42     } while (0)
43
44 /*
45  * Initialization
46  */
47 #include "jit_names.c"
48
49 /*
50  * Implementation
51  */
52 void
53 _jit_print(jit_state_t *_jit)
54 {
55     jit_node_t          *node;
56
57     if ((node = _jitc->head)) {
58         jit_print_node(node);
59         for (node = node->next; node; node = node->next) {
60             print_chr('\n');
61             jit_print_node(node);
62         }
63         print_chr('\n');
64     }
65 }
66
67 void
68 _jit_print_node(jit_state_t *_jit, jit_node_t *node)
69 {
70     jit_block_t         *block;
71     jit_int32_t          value;
72     jit_int32_t          offset;
73
74     if (node->code == jit_code_label ||
75         node->code == jit_code_prolog || node->code == jit_code_epilog) {
76         print_chr('L');
77         print_dec(node->v.w);
78         print_chr(':');
79         block = _jitc->blocks.ptr + node->v.w;
80         for (offset = 0; offset < _jitc->reglen; offset++) {
81             if (jit_regset_tstbit(&block->reglive, offset)) {
82                 print_chr(' ');
83                 print_reg(offset);
84             }
85         }
86         if (node->code == jit_code_prolog ||
87             node->code == jit_code_epilog) {
88             print_str(" /* ");
89             print_str(code_name[node->code]);
90             print_str(" */");
91         }
92         return;
93     }
94     value = jit_classify(node->code) &
95         (jit_cc_a0_int|jit_cc_a0_flt|jit_cc_a0_dbl|jit_cc_a0_jmp|
96          jit_cc_a0_reg|jit_cc_a0_rlh|jit_cc_a0_arg|
97          jit_cc_a1_reg|jit_cc_a1_int|jit_cc_a1_flt|jit_cc_a1_dbl|jit_cc_a1_arg|
98          jit_cc_a2_reg|jit_cc_a2_int|jit_cc_a2_flt|jit_cc_a2_dbl);
99     if (!(node->flag & jit_flag_synth) && ((value & jit_cc_a0_jmp) ||
100                                            node->code == jit_code_finishr ||
101                                            node->code == jit_code_finishi))
102         print_str("    ");
103     else
104         print_chr('\t');
105     if (node->flag & jit_flag_synth)
106         print_str(" \\__ ");
107     print_str(code_name[node->code]);
108     switch (node->code) {
109         r:
110             print_chr(' ');     print_reg(node->u.w);   return;
111         w:
112             print_chr(' ');     print_hex(node->u.w);   return;
113         f:
114             print_chr(' ');
115             if (node->flag & jit_flag_data)
116                 print_flt(*(jit_float32_t *)node->u.n->u.w);
117             else
118                 print_flt(node->u.f);
119             return;
120         d:
121             print_chr(' ');
122             if (node->flag & jit_flag_data)
123                 print_flt(*(jit_float64_t *)node->u.n->u.w);
124             else
125                 print_flt(node->u.d);
126             return;
127         n:
128             print_chr(' ');
129             if (!(node->flag & jit_flag_node))
130                 print_ptr(node->u.p);
131             else {
132                 print_chr('L');
133                 print_dec(node->u.n->v.w);
134             }
135             return;
136         a:
137             print_chr(' ');     print_arg(node);        return;
138         r_r:
139             print_chr(' ');     print_reg(node->u.w);
140             print_chr(' ');     print_reg(node->v.w);   return;
141         r_w:
142             print_chr(' ');     print_reg(node->u.w);
143             print_chr(' ');     print_hex(node->v.w);   return;
144         r_f:
145             print_chr(' ');     print_reg(node->u.w);
146             print_chr(' ');
147             if (node->flag & jit_flag_data)
148                 print_flt(*(jit_float32_t *)node->v.n->u.w);
149             else
150                 print_flt(node->v.f);
151             return;
152         r_d:
153             print_chr(' ');     print_reg(node->u.w);
154             print_chr(' ');
155             if (node->flag & jit_flag_data)
156                 print_flt(*(jit_float64_t *)node->v.n->u.w);
157             else
158                 print_flt(node->v.d);
159             return;
160         r_a:
161             print_chr(' ');     print_reg(node->u.w);
162             print_chr(' ');     print_arg(node->v.n);
163             return;
164         w_r:
165             print_chr(' ');     print_hex(node->u.w);
166             print_chr(' ');     print_reg(node->v.w);   return;
167         w_w:
168             print_chr(' ');     print_hex(node->u.w);
169             print_chr(' ');     print_hex(node->v.w);   return;
170         w_a:
171             print_chr(' ');     print_hex(node->u.w);
172             print_chr(' ');     print_arg(node->v.n);
173             return;
174         f_a:
175             print_chr(' ');
176             if (node->flag & jit_flag_data)
177                 print_flt(*(jit_float32_t *)node->u.n->u.w);
178             else
179                 print_flt(node->u.f);
180             print_chr(' ');     print_arg(node->v.n);
181             return;
182         d_a:
183             print_chr(' ');
184             if (node->flag & jit_flag_data)
185                 print_flt(*(jit_float64_t *)node->u.n->u.w);
186             else
187                 print_flt(node->u.d);
188             print_chr(' ');     print_arg(node->v.n);
189             return;
190         r_r_r:
191             print_chr(' ');     print_reg(node->u.w);
192             print_chr(' ');     print_reg(node->v.w);
193             print_chr(' ');     print_reg(node->w.w);   return;
194         r_r_w:
195             print_chr(' ');     print_reg(node->u.w);
196             print_chr(' ');     print_reg(node->v.w);
197             print_chr(' ');     print_hex(node->w.w);   return;
198         q_r_r:
199             print_str(" (");    print_reg(node->u.q.l);
200             print_chr(' ');     print_reg(node->u.q.h);
201             print_str(") ");    print_reg(node->v.w);
202             print_chr(' ');     print_reg(node->w.w);   return;
203         q_r_w:
204             print_str(" (");    print_reg(node->u.q.l);
205             print_chr(' ');     print_reg(node->u.q.h);
206             print_str(") ");    print_reg(node->v.w);
207             print_chr(' ');     print_hex(node->w.w);   return;
208         r_r_f:
209             print_chr(' ');     print_reg(node->u.w);
210             print_chr(' ');     print_reg(node->v.w);
211             print_chr(' ');
212             if (node->flag & jit_flag_data)
213                 print_flt(*(jit_float32_t *)node->w.n->u.w);
214             else
215                 print_flt(node->w.f);
216             return;
217         r_r_d:
218             print_chr(' ');     print_reg(node->u.w);
219             print_chr(' ');     print_reg(node->v.w);
220             print_chr(' ');
221             if (node->flag & jit_flag_data)
222                 print_flt(*(jit_float64_t *)node->w.n->u.w);
223             else
224                 print_flt(node->w.d);
225             return;
226         w_r_r:
227             print_chr(' ');     print_hex(node->u.w);
228             print_chr(' ');     print_reg(node->v.w);
229             print_chr(' ');     print_reg(node->w.w);   return;
230         n_r_r:
231             print_chr(' ');
232             if (!(node->flag & jit_flag_node))
233                 print_ptr(node->u.p);
234             else {
235                 print_chr('L');
236                 print_dec(node->u.n->v.w);
237             }
238             print_chr(' ');     print_reg(node->v.w);
239             print_chr(' ');     print_reg(node->w.w);   return;
240         n_r_w:
241             print_chr(' ');
242             if (!(node->flag & jit_flag_node))
243                 print_ptr(node->u.p);
244             else {
245                 print_chr('L');
246                 print_dec(node->u.n->v.w);
247             }
248             print_chr(' ');     print_reg(node->v.w);
249             print_chr(' ');     print_hex(node->w.w);   return;
250         n_r_f:
251             print_chr(' ');
252             if (!(node->flag & jit_flag_node))
253                 print_ptr(node->u.p);
254             else{
255                 print_chr('L');
256                 print_dec(node->u.n->v.w);
257             }
258             print_chr(' ');     print_reg(node->v.w);
259             print_chr(' ');
260             if (node->flag & jit_flag_data)
261                 print_flt(*(jit_float32_t *)node->w.n->u.w);
262             else
263                 print_flt(node->w.f);
264             return;
265         n_r_d:
266             print_chr(' ');
267             if (!(node->flag & jit_flag_node))
268                 print_ptr(node->u.p);
269             else {
270                 print_chr('L');
271                 print_dec(node->u.n->v.w);
272             }
273             print_chr(' ');     print_reg(node->v.w);
274             print_chr(' ');
275             if (node->flag & jit_flag_data)
276                 print_flt(*(jit_float64_t *)node->w.n->u.w);
277             else
278                 print_flt(node->w.d);
279             return;
280         case jit_code_name:
281             print_chr(' ');
282             if (node->v.p && _jitc->emit)
283                 print_ptr(node->v.n->u.p);
284             break;
285         case jit_code_note:
286             print_chr(' ');
287             if (node->v.p && _jitc->emit)
288                 print_ptr(node->v.n->u.p);
289             if (node->v.p && _jitc->emit && node->w.w)
290                 print_chr(':');
291             if (node->w.w)
292                 print_dec(node->w.w);
293             break;
294         case jit_code_data:
295         case jit_code_label:
296         case jit_code_ellipsis:
297         case jit_code_prolog:   case jit_code_epilog:
298         case jit_code_ret:      case jit_code_prepare:
299             break;
300         case jit_code_save:     case jit_code_load:
301             goto r;
302         default:
303             switch (value) {
304                 case jit_cc_a0_reg:
305                 case jit_cc_a0_reg|jit_cc_a0_chg:
306                 case jit_cc_a0_reg|jit_cc_a0_jmp:
307                     goto r;
308                 case jit_cc_a0_int:
309                     goto w;
310                 case jit_cc_a0_flt:
311                     goto f;
312                 case jit_cc_a0_dbl:
313                     goto d;
314                 case jit_cc_a0_jmp:
315                     goto n;
316                 case jit_cc_a0_int|jit_cc_a0_arg:
317                     goto a;
318                 case jit_cc_a0_reg|jit_cc_a1_reg:
319                     goto r_r;
320                 case jit_cc_a0_reg|jit_cc_a1_int:
321                     goto r_w;
322                 case jit_cc_a0_reg|jit_cc_a1_flt:
323                     goto r_f;
324                 case jit_cc_a0_reg|jit_cc_a1_dbl:
325                     goto r_d;
326                 case jit_cc_a0_reg|jit_cc_a1_arg:
327                     goto r_a;
328                 case jit_cc_a0_int|jit_cc_a1_reg:
329                     goto w_r;
330                 case jit_cc_a0_int|jit_cc_a1_int:
331                     goto w_w;
332                 case jit_cc_a0_int|jit_cc_a1_arg:
333                     goto w_a;
334                 case jit_cc_a0_flt|jit_cc_a1_arg:
335                     goto f_a;
336                 case jit_cc_a0_dbl|jit_cc_a1_arg:
337                     goto d_a;
338                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_reg:
339                     goto r_r_r;
340                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_int:
341                     goto r_r_w;
342                 case jit_cc_a0_reg|jit_cc_a0_rlh|
343                      jit_cc_a1_reg|jit_cc_a2_reg:
344                     goto q_r_r;
345                 case jit_cc_a0_reg|jit_cc_a0_rlh|
346                      jit_cc_a1_reg|jit_cc_a2_int:
347                     goto q_r_w;
348                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_flt:
349                     goto r_r_f;
350                 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_dbl:
351                     goto r_r_d;
352                 case jit_cc_a0_int|jit_cc_a1_reg|jit_cc_a2_reg:
353                     goto w_r_r;
354                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_reg:
355                     goto n_r_r;
356                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_int:
357                     goto n_r_w;
358                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_flt:
359                     goto n_r_f;
360                 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_dbl:
361                     goto n_r_d;
362                 default:
363                     abort();
364             }
365             break;
366     }
367 }