Fix GTE directly referencing psxRegs
[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
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 */
52void
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
67void
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)
9361a5aa 283 print_ptr(node->v.n->u.p);
4a71579b
PC
284 break;
285 case jit_code_note:
286 print_chr(' ');
287 if (node->v.p && _jitc->emit)
9361a5aa 288 print_ptr(node->v.n->u.p);
4a71579b
PC
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}