1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Imagination Technologies Ltd.
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
5*61046927SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal
6*61046927SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights
7*61046927SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*61046927SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is
9*61046927SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18*61046927SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
25*61046927SAndroid Build Coastguard Worker #include "rogue.h"
26*61046927SAndroid Build Coastguard Worker #include "util/bitscan.h"
27*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
30*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker /**
33*61046927SAndroid Build Coastguard Worker * \file rogue_print.c
34*61046927SAndroid Build Coastguard Worker *
35*61046927SAndroid Build Coastguard Worker * \brief Contains functions to print Rogue IR types and structures.
36*61046927SAndroid Build Coastguard Worker */
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker /* TODO NEXT: Go through and make types the same, i.e. decide on using ONLY
39*61046927SAndroid Build Coastguard Worker * unsigned, uint32/64_t, etc., and then use inttypes if so */
40*61046927SAndroid Build Coastguard Worker /* TODO NEXT: Make fp the last argument. */
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker enum color_esc {
43*61046927SAndroid Build Coastguard Worker ESC_RESET = 0,
44*61046927SAndroid Build Coastguard Worker ESC_BLACK,
45*61046927SAndroid Build Coastguard Worker ESC_RED,
46*61046927SAndroid Build Coastguard Worker ESC_GREEN,
47*61046927SAndroid Build Coastguard Worker ESC_YELLOW,
48*61046927SAndroid Build Coastguard Worker ESC_BLUE,
49*61046927SAndroid Build Coastguard Worker ESC_PURPLE,
50*61046927SAndroid Build Coastguard Worker ESC_CYAN,
51*61046927SAndroid Build Coastguard Worker ESC_WHITE,
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker ESC_COUNT,
54*61046927SAndroid Build Coastguard Worker };
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker static
57*61046927SAndroid Build Coastguard Worker const char *color_esc[2][ESC_COUNT] = {
58*61046927SAndroid Build Coastguard Worker [0] = {
59*61046927SAndroid Build Coastguard Worker [ESC_RESET] = "",
60*61046927SAndroid Build Coastguard Worker [ESC_BLACK] = "",
61*61046927SAndroid Build Coastguard Worker [ESC_RED] = "",
62*61046927SAndroid Build Coastguard Worker [ESC_GREEN] = "",
63*61046927SAndroid Build Coastguard Worker [ESC_YELLOW] = "",
64*61046927SAndroid Build Coastguard Worker [ESC_BLUE] = "",
65*61046927SAndroid Build Coastguard Worker [ESC_PURPLE] = "",
66*61046927SAndroid Build Coastguard Worker [ESC_CYAN] = "",
67*61046927SAndroid Build Coastguard Worker [ESC_WHITE] = "",
68*61046927SAndroid Build Coastguard Worker },
69*61046927SAndroid Build Coastguard Worker [1] = {
70*61046927SAndroid Build Coastguard Worker [ESC_RESET] = "\033[0m",
71*61046927SAndroid Build Coastguard Worker [ESC_BLACK] = "\033[0;30m",
72*61046927SAndroid Build Coastguard Worker [ESC_RED] = "\033[0;31m",
73*61046927SAndroid Build Coastguard Worker [ESC_GREEN] = "\033[0;32m",
74*61046927SAndroid Build Coastguard Worker [ESC_YELLOW] = "\033[0;33m",
75*61046927SAndroid Build Coastguard Worker [ESC_BLUE] = "\033[0;34m",
76*61046927SAndroid Build Coastguard Worker [ESC_PURPLE] = "\033[0;35m",
77*61046927SAndroid Build Coastguard Worker [ESC_CYAN] = "\033[0;36m",
78*61046927SAndroid Build Coastguard Worker [ESC_WHITE] = "\033[0;37m",
79*61046927SAndroid Build Coastguard Worker },
80*61046927SAndroid Build Coastguard Worker };
81*61046927SAndroid Build Coastguard Worker
RESET(FILE * fp)82*61046927SAndroid Build Coastguard Worker static inline void RESET(FILE *fp)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_RESET], fp);
85*61046927SAndroid Build Coastguard Worker }
86*61046927SAndroid Build Coastguard Worker
BLACK(FILE * fp)87*61046927SAndroid Build Coastguard Worker static inline void BLACK(FILE *fp)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_BLACK], fp);
90*61046927SAndroid Build Coastguard Worker }
91*61046927SAndroid Build Coastguard Worker
RED(FILE * fp)92*61046927SAndroid Build Coastguard Worker static inline void RED(FILE *fp)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_RED], fp);
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker
GREEN(FILE * fp)97*61046927SAndroid Build Coastguard Worker static inline void GREEN(FILE *fp)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_GREEN], fp);
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker
YELLOW(FILE * fp)102*61046927SAndroid Build Coastguard Worker static inline void YELLOW(FILE *fp)
103*61046927SAndroid Build Coastguard Worker {
104*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_YELLOW], fp);
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker
BLUE(FILE * fp)107*61046927SAndroid Build Coastguard Worker static inline void BLUE(FILE *fp)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_BLUE], fp);
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker
PURPLE(FILE * fp)112*61046927SAndroid Build Coastguard Worker static inline void PURPLE(FILE *fp)
113*61046927SAndroid Build Coastguard Worker {
114*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_PURPLE], fp);
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker
CYAN(FILE * fp)117*61046927SAndroid Build Coastguard Worker static inline void CYAN(FILE *fp)
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_CYAN], fp);
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker
WHITE(FILE * fp)122*61046927SAndroid Build Coastguard Worker static inline void WHITE(FILE *fp)
123*61046927SAndroid Build Coastguard Worker {
124*61046927SAndroid Build Coastguard Worker fputs(color_esc[rogue_color][ESC_WHITE], fp);
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker
rogue_print_val(FILE * fp,unsigned val)127*61046927SAndroid Build Coastguard Worker static inline void rogue_print_val(FILE *fp, unsigned val)
128*61046927SAndroid Build Coastguard Worker {
129*61046927SAndroid Build Coastguard Worker PURPLE(fp);
130*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", val);
131*61046927SAndroid Build Coastguard Worker RESET(fp);
132*61046927SAndroid Build Coastguard Worker }
133*61046927SAndroid Build Coastguard Worker
rogue_print_reg(FILE * fp,const rogue_reg * reg)134*61046927SAndroid Build Coastguard Worker static inline void rogue_print_reg(FILE *fp, const rogue_reg *reg)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker const rogue_reg_info *info = &rogue_reg_infos[reg->class];
137*61046927SAndroid Build Coastguard Worker YELLOW(fp);
138*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s%" PRIu32, info->str, reg->index);
139*61046927SAndroid Build Coastguard Worker RESET(fp);
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker
rogue_print_regarray(FILE * fp,const rogue_regarray * regarray)142*61046927SAndroid Build Coastguard Worker static inline void rogue_print_regarray(FILE *fp,
143*61046927SAndroid Build Coastguard Worker const rogue_regarray *regarray)
144*61046927SAndroid Build Coastguard Worker {
145*61046927SAndroid Build Coastguard Worker const rogue_reg *reg = regarray->regs[0];
146*61046927SAndroid Build Coastguard Worker const rogue_reg_info *info = &rogue_reg_infos[reg->class];
147*61046927SAndroid Build Coastguard Worker YELLOW(fp);
148*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s[%" PRIu32, info->str, reg->index);
149*61046927SAndroid Build Coastguard Worker if (regarray->size > 1) {
150*61046927SAndroid Build Coastguard Worker RESET(fp);
151*61046927SAndroid Build Coastguard Worker fputs("..", fp);
152*61046927SAndroid Build Coastguard Worker YELLOW(fp);
153*61046927SAndroid Build Coastguard Worker fprintf(fp, "%" PRIu32, regarray->size + reg->index - 1);
154*61046927SAndroid Build Coastguard Worker }
155*61046927SAndroid Build Coastguard Worker fputs("]", fp);
156*61046927SAndroid Build Coastguard Worker RESET(fp);
157*61046927SAndroid Build Coastguard Worker }
158*61046927SAndroid Build Coastguard Worker
rogue_print_imm(FILE * fp,const rogue_imm * imm)159*61046927SAndroid Build Coastguard Worker static inline void rogue_print_imm(FILE *fp, const rogue_imm *imm)
160*61046927SAndroid Build Coastguard Worker {
161*61046927SAndroid Build Coastguard Worker PURPLE(fp);
162*61046927SAndroid Build Coastguard Worker fprintf(fp, "0x%" PRIx32, imm->imm.u32);
163*61046927SAndroid Build Coastguard Worker RESET(fp);
164*61046927SAndroid Build Coastguard Worker }
165*61046927SAndroid Build Coastguard Worker
rogue_print_io(FILE * fp,enum rogue_io io)166*61046927SAndroid Build Coastguard Worker static inline void rogue_print_io(FILE *fp, enum rogue_io io)
167*61046927SAndroid Build Coastguard Worker {
168*61046927SAndroid Build Coastguard Worker const rogue_io_info *info = &rogue_io_infos[io];
169*61046927SAndroid Build Coastguard Worker BLUE(fp);
170*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", info->str);
171*61046927SAndroid Build Coastguard Worker RESET(fp);
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker
rogue_print_drc(FILE * fp,const rogue_drc * drc)174*61046927SAndroid Build Coastguard Worker static inline void rogue_print_drc(FILE *fp, const rogue_drc *drc)
175*61046927SAndroid Build Coastguard Worker {
176*61046927SAndroid Build Coastguard Worker RED(fp);
177*61046927SAndroid Build Coastguard Worker fprintf(fp, "drc%u", drc->index);
178*61046927SAndroid Build Coastguard Worker RESET(fp);
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker
rogue_print_ref(FILE * fp,const rogue_ref * ref)181*61046927SAndroid Build Coastguard Worker static inline void rogue_print_ref(FILE *fp, const rogue_ref *ref)
182*61046927SAndroid Build Coastguard Worker {
183*61046927SAndroid Build Coastguard Worker switch (ref->type) {
184*61046927SAndroid Build Coastguard Worker case ROGUE_REF_TYPE_VAL:
185*61046927SAndroid Build Coastguard Worker rogue_print_val(fp, ref->val);
186*61046927SAndroid Build Coastguard Worker break;
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker case ROGUE_REF_TYPE_REG:
189*61046927SAndroid Build Coastguard Worker rogue_print_reg(fp, ref->reg);
190*61046927SAndroid Build Coastguard Worker break;
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker case ROGUE_REF_TYPE_REGARRAY:
193*61046927SAndroid Build Coastguard Worker rogue_print_regarray(fp, ref->regarray);
194*61046927SAndroid Build Coastguard Worker break;
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker case ROGUE_REF_TYPE_IMM:
197*61046927SAndroid Build Coastguard Worker rogue_print_imm(fp, &ref->imm);
198*61046927SAndroid Build Coastguard Worker break;
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker case ROGUE_REF_TYPE_IO:
201*61046927SAndroid Build Coastguard Worker rogue_print_io(fp, ref->io);
202*61046927SAndroid Build Coastguard Worker break;
203*61046927SAndroid Build Coastguard Worker
204*61046927SAndroid Build Coastguard Worker case ROGUE_REF_TYPE_DRC:
205*61046927SAndroid Build Coastguard Worker rogue_print_drc(fp, &ref->drc);
206*61046927SAndroid Build Coastguard Worker break;
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker default:
209*61046927SAndroid Build Coastguard Worker unreachable("Unsupported ref type.");
210*61046927SAndroid Build Coastguard Worker }
211*61046927SAndroid Build Coastguard Worker }
212*61046927SAndroid Build Coastguard Worker
rogue_print_alu_dst(FILE * fp,const rogue_instr_dst * dst)213*61046927SAndroid Build Coastguard Worker static inline void rogue_print_alu_dst(FILE *fp, const rogue_instr_dst *dst)
214*61046927SAndroid Build Coastguard Worker {
215*61046927SAndroid Build Coastguard Worker rogue_print_ref(fp, &dst->ref);
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker uint64_t mod = dst->mod;
218*61046927SAndroid Build Coastguard Worker while (mod) {
219*61046927SAndroid Build Coastguard Worker enum rogue_alu_dst_mod dst_mod = u_bit_scan64(&mod);
220*61046927SAndroid Build Coastguard Worker assert(dst_mod < ROGUE_ALU_DST_MOD_COUNT);
221*61046927SAndroid Build Coastguard Worker fprintf(fp, ".%s", rogue_alu_dst_mod_infos[dst_mod].str);
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker }
224*61046927SAndroid Build Coastguard Worker
rogue_print_alu_src(FILE * fp,const rogue_instr_src * src)225*61046927SAndroid Build Coastguard Worker static inline void rogue_print_alu_src(FILE *fp, const rogue_instr_src *src)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker rogue_print_ref(fp, &src->ref);
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker uint64_t mod = src->mod;
230*61046927SAndroid Build Coastguard Worker while (mod) {
231*61046927SAndroid Build Coastguard Worker enum rogue_alu_src_mod src_mod = u_bit_scan64(&mod);
232*61046927SAndroid Build Coastguard Worker assert(src_mod < ROGUE_ALU_SRC_MOD_COUNT);
233*61046927SAndroid Build Coastguard Worker fprintf(fp, ".%s", rogue_alu_src_mod_infos[src_mod].str);
234*61046927SAndroid Build Coastguard Worker }
235*61046927SAndroid Build Coastguard Worker }
236*61046927SAndroid Build Coastguard Worker
rogue_print_alu_mods(FILE * fp,const rogue_alu_instr * alu)237*61046927SAndroid Build Coastguard Worker static inline void rogue_print_alu_mods(FILE *fp, const rogue_alu_instr *alu)
238*61046927SAndroid Build Coastguard Worker {
239*61046927SAndroid Build Coastguard Worker uint64_t mod = alu->mod;
240*61046927SAndroid Build Coastguard Worker while (mod) {
241*61046927SAndroid Build Coastguard Worker enum rogue_alu_op_mod op_mod = u_bit_scan64(&mod);
242*61046927SAndroid Build Coastguard Worker assert(op_mod < ROGUE_ALU_OP_MOD_COUNT);
243*61046927SAndroid Build Coastguard Worker fprintf(fp, ".%s", rogue_alu_op_mod_infos[op_mod].str);
244*61046927SAndroid Build Coastguard Worker }
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker
rogue_print_alu_instr(FILE * fp,const rogue_alu_instr * alu)247*61046927SAndroid Build Coastguard Worker static inline void rogue_print_alu_instr(FILE *fp, const rogue_alu_instr *alu)
248*61046927SAndroid Build Coastguard Worker {
249*61046927SAndroid Build Coastguard Worker const rogue_alu_op_info *info = &rogue_alu_op_infos[alu->op];
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker /* TODO: Print conditional info once supported. */
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", info->str);
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Worker rogue_print_alu_mods(fp, alu);
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_dsts; ++i) {
258*61046927SAndroid Build Coastguard Worker if (i > 0)
259*61046927SAndroid Build Coastguard Worker fputs(",", fp);
260*61046927SAndroid Build Coastguard Worker
261*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker rogue_print_alu_dst(fp, &alu->dst[i]);
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_srcs; ++i) {
267*61046927SAndroid Build Coastguard Worker if (i == 0 && !info->num_dsts)
268*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
269*61046927SAndroid Build Coastguard Worker else
270*61046927SAndroid Build Coastguard Worker fputs(", ", fp);
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker rogue_print_alu_src(fp, &alu->src[i]);
273*61046927SAndroid Build Coastguard Worker }
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
rogue_print_block_label(FILE * fp,const rogue_block * block)276*61046927SAndroid Build Coastguard Worker static inline void rogue_print_block_label(FILE *fp, const rogue_block *block)
277*61046927SAndroid Build Coastguard Worker {
278*61046927SAndroid Build Coastguard Worker /* For debug purposes. */
279*61046927SAndroid Build Coastguard Worker if (block->label)
280*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", block->label);
281*61046927SAndroid Build Coastguard Worker else
282*61046927SAndroid Build Coastguard Worker fprintf(fp, "block%u", block->index);
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
rogue_print_backend_dst(FILE * fp,const rogue_instr_dst * dst)285*61046927SAndroid Build Coastguard Worker static inline void rogue_print_backend_dst(FILE *fp, const rogue_instr_dst *dst)
286*61046927SAndroid Build Coastguard Worker {
287*61046927SAndroid Build Coastguard Worker rogue_print_ref(fp, &dst->ref);
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker
rogue_print_backend_src(FILE * fp,const rogue_instr_src * src)290*61046927SAndroid Build Coastguard Worker static inline void rogue_print_backend_src(FILE *fp, const rogue_instr_src *src)
291*61046927SAndroid Build Coastguard Worker {
292*61046927SAndroid Build Coastguard Worker rogue_print_ref(fp, &src->ref);
293*61046927SAndroid Build Coastguard Worker }
294*61046927SAndroid Build Coastguard Worker
rogue_print_backend_mods(FILE * fp,const rogue_backend_instr * backend)295*61046927SAndroid Build Coastguard Worker static inline void rogue_print_backend_mods(FILE *fp,
296*61046927SAndroid Build Coastguard Worker const rogue_backend_instr *backend)
297*61046927SAndroid Build Coastguard Worker {
298*61046927SAndroid Build Coastguard Worker uint64_t mod = backend->mod;
299*61046927SAndroid Build Coastguard Worker while (mod) {
300*61046927SAndroid Build Coastguard Worker enum rogue_backend_op_mod op_mod = u_bit_scan64(&mod);
301*61046927SAndroid Build Coastguard Worker assert(op_mod < ROGUE_BACKEND_OP_MOD_COUNT);
302*61046927SAndroid Build Coastguard Worker fprintf(fp, ".%s", rogue_backend_op_mod_infos[op_mod].str);
303*61046927SAndroid Build Coastguard Worker }
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker
rogue_print_backend_instr(FILE * fp,const rogue_backend_instr * backend)306*61046927SAndroid Build Coastguard Worker static inline void rogue_print_backend_instr(FILE *fp,
307*61046927SAndroid Build Coastguard Worker const rogue_backend_instr *backend)
308*61046927SAndroid Build Coastguard Worker {
309*61046927SAndroid Build Coastguard Worker const rogue_backend_op_info *info = &rogue_backend_op_infos[backend->op];
310*61046927SAndroid Build Coastguard Worker
311*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", info->str);
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker rogue_print_backend_mods(fp, backend);
314*61046927SAndroid Build Coastguard Worker
315*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_dsts; ++i) {
316*61046927SAndroid Build Coastguard Worker if (i > 0)
317*61046927SAndroid Build Coastguard Worker fputs(",", fp);
318*61046927SAndroid Build Coastguard Worker
319*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
320*61046927SAndroid Build Coastguard Worker
321*61046927SAndroid Build Coastguard Worker rogue_print_backend_dst(fp, &backend->dst[i]);
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_srcs; ++i) {
325*61046927SAndroid Build Coastguard Worker if (i == 0 && !info->num_dsts)
326*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
327*61046927SAndroid Build Coastguard Worker else
328*61046927SAndroid Build Coastguard Worker fputs(", ", fp);
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker rogue_print_backend_src(fp, &backend->src[i]);
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker }
333*61046927SAndroid Build Coastguard Worker
rogue_print_ctrl_mods(FILE * fp,const rogue_ctrl_instr * ctrl)334*61046927SAndroid Build Coastguard Worker static inline void rogue_print_ctrl_mods(FILE *fp, const rogue_ctrl_instr *ctrl)
335*61046927SAndroid Build Coastguard Worker {
336*61046927SAndroid Build Coastguard Worker uint64_t mod = ctrl->mod;
337*61046927SAndroid Build Coastguard Worker while (mod) {
338*61046927SAndroid Build Coastguard Worker enum rogue_ctrl_op_mod op_mod = u_bit_scan64(&mod);
339*61046927SAndroid Build Coastguard Worker assert(op_mod < ROGUE_CTRL_OP_MOD_COUNT);
340*61046927SAndroid Build Coastguard Worker fprintf(fp, ".%s", rogue_ctrl_op_mod_infos[op_mod].str);
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker }
343*61046927SAndroid Build Coastguard Worker
rogue_print_ctrl_src(FILE * fp,const rogue_instr_src * src)344*61046927SAndroid Build Coastguard Worker static inline void rogue_print_ctrl_src(FILE *fp, const rogue_instr_src *src)
345*61046927SAndroid Build Coastguard Worker {
346*61046927SAndroid Build Coastguard Worker rogue_print_ref(fp, &src->ref);
347*61046927SAndroid Build Coastguard Worker }
348*61046927SAndroid Build Coastguard Worker
rogue_print_ctrl_instr(FILE * fp,const rogue_ctrl_instr * ctrl)349*61046927SAndroid Build Coastguard Worker static inline void rogue_print_ctrl_instr(FILE *fp,
350*61046927SAndroid Build Coastguard Worker const rogue_ctrl_instr *ctrl)
351*61046927SAndroid Build Coastguard Worker {
352*61046927SAndroid Build Coastguard Worker const rogue_ctrl_op_info *info = &rogue_ctrl_op_infos[ctrl->op];
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker /* TODO: Print conditional info once supported. */
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", info->str);
357*61046927SAndroid Build Coastguard Worker
358*61046927SAndroid Build Coastguard Worker rogue_print_ctrl_mods(fp, ctrl);
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker if (ctrl->target_block) {
361*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
362*61046927SAndroid Build Coastguard Worker rogue_print_block_label(fp, ctrl->target_block);
363*61046927SAndroid Build Coastguard Worker }
364*61046927SAndroid Build Coastguard Worker
365*61046927SAndroid Build Coastguard Worker /* TODO NEXT: Dests. */
366*61046927SAndroid Build Coastguard Worker /* TODO: Special case for the conditional ctrl instructions as they're
367*61046927SAndroid Build Coastguard Worker * printed as source 0, then dest, then rest of the sources. */
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_srcs; ++i) {
370*61046927SAndroid Build Coastguard Worker if (i == 0 && !info->num_dsts)
371*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
372*61046927SAndroid Build Coastguard Worker else
373*61046927SAndroid Build Coastguard Worker fputs(", ", fp);
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker rogue_print_ctrl_src(fp, &ctrl->src[i]);
376*61046927SAndroid Build Coastguard Worker }
377*61046927SAndroid Build Coastguard Worker }
378*61046927SAndroid Build Coastguard Worker
rogue_print_bitwise_dst(FILE * fp,const rogue_instr_dst * dst)379*61046927SAndroid Build Coastguard Worker static inline void rogue_print_bitwise_dst(FILE *fp, const rogue_instr_dst *dst)
380*61046927SAndroid Build Coastguard Worker {
381*61046927SAndroid Build Coastguard Worker rogue_print_ref(fp, &dst->ref);
382*61046927SAndroid Build Coastguard Worker }
383*61046927SAndroid Build Coastguard Worker
rogue_print_bitwise_src(FILE * fp,const rogue_instr_src * src)384*61046927SAndroid Build Coastguard Worker static inline void rogue_print_bitwise_src(FILE *fp, const rogue_instr_src *src)
385*61046927SAndroid Build Coastguard Worker {
386*61046927SAndroid Build Coastguard Worker rogue_print_ref(fp, &src->ref);
387*61046927SAndroid Build Coastguard Worker }
388*61046927SAndroid Build Coastguard Worker
rogue_print_bitwise_instr(FILE * fp,const rogue_bitwise_instr * bitwise)389*61046927SAndroid Build Coastguard Worker static inline void rogue_print_bitwise_instr(FILE *fp,
390*61046927SAndroid Build Coastguard Worker const rogue_bitwise_instr *bitwise)
391*61046927SAndroid Build Coastguard Worker {
392*61046927SAndroid Build Coastguard Worker const rogue_bitwise_op_info *info = &rogue_bitwise_op_infos[bitwise->op];
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", info->str);
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard Worker /* rogue_print_bitwise_mods(fp, bitwise); */
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_dsts; ++i) {
399*61046927SAndroid Build Coastguard Worker if (i > 0)
400*61046927SAndroid Build Coastguard Worker fputs(",", fp);
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker rogue_print_bitwise_dst(fp, &bitwise->dst[i]);
405*61046927SAndroid Build Coastguard Worker }
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < info->num_srcs; ++i) {
408*61046927SAndroid Build Coastguard Worker if (i == 0 && !info->num_dsts)
409*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
410*61046927SAndroid Build Coastguard Worker else
411*61046927SAndroid Build Coastguard Worker fputs(", ", fp);
412*61046927SAndroid Build Coastguard Worker
413*61046927SAndroid Build Coastguard Worker rogue_print_bitwise_src(fp, &bitwise->src[i]);
414*61046927SAndroid Build Coastguard Worker }
415*61046927SAndroid Build Coastguard Worker }
416*61046927SAndroid Build Coastguard Worker
417*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_print_instr(FILE * fp,const rogue_instr * instr)418*61046927SAndroid Build Coastguard Worker void rogue_print_instr(FILE *fp, const rogue_instr *instr)
419*61046927SAndroid Build Coastguard Worker {
420*61046927SAndroid Build Coastguard Worker if (instr->exec_cond > ROGUE_EXEC_COND_PE_TRUE)
421*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s ", rogue_exec_cond_str[instr->exec_cond]);
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker if (instr->repeat > 1)
424*61046927SAndroid Build Coastguard Worker fprintf(fp, "(rpt%u) ", instr->repeat);
425*61046927SAndroid Build Coastguard Worker
426*61046927SAndroid Build Coastguard Worker GREEN(fp);
427*61046927SAndroid Build Coastguard Worker switch (instr->type) {
428*61046927SAndroid Build Coastguard Worker case ROGUE_INSTR_TYPE_ALU:
429*61046927SAndroid Build Coastguard Worker rogue_print_alu_instr(fp, rogue_instr_as_alu(instr));
430*61046927SAndroid Build Coastguard Worker break;
431*61046927SAndroid Build Coastguard Worker
432*61046927SAndroid Build Coastguard Worker case ROGUE_INSTR_TYPE_BACKEND:
433*61046927SAndroid Build Coastguard Worker rogue_print_backend_instr(fp, rogue_instr_as_backend(instr));
434*61046927SAndroid Build Coastguard Worker break;
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker case ROGUE_INSTR_TYPE_CTRL:
437*61046927SAndroid Build Coastguard Worker rogue_print_ctrl_instr(fp, rogue_instr_as_ctrl(instr));
438*61046927SAndroid Build Coastguard Worker break;
439*61046927SAndroid Build Coastguard Worker
440*61046927SAndroid Build Coastguard Worker case ROGUE_INSTR_TYPE_BITWISE:
441*61046927SAndroid Build Coastguard Worker rogue_print_bitwise_instr(fp, rogue_instr_as_bitwise(instr));
442*61046927SAndroid Build Coastguard Worker break;
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker default:
445*61046927SAndroid Build Coastguard Worker unreachable("Unsupported instruction type.");
446*61046927SAndroid Build Coastguard Worker }
447*61046927SAndroid Build Coastguard Worker RESET(fp);
448*61046927SAndroid Build Coastguard Worker
449*61046927SAndroid Build Coastguard Worker if (instr->end)
450*61046927SAndroid Build Coastguard Worker fputs(" {end}", fp);
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Worker /* For debug purposes. */
453*61046927SAndroid Build Coastguard Worker fputs(";", fp);
454*61046927SAndroid Build Coastguard Worker
455*61046927SAndroid Build Coastguard Worker if (instr->comment)
456*61046927SAndroid Build Coastguard Worker fprintf(fp, " /* %s */", instr->comment);
457*61046927SAndroid Build Coastguard Worker }
458*61046927SAndroid Build Coastguard Worker
459*61046927SAndroid Build Coastguard Worker /* TODO NEXT: Split this up into separate functions for printing lower srcs,
460*61046927SAndroid Build Coastguard Worker * upper srcs, etc. since we'd want to print them in-between instructions. */
461*61046927SAndroid Build Coastguard Worker /* TODO NEXT: Commonise with printing the ref io stuff. */
462*61046927SAndroid Build Coastguard Worker static inline void
rogue_print_instr_group_io_sel(FILE * fp,const rogue_instr_group_io_sel * io_sel)463*61046927SAndroid Build Coastguard Worker rogue_print_instr_group_io_sel(FILE *fp, const rogue_instr_group_io_sel *io_sel)
464*61046927SAndroid Build Coastguard Worker {
465*61046927SAndroid Build Coastguard Worker bool present = false;
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
468*61046927SAndroid Build Coastguard Worker
469*61046927SAndroid Build Coastguard Worker /* TODO NEXT: Commonise this code!! */
470*61046927SAndroid Build Coastguard Worker /* Print upper and lower sources. */
471*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(io_sel->srcs); ++i) {
472*61046927SAndroid Build Coastguard Worker if (rogue_ref_is_null(&io_sel->srcs[i]))
473*61046927SAndroid Build Coastguard Worker continue;
474*61046927SAndroid Build Coastguard Worker
475*61046927SAndroid Build Coastguard Worker if (present && i > 0)
476*61046927SAndroid Build Coastguard Worker fputs(", ", fp);
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker present = true;
479*61046927SAndroid Build Coastguard Worker
480*61046927SAndroid Build Coastguard Worker rogue_print_io(fp, ROGUE_IO_S0 + i);
481*61046927SAndroid Build Coastguard Worker fputs("=", fp);
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker if (rogue_ref_is_reg(&io_sel->srcs[i]))
484*61046927SAndroid Build Coastguard Worker rogue_print_reg(fp, io_sel->srcs[i].reg);
485*61046927SAndroid Build Coastguard Worker else if (rogue_ref_is_regarray(&io_sel->srcs[i]))
486*61046927SAndroid Build Coastguard Worker rogue_print_regarray(fp, io_sel->srcs[i].regarray);
487*61046927SAndroid Build Coastguard Worker else if (rogue_ref_is_io(&io_sel->srcs[i]))
488*61046927SAndroid Build Coastguard Worker rogue_print_io(fp, io_sel->srcs[i].io);
489*61046927SAndroid Build Coastguard Worker else
490*61046927SAndroid Build Coastguard Worker unreachable("Unsupported src map.");
491*61046927SAndroid Build Coastguard Worker }
492*61046927SAndroid Build Coastguard Worker if (present)
493*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker /* Print internal sources. */
496*61046927SAndroid Build Coastguard Worker present = false;
497*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(io_sel->iss); ++i) {
498*61046927SAndroid Build Coastguard Worker if (rogue_ref_is_null(&io_sel->iss[i]))
499*61046927SAndroid Build Coastguard Worker continue;
500*61046927SAndroid Build Coastguard Worker
501*61046927SAndroid Build Coastguard Worker if (present && i > 0)
502*61046927SAndroid Build Coastguard Worker fputs(", ", fp);
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker present = true;
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker rogue_print_io(fp, ROGUE_IO_IS0 + i);
507*61046927SAndroid Build Coastguard Worker fputs("=", fp);
508*61046927SAndroid Build Coastguard Worker
509*61046927SAndroid Build Coastguard Worker if (rogue_ref_is_reg(&io_sel->iss[i]))
510*61046927SAndroid Build Coastguard Worker rogue_print_reg(fp, io_sel->iss[i].reg);
511*61046927SAndroid Build Coastguard Worker else if (rogue_ref_is_regarray(&io_sel->iss[i]))
512*61046927SAndroid Build Coastguard Worker rogue_print_regarray(fp, io_sel->iss[i].regarray);
513*61046927SAndroid Build Coastguard Worker else if (rogue_ref_is_io(&io_sel->iss[i]))
514*61046927SAndroid Build Coastguard Worker rogue_print_io(fp, io_sel->iss[i].io);
515*61046927SAndroid Build Coastguard Worker else
516*61046927SAndroid Build Coastguard Worker unreachable("Unsupported iss map.");
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker if (present)
519*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
520*61046927SAndroid Build Coastguard Worker
521*61046927SAndroid Build Coastguard Worker /* Print destinations. */
522*61046927SAndroid Build Coastguard Worker present = false;
523*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(io_sel->dsts); ++i) {
524*61046927SAndroid Build Coastguard Worker if (rogue_ref_is_null(&io_sel->dsts[i]))
525*61046927SAndroid Build Coastguard Worker continue;
526*61046927SAndroid Build Coastguard Worker
527*61046927SAndroid Build Coastguard Worker if (present && i > 0)
528*61046927SAndroid Build Coastguard Worker fputs(", ", fp);
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker present = true;
531*61046927SAndroid Build Coastguard Worker
532*61046927SAndroid Build Coastguard Worker rogue_print_io(fp, ROGUE_IO_W0 + i);
533*61046927SAndroid Build Coastguard Worker fputs("=", fp);
534*61046927SAndroid Build Coastguard Worker
535*61046927SAndroid Build Coastguard Worker if (rogue_ref_is_reg(&io_sel->dsts[i]))
536*61046927SAndroid Build Coastguard Worker rogue_print_reg(fp, io_sel->dsts[i].reg);
537*61046927SAndroid Build Coastguard Worker else if (rogue_ref_is_regarray(&io_sel->dsts[i]))
538*61046927SAndroid Build Coastguard Worker rogue_print_regarray(fp, io_sel->dsts[i].regarray);
539*61046927SAndroid Build Coastguard Worker else if (rogue_ref_is_io(&io_sel->dsts[i]))
540*61046927SAndroid Build Coastguard Worker rogue_print_io(fp, io_sel->dsts[i].io);
541*61046927SAndroid Build Coastguard Worker else
542*61046927SAndroid Build Coastguard Worker unreachable("Unsupported dst map.");
543*61046927SAndroid Build Coastguard Worker }
544*61046927SAndroid Build Coastguard Worker if (present)
545*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
546*61046927SAndroid Build Coastguard Worker }
547*61046927SAndroid Build Coastguard Worker
rogue_print_instr_phase(FILE * fp,enum rogue_alu alu,enum rogue_instr_phase phase)548*61046927SAndroid Build Coastguard Worker static inline void rogue_print_instr_phase(FILE *fp,
549*61046927SAndroid Build Coastguard Worker enum rogue_alu alu,
550*61046927SAndroid Build Coastguard Worker enum rogue_instr_phase phase)
551*61046927SAndroid Build Coastguard Worker {
552*61046927SAndroid Build Coastguard Worker const char *phase_str = rogue_instr_phase_str[alu][phase];
553*61046927SAndroid Build Coastguard Worker assert(phase_str);
554*61046927SAndroid Build Coastguard Worker fputs(phase_str, fp);
555*61046927SAndroid Build Coastguard Worker }
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Worker static inline void
rogue_print_instr_group_header(FILE * fp,const rogue_instr_group * group)558*61046927SAndroid Build Coastguard Worker rogue_print_instr_group_header(FILE *fp, const rogue_instr_group *group)
559*61046927SAndroid Build Coastguard Worker {
560*61046927SAndroid Build Coastguard Worker /* ALU specific */
561*61046927SAndroid Build Coastguard Worker switch (group->header.alu) {
562*61046927SAndroid Build Coastguard Worker case ROGUE_ALU_MAIN:
563*61046927SAndroid Build Coastguard Worker break;
564*61046927SAndroid Build Coastguard Worker
565*61046927SAndroid Build Coastguard Worker case ROGUE_ALU_BITWISE:
566*61046927SAndroid Build Coastguard Worker break;
567*61046927SAndroid Build Coastguard Worker
568*61046927SAndroid Build Coastguard Worker case ROGUE_ALU_CONTROL:
569*61046927SAndroid Build Coastguard Worker break;
570*61046927SAndroid Build Coastguard Worker
571*61046927SAndroid Build Coastguard Worker default:
572*61046927SAndroid Build Coastguard Worker unreachable("Unsupported instruction group ALU.");
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker
575*61046927SAndroid Build Coastguard Worker if (group->header.end)
576*61046927SAndroid Build Coastguard Worker fputs(".end", fp);
577*61046927SAndroid Build Coastguard Worker }
578*61046927SAndroid Build Coastguard Worker
rogue_print_instr_group(FILE * fp,const rogue_instr_group * group)579*61046927SAndroid Build Coastguard Worker static inline void rogue_print_instr_group(FILE *fp,
580*61046927SAndroid Build Coastguard Worker const rogue_instr_group *group)
581*61046927SAndroid Build Coastguard Worker {
582*61046927SAndroid Build Coastguard Worker /* For debug purposes. */
583*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", group->index);
584*61046927SAndroid Build Coastguard Worker fputs(": ", fp);
585*61046927SAndroid Build Coastguard Worker
586*61046927SAndroid Build Coastguard Worker if (group->header.exec_cond > ROGUE_EXEC_COND_PE_TRUE)
587*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s ", rogue_exec_cond_str[group->header.exec_cond]);
588*61046927SAndroid Build Coastguard Worker
589*61046927SAndroid Build Coastguard Worker if (group->header.repeat > 1)
590*61046927SAndroid Build Coastguard Worker fprintf(fp, "(rpt%u) ", group->header.repeat);
591*61046927SAndroid Build Coastguard Worker
592*61046927SAndroid Build Coastguard Worker fputs("{ ", fp);
593*61046927SAndroid Build Coastguard Worker
594*61046927SAndroid Build Coastguard Worker CYAN(fp);
595*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", rogue_alu_str[group->header.alu]);
596*61046927SAndroid Build Coastguard Worker RESET(fp);
597*61046927SAndroid Build Coastguard Worker
598*61046927SAndroid Build Coastguard Worker /* Print each instruction. */
599*61046927SAndroid Build Coastguard Worker rogue_foreach_phase_in_set (p, group->header.phases) {
600*61046927SAndroid Build Coastguard Worker const rogue_instr *instr = group->instrs[p];
601*61046927SAndroid Build Coastguard Worker assert(instr);
602*61046927SAndroid Build Coastguard Worker
603*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
604*61046927SAndroid Build Coastguard Worker rogue_print_instr_phase(fp, group->header.alu, p);
605*61046927SAndroid Build Coastguard Worker fputs(": ", fp);
606*61046927SAndroid Build Coastguard Worker rogue_print_instr(fp, instr);
607*61046927SAndroid Build Coastguard Worker }
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker /* Print source/dest mappings (if present). */
610*61046927SAndroid Build Coastguard Worker rogue_print_instr_group_io_sel(fp, &group->io_sel);
611*61046927SAndroid Build Coastguard Worker
612*61046927SAndroid Build Coastguard Worker fputs("}", fp);
613*61046927SAndroid Build Coastguard Worker
614*61046927SAndroid Build Coastguard Worker /* Print group header info. */
615*61046927SAndroid Build Coastguard Worker rogue_print_instr_group_header(fp, group);
616*61046927SAndroid Build Coastguard Worker }
617*61046927SAndroid Build Coastguard Worker
rogue_print_block(FILE * fp,const rogue_block * block)618*61046927SAndroid Build Coastguard Worker static inline void rogue_print_block(FILE *fp, const rogue_block *block)
619*61046927SAndroid Build Coastguard Worker {
620*61046927SAndroid Build Coastguard Worker rogue_print_block_label(fp, block);
621*61046927SAndroid Build Coastguard Worker fputs(":\n", fp);
622*61046927SAndroid Build Coastguard Worker
623*61046927SAndroid Build Coastguard Worker if (!block->shader->is_grouped) {
624*61046927SAndroid Build Coastguard Worker rogue_foreach_instr_in_block (instr, block) {
625*61046927SAndroid Build Coastguard Worker fputs("\t", fp);
626*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", instr->index);
627*61046927SAndroid Build Coastguard Worker fputs(": ", fp);
628*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s: ", rogue_instr_type_str[instr->type]);
629*61046927SAndroid Build Coastguard Worker rogue_print_instr(fp, instr);
630*61046927SAndroid Build Coastguard Worker fputs("\n", fp);
631*61046927SAndroid Build Coastguard Worker }
632*61046927SAndroid Build Coastguard Worker } else {
633*61046927SAndroid Build Coastguard Worker rogue_foreach_instr_group_in_block (group, block) {
634*61046927SAndroid Build Coastguard Worker fputs("\t", fp);
635*61046927SAndroid Build Coastguard Worker rogue_print_instr_group(fp, group);
636*61046927SAndroid Build Coastguard Worker fputs("\n", fp);
637*61046927SAndroid Build Coastguard Worker }
638*61046927SAndroid Build Coastguard Worker }
639*61046927SAndroid Build Coastguard Worker }
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_print_shader(FILE * fp,const rogue_shader * shader)642*61046927SAndroid Build Coastguard Worker void rogue_print_shader(FILE *fp, const rogue_shader *shader)
643*61046927SAndroid Build Coastguard Worker {
644*61046927SAndroid Build Coastguard Worker fputs("/*", fp);
645*61046927SAndroid Build Coastguard Worker
646*61046927SAndroid Build Coastguard Worker if (shader->stage == MESA_SHADER_NONE)
647*61046927SAndroid Build Coastguard Worker fputs(" USC program", fp);
648*61046927SAndroid Build Coastguard Worker else
649*61046927SAndroid Build Coastguard Worker fprintf(fp, " %s shader", _mesa_shader_stage_to_string(shader->stage));
650*61046927SAndroid Build Coastguard Worker
651*61046927SAndroid Build Coastguard Worker if (shader->name)
652*61046927SAndroid Build Coastguard Worker fprintf(fp, " - %s", shader->name);
653*61046927SAndroid Build Coastguard Worker
654*61046927SAndroid Build Coastguard Worker fputs(" */\n", fp);
655*61046927SAndroid Build Coastguard Worker
656*61046927SAndroid Build Coastguard Worker rogue_foreach_block (block, shader)
657*61046927SAndroid Build Coastguard Worker rogue_print_block(fp, block);
658*61046927SAndroid Build Coastguard Worker }
659*61046927SAndroid Build Coastguard Worker
rogue_print_instr_ref(FILE * fp,const rogue_instr * instr,bool dst,unsigned index,bool is_grouped)660*61046927SAndroid Build Coastguard Worker static void rogue_print_instr_ref(FILE *fp,
661*61046927SAndroid Build Coastguard Worker const rogue_instr *instr,
662*61046927SAndroid Build Coastguard Worker bool dst,
663*61046927SAndroid Build Coastguard Worker unsigned index,
664*61046927SAndroid Build Coastguard Worker bool is_grouped)
665*61046927SAndroid Build Coastguard Worker {
666*61046927SAndroid Build Coastguard Worker if (is_grouped) {
667*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", instr->group->index);
668*61046927SAndroid Build Coastguard Worker fputs(": { ", fp);
669*61046927SAndroid Build Coastguard Worker rogue_print_instr_phase(fp, instr->group->header.alu, instr->index);
670*61046927SAndroid Build Coastguard Worker } else {
671*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u", instr->index);
672*61046927SAndroid Build Coastguard Worker if (index != ~0)
673*61046927SAndroid Build Coastguard Worker fputs(": ", fp);
674*61046927SAndroid Build Coastguard Worker }
675*61046927SAndroid Build Coastguard Worker
676*61046927SAndroid Build Coastguard Worker if (index != ~0) {
677*61046927SAndroid Build Coastguard Worker BLUE(fp);
678*61046927SAndroid Build Coastguard Worker fprintf(fp, "[%s%u]", dst ? "dst" : "src", index);
679*61046927SAndroid Build Coastguard Worker RESET(fp);
680*61046927SAndroid Build Coastguard Worker }
681*61046927SAndroid Build Coastguard Worker
682*61046927SAndroid Build Coastguard Worker if (is_grouped)
683*61046927SAndroid Build Coastguard Worker fputs(" }", fp);
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker
686*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_print_reg_writes(FILE * fp,const rogue_shader * shader)687*61046927SAndroid Build Coastguard Worker void rogue_print_reg_writes(FILE *fp, const rogue_shader *shader)
688*61046927SAndroid Build Coastguard Worker {
689*61046927SAndroid Build Coastguard Worker fputs("/* register writes */\n", fp);
690*61046927SAndroid Build Coastguard Worker for (enum rogue_reg_class class = 0; class < ROGUE_REG_CLASS_COUNT;
691*61046927SAndroid Build Coastguard Worker ++class) {
692*61046927SAndroid Build Coastguard Worker rogue_foreach_reg (reg, shader, class) {
693*61046927SAndroid Build Coastguard Worker bool unused = true;
694*61046927SAndroid Build Coastguard Worker
695*61046927SAndroid Build Coastguard Worker rogue_print_reg(fp, reg);
696*61046927SAndroid Build Coastguard Worker fputs(":", fp);
697*61046927SAndroid Build Coastguard Worker
698*61046927SAndroid Build Coastguard Worker rogue_foreach_reg_write (write, reg) {
699*61046927SAndroid Build Coastguard Worker assert(write->instr);
700*61046927SAndroid Build Coastguard Worker unused = false;
701*61046927SAndroid Build Coastguard Worker
702*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
703*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp,
704*61046927SAndroid Build Coastguard Worker write->instr,
705*61046927SAndroid Build Coastguard Worker true,
706*61046927SAndroid Build Coastguard Worker write->dst_index,
707*61046927SAndroid Build Coastguard Worker shader->is_grouped);
708*61046927SAndroid Build Coastguard Worker }
709*61046927SAndroid Build Coastguard Worker
710*61046927SAndroid Build Coastguard Worker if (reg->regarray) {
711*61046927SAndroid Build Coastguard Worker rogue_foreach_regarray_write (write, reg->regarray) {
712*61046927SAndroid Build Coastguard Worker assert(write->instr);
713*61046927SAndroid Build Coastguard Worker unused = false;
714*61046927SAndroid Build Coastguard Worker
715*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
716*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp,
717*61046927SAndroid Build Coastguard Worker write->instr,
718*61046927SAndroid Build Coastguard Worker false,
719*61046927SAndroid Build Coastguard Worker write->dst_index,
720*61046927SAndroid Build Coastguard Worker shader->is_grouped);
721*61046927SAndroid Build Coastguard Worker }
722*61046927SAndroid Build Coastguard Worker
723*61046927SAndroid Build Coastguard Worker rogue_foreach_subarray (subarray, reg->regarray) {
724*61046927SAndroid Build Coastguard Worker unsigned subarray_start = subarray->regs[0]->index;
725*61046927SAndroid Build Coastguard Worker unsigned subarray_end = subarray_start + subarray->size - 1;
726*61046927SAndroid Build Coastguard Worker if (reg->index < subarray_start || reg->index > subarray_end)
727*61046927SAndroid Build Coastguard Worker continue;
728*61046927SAndroid Build Coastguard Worker
729*61046927SAndroid Build Coastguard Worker rogue_foreach_regarray_write (write, subarray) {
730*61046927SAndroid Build Coastguard Worker assert(write->instr);
731*61046927SAndroid Build Coastguard Worker unused = false;
732*61046927SAndroid Build Coastguard Worker
733*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
734*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp,
735*61046927SAndroid Build Coastguard Worker write->instr,
736*61046927SAndroid Build Coastguard Worker false,
737*61046927SAndroid Build Coastguard Worker write->dst_index,
738*61046927SAndroid Build Coastguard Worker shader->is_grouped);
739*61046927SAndroid Build Coastguard Worker }
740*61046927SAndroid Build Coastguard Worker }
741*61046927SAndroid Build Coastguard Worker }
742*61046927SAndroid Build Coastguard Worker
743*61046927SAndroid Build Coastguard Worker if (unused) {
744*61046927SAndroid Build Coastguard Worker fputs(" <none>\n", fp);
745*61046927SAndroid Build Coastguard Worker continue;
746*61046927SAndroid Build Coastguard Worker }
747*61046927SAndroid Build Coastguard Worker
748*61046927SAndroid Build Coastguard Worker fputs("\n", fp);
749*61046927SAndroid Build Coastguard Worker }
750*61046927SAndroid Build Coastguard Worker }
751*61046927SAndroid Build Coastguard Worker }
752*61046927SAndroid Build Coastguard Worker
753*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_print_reg_uses(FILE * fp,const rogue_shader * shader)754*61046927SAndroid Build Coastguard Worker void rogue_print_reg_uses(FILE *fp, const rogue_shader *shader)
755*61046927SAndroid Build Coastguard Worker {
756*61046927SAndroid Build Coastguard Worker fputs("/* register uses */\n", fp);
757*61046927SAndroid Build Coastguard Worker for (enum rogue_reg_class class = 0; class < ROGUE_REG_CLASS_COUNT;
758*61046927SAndroid Build Coastguard Worker ++class) {
759*61046927SAndroid Build Coastguard Worker rogue_foreach_reg (reg, shader, class) {
760*61046927SAndroid Build Coastguard Worker bool unused = true;
761*61046927SAndroid Build Coastguard Worker
762*61046927SAndroid Build Coastguard Worker rogue_print_reg(fp, reg);
763*61046927SAndroid Build Coastguard Worker fputs(":", fp);
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker rogue_foreach_reg_use (use, reg) {
766*61046927SAndroid Build Coastguard Worker assert(use->instr);
767*61046927SAndroid Build Coastguard Worker unused = false;
768*61046927SAndroid Build Coastguard Worker
769*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
770*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp,
771*61046927SAndroid Build Coastguard Worker use->instr,
772*61046927SAndroid Build Coastguard Worker false,
773*61046927SAndroid Build Coastguard Worker use->src_index,
774*61046927SAndroid Build Coastguard Worker shader->is_grouped);
775*61046927SAndroid Build Coastguard Worker }
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker if (reg->regarray) {
778*61046927SAndroid Build Coastguard Worker rogue_foreach_regarray_use (use, reg->regarray) {
779*61046927SAndroid Build Coastguard Worker assert(use->instr);
780*61046927SAndroid Build Coastguard Worker unused = false;
781*61046927SAndroid Build Coastguard Worker
782*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
783*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp,
784*61046927SAndroid Build Coastguard Worker use->instr,
785*61046927SAndroid Build Coastguard Worker false,
786*61046927SAndroid Build Coastguard Worker use->src_index,
787*61046927SAndroid Build Coastguard Worker shader->is_grouped);
788*61046927SAndroid Build Coastguard Worker }
789*61046927SAndroid Build Coastguard Worker
790*61046927SAndroid Build Coastguard Worker rogue_foreach_subarray (subarray, reg->regarray) {
791*61046927SAndroid Build Coastguard Worker unsigned subarray_start = subarray->regs[0]->index;
792*61046927SAndroid Build Coastguard Worker unsigned subarray_end = subarray_start + subarray->size - 1;
793*61046927SAndroid Build Coastguard Worker if (reg->index < subarray_start || reg->index > subarray_end)
794*61046927SAndroid Build Coastguard Worker continue;
795*61046927SAndroid Build Coastguard Worker
796*61046927SAndroid Build Coastguard Worker rogue_foreach_regarray_use (use, subarray) {
797*61046927SAndroid Build Coastguard Worker assert(use->instr);
798*61046927SAndroid Build Coastguard Worker unused = false;
799*61046927SAndroid Build Coastguard Worker
800*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
801*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp,
802*61046927SAndroid Build Coastguard Worker use->instr,
803*61046927SAndroid Build Coastguard Worker false,
804*61046927SAndroid Build Coastguard Worker use->src_index,
805*61046927SAndroid Build Coastguard Worker shader->is_grouped);
806*61046927SAndroid Build Coastguard Worker }
807*61046927SAndroid Build Coastguard Worker }
808*61046927SAndroid Build Coastguard Worker }
809*61046927SAndroid Build Coastguard Worker
810*61046927SAndroid Build Coastguard Worker if (unused) {
811*61046927SAndroid Build Coastguard Worker fputs(" <none>\n", fp);
812*61046927SAndroid Build Coastguard Worker continue;
813*61046927SAndroid Build Coastguard Worker }
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker fputs("\n", fp);
816*61046927SAndroid Build Coastguard Worker }
817*61046927SAndroid Build Coastguard Worker }
818*61046927SAndroid Build Coastguard Worker }
819*61046927SAndroid Build Coastguard Worker
820*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_print_block_uses(FILE * fp,const rogue_shader * shader)821*61046927SAndroid Build Coastguard Worker void rogue_print_block_uses(FILE *fp, const rogue_shader *shader)
822*61046927SAndroid Build Coastguard Worker {
823*61046927SAndroid Build Coastguard Worker fputs("/* block uses */\n", fp);
824*61046927SAndroid Build Coastguard Worker rogue_foreach_block (block, shader) {
825*61046927SAndroid Build Coastguard Worker rogue_print_block_label(fp, block);
826*61046927SAndroid Build Coastguard Worker fputs(":", fp);
827*61046927SAndroid Build Coastguard Worker
828*61046927SAndroid Build Coastguard Worker if (list_is_empty(&block->uses)) {
829*61046927SAndroid Build Coastguard Worker if (list_first_entry(&shader->blocks, rogue_block, link) == block)
830*61046927SAndroid Build Coastguard Worker fputs(" <entry>\n", fp);
831*61046927SAndroid Build Coastguard Worker else
832*61046927SAndroid Build Coastguard Worker fputs(" <none>\n", fp);
833*61046927SAndroid Build Coastguard Worker
834*61046927SAndroid Build Coastguard Worker continue;
835*61046927SAndroid Build Coastguard Worker }
836*61046927SAndroid Build Coastguard Worker
837*61046927SAndroid Build Coastguard Worker rogue_foreach_block_use (use, block) {
838*61046927SAndroid Build Coastguard Worker assert(use->instr);
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker fputs(" ", fp);
841*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp, use->instr, false, ~0, shader->is_grouped);
842*61046927SAndroid Build Coastguard Worker }
843*61046927SAndroid Build Coastguard Worker
844*61046927SAndroid Build Coastguard Worker fputs("\n", fp);
845*61046927SAndroid Build Coastguard Worker }
846*61046927SAndroid Build Coastguard Worker }
847*61046927SAndroid Build Coastguard Worker
rogue_print_drc_trxn(FILE * fp,const rogue_shader * shader,const rogue_drc_trxn * drc_trxn,unsigned index)848*61046927SAndroid Build Coastguard Worker static void rogue_print_drc_trxn(FILE *fp,
849*61046927SAndroid Build Coastguard Worker const rogue_shader *shader,
850*61046927SAndroid Build Coastguard Worker const rogue_drc_trxn *drc_trxn,
851*61046927SAndroid Build Coastguard Worker unsigned index)
852*61046927SAndroid Build Coastguard Worker {
853*61046927SAndroid Build Coastguard Worker fprintf(fp, "drc%u: ack: ", index);
854*61046927SAndroid Build Coastguard Worker
855*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp, drc_trxn->acquire, false, ~0, shader->is_grouped);
856*61046927SAndroid Build Coastguard Worker
857*61046927SAndroid Build Coastguard Worker fputs(", rel: ", fp);
858*61046927SAndroid Build Coastguard Worker
859*61046927SAndroid Build Coastguard Worker if (drc_trxn->release) {
860*61046927SAndroid Build Coastguard Worker rogue_print_instr_ref(fp,
861*61046927SAndroid Build Coastguard Worker drc_trxn->release,
862*61046927SAndroid Build Coastguard Worker false,
863*61046927SAndroid Build Coastguard Worker ~0,
864*61046927SAndroid Build Coastguard Worker shader->is_grouped);
865*61046927SAndroid Build Coastguard Worker } else {
866*61046927SAndroid Build Coastguard Worker fputs("<none>", fp);
867*61046927SAndroid Build Coastguard Worker }
868*61046927SAndroid Build Coastguard Worker
869*61046927SAndroid Build Coastguard Worker fputs("\n", fp);
870*61046927SAndroid Build Coastguard Worker }
871*61046927SAndroid Build Coastguard Worker
872*61046927SAndroid Build Coastguard Worker PUBLIC
rogue_print_drc_trxns(FILE * fp,const rogue_shader * shader)873*61046927SAndroid Build Coastguard Worker void rogue_print_drc_trxns(FILE *fp, const rogue_shader *shader)
874*61046927SAndroid Build Coastguard Worker {
875*61046927SAndroid Build Coastguard Worker fputs("/* DRC transactions */\n", fp);
876*61046927SAndroid Build Coastguard Worker
877*61046927SAndroid Build Coastguard Worker rogue_foreach_drc_trxn (drc_trxn, shader, 0) {
878*61046927SAndroid Build Coastguard Worker rogue_print_drc_trxn(fp, shader, drc_trxn, 0);
879*61046927SAndroid Build Coastguard Worker }
880*61046927SAndroid Build Coastguard Worker
881*61046927SAndroid Build Coastguard Worker rogue_foreach_drc_trxn (drc_trxn, shader, 1) {
882*61046927SAndroid Build Coastguard Worker rogue_print_drc_trxn(fp, shader, drc_trxn, 1);
883*61046927SAndroid Build Coastguard Worker }
884*61046927SAndroid Build Coastguard Worker }
885