1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Mary Guillemard
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker #include "mme_fermi.h"
6*61046927SAndroid Build Coastguard Worker
7*61046927SAndroid Build Coastguard Worker #include "mme_bitpack_helpers.h"
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #define OP_TO_STR(OP) [MME_FERMI_OP_##OP] = #OP
10*61046927SAndroid Build Coastguard Worker static const char *op_to_str[] = {
11*61046927SAndroid Build Coastguard Worker OP_TO_STR(ALU_REG),
12*61046927SAndroid Build Coastguard Worker OP_TO_STR(ADD_IMM),
13*61046927SAndroid Build Coastguard Worker OP_TO_STR(MERGE),
14*61046927SAndroid Build Coastguard Worker OP_TO_STR(BFE_LSL_IMM),
15*61046927SAndroid Build Coastguard Worker OP_TO_STR(BFE_LSL_REG),
16*61046927SAndroid Build Coastguard Worker OP_TO_STR(STATE),
17*61046927SAndroid Build Coastguard Worker OP_TO_STR(UNK6),
18*61046927SAndroid Build Coastguard Worker OP_TO_STR(BRANCH),
19*61046927SAndroid Build Coastguard Worker };
20*61046927SAndroid Build Coastguard Worker #undef OP_TO_STR
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker const char *
mme_fermi_op_to_str(enum mme_fermi_op op)23*61046927SAndroid Build Coastguard Worker mme_fermi_op_to_str(enum mme_fermi_op op)
24*61046927SAndroid Build Coastguard Worker {
25*61046927SAndroid Build Coastguard Worker assert(op < ARRAY_SIZE(op_to_str));
26*61046927SAndroid Build Coastguard Worker return op_to_str[op];
27*61046927SAndroid Build Coastguard Worker }
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #define ALU_OP_TO_STR(OP) [MME_FERMI_ALU_OP_##OP] = #OP
30*61046927SAndroid Build Coastguard Worker static const char *alu_op_to_str[] = {
31*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(ADD),
32*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(ADDC),
33*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(SUB),
34*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(SUBB),
35*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED4),
36*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED5),
37*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED6),
38*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED7),
39*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(XOR),
40*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(OR),
41*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(AND),
42*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(AND_NOT),
43*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(NAND),
44*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED13),
45*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED14),
46*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED15),
47*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED16),
48*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED17),
49*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED18),
50*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED19),
51*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED20),
52*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED21),
53*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED22),
54*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED23),
55*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED24),
56*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED25),
57*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED26),
58*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED27),
59*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED28),
60*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED29),
61*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED30),
62*61046927SAndroid Build Coastguard Worker ALU_OP_TO_STR(RESERVED31),
63*61046927SAndroid Build Coastguard Worker };
64*61046927SAndroid Build Coastguard Worker #undef ALU_OP_TO_STR
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker const char *
mme_fermi_alu_op_to_str(enum mme_fermi_alu_op op)67*61046927SAndroid Build Coastguard Worker mme_fermi_alu_op_to_str(enum mme_fermi_alu_op op)
68*61046927SAndroid Build Coastguard Worker {
69*61046927SAndroid Build Coastguard Worker assert(op < ARRAY_SIZE(alu_op_to_str));
70*61046927SAndroid Build Coastguard Worker return alu_op_to_str[op];
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker #define ASSIGN_OP_TO_STR(OP) [MME_FERMI_ASSIGN_OP_##OP] = #OP
74*61046927SAndroid Build Coastguard Worker static const char *assign_op_to_str[] = {
75*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(LOAD),
76*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(MOVE),
77*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(MOVE_SET_MADDR),
78*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(LOAD_EMIT),
79*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(MOVE_EMIT),
80*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(LOAD_SET_MADDR),
81*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(MOVE_SET_MADDR_LOAD_EMIT),
82*61046927SAndroid Build Coastguard Worker ASSIGN_OP_TO_STR(MOVE_SET_MADDR_LOAD_EMIT_HIGH),
83*61046927SAndroid Build Coastguard Worker };
84*61046927SAndroid Build Coastguard Worker #undef ASSIGN_OP_TO_STR
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker const char *
mme_fermi_assign_op_to_str(enum mme_fermi_assign_op op)87*61046927SAndroid Build Coastguard Worker mme_fermi_assign_op_to_str(enum mme_fermi_assign_op op)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker assert(op < ARRAY_SIZE(assign_op_to_str));
90*61046927SAndroid Build Coastguard Worker return assign_op_to_str[op];
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker
mme_fermi_encode(uint32_t * out,uint32_t inst_count,const struct mme_fermi_inst * insts)93*61046927SAndroid Build Coastguard Worker void mme_fermi_encode(uint32_t *out, uint32_t inst_count,
94*61046927SAndroid Build Coastguard Worker const struct mme_fermi_inst *insts)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < inst_count; i++) {
97*61046927SAndroid Build Coastguard Worker uint32_t *b = &out[i];
98*61046927SAndroid Build Coastguard Worker *b = 0;
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker pack_uint(b, 0, 3, insts[i].op);
101*61046927SAndroid Build Coastguard Worker pack_uint(b, 7, 7, insts[i].end_next);
102*61046927SAndroid Build Coastguard Worker pack_uint(b, 8, 10, insts[i].dst);
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker if (insts[i].op != MME_FERMI_OP_BRANCH) {
105*61046927SAndroid Build Coastguard Worker pack_uint(b, 4, 6, insts[i].assign_op);
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker if (insts[i].op == MME_FERMI_OP_ALU_REG) {
109*61046927SAndroid Build Coastguard Worker pack_uint(b, 11, 13, insts[i].src[0]);
110*61046927SAndroid Build Coastguard Worker pack_uint(b, 14, 16, insts[i].src[1]);
111*61046927SAndroid Build Coastguard Worker pack_uint(b, 17, 21, insts[i].alu_op);
112*61046927SAndroid Build Coastguard Worker } else if (insts[i].op == MME_FERMI_OP_ADD_IMM ||
113*61046927SAndroid Build Coastguard Worker insts[i].op == MME_FERMI_OP_STATE) {
114*61046927SAndroid Build Coastguard Worker pack_uint(b, 11, 13, insts[i].src[0]);
115*61046927SAndroid Build Coastguard Worker pack_sint(b, 14, 31, insts[i].imm);
116*61046927SAndroid Build Coastguard Worker } else if (insts[i].op == MME_FERMI_OP_MERGE ||
117*61046927SAndroid Build Coastguard Worker insts[i].op == MME_FERMI_OP_BFE_LSL_IMM ||
118*61046927SAndroid Build Coastguard Worker insts[i].op == MME_FERMI_OP_BFE_LSL_REG) {
119*61046927SAndroid Build Coastguard Worker pack_uint(b, 11, 13, insts[i].src[0]);
120*61046927SAndroid Build Coastguard Worker pack_uint(b, 14, 16, insts[i].src[1]);
121*61046927SAndroid Build Coastguard Worker pack_uint(b, 17, 21, insts[i].bitfield.src_bit);
122*61046927SAndroid Build Coastguard Worker pack_uint(b, 22, 26, insts[i].bitfield.size);
123*61046927SAndroid Build Coastguard Worker pack_uint(b, 27, 31, insts[i].bitfield.dst_bit);
124*61046927SAndroid Build Coastguard Worker } else if (insts[i].op == MME_FERMI_OP_BRANCH) {
125*61046927SAndroid Build Coastguard Worker pack_uint(b, 4, 4, insts[i].branch.not_zero);
126*61046927SAndroid Build Coastguard Worker pack_uint(b, 5, 5, insts[i].branch.no_delay);
127*61046927SAndroid Build Coastguard Worker pack_uint(b, 11, 13, insts[i].src[0]);
128*61046927SAndroid Build Coastguard Worker pack_sint(b, 14, 31, insts[i].imm);
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker }
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker
mme_fermi_decode(struct mme_fermi_inst * insts,const uint32_t * in,uint32_t inst_count)133*61046927SAndroid Build Coastguard Worker void mme_fermi_decode(struct mme_fermi_inst *insts,
134*61046927SAndroid Build Coastguard Worker const uint32_t *in, uint32_t inst_count)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < inst_count; i++) {
137*61046927SAndroid Build Coastguard Worker const uint32_t *b = &in[i];
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker insts[i] = (struct mme_fermi_inst) {
140*61046927SAndroid Build Coastguard Worker .op = unpack_uint(b, 0, 3),
141*61046927SAndroid Build Coastguard Worker .end_next = unpack_uint(b, 7, 7),
142*61046927SAndroid Build Coastguard Worker .dst = unpack_uint(b, 8, 10),
143*61046927SAndroid Build Coastguard Worker };
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker if (insts[i].op != MME_FERMI_OP_BRANCH) {
146*61046927SAndroid Build Coastguard Worker insts[i].assign_op = unpack_uint(b, 4, 6);
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker if (insts[i].op == MME_FERMI_OP_ALU_REG) {
150*61046927SAndroid Build Coastguard Worker insts[i].src[0] = unpack_uint(b, 11, 13);
151*61046927SAndroid Build Coastguard Worker insts[i].src[1] = unpack_uint(b, 14, 16);
152*61046927SAndroid Build Coastguard Worker insts[i].alu_op = unpack_uint(b, 17, 21);
153*61046927SAndroid Build Coastguard Worker } else if (insts[i].op == MME_FERMI_OP_ADD_IMM ||
154*61046927SAndroid Build Coastguard Worker insts[i].op == MME_FERMI_OP_STATE) {
155*61046927SAndroid Build Coastguard Worker insts[i].src[0] = unpack_uint(b, 11, 13);
156*61046927SAndroid Build Coastguard Worker insts[i].imm = unpack_sint(b, 14, 31);
157*61046927SAndroid Build Coastguard Worker } else if (insts[i].op == MME_FERMI_OP_MERGE ||
158*61046927SAndroid Build Coastguard Worker insts[i].op == MME_FERMI_OP_BFE_LSL_IMM ||
159*61046927SAndroid Build Coastguard Worker insts[i].op == MME_FERMI_OP_BFE_LSL_REG) {
160*61046927SAndroid Build Coastguard Worker insts[i].src[0] = unpack_uint(b, 11, 13);
161*61046927SAndroid Build Coastguard Worker insts[i].src[1] = unpack_uint(b, 14, 16);
162*61046927SAndroid Build Coastguard Worker insts[i].bitfield.src_bit = unpack_uint(b, 17, 21);
163*61046927SAndroid Build Coastguard Worker insts[i].bitfield.size = unpack_uint(b, 22, 26);
164*61046927SAndroid Build Coastguard Worker insts[i].bitfield.dst_bit = unpack_uint(b, 27, 31);
165*61046927SAndroid Build Coastguard Worker } else if (insts[i].op == MME_FERMI_OP_BRANCH) {
166*61046927SAndroid Build Coastguard Worker insts[i].branch.not_zero = unpack_uint(b, 4, 4);
167*61046927SAndroid Build Coastguard Worker insts[i].branch.no_delay = unpack_uint(b, 5, 5);
168*61046927SAndroid Build Coastguard Worker insts[i].src[0] = unpack_uint(b, 11, 13);
169*61046927SAndroid Build Coastguard Worker insts[i].imm = unpack_sint(b, 14, 31);
170*61046927SAndroid Build Coastguard Worker }
171*61046927SAndroid Build Coastguard Worker }
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker static void
print_indent(FILE * fp,unsigned depth)175*61046927SAndroid Build Coastguard Worker print_indent(FILE *fp, unsigned depth)
176*61046927SAndroid Build Coastguard Worker {
177*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < depth; i++)
178*61046927SAndroid Build Coastguard Worker fprintf(fp, " ");
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker static void
print_reg(FILE * fp,enum mme_fermi_reg reg)182*61046927SAndroid Build Coastguard Worker print_reg(FILE *fp, enum mme_fermi_reg reg)
183*61046927SAndroid Build Coastguard Worker {
184*61046927SAndroid Build Coastguard Worker if (reg == MME_FERMI_REG_ZERO) {
185*61046927SAndroid Build Coastguard Worker fprintf(fp, " $zero");
186*61046927SAndroid Build Coastguard Worker } else {
187*61046927SAndroid Build Coastguard Worker fprintf(fp, " $r%u", (unsigned)reg);
188*61046927SAndroid Build Coastguard Worker }
189*61046927SAndroid Build Coastguard Worker }
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker static void
print_imm(FILE * fp,const struct mme_fermi_inst * inst)192*61046927SAndroid Build Coastguard Worker print_imm(FILE *fp, const struct mme_fermi_inst *inst)
193*61046927SAndroid Build Coastguard Worker {
194*61046927SAndroid Build Coastguard Worker int32_t imm = util_mask_sign_extend(inst->imm, 18);
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker fprintf(fp, " %d /* 0x%04x */", (int)imm, (unsigned)imm);
197*61046927SAndroid Build Coastguard Worker }
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker void
mme_fermi_print_inst(FILE * fp,unsigned indent,const struct mme_fermi_inst * inst)200*61046927SAndroid Build Coastguard Worker mme_fermi_print_inst(FILE *fp, unsigned indent,
201*61046927SAndroid Build Coastguard Worker const struct mme_fermi_inst *inst)
202*61046927SAndroid Build Coastguard Worker {
203*61046927SAndroid Build Coastguard Worker print_indent(fp, indent);
204*61046927SAndroid Build Coastguard Worker
205*61046927SAndroid Build Coastguard Worker switch (inst->op) {
206*61046927SAndroid Build Coastguard Worker case MME_FERMI_OP_ALU_REG:
207*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mme_fermi_alu_op_to_str(inst->alu_op));
208*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[0]);
209*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[1]);
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker if (inst->alu_op == MME_FERMI_ALU_OP_ADDC) {
212*61046927SAndroid Build Coastguard Worker fprintf(fp, " $carry");
213*61046927SAndroid Build Coastguard Worker } else if (inst->alu_op == MME_FERMI_ALU_OP_SUBB) {
214*61046927SAndroid Build Coastguard Worker fprintf(fp, " $borrow");
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker break;
217*61046927SAndroid Build Coastguard Worker case MME_FERMI_OP_ADD_IMM:
218*61046927SAndroid Build Coastguard Worker case MME_FERMI_OP_STATE:
219*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mme_fermi_op_to_str(inst->op));
220*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[0]);
221*61046927SAndroid Build Coastguard Worker print_imm(fp, inst);
222*61046927SAndroid Build Coastguard Worker break;
223*61046927SAndroid Build Coastguard Worker case MME_FERMI_OP_MERGE:
224*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mme_fermi_op_to_str(inst->op));
225*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[0]);
226*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[1]);
227*61046927SAndroid Build Coastguard Worker fprintf(fp, " (%u, %u, %u)", inst->bitfield.dst_bit,
228*61046927SAndroid Build Coastguard Worker inst->bitfield.size,
229*61046927SAndroid Build Coastguard Worker inst->bitfield.src_bit);
230*61046927SAndroid Build Coastguard Worker break;
231*61046927SAndroid Build Coastguard Worker case MME_FERMI_OP_BFE_LSL_IMM:
232*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mme_fermi_op_to_str(inst->op));
233*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[0]);
234*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[1]);
235*61046927SAndroid Build Coastguard Worker fprintf(fp, " (%u, %u)", inst->bitfield.dst_bit,
236*61046927SAndroid Build Coastguard Worker inst->bitfield.size);
237*61046927SAndroid Build Coastguard Worker break;
238*61046927SAndroid Build Coastguard Worker case MME_FERMI_OP_BFE_LSL_REG:
239*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mme_fermi_op_to_str(inst->op));
240*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[0]);
241*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[1]);
242*61046927SAndroid Build Coastguard Worker fprintf(fp, " (%u, %u)", inst->bitfield.src_bit,
243*61046927SAndroid Build Coastguard Worker inst->bitfield.size);
244*61046927SAndroid Build Coastguard Worker break;
245*61046927SAndroid Build Coastguard Worker case MME_FERMI_OP_BRANCH:
246*61046927SAndroid Build Coastguard Worker if (inst->branch.not_zero) {
247*61046927SAndroid Build Coastguard Worker fprintf(fp, "BNZ");
248*61046927SAndroid Build Coastguard Worker } else {
249*61046927SAndroid Build Coastguard Worker fprintf(fp, "BZ");
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->src[0]);
252*61046927SAndroid Build Coastguard Worker print_imm(fp, inst);
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker if (inst->branch.no_delay) {
255*61046927SAndroid Build Coastguard Worker fprintf(fp, " NO_DELAY");
256*61046927SAndroid Build Coastguard Worker }
257*61046927SAndroid Build Coastguard Worker
258*61046927SAndroid Build Coastguard Worker break;
259*61046927SAndroid Build Coastguard Worker default:
260*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mme_fermi_op_to_str(inst->op));
261*61046927SAndroid Build Coastguard Worker break;
262*61046927SAndroid Build Coastguard Worker }
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker if (inst->op != MME_FERMI_OP_BRANCH) {
265*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
266*61046927SAndroid Build Coastguard Worker print_indent(fp, indent);
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker fprintf(fp, "%s", mme_fermi_assign_op_to_str(inst->assign_op));
269*61046927SAndroid Build Coastguard Worker print_reg(fp, inst->dst);
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Worker if (inst->assign_op != MME_FERMI_ASSIGN_OP_LOAD) {
272*61046927SAndroid Build Coastguard Worker fprintf(fp, " $scratch");
273*61046927SAndroid Build Coastguard Worker }
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker if (inst->end_next) {
277*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
278*61046927SAndroid Build Coastguard Worker print_indent(fp, indent);
279*61046927SAndroid Build Coastguard Worker fprintf(fp, "END_NEXT");
280*61046927SAndroid Build Coastguard Worker }
281*61046927SAndroid Build Coastguard Worker
282*61046927SAndroid Build Coastguard Worker fprintf(fp, "\n");
283*61046927SAndroid Build Coastguard Worker
284*61046927SAndroid Build Coastguard Worker }
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker void
mme_fermi_print(FILE * fp,const struct mme_fermi_inst * insts,uint32_t inst_count)287*61046927SAndroid Build Coastguard Worker mme_fermi_print(FILE *fp, const struct mme_fermi_inst *insts,
288*61046927SAndroid Build Coastguard Worker uint32_t inst_count)
289*61046927SAndroid Build Coastguard Worker {
290*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < inst_count; i++) {
291*61046927SAndroid Build Coastguard Worker fprintf(fp, "%u:\n", i);
292*61046927SAndroid Build Coastguard Worker mme_fermi_print_inst(fp, 1, &insts[i]);
293*61046927SAndroid Build Coastguard Worker }
294*61046927SAndroid Build Coastguard Worker }
295*61046927SAndroid Build Coastguard Worker
296*61046927SAndroid Build Coastguard Worker void
mme_fermi_dump(FILE * fp,uint32_t * encoded,size_t encoded_size)297*61046927SAndroid Build Coastguard Worker mme_fermi_dump(FILE *fp, uint32_t *encoded, size_t encoded_size)
298*61046927SAndroid Build Coastguard Worker {
299*61046927SAndroid Build Coastguard Worker uint32_t inst_count = encoded_size / 4;
300*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < inst_count; i++) {
301*61046927SAndroid Build Coastguard Worker struct mme_fermi_inst inst;
302*61046927SAndroid Build Coastguard Worker mme_fermi_decode(&inst, &encoded[i], 1);
303*61046927SAndroid Build Coastguard Worker mme_fermi_print_inst(fp, 1, &inst);
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker }
306