2 * Copyright (C) 2012-2019 Free Software Foundation, Inc.
4 * This file is part of GNU lightning.
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)
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.
17 * Paulo Cesar Pereira de Andrade
20 #include <lightning.h>
21 #include <lightning/jit_private.h>
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)
29 #define print_reg(value) \
31 if ((value) & jit_regno_patch) \
33 print_str(_rvs[jit_regno(value)].name); \
35 #define print_arg(value) \
39 print_dec((value)->v.w); \
47 #include "jit_names.c"
51 static FILE *print_stream;
58 _jit_print(jit_state_t *_jit)
63 print_stream = stderr;
65 if ((node = _jitc->head)) {
67 for (node = node->next; node; node = node->next) {
76 _jit_print_node(jit_state_t *_jit, jit_node_t *node)
82 if (node->code == jit_code_label ||
83 node->code == jit_code_prolog || node->code == jit_code_epilog) {
87 block = _jitc->blocks.ptr + node->v.w;
88 for (offset = 0; offset < _jitc->reglen; offset++) {
89 if (jit_regset_tstbit(&block->reglive, offset)) {
94 if (node->code == jit_code_prolog ||
95 node->code == jit_code_epilog) {
97 print_str(code_name[node->code]);
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))
113 if (node->flag & jit_flag_synth)
115 print_str(code_name[node->code]);
116 switch (node->code) {
118 print_chr(' '); print_reg(node->u.w); return;
120 print_chr(' '); print_hex(node->u.w); return;
123 if (node->flag & jit_flag_data)
124 print_flt(*(jit_float32_t *)node->u.n->u.w);
126 print_flt(node->u.f);
130 if (node->flag & jit_flag_data)
131 print_flt(*(jit_float64_t *)node->u.n->u.w);
133 print_flt(node->u.d);
137 if (!(node->flag & jit_flag_node))
138 print_ptr(node->u.p);
141 print_dec(node->u.n->v.w);
145 print_chr(' '); print_arg(node); return;
147 print_chr(' '); print_reg(node->u.w);
148 print_chr(' '); print_reg(node->v.w); return;
150 print_chr(' '); print_reg(node->u.w);
151 print_chr(' '); print_hex(node->v.w); return;
153 print_chr(' '); print_reg(node->u.w);
155 if (node->flag & jit_flag_data)
156 print_flt(*(jit_float32_t *)node->v.n->u.w);
158 print_flt(node->v.f);
161 print_chr(' '); print_reg(node->u.w);
163 if (node->flag & jit_flag_data)
164 print_flt(*(jit_float64_t *)node->v.n->u.w);
166 print_flt(node->v.d);
169 print_chr(' '); print_reg(node->u.w);
170 print_chr(' '); print_arg(node->v.n);
173 print_chr(' '); print_hex(node->u.w);
174 print_chr(' '); print_reg(node->v.w); return;
176 print_chr(' '); print_hex(node->u.w);
177 print_chr(' '); print_hex(node->v.w); return;
179 print_chr(' '); print_hex(node->u.w);
180 print_chr(' '); print_arg(node->v.n);
184 if (node->flag & jit_flag_data)
185 print_flt(*(jit_float32_t *)node->u.n->u.w);
187 print_flt(node->u.f);
188 print_chr(' '); print_arg(node->v.n);
192 if (node->flag & jit_flag_data)
193 print_flt(*(jit_float64_t *)node->u.n->u.w);
195 print_flt(node->u.d);
196 print_chr(' '); print_arg(node->v.n);
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;
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;
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;
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;
217 print_chr(' '); print_reg(node->u.w);
218 print_chr(' '); print_reg(node->v.w);
220 if (node->flag & jit_flag_data)
221 print_flt(*(jit_float32_t *)node->w.n->u.w);
223 print_flt(node->w.f);
226 print_chr(' '); print_reg(node->u.w);
227 print_chr(' '); print_reg(node->v.w);
229 if (node->flag & jit_flag_data)
230 print_flt(*(jit_float64_t *)node->w.n->u.w);
232 print_flt(node->w.d);
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;
240 if (!(node->flag & jit_flag_node))
241 print_ptr(node->u.p);
244 print_dec(node->u.n->v.w);
246 print_chr(' '); print_reg(node->v.w);
247 print_chr(' '); print_reg(node->w.w); return;
250 if (!(node->flag & jit_flag_node))
251 print_ptr(node->u.p);
254 print_dec(node->u.n->v.w);
256 print_chr(' '); print_reg(node->v.w);
257 print_chr(' '); print_hex(node->w.w); return;
260 if (!(node->flag & jit_flag_node))
261 print_ptr(node->u.p);
264 print_dec(node->u.n->v.w);
266 print_chr(' '); print_reg(node->v.w);
268 if (node->flag & jit_flag_data)
269 print_flt(*(jit_float32_t *)node->w.n->u.w);
271 print_flt(node->w.f);
275 if (!(node->flag & jit_flag_node))
276 print_ptr(node->u.p);
279 print_dec(node->u.n->v.w);
281 print_chr(' '); print_reg(node->v.w);
283 if (node->flag & jit_flag_data)
284 print_flt(*(jit_float64_t *)node->w.n->u.w);
286 print_flt(node->w.d);
290 if (node->v.p && _jitc->emit)
291 print_str(node->v.n->u.p);
295 if (node->v.p && _jitc->emit)
296 print_str(node->v.n->u.p);
297 if (node->v.p && _jitc->emit && node->w.w)
300 print_dec(node->w.w);
304 case jit_code_ellipsis:
305 case jit_code_prolog: case jit_code_epilog:
306 case jit_code_ret: case jit_code_prepare:
308 case jit_code_save: case jit_code_load:
313 case jit_cc_a0_reg|jit_cc_a0_chg:
314 case jit_cc_a0_reg|jit_cc_a0_jmp:
324 case jit_cc_a0_int|jit_cc_a0_arg:
326 case jit_cc_a0_reg|jit_cc_a1_reg:
328 case jit_cc_a0_reg|jit_cc_a1_int:
330 case jit_cc_a0_reg|jit_cc_a1_flt:
332 case jit_cc_a0_reg|jit_cc_a1_dbl:
334 case jit_cc_a0_reg|jit_cc_a1_arg:
336 case jit_cc_a0_int|jit_cc_a1_reg:
338 case jit_cc_a0_int|jit_cc_a1_int:
340 case jit_cc_a0_int|jit_cc_a1_arg:
342 case jit_cc_a0_flt|jit_cc_a1_arg:
344 case jit_cc_a0_dbl|jit_cc_a1_arg:
346 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_reg:
348 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_int:
350 case jit_cc_a0_reg|jit_cc_a0_rlh|
351 jit_cc_a1_reg|jit_cc_a2_reg:
353 case jit_cc_a0_reg|jit_cc_a0_rlh|
354 jit_cc_a1_reg|jit_cc_a2_int:
356 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_flt:
358 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_dbl:
360 case jit_cc_a0_int|jit_cc_a1_reg|jit_cc_a2_reg:
362 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_reg:
364 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_int:
366 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_flt:
368 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_dbl: