xref: /aosp_15_r20/external/mesa3d/src/nouveau/mme/mme_tu104.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Collabora Ltd.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker #include "mme_tu104.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 #include <stdlib.h>
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "nv_push_clc597.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #define PRED_TO_STR(OP) [MME_TU104_PRED_##OP] = #OP
14*61046927SAndroid Build Coastguard Worker const char *pred_to_str[] = {
15*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUUU),
16*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(TTTT),
17*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(FFFF),
18*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(TTUU),
19*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(FFUU),
20*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(TFUU),
21*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(TUUU),
22*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(FUUU),
23*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUTT),
24*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUTF),
25*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUTU),
26*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUFT),
27*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUFF),
28*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUFU),
29*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUUT),
30*61046927SAndroid Build Coastguard Worker    PRED_TO_STR(UUUF),
31*61046927SAndroid Build Coastguard Worker };
32*61046927SAndroid Build Coastguard Worker #undef PRED_TO_STR
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker const char *
mme_tu104_pred_to_str(enum mme_tu104_pred pred)35*61046927SAndroid Build Coastguard Worker mme_tu104_pred_to_str(enum mme_tu104_pred pred)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker    assert(pred < ARRAY_SIZE(pred_to_str));
38*61046927SAndroid Build Coastguard Worker    return pred_to_str[pred];
39*61046927SAndroid Build Coastguard Worker }
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker #define OP_TO_STR(OP) [MME_TU104_ALU_OP_##OP] = #OP
42*61046927SAndroid Build Coastguard Worker static const char *alu_op_to_str[] = {
43*61046927SAndroid Build Coastguard Worker    OP_TO_STR(ADD),
44*61046927SAndroid Build Coastguard Worker    OP_TO_STR(ADDC),
45*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SUB),
46*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SUBB),
47*61046927SAndroid Build Coastguard Worker    OP_TO_STR(MUL),
48*61046927SAndroid Build Coastguard Worker    OP_TO_STR(MULH),
49*61046927SAndroid Build Coastguard Worker    OP_TO_STR(MULU),
50*61046927SAndroid Build Coastguard Worker    OP_TO_STR(EXTENDED),
51*61046927SAndroid Build Coastguard Worker    OP_TO_STR(CLZ),
52*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SLL),
53*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SRL),
54*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SRA),
55*61046927SAndroid Build Coastguard Worker    OP_TO_STR(AND),
56*61046927SAndroid Build Coastguard Worker    OP_TO_STR(NAND),
57*61046927SAndroid Build Coastguard Worker    OP_TO_STR(OR),
58*61046927SAndroid Build Coastguard Worker    OP_TO_STR(XOR),
59*61046927SAndroid Build Coastguard Worker    OP_TO_STR(MERGE),
60*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SLT),
61*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SLTU),
62*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SLE),
63*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SLEU),
64*61046927SAndroid Build Coastguard Worker    OP_TO_STR(SEQ),
65*61046927SAndroid Build Coastguard Worker    OP_TO_STR(STATE),
66*61046927SAndroid Build Coastguard Worker    OP_TO_STR(LOOP),
67*61046927SAndroid Build Coastguard Worker    OP_TO_STR(JAL),
68*61046927SAndroid Build Coastguard Worker    OP_TO_STR(BLT),
69*61046927SAndroid Build Coastguard Worker    OP_TO_STR(BLTU),
70*61046927SAndroid Build Coastguard Worker    OP_TO_STR(BLE),
71*61046927SAndroid Build Coastguard Worker    OP_TO_STR(BLEU),
72*61046927SAndroid Build Coastguard Worker    OP_TO_STR(BEQ),
73*61046927SAndroid Build Coastguard Worker    OP_TO_STR(DREAD),
74*61046927SAndroid Build Coastguard Worker    OP_TO_STR(DWRITE),
75*61046927SAndroid Build Coastguard Worker };
76*61046927SAndroid Build Coastguard Worker #undef OP_TO_STR
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker const char *
mme_tu104_alu_op_to_str(enum mme_tu104_alu_op op)79*61046927SAndroid Build Coastguard Worker mme_tu104_alu_op_to_str(enum mme_tu104_alu_op op)
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker    assert(op < ARRAY_SIZE(alu_op_to_str));
82*61046927SAndroid Build Coastguard Worker    return alu_op_to_str[op];
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker void
mme_tu104_encode(uint32_t * out,uint32_t inst_count,const struct mme_tu104_inst * insts)86*61046927SAndroid Build Coastguard Worker mme_tu104_encode(uint32_t *out, uint32_t inst_count,
87*61046927SAndroid Build Coastguard Worker                  const struct mme_tu104_inst *insts)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < inst_count; i++) {
90*61046927SAndroid Build Coastguard Worker       uint32_t b[3] = { 0, 0, 0};
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker       pack_uint(b,  0,  0, insts[i].end_next);
93*61046927SAndroid Build Coastguard Worker       pack_uint(b,  1,  4, insts[i].pred_mode);
94*61046927SAndroid Build Coastguard Worker       pack_uint(b,  5,  9, insts[i].pred);
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker       pack_uint(b, 10, 14, insts[i].alu[0].op);
97*61046927SAndroid Build Coastguard Worker       pack_uint(b, 15, 19, insts[i].alu[0].dst);
98*61046927SAndroid Build Coastguard Worker       pack_uint(b, 20, 24, insts[i].alu[0].src[0]);
99*61046927SAndroid Build Coastguard Worker       pack_uint(b, 25, 29, insts[i].alu[0].src[1]);
100*61046927SAndroid Build Coastguard Worker       pack_uint(b, 30, 45, insts[i].imm[0]);
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker       pack_uint(b, 46, 50, insts[i].alu[1].op);
103*61046927SAndroid Build Coastguard Worker       pack_uint(b, 51, 55, insts[i].alu[1].dst);
104*61046927SAndroid Build Coastguard Worker       pack_uint(b, 56, 60, insts[i].alu[1].src[0]);
105*61046927SAndroid Build Coastguard Worker       pack_uint(b, 61, 65, insts[i].alu[1].src[1]);
106*61046927SAndroid Build Coastguard Worker       pack_uint(b, 66, 81, insts[i].imm[1]);
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker       pack_uint(b, 82, 84, insts[i].out[0].mthd);
109*61046927SAndroid Build Coastguard Worker       pack_uint(b, 85, 88, insts[i].out[0].emit);
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker       pack_uint(b, 89, 91, insts[i].out[1].mthd);
112*61046927SAndroid Build Coastguard Worker       pack_uint(b, 92, 95, insts[i].out[1].emit);
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker       /* Annoyingly, the words are reversed in the actual encoding */
115*61046927SAndroid Build Coastguard Worker       out[i * 3 + 2] = b[0];
116*61046927SAndroid Build Coastguard Worker       out[i * 3 + 1] = b[1];
117*61046927SAndroid Build Coastguard Worker       out[i * 3 + 0] = b[2];
118*61046927SAndroid Build Coastguard Worker    }
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker void
mme_tu104_decode(struct mme_tu104_inst * insts,const uint32_t * in,uint32_t inst_count)122*61046927SAndroid Build Coastguard Worker mme_tu104_decode(struct mme_tu104_inst *insts,
123*61046927SAndroid Build Coastguard Worker                  const uint32_t *in, uint32_t inst_count)
124*61046927SAndroid Build Coastguard Worker {
125*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < inst_count; i++) {
126*61046927SAndroid Build Coastguard Worker       /* Annoyingly, the words are reversed in the actual encoding */
127*61046927SAndroid Build Coastguard Worker       const uint32_t b[3] = {
128*61046927SAndroid Build Coastguard Worker          in[i * 3 + 2],
129*61046927SAndroid Build Coastguard Worker          in[i * 3 + 1],
130*61046927SAndroid Build Coastguard Worker          in[i * 3 + 0],
131*61046927SAndroid Build Coastguard Worker       };
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker       insts[i].end_next       = unpack_uint(b,  0,  0);
134*61046927SAndroid Build Coastguard Worker       insts[i].pred_mode      = unpack_uint(b,  1,  4);
135*61046927SAndroid Build Coastguard Worker       insts[i].pred           = unpack_uint(b,  5,  9);
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker       insts[i].alu[0].op      = unpack_uint(b, 10, 14);
138*61046927SAndroid Build Coastguard Worker       insts[i].alu[0].dst     = unpack_uint(b, 15, 19);
139*61046927SAndroid Build Coastguard Worker       insts[i].alu[0].src[0]  = unpack_uint(b, 20, 24);
140*61046927SAndroid Build Coastguard Worker       insts[i].alu[0].src[1]  = unpack_uint(b, 25, 29);
141*61046927SAndroid Build Coastguard Worker       insts[i].imm[0]         = unpack_uint(b, 30, 45);
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker       insts[i].alu[1].op      = unpack_uint(b, 46, 50);
144*61046927SAndroid Build Coastguard Worker       insts[i].alu[1].dst     = unpack_uint(b, 51, 55);
145*61046927SAndroid Build Coastguard Worker       insts[i].alu[1].src[0]  = unpack_uint(b, 56, 60);
146*61046927SAndroid Build Coastguard Worker       insts[i].alu[1].src[1]  = unpack_uint(b, 61, 65);
147*61046927SAndroid Build Coastguard Worker       insts[i].imm[1]         = unpack_uint(b, 66, 81);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker       insts[i].out[0].mthd    = unpack_uint(b, 82, 84);
150*61046927SAndroid Build Coastguard Worker       insts[i].out[0].emit    = unpack_uint(b, 85, 88);
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker       insts[i].out[1].mthd    = unpack_uint(b, 89, 91);
153*61046927SAndroid Build Coastguard Worker       insts[i].out[1].emit    = unpack_uint(b, 92, 95);
154*61046927SAndroid Build Coastguard Worker    }
155*61046927SAndroid Build Coastguard Worker }
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker static void
print_indent(FILE * fp,unsigned depth)158*61046927SAndroid Build Coastguard Worker print_indent(FILE *fp, unsigned depth)
159*61046927SAndroid Build Coastguard Worker {
160*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < depth; i++)
161*61046927SAndroid Build Coastguard Worker       fprintf(fp, "    ");
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker static bool
mme_tu104_alu_src_is_imm(const struct mme_tu104_inst * inst,unsigned alu_idx,unsigned src_idx,uint32_t * imm)165*61046927SAndroid Build Coastguard Worker mme_tu104_alu_src_is_imm(const struct mme_tu104_inst *inst,
166*61046927SAndroid Build Coastguard Worker                          unsigned alu_idx, unsigned src_idx,
167*61046927SAndroid Build Coastguard Worker                          uint32_t *imm)
168*61046927SAndroid Build Coastguard Worker {
169*61046927SAndroid Build Coastguard Worker    const enum mme_tu104_reg reg = inst->alu[alu_idx].src[src_idx];
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker    switch (reg) {
172*61046927SAndroid Build Coastguard Worker    case MME_TU104_REG_ZERO:
173*61046927SAndroid Build Coastguard Worker       *imm = 0;
174*61046927SAndroid Build Coastguard Worker       return true;
175*61046927SAndroid Build Coastguard Worker    case MME_TU104_REG_IMM:
176*61046927SAndroid Build Coastguard Worker       *imm = (int32_t)(int16_t)inst->imm[alu_idx];
177*61046927SAndroid Build Coastguard Worker       return true;
178*61046927SAndroid Build Coastguard Worker    case MME_TU104_REG_IMMPAIR:
179*61046927SAndroid Build Coastguard Worker       *imm = (int32_t)(int16_t)inst->imm[1 - alu_idx];
180*61046927SAndroid Build Coastguard Worker       return true;
181*61046927SAndroid Build Coastguard Worker    case MME_TU104_REG_IMM32:
182*61046927SAndroid Build Coastguard Worker       *imm = ((uint32_t)inst->imm[0] << 16) | inst->imm[1];
183*61046927SAndroid Build Coastguard Worker       return true;
184*61046927SAndroid Build Coastguard Worker    default:
185*61046927SAndroid Build Coastguard Worker       return false;
186*61046927SAndroid Build Coastguard Worker    }
187*61046927SAndroid Build Coastguard Worker }
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker static void
mme_tu104_print_alu_src(FILE * fp,const struct mme_tu104_inst * inst,unsigned alu_idx,unsigned src_idx)190*61046927SAndroid Build Coastguard Worker mme_tu104_print_alu_src(FILE *fp, const struct mme_tu104_inst *inst,
191*61046927SAndroid Build Coastguard Worker                         unsigned alu_idx, unsigned src_idx)
192*61046927SAndroid Build Coastguard Worker {
193*61046927SAndroid Build Coastguard Worker    const enum mme_tu104_reg reg = inst->alu[alu_idx].src[src_idx];
194*61046927SAndroid Build Coastguard Worker    if (reg <= MME_TU104_REG_R23) {
195*61046927SAndroid Build Coastguard Worker       fprintf(fp, " $r%u", (unsigned)reg);
196*61046927SAndroid Build Coastguard Worker    } else {
197*61046927SAndroid Build Coastguard Worker       switch (reg) {
198*61046927SAndroid Build Coastguard Worker       case MME_TU104_REG_ZERO:
199*61046927SAndroid Build Coastguard Worker          fprintf(fp, " $zero");
200*61046927SAndroid Build Coastguard Worker          break;
201*61046927SAndroid Build Coastguard Worker       case MME_TU104_REG_IMM:
202*61046927SAndroid Build Coastguard Worker          fprintf(fp, " %d /* 0x%04x */", (int)(int16_t)inst->imm[alu_idx],
203*61046927SAndroid Build Coastguard Worker                  (unsigned)inst->imm[alu_idx]);
204*61046927SAndroid Build Coastguard Worker          break;
205*61046927SAndroid Build Coastguard Worker       case MME_TU104_REG_IMMPAIR:
206*61046927SAndroid Build Coastguard Worker          fprintf(fp, " %d /* 0x%04x */", (int)(int16_t)inst->imm[1 - alu_idx],
207*61046927SAndroid Build Coastguard Worker                  (unsigned)inst->imm[1 - alu_idx]);
208*61046927SAndroid Build Coastguard Worker          break;
209*61046927SAndroid Build Coastguard Worker       case MME_TU104_REG_IMM32:
210*61046927SAndroid Build Coastguard Worker          fprintf(fp, " 0x%x", ((uint32_t)inst->imm[0] << 16) | inst->imm[1]);
211*61046927SAndroid Build Coastguard Worker          break;
212*61046927SAndroid Build Coastguard Worker       case MME_TU104_REG_LOAD0:
213*61046927SAndroid Build Coastguard Worker          fprintf(fp, " $load0");
214*61046927SAndroid Build Coastguard Worker          break;
215*61046927SAndroid Build Coastguard Worker       case MME_TU104_REG_LOAD1:
216*61046927SAndroid Build Coastguard Worker          fprintf(fp, " $load1");
217*61046927SAndroid Build Coastguard Worker          break;
218*61046927SAndroid Build Coastguard Worker       default:
219*61046927SAndroid Build Coastguard Worker          unreachable("Invalid ALU source register");
220*61046927SAndroid Build Coastguard Worker       }
221*61046927SAndroid Build Coastguard Worker    }
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker bool
mme_tu104_alu_op_has_implicit_imm(enum mme_tu104_alu_op op)225*61046927SAndroid Build Coastguard Worker mme_tu104_alu_op_has_implicit_imm(enum mme_tu104_alu_op op)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker    switch (op) {
228*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_MERGE:
229*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_LOOP:
230*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_JAL:
231*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLT:
232*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLTU:
233*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLE:
234*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLEU:
235*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BEQ:
236*61046927SAndroid Build Coastguard Worker       return true;
237*61046927SAndroid Build Coastguard Worker    default:
238*61046927SAndroid Build Coastguard Worker       return false;
239*61046927SAndroid Build Coastguard Worker    }
240*61046927SAndroid Build Coastguard Worker }
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker bool
mme_tu104_alu_op_has_side_effects(enum mme_tu104_alu_op op)243*61046927SAndroid Build Coastguard Worker mme_tu104_alu_op_has_side_effects(enum mme_tu104_alu_op op)
244*61046927SAndroid Build Coastguard Worker {
245*61046927SAndroid Build Coastguard Worker    return mme_tu104_alu_op_is_control_flow(op) ||
246*61046927SAndroid Build Coastguard Worker           op == MME_TU104_ALU_OP_EXTENDED ||
247*61046927SAndroid Build Coastguard Worker           op == MME_TU104_ALU_OP_DWRITE;
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker bool
mme_tu104_alu_op_is_control_flow(enum mme_tu104_alu_op op)251*61046927SAndroid Build Coastguard Worker mme_tu104_alu_op_is_control_flow(enum mme_tu104_alu_op op)
252*61046927SAndroid Build Coastguard Worker {
253*61046927SAndroid Build Coastguard Worker    switch (op) {
254*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_LOOP:
255*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_JAL:
256*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLT:
257*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLTU:
258*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLE:
259*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLEU:
260*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BEQ:
261*61046927SAndroid Build Coastguard Worker       return true;
262*61046927SAndroid Build Coastguard Worker    default:
263*61046927SAndroid Build Coastguard Worker       return false;
264*61046927SAndroid Build Coastguard Worker    }
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker bool
mme_tu104_alu_op_may_depend_on_mthd(enum mme_tu104_alu_op op)268*61046927SAndroid Build Coastguard Worker mme_tu104_alu_op_may_depend_on_mthd(enum mme_tu104_alu_op op)
269*61046927SAndroid Build Coastguard Worker {
270*61046927SAndroid Build Coastguard Worker    switch (op) {
271*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_EXTENDED:
272*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_STATE:
273*61046927SAndroid Build Coastguard Worker       return true;
274*61046927SAndroid Build Coastguard Worker    default:
275*61046927SAndroid Build Coastguard Worker       return false;
276*61046927SAndroid Build Coastguard Worker    }
277*61046927SAndroid Build Coastguard Worker }
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker bool
mme_tu104_alus_have_dependency(const struct mme_tu104_alu * first,const struct mme_tu104_alu * second)280*61046927SAndroid Build Coastguard Worker mme_tu104_alus_have_dependency(const struct mme_tu104_alu *first,
281*61046927SAndroid Build Coastguard Worker                                const struct mme_tu104_alu *second)
282*61046927SAndroid Build Coastguard Worker {
283*61046927SAndroid Build Coastguard Worker    if (first->dst != MME_TU104_REG_ZERO &&
284*61046927SAndroid Build Coastguard Worker        (first->dst == second->dst ||
285*61046927SAndroid Build Coastguard Worker         first->dst == second->src[0] ||
286*61046927SAndroid Build Coastguard Worker         first->dst == second->src[1]))
287*61046927SAndroid Build Coastguard Worker       return true;
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    /* TODO: This could be more detailed */
290*61046927SAndroid Build Coastguard Worker    if (first->op == MME_TU104_ALU_OP_DWRITE &&
291*61046927SAndroid Build Coastguard Worker        (second->op == MME_TU104_ALU_OP_DREAD ||
292*61046927SAndroid Build Coastguard Worker         second->op == MME_TU104_ALU_OP_DWRITE))
293*61046927SAndroid Build Coastguard Worker       return true;
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker    /* TODO: This could be more detailed */
296*61046927SAndroid Build Coastguard Worker    if (second->op == MME_TU104_ALU_OP_DWRITE &&
297*61046927SAndroid Build Coastguard Worker        (first->op == MME_TU104_ALU_OP_DREAD ||
298*61046927SAndroid Build Coastguard Worker         first->op == MME_TU104_ALU_OP_DWRITE))
299*61046927SAndroid Build Coastguard Worker       return true;
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    /* EXTENDED acts like a barrier between MME_DMA_READ_FIFOED and LOAD0/1 */
302*61046927SAndroid Build Coastguard Worker    if (first->op == MME_TU104_ALU_OP_EXTENDED &&
303*61046927SAndroid Build Coastguard Worker        (second->src[0] == MME_TU104_REG_LOAD0 ||
304*61046927SAndroid Build Coastguard Worker         second->src[0] == MME_TU104_REG_LOAD1 ||
305*61046927SAndroid Build Coastguard Worker         second->src[1] == MME_TU104_REG_LOAD0 ||
306*61046927SAndroid Build Coastguard Worker         second->src[1] == MME_TU104_REG_LOAD1))
307*61046927SAndroid Build Coastguard Worker       return true;
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker    return false;
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker static bool
mme_tu104_alu_is_branch(const struct mme_tu104_inst * inst,unsigned alu_idx,int * then_offset,unsigned * else_offset)313*61046927SAndroid Build Coastguard Worker mme_tu104_alu_is_branch(const struct mme_tu104_inst *inst, unsigned alu_idx,
314*61046927SAndroid Build Coastguard Worker                         int *then_offset, unsigned *else_offset)
315*61046927SAndroid Build Coastguard Worker {
316*61046927SAndroid Build Coastguard Worker    switch (inst->alu[alu_idx].op) {
317*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLT:
318*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLTU:
319*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLE:
320*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BLEU:
321*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_BEQ:
322*61046927SAndroid Build Coastguard Worker       *then_offset = util_mask_sign_extend(inst->imm[alu_idx], 14);
323*61046927SAndroid Build Coastguard Worker       *else_offset = (inst->imm[alu_idx] >> 14) & 0x3;
324*61046927SAndroid Build Coastguard Worker       return true;
325*61046927SAndroid Build Coastguard Worker    default:
326*61046927SAndroid Build Coastguard Worker       return false;
327*61046927SAndroid Build Coastguard Worker    }
328*61046927SAndroid Build Coastguard Worker }
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker static void
mme_tu104_print_alu(FILE * fp,unsigned indent,const struct mme_tu104_inst * inst,unsigned alu_idx)331*61046927SAndroid Build Coastguard Worker mme_tu104_print_alu(FILE *fp, unsigned indent,
332*61046927SAndroid Build Coastguard Worker                     const struct mme_tu104_inst *inst,
333*61046927SAndroid Build Coastguard Worker                     unsigned alu_idx)
334*61046927SAndroid Build Coastguard Worker {
335*61046927SAndroid Build Coastguard Worker    const struct mme_tu104_alu *alu = &inst->alu[alu_idx];
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker    const bool used_by_out =
338*61046927SAndroid Build Coastguard Worker       inst->out[0].mthd == MME_TU104_OUT_OP_ALU0 + alu_idx ||
339*61046927SAndroid Build Coastguard Worker       inst->out[0].emit == MME_TU104_OUT_OP_ALU0 + alu_idx ||
340*61046927SAndroid Build Coastguard Worker       inst->out[1].mthd == MME_TU104_OUT_OP_ALU0 + alu_idx ||
341*61046927SAndroid Build Coastguard Worker       inst->out[1].emit == MME_TU104_OUT_OP_ALU0 + alu_idx;
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker    if (!used_by_out && alu->dst == MME_TU104_REG_ZERO &&
344*61046927SAndroid Build Coastguard Worker        !mme_tu104_alu_op_has_side_effects(alu->op))
345*61046927SAndroid Build Coastguard Worker       return;
346*61046927SAndroid Build Coastguard Worker 
347*61046927SAndroid Build Coastguard Worker    print_indent(fp, indent);
348*61046927SAndroid Build Coastguard Worker 
349*61046927SAndroid Build Coastguard Worker    if (used_by_out || alu->dst != MME_TU104_REG_ZERO) {
350*61046927SAndroid Build Coastguard Worker       if (used_by_out)
351*61046927SAndroid Build Coastguard Worker          fprintf(fp, "$alu%u", alu_idx);
352*61046927SAndroid Build Coastguard Worker       if (alu->dst <= MME_TU104_REG_R23) {
353*61046927SAndroid Build Coastguard Worker          fprintf(fp, "%s$r%u", used_by_out ? ", " : "", (unsigned)alu->dst);
354*61046927SAndroid Build Coastguard Worker       } else {
355*61046927SAndroid Build Coastguard Worker          assert(alu->dst == MME_TU104_REG_ZERO);
356*61046927SAndroid Build Coastguard Worker       }
357*61046927SAndroid Build Coastguard Worker       fprintf(fp, " = ");
358*61046927SAndroid Build Coastguard Worker    }
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker    switch (alu->op) {
361*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_ADDC:
362*61046927SAndroid Build Coastguard Worker       assert(alu_idx == 1);
363*61046927SAndroid Build Coastguard Worker       fprintf(fp, "ADDC");
364*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 0);
365*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 1);
366*61046927SAndroid Build Coastguard Worker       fprintf(fp, " $carry");
367*61046927SAndroid Build Coastguard Worker       break;
368*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_SUBB:
369*61046927SAndroid Build Coastguard Worker       assert(alu_idx == 1);
370*61046927SAndroid Build Coastguard Worker       fprintf(fp, "SUBB");
371*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 0);
372*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 1);
373*61046927SAndroid Build Coastguard Worker       fprintf(fp, " $borrow");
374*61046927SAndroid Build Coastguard Worker       break;
375*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_MULH:
376*61046927SAndroid Build Coastguard Worker       assert(alu_idx == 1);
377*61046927SAndroid Build Coastguard Worker       assert(alu->src[0] == MME_TU104_REG_ZERO);
378*61046927SAndroid Build Coastguard Worker       assert(alu->src[1] == MME_TU104_REG_ZERO);
379*61046927SAndroid Build Coastguard Worker       fprintf(fp, "MULH $alu0");
380*61046927SAndroid Build Coastguard Worker       break;
381*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_MERGE: {
382*61046927SAndroid Build Coastguard Worker       uint16_t immed = inst->imm[alu_idx];
383*61046927SAndroid Build Coastguard Worker       uint32_t src_pos  = (immed >> 0)  & 0x1f;
384*61046927SAndroid Build Coastguard Worker       uint32_t bits     = (immed >> 5)  & 0x1f;
385*61046927SAndroid Build Coastguard Worker       uint32_t dst_pos  = (immed >> 10) & 0x3f;
386*61046927SAndroid Build Coastguard Worker       fprintf(fp, "MERGE");
387*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 0);
388*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 1);
389*61046927SAndroid Build Coastguard Worker       fprintf(fp, " (%u, %u, %u)", dst_pos, bits, src_pos);
390*61046927SAndroid Build Coastguard Worker       break;
391*61046927SAndroid Build Coastguard Worker    }
392*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_STATE: {
393*61046927SAndroid Build Coastguard Worker       fprintf(fp, "STATE");
394*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 0);
395*61046927SAndroid Build Coastguard Worker       if (alu->src[1] != MME_TU104_REG_ZERO) {
396*61046927SAndroid Build Coastguard Worker          fprintf(fp, " +");
397*61046927SAndroid Build Coastguard Worker          mme_tu104_print_alu_src(fp, inst, alu_idx, 1);
398*61046927SAndroid Build Coastguard Worker       }
399*61046927SAndroid Build Coastguard Worker       uint32_t imm;
400*61046927SAndroid Build Coastguard Worker       if (mme_tu104_alu_src_is_imm(inst, alu_idx, 0, &imm)) {
401*61046927SAndroid Build Coastguard Worker          uint32_t mthd = imm << 2;
402*61046927SAndroid Build Coastguard Worker          fprintf(fp, " /* %s", P_PARSE_NVC597_MTHD(mthd));
403*61046927SAndroid Build Coastguard Worker          if (alu->src[1] != MME_TU104_REG_ZERO) {
404*61046927SAndroid Build Coastguard Worker             fprintf(fp, " +");
405*61046927SAndroid Build Coastguard Worker             mme_tu104_print_alu_src(fp, inst, alu_idx, 1);
406*61046927SAndroid Build Coastguard Worker          }
407*61046927SAndroid Build Coastguard Worker          fprintf(fp, " */");
408*61046927SAndroid Build Coastguard Worker       }
409*61046927SAndroid Build Coastguard Worker       break;
410*61046927SAndroid Build Coastguard Worker    }
411*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_JAL:
412*61046927SAndroid Build Coastguard Worker       assert(alu->src[0] == MME_TU104_REG_ZERO);
413*61046927SAndroid Build Coastguard Worker       assert(alu->src[1] == MME_TU104_REG_ZERO);
414*61046927SAndroid Build Coastguard Worker       fprintf(fp, "JAL (0x%04x)", (unsigned)inst->imm[alu_idx]);
415*61046927SAndroid Build Coastguard Worker       break;
416*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_LOOP:
417*61046927SAndroid Build Coastguard Worker    case MME_TU104_ALU_OP_DREAD:
418*61046927SAndroid Build Coastguard Worker       fprintf(fp, "%s", mme_tu104_alu_op_to_str(alu->op));
419*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 0);
420*61046927SAndroid Build Coastguard Worker       assert(alu->src[1] == MME_TU104_REG_ZERO);
421*61046927SAndroid Build Coastguard Worker       break;
422*61046927SAndroid Build Coastguard Worker    default:
423*61046927SAndroid Build Coastguard Worker       fprintf(fp, "%s", mme_tu104_alu_op_to_str(alu->op));
424*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 0);
425*61046927SAndroid Build Coastguard Worker       mme_tu104_print_alu_src(fp, inst, alu_idx, 1);
426*61046927SAndroid Build Coastguard Worker       break;
427*61046927SAndroid Build Coastguard Worker    }
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker    int then_offset;
430*61046927SAndroid Build Coastguard Worker    unsigned else_offset;
431*61046927SAndroid Build Coastguard Worker    if (mme_tu104_alu_is_branch(inst, alu_idx, &then_offset, &else_offset))
432*61046927SAndroid Build Coastguard Worker       fprintf(fp, " (%d, %u)", then_offset, else_offset);
433*61046927SAndroid Build Coastguard Worker 
434*61046927SAndroid Build Coastguard Worker    if (alu->op == MME_TU104_ALU_OP_LOOP)
435*61046927SAndroid Build Coastguard Worker       fprintf(fp, " (%d)", (unsigned)inst->imm[alu_idx]);
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker    fprintf(fp, "\n");
438*61046927SAndroid Build Coastguard Worker }
439*61046927SAndroid Build Coastguard Worker 
440*61046927SAndroid Build Coastguard Worker static bool
mme_tu104_out_is_imm(const struct mme_tu104_inst * inst,enum mme_tu104_out_op op,uint32_t * imm)441*61046927SAndroid Build Coastguard Worker mme_tu104_out_is_imm(const struct mme_tu104_inst *inst,
442*61046927SAndroid Build Coastguard Worker                      enum mme_tu104_out_op op, uint32_t *imm)
443*61046927SAndroid Build Coastguard Worker {
444*61046927SAndroid Build Coastguard Worker    switch (op) {
445*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMM0:
446*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMM1:
447*61046927SAndroid Build Coastguard Worker       *imm = inst->imm[op - MME_TU104_OUT_OP_IMM0];
448*61046927SAndroid Build Coastguard Worker       return true;
449*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMMHIGH0:
450*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMMHIGH1:
451*61046927SAndroid Build Coastguard Worker       *imm = inst->imm[op - MME_TU104_OUT_OP_IMMHIGH0] >> 12;
452*61046927SAndroid Build Coastguard Worker       return true;
453*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMM32:
454*61046927SAndroid Build Coastguard Worker       *imm = ((uint32_t)inst->imm[0] << 16) | inst->imm[1];
455*61046927SAndroid Build Coastguard Worker       return true;
456*61046927SAndroid Build Coastguard Worker    default:
457*61046927SAndroid Build Coastguard Worker       return false;
458*61046927SAndroid Build Coastguard Worker    }
459*61046927SAndroid Build Coastguard Worker }
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker static void
mme_tu104_print_out_src(FILE * fp,const struct mme_tu104_inst * inst,enum mme_tu104_out_op op)462*61046927SAndroid Build Coastguard Worker mme_tu104_print_out_src(FILE *fp, const struct mme_tu104_inst *inst,
463*61046927SAndroid Build Coastguard Worker                         enum mme_tu104_out_op op)
464*61046927SAndroid Build Coastguard Worker {
465*61046927SAndroid Build Coastguard Worker    switch (op) {
466*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_ALU0:
467*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_ALU1:
468*61046927SAndroid Build Coastguard Worker       fprintf(fp, "$alu%u", (int)op - MME_TU104_OUT_OP_ALU0);
469*61046927SAndroid Build Coastguard Worker       break;
470*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_LOAD0:
471*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_LOAD1:
472*61046927SAndroid Build Coastguard Worker       fprintf(fp, "$load%u", (int)op - MME_TU104_OUT_OP_LOAD0);
473*61046927SAndroid Build Coastguard Worker       break;
474*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMM0:
475*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMM1:
476*61046927SAndroid Build Coastguard Worker       fprintf(fp, "0x%x", (unsigned)inst->imm[op - MME_TU104_OUT_OP_IMM0]);
477*61046927SAndroid Build Coastguard Worker       break;
478*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_RESERVED:
479*61046927SAndroid Build Coastguard Worker       fprintf(fp, "RESERVED");
480*61046927SAndroid Build Coastguard Worker       break;
481*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMMHIGH0:
482*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMMHIGH1:
483*61046927SAndroid Build Coastguard Worker       fprintf(fp, "%u",
484*61046927SAndroid Build Coastguard Worker               (unsigned)(inst->imm[op - MME_TU104_OUT_OP_IMMHIGH0] >> 12));
485*61046927SAndroid Build Coastguard Worker       break;
486*61046927SAndroid Build Coastguard Worker    case MME_TU104_OUT_OP_IMM32:
487*61046927SAndroid Build Coastguard Worker       fprintf(fp, "0x%x", ((uint32_t)inst->imm[0] << 16) | inst->imm[1]);
488*61046927SAndroid Build Coastguard Worker       break;
489*61046927SAndroid Build Coastguard Worker    default:
490*61046927SAndroid Build Coastguard Worker       unreachable("Invalid output source");
491*61046927SAndroid Build Coastguard Worker    }
492*61046927SAndroid Build Coastguard Worker };
493*61046927SAndroid Build Coastguard Worker 
494*61046927SAndroid Build Coastguard Worker static void
mme_tu104_print_out(FILE * fp,unsigned indent,const struct mme_tu104_inst * inst,unsigned out_idx)495*61046927SAndroid Build Coastguard Worker mme_tu104_print_out(FILE *fp, unsigned indent,
496*61046927SAndroid Build Coastguard Worker                     const struct mme_tu104_inst *inst,
497*61046927SAndroid Build Coastguard Worker                     unsigned out_idx)
498*61046927SAndroid Build Coastguard Worker {
499*61046927SAndroid Build Coastguard Worker    const struct mme_tu104_out *out = &inst->out[out_idx];
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker    if (out->mthd != MME_TU104_OUT_OP_NONE) {
502*61046927SAndroid Build Coastguard Worker       print_indent(fp, indent);
503*61046927SAndroid Build Coastguard Worker       fprintf(fp, "mthd(");
504*61046927SAndroid Build Coastguard Worker       uint32_t imm;
505*61046927SAndroid Build Coastguard Worker       if (mme_tu104_out_is_imm(inst, out->mthd, &imm)) {
506*61046927SAndroid Build Coastguard Worker          uint32_t mthd = (imm & 0xfff) << 2;
507*61046927SAndroid Build Coastguard Worker          uint32_t incr = imm >> 12;
508*61046927SAndroid Build Coastguard Worker          fprintf(fp, "0x%04x, %u)", mthd, incr);
509*61046927SAndroid Build Coastguard Worker          fprintf(fp, " /* %s */", P_PARSE_NVC597_MTHD(mthd));
510*61046927SAndroid Build Coastguard Worker       } else {
511*61046927SAndroid Build Coastguard Worker          mme_tu104_print_out_src(fp, inst, out->mthd);
512*61046927SAndroid Build Coastguard Worker          fprintf(fp, ")");
513*61046927SAndroid Build Coastguard Worker       }
514*61046927SAndroid Build Coastguard Worker       fprintf(fp, "\n");
515*61046927SAndroid Build Coastguard Worker    }
516*61046927SAndroid Build Coastguard Worker    if (out->emit != MME_TU104_OUT_OP_NONE) {
517*61046927SAndroid Build Coastguard Worker       print_indent(fp, indent);
518*61046927SAndroid Build Coastguard Worker       fprintf(fp, "emit(");
519*61046927SAndroid Build Coastguard Worker       mme_tu104_print_out_src(fp, inst, out->emit);
520*61046927SAndroid Build Coastguard Worker       fprintf(fp, ")\n");
521*61046927SAndroid Build Coastguard Worker    }
522*61046927SAndroid Build Coastguard Worker }
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker void
mme_tu104_print_inst(FILE * fp,unsigned indent,const struct mme_tu104_inst * inst)525*61046927SAndroid Build Coastguard Worker mme_tu104_print_inst(FILE *fp, unsigned indent,
526*61046927SAndroid Build Coastguard Worker                      const struct mme_tu104_inst *inst)
527*61046927SAndroid Build Coastguard Worker {
528*61046927SAndroid Build Coastguard Worker    if (inst->pred_mode != MME_TU104_PRED_UUUU) {
529*61046927SAndroid Build Coastguard Worker       print_indent(fp, indent);
530*61046927SAndroid Build Coastguard Worker       fprintf(fp, "pred %s", mme_tu104_pred_to_str(inst->pred_mode));
531*61046927SAndroid Build Coastguard Worker       fprintf(fp, " $r%u {\n", (unsigned)inst->pred);
532*61046927SAndroid Build Coastguard Worker       indent++;
533*61046927SAndroid Build Coastguard Worker    }
534*61046927SAndroid Build Coastguard Worker 
535*61046927SAndroid Build Coastguard Worker    mme_tu104_print_alu(fp, indent, inst, 0);
536*61046927SAndroid Build Coastguard Worker    mme_tu104_print_alu(fp, indent, inst, 1);
537*61046927SAndroid Build Coastguard Worker    mme_tu104_print_out(fp, indent, inst, 0);
538*61046927SAndroid Build Coastguard Worker    mme_tu104_print_out(fp, indent, inst, 1);
539*61046927SAndroid Build Coastguard Worker 
540*61046927SAndroid Build Coastguard Worker    if (inst->pred_mode != MME_TU104_PRED_UUUU) {
541*61046927SAndroid Build Coastguard Worker       indent--;
542*61046927SAndroid Build Coastguard Worker       print_indent(fp, indent);
543*61046927SAndroid Build Coastguard Worker       fprintf(fp, "}\n");
544*61046927SAndroid Build Coastguard Worker    }
545*61046927SAndroid Build Coastguard Worker }
546*61046927SAndroid Build Coastguard Worker 
547*61046927SAndroid Build Coastguard Worker void
mme_tu104_print(FILE * fp,const struct mme_tu104_inst * insts,uint32_t inst_count)548*61046927SAndroid Build Coastguard Worker mme_tu104_print(FILE *fp, const struct mme_tu104_inst *insts,
549*61046927SAndroid Build Coastguard Worker                 uint32_t inst_count)
550*61046927SAndroid Build Coastguard Worker {
551*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < inst_count; i++) {
552*61046927SAndroid Build Coastguard Worker       fprintf(fp, "%u:\n", i);
553*61046927SAndroid Build Coastguard Worker       mme_tu104_print_inst(fp, 1, &insts[i]);
554*61046927SAndroid Build Coastguard Worker    }
555*61046927SAndroid Build Coastguard Worker }
556*61046927SAndroid Build Coastguard Worker 
557*61046927SAndroid Build Coastguard Worker void
mme_tu104_dump(FILE * fp,uint32_t * encoded,size_t encoded_size)558*61046927SAndroid Build Coastguard Worker mme_tu104_dump(FILE *fp, uint32_t *encoded, size_t encoded_size)
559*61046927SAndroid Build Coastguard Worker {
560*61046927SAndroid Build Coastguard Worker    uint32_t inst_count = encoded_size / 12;
561*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < inst_count; i++) {
562*61046927SAndroid Build Coastguard Worker       struct mme_tu104_inst inst;
563*61046927SAndroid Build Coastguard Worker       mme_tu104_decode(&inst, &encoded[i * 3], 1);
564*61046927SAndroid Build Coastguard Worker       mme_tu104_print_inst(fp, 1, &inst);
565*61046927SAndroid Build Coastguard Worker    }
566*61046927SAndroid Build Coastguard Worker }
567