xref: /aosp_15_r20/external/mesa3d/src/panfrost/compiler/bi_printer.c.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker#
2*61046927SAndroid Build Coastguard Worker# Copyright (C) 2020 Collabora, Ltd.
3*61046927SAndroid Build Coastguard Worker#
4*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker# Software is 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
18*61046927SAndroid Build Coastguard Worker# THE 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
20*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker# IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard WorkerTEMPLATE = """#include <stdio.h>
24*61046927SAndroid Build Coastguard Worker#include "compiler.h"
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Workerstatic const char *
27*61046927SAndroid Build Coastguard Workerbi_swizzle_as_str(enum bi_swizzle swz)
28*61046927SAndroid Build Coastguard Worker{
29*61046927SAndroid Build Coastguard Worker        switch (swz) {
30*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_H00: return ".h00";
31*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_H01: return "";
32*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_H10: return ".h10";
33*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_H11: return ".h11";
34*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B0000: return ".b0";
35*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B1111: return ".b1";
36*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B2222: return ".b2";
37*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B3333: return ".b3";
38*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B0011: return ".b0011";
39*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B2233: return ".b2233";
40*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B1032: return ".b1032";
41*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B3210: return ".b3210";
42*61046927SAndroid Build Coastguard Worker        case BI_SWIZZLE_B0022: return ".b0022";
43*61046927SAndroid Build Coastguard Worker        }
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker        unreachable("Invalid swizzle");
46*61046927SAndroid Build Coastguard Worker}
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Workerstatic const char *
49*61046927SAndroid Build Coastguard Workerbir_fau_name(unsigned fau_idx)
50*61046927SAndroid Build Coastguard Worker{
51*61046927SAndroid Build Coastguard Worker    const char *names[] = {
52*61046927SAndroid Build Coastguard Worker            "zero", "lane-id", "wrap-id", "core-id", "fb-extent",
53*61046927SAndroid Build Coastguard Worker            "atest-param", "sample-pos", "reserved",
54*61046927SAndroid Build Coastguard Worker            "blend_descriptor_0", "blend_descriptor_1",
55*61046927SAndroid Build Coastguard Worker            "blend_descriptor_2", "blend_descriptor_3",
56*61046927SAndroid Build Coastguard Worker            "blend_descriptor_4", "blend_descriptor_5",
57*61046927SAndroid Build Coastguard Worker            "blend_descriptor_6", "blend_descriptor_7",
58*61046927SAndroid Build Coastguard Worker            "tls_ptr", "wls_ptr", "program_counter",
59*61046927SAndroid Build Coastguard Worker    };
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker    assert(fau_idx < ARRAY_SIZE(names));
62*61046927SAndroid Build Coastguard Worker    return names[fau_idx];
63*61046927SAndroid Build Coastguard Worker}
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Workerstatic const char *
66*61046927SAndroid Build Coastguard Workerbir_passthrough_name(unsigned idx)
67*61046927SAndroid Build Coastguard Worker{
68*61046927SAndroid Build Coastguard Worker    const char *names[] = {
69*61046927SAndroid Build Coastguard Worker            "s0", "s1", "s2", "t", "fau.x", "fau.y", "t0", "t1"
70*61046927SAndroid Build Coastguard Worker    };
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker    assert(idx < ARRAY_SIZE(names));
73*61046927SAndroid Build Coastguard Worker    return names[idx];
74*61046927SAndroid Build Coastguard Worker}
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Workerstatic void
77*61046927SAndroid Build Coastguard Workerbi_print_index(FILE *fp, bi_index index)
78*61046927SAndroid Build Coastguard Worker{
79*61046927SAndroid Build Coastguard Worker    if (index.discard)
80*61046927SAndroid Build Coastguard Worker        fputs("^", fp);
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker    if (bi_is_null(index))
83*61046927SAndroid Build Coastguard Worker        fprintf(fp, "_");
84*61046927SAndroid Build Coastguard Worker    else if (index.type == BI_INDEX_CONSTANT)
85*61046927SAndroid Build Coastguard Worker        fprintf(fp, "#0x%x", index.value);
86*61046927SAndroid Build Coastguard Worker    else if (index.type == BI_INDEX_FAU && index.value >= BIR_FAU_UNIFORM)
87*61046927SAndroid Build Coastguard Worker        fprintf(fp, "u%u", index.value & ~BIR_FAU_UNIFORM);
88*61046927SAndroid Build Coastguard Worker    else if (index.type == BI_INDEX_FAU)
89*61046927SAndroid Build Coastguard Worker        fprintf(fp, "%s", bir_fau_name(index.value));
90*61046927SAndroid Build Coastguard Worker    else if (index.type == BI_INDEX_PASS)
91*61046927SAndroid Build Coastguard Worker        fprintf(fp, "%s", bir_passthrough_name(index.value));
92*61046927SAndroid Build Coastguard Worker    else if (index.type == BI_INDEX_REGISTER)
93*61046927SAndroid Build Coastguard Worker        fprintf(fp, "r%u", index.value);
94*61046927SAndroid Build Coastguard Worker    else if (index.type == BI_INDEX_NORMAL)
95*61046927SAndroid Build Coastguard Worker        fprintf(fp, "%u", index.value);
96*61046927SAndroid Build Coastguard Worker    else
97*61046927SAndroid Build Coastguard Worker        unreachable("Invalid index");
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker    if (index.offset)
100*61046927SAndroid Build Coastguard Worker        fprintf(fp, "[%u]", index.offset);
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker    if (index.abs)
103*61046927SAndroid Build Coastguard Worker        fputs(".abs", fp);
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker    if (index.neg)
106*61046927SAndroid Build Coastguard Worker        fputs(".neg", fp);
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker    fputs(bi_swizzle_as_str(index.swizzle), fp);
109*61046927SAndroid Build Coastguard Worker}
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker% for mod in sorted(modifiers):
112*61046927SAndroid Build Coastguard Worker% if len(modifiers[mod]) > 2: # otherwise just boolean
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard WorkerUNUSED static inline const char *
115*61046927SAndroid Build Coastguard Workerbi_${mod}_as_str(enum bi_${mod} ${mod})
116*61046927SAndroid Build Coastguard Worker{
117*61046927SAndroid Build Coastguard Worker    switch (${mod}) {
118*61046927SAndroid Build Coastguard Worker% for i, state in enumerate(sorted(modifiers[mod])):
119*61046927SAndroid Build Coastguard Worker% if state == "none":
120*61046927SAndroid Build Coastguard Worker    case BI_${mod.upper()}_NONE: return "";
121*61046927SAndroid Build Coastguard Worker% elif state != "reserved":
122*61046927SAndroid Build Coastguard Worker    case BI_${mod.upper()}_${state.upper()}: return ".${state.lower()}";
123*61046927SAndroid Build Coastguard Worker% endif
124*61046927SAndroid Build Coastguard Worker% endfor
125*61046927SAndroid Build Coastguard Worker    }
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker    unreachable("Invalid ${mod}");
128*61046927SAndroid Build Coastguard Worker};
129*61046927SAndroid Build Coastguard Worker% endif
130*61046927SAndroid Build Coastguard Worker% endfor
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker<%def name="print_modifiers(mods, table)">
133*61046927SAndroid Build Coastguard Worker    % for mod in mods:
134*61046927SAndroid Build Coastguard Worker    % if mod not in ["lane_dest"]:
135*61046927SAndroid Build Coastguard Worker    % if len(table[mod]) > 2:
136*61046927SAndroid Build Coastguard Worker        fputs(bi_${mod}_as_str(I->${mod}), fp);
137*61046927SAndroid Build Coastguard Worker    % else:
138*61046927SAndroid Build Coastguard Worker        if (I->${mod}) fputs(".${mod}", fp);
139*61046927SAndroid Build Coastguard Worker    % endif
140*61046927SAndroid Build Coastguard Worker    % endif
141*61046927SAndroid Build Coastguard Worker    % endfor
142*61046927SAndroid Build Coastguard Worker</%def>
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker<%def name="print_source_modifiers(mods, src, table)">
145*61046927SAndroid Build Coastguard Worker    % for mod in mods:
146*61046927SAndroid Build Coastguard Worker    % if mod[0:-1] not in ["lane", "lanes", "replicate", "swz", "widen", "swap", "abs", "neg", "sign", "not"]:
147*61046927SAndroid Build Coastguard Worker    % if len(table[mod[0:-1]]) > 2:
148*61046927SAndroid Build Coastguard Worker        fputs(bi_${mod[0:-1]}_as_str(I->${mod[0:-1]}[${src}]), fp);
149*61046927SAndroid Build Coastguard Worker    % elif mod == "bytes2":
150*61046927SAndroid Build Coastguard Worker        if (I->bytes2) fputs(".bytes", fp);
151*61046927SAndroid Build Coastguard Worker    % else:
152*61046927SAndroid Build Coastguard Worker        if (I->${mod[0:-1]}[${src}]) fputs(".${mod[0:-1]}", fp);
153*61046927SAndroid Build Coastguard Worker    % endif
154*61046927SAndroid Build Coastguard Worker    %endif
155*61046927SAndroid Build Coastguard Worker    % endfor
156*61046927SAndroid Build Coastguard Worker</%def>
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Workervoid
159*61046927SAndroid Build Coastguard Workerbi_print_instr(const bi_instr *I, FILE *fp)
160*61046927SAndroid Build Coastguard Worker{
161*61046927SAndroid Build Coastguard Worker    fputs("   ", fp);
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker    bi_foreach_dest(I, d) {
164*61046927SAndroid Build Coastguard Worker        if (d > 0) fprintf(fp, ", ");
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard Worker        bi_print_index(fp, I->dest[d]);
167*61046927SAndroid Build Coastguard Worker    }
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker    if (I->nr_dests > 0)
170*61046927SAndroid Build Coastguard Worker        fputs(" = ", fp);
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard Worker    fprintf(fp, "%s", bi_opcode_props[I->op].name);
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker    if (I->table)
175*61046927SAndroid Build Coastguard Worker        fprintf(fp, ".table%u", I->table);
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker    if (I->flow)
178*61046927SAndroid Build Coastguard Worker        fprintf(fp, ".flow%u", I->flow);
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker    if (I->op == BI_OPCODE_COLLECT_I32 || I->op == BI_OPCODE_PHI) {
181*61046927SAndroid Build Coastguard Worker        for (unsigned i = 0; i < I->nr_srcs; ++i) {
182*61046927SAndroid Build Coastguard Worker            if (i > 0)
183*61046927SAndroid Build Coastguard Worker                fputs(", ", fp);
184*61046927SAndroid Build Coastguard Worker            else
185*61046927SAndroid Build Coastguard Worker                fputs(" ", fp);
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker            bi_print_index(fp, I->src[i]);
188*61046927SAndroid Build Coastguard Worker        }
189*61046927SAndroid Build Coastguard Worker    }
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker    switch (I->op) {
192*61046927SAndroid Build Coastguard Worker% for opcode in ops:
193*61046927SAndroid Build Coastguard Worker<%
194*61046927SAndroid Build Coastguard Worker    # Extract modifiers that are not per-source
195*61046927SAndroid Build Coastguard Worker    root_modifiers = [x for x in ops[opcode]["modifiers"] if x[-1] not in "0123"]
196*61046927SAndroid Build Coastguard Worker%>
197*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_${opcode.replace('.', '_').upper()}:
198*61046927SAndroid Build Coastguard Worker        ${print_modifiers(root_modifiers, modifiers)}
199*61046927SAndroid Build Coastguard Worker        fputs(" ", fp);
200*61046927SAndroid Build Coastguard Worker    % for src in range(src_count(ops[opcode])):
201*61046927SAndroid Build Coastguard Worker    % if src > 0:
202*61046927SAndroid Build Coastguard Worker        fputs(", ", fp);
203*61046927SAndroid Build Coastguard Worker    % endif
204*61046927SAndroid Build Coastguard Worker        bi_print_index(fp, I->src[${src}]);
205*61046927SAndroid Build Coastguard Worker        ${print_source_modifiers([m for m in ops[opcode]["modifiers"] if m[-1] == str(src)], src, modifiers)}
206*61046927SAndroid Build Coastguard Worker    % endfor
207*61046927SAndroid Build Coastguard Worker    % for imm in ops[opcode]["immediates"]:
208*61046927SAndroid Build Coastguard Worker        fprintf(fp, ", ${imm}:%u", I->${imm});
209*61046927SAndroid Build Coastguard Worker    % endfor
210*61046927SAndroid Build Coastguard Worker        break;
211*61046927SAndroid Build Coastguard Worker% endfor
212*61046927SAndroid Build Coastguard Worker    default:
213*61046927SAndroid Build Coastguard Worker        unreachable("Invalid opcode");
214*61046927SAndroid Build Coastguard Worker    }
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard Worker    if (I->branch_target)
217*61046927SAndroid Build Coastguard Worker            fprintf(fp, " -> block%u", I->branch_target->index);
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker    fputs("\\n", fp);
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker}"""
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Workerimport sys
224*61046927SAndroid Build Coastguard Workerfrom bifrost_isa import *
225*61046927SAndroid Build Coastguard Workerfrom mako.template import Template
226*61046927SAndroid Build Coastguard Worker
227*61046927SAndroid Build Coastguard Workerinstructions = {}
228*61046927SAndroid Build Coastguard Workerfor arg in sys.argv[1:]:
229*61046927SAndroid Build Coastguard Worker    new_instructions = parse_instructions(arg, include_pseudo = True)
230*61046927SAndroid Build Coastguard Worker    instructions.update(new_instructions)
231*61046927SAndroid Build Coastguard Worker
232*61046927SAndroid Build Coastguard Workerir_instructions = partition_mnemonics(instructions)
233*61046927SAndroid Build Coastguard Workermodifier_lists = order_modifiers(ir_instructions)
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Workerprint(Template(COPYRIGHT + TEMPLATE).render(ops = ir_instructions, modifiers = modifier_lists, src_count = src_count))
236