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