lightrec: hack to fix a wrong assumption
[pcsx_rearmed.git] / deps / lightning / lib / jit_print.c
CommitLineData
4a71579b 1/*
c0c16242 2 * Copyright (C) 2012-2022 Free Software Foundation, Inc.
4a71579b
PC
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
c0c16242
PC
23#if __WORDSIZE == 32
24# define MININT 0x80000000
25#else
26# define MININT 0x8000000000000000
27#endif
28
29
519a9ea1 30#define print_chr(value) fputc(value, print_stream)
c0c16242
PC
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)
519a9ea1
PC
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)
4a71579b
PC
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"
519a9ea1
PC
61/*
62 * Initialization
63 */
64static FILE *print_stream;
65
4a71579b
PC
66
67/*
68 * Implementation
69 */
70void
40a44dcb 71jit_init_print(void)
4a71579b 72{
519a9ea1 73 if (!print_stream)
ba3814c1 74 print_stream = stdout;
40a44dcb
PC
75}
76
77void
78_jit_print(jit_state_t *_jit)
79{
80 jit_node_t *node;
519a9ea1 81
4a71579b
PC
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
92void
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|
ba3814c1 123 jit_cc_a2_reg|jit_cc_a2_int|jit_cc_a2_flt|jit_cc_a2_dbl|jit_cc_a2_rlh);
4a71579b
PC
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;
ba3814c1
PC
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;
4a71579b
PC
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)
c0c16242 320 print_str((char *)node->v.n->u.p);
4a71579b
PC
321 break;
322 case jit_code_note:
323 print_chr(' ');
324 if (node->v.p && _jitc->emit)
c0c16242 325 print_str((char *)node->v.n->u.p);
4a71579b
PC
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;
ba3814c1
PC
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;
4a71579b
PC
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}