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, 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) \
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"
53 _jit_print(jit_state_t *_jit)
57 if ((node = _jitc->head)) {
59 for (node = node->next; node; node = node->next) {
68 _jit_print_node(jit_state_t *_jit, jit_node_t *node)
74 if (node->code == jit_code_label ||
75 node->code == jit_code_prolog || node->code == jit_code_epilog) {
79 block = _jitc->blocks.ptr + node->v.w;
80 for (offset = 0; offset < _jitc->reglen; offset++) {
81 if (jit_regset_tstbit(&block->reglive, offset)) {
86 if (node->code == jit_code_prolog ||
87 node->code == jit_code_epilog) {
89 print_str(code_name[node->code]);
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))
105 if (node->flag & jit_flag_synth)
107 print_str(code_name[node->code]);
108 switch (node->code) {
110 print_chr(' '); print_reg(node->u.w); return;
112 print_chr(' '); print_hex(node->u.w); return;
115 if (node->flag & jit_flag_data)
116 print_flt(*(jit_float32_t *)node->u.n->u.w);
118 print_flt(node->u.f);
122 if (node->flag & jit_flag_data)
123 print_flt(*(jit_float64_t *)node->u.n->u.w);
125 print_flt(node->u.d);
129 if (!(node->flag & jit_flag_node))
130 print_ptr(node->u.p);
133 print_dec(node->u.n->v.w);
137 print_chr(' '); print_arg(node); return;
139 print_chr(' '); print_reg(node->u.w);
140 print_chr(' '); print_reg(node->v.w); return;
142 print_chr(' '); print_reg(node->u.w);
143 print_chr(' '); print_hex(node->v.w); return;
145 print_chr(' '); print_reg(node->u.w);
147 if (node->flag & jit_flag_data)
148 print_flt(*(jit_float32_t *)node->v.n->u.w);
150 print_flt(node->v.f);
153 print_chr(' '); print_reg(node->u.w);
155 if (node->flag & jit_flag_data)
156 print_flt(*(jit_float64_t *)node->v.n->u.w);
158 print_flt(node->v.d);
161 print_chr(' '); print_reg(node->u.w);
162 print_chr(' '); print_arg(node->v.n);
165 print_chr(' '); print_hex(node->u.w);
166 print_chr(' '); print_reg(node->v.w); return;
168 print_chr(' '); print_hex(node->u.w);
169 print_chr(' '); print_hex(node->v.w); return;
171 print_chr(' '); print_hex(node->u.w);
172 print_chr(' '); print_arg(node->v.n);
176 if (node->flag & jit_flag_data)
177 print_flt(*(jit_float32_t *)node->u.n->u.w);
179 print_flt(node->u.f);
180 print_chr(' '); print_arg(node->v.n);
184 if (node->flag & jit_flag_data)
185 print_flt(*(jit_float64_t *)node->u.n->u.w);
187 print_flt(node->u.d);
188 print_chr(' '); print_arg(node->v.n);
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;
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;
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;
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;
209 print_chr(' '); print_reg(node->u.w);
210 print_chr(' '); print_reg(node->v.w);
212 if (node->flag & jit_flag_data)
213 print_flt(*(jit_float32_t *)node->w.n->u.w);
215 print_flt(node->w.f);
218 print_chr(' '); print_reg(node->u.w);
219 print_chr(' '); print_reg(node->v.w);
221 if (node->flag & jit_flag_data)
222 print_flt(*(jit_float64_t *)node->w.n->u.w);
224 print_flt(node->w.d);
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;
232 if (!(node->flag & jit_flag_node))
233 print_ptr(node->u.p);
236 print_dec(node->u.n->v.w);
238 print_chr(' '); print_reg(node->v.w);
239 print_chr(' '); print_reg(node->w.w); return;
242 if (!(node->flag & jit_flag_node))
243 print_ptr(node->u.p);
246 print_dec(node->u.n->v.w);
248 print_chr(' '); print_reg(node->v.w);
249 print_chr(' '); print_hex(node->w.w); return;
252 if (!(node->flag & jit_flag_node))
253 print_ptr(node->u.p);
256 print_dec(node->u.n->v.w);
258 print_chr(' '); print_reg(node->v.w);
260 if (node->flag & jit_flag_data)
261 print_flt(*(jit_float32_t *)node->w.n->u.w);
263 print_flt(node->w.f);
267 if (!(node->flag & jit_flag_node))
268 print_ptr(node->u.p);
271 print_dec(node->u.n->v.w);
273 print_chr(' '); print_reg(node->v.w);
275 if (node->flag & jit_flag_data)
276 print_flt(*(jit_float64_t *)node->w.n->u.w);
278 print_flt(node->w.d);
282 if (node->v.p && _jitc->emit)
283 print_str(node->v.n->u.p);
287 if (node->v.p && _jitc->emit)
288 print_str(node->v.n->u.p);
289 if (node->v.p && _jitc->emit && node->w.w)
292 print_dec(node->w.w);
296 case jit_code_ellipsis:
297 case jit_code_prolog: case jit_code_epilog:
298 case jit_code_ret: case jit_code_prepare:
300 case jit_code_save: case jit_code_load:
305 case jit_cc_a0_reg|jit_cc_a0_chg:
306 case jit_cc_a0_reg|jit_cc_a0_jmp:
316 case jit_cc_a0_int|jit_cc_a0_arg:
318 case jit_cc_a0_reg|jit_cc_a1_reg:
320 case jit_cc_a0_reg|jit_cc_a1_int:
322 case jit_cc_a0_reg|jit_cc_a1_flt:
324 case jit_cc_a0_reg|jit_cc_a1_dbl:
326 case jit_cc_a0_reg|jit_cc_a1_arg:
328 case jit_cc_a0_int|jit_cc_a1_reg:
330 case jit_cc_a0_int|jit_cc_a1_int:
332 case jit_cc_a0_int|jit_cc_a1_arg:
334 case jit_cc_a0_flt|jit_cc_a1_arg:
336 case jit_cc_a0_dbl|jit_cc_a1_arg:
338 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_reg:
340 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_int:
342 case jit_cc_a0_reg|jit_cc_a0_rlh|
343 jit_cc_a1_reg|jit_cc_a2_reg:
345 case jit_cc_a0_reg|jit_cc_a0_rlh|
346 jit_cc_a1_reg|jit_cc_a2_int:
348 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_flt:
350 case jit_cc_a0_reg|jit_cc_a1_reg|jit_cc_a2_dbl:
352 case jit_cc_a0_int|jit_cc_a1_reg|jit_cc_a2_reg:
354 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_reg:
356 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_int:
358 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_flt:
360 case jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_dbl: