xref: /aosp_15_r20/external/mesa3d/src/asahi/compiler/agx_builder.h.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Workertemplate = """/*
2*61046927SAndroid Build Coastguard Worker * Copyright 2021 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker#ifndef _AGX_BUILDER_
7*61046927SAndroid Build Coastguard Worker#define _AGX_BUILDER_
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker#include "agx_compiler.h"
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Workerstatic inline agx_instr *
12*61046927SAndroid Build Coastguard Workeragx_alloc_instr(agx_builder *b, enum agx_opcode op, uint8_t nr_dests, uint8_t nr_srcs)
13*61046927SAndroid Build Coastguard Worker{
14*61046927SAndroid Build Coastguard Worker   size_t size = sizeof(agx_instr);
15*61046927SAndroid Build Coastguard Worker   size += sizeof(agx_index) * nr_dests;
16*61046927SAndroid Build Coastguard Worker   size += sizeof(agx_index) * nr_srcs;
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker   agx_instr *I = (agx_instr *) rzalloc_size(b->shader, size);
19*61046927SAndroid Build Coastguard Worker   I->dest = (agx_index *) (I + 1);
20*61046927SAndroid Build Coastguard Worker   I->src = I->dest + nr_dests;
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker   I->op = op;
23*61046927SAndroid Build Coastguard Worker   I->nr_dests = nr_dests;
24*61046927SAndroid Build Coastguard Worker   I->nr_srcs = nr_srcs;
25*61046927SAndroid Build Coastguard Worker   return I;
26*61046927SAndroid Build Coastguard Worker}
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker% for opcode in opcodes:
29*61046927SAndroid Build Coastguard Worker<%
30*61046927SAndroid Build Coastguard Worker   op = opcodes[opcode]
31*61046927SAndroid Build Coastguard Worker   dests = op.dests
32*61046927SAndroid Build Coastguard Worker   srcs = op.srcs
33*61046927SAndroid Build Coastguard Worker   imms = [x for x in op.imms if (x.name != 'scoreboard' or opcode == 'wait')]
34*61046927SAndroid Build Coastguard Worker   suffix = "_to" if dests > 0 else ""
35*61046927SAndroid Build Coastguard Worker   nr_dests = "nr_dests" if op.variable_dests else str(dests)
36*61046927SAndroid Build Coastguard Worker   nr_srcs = "nr_srcs" if op.variable_srcs else str(srcs)
37*61046927SAndroid Build Coastguard Worker%>
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Workerstatic inline agx_instr *
40*61046927SAndroid Build Coastguard Workeragx_${opcode}${suffix}(agx_builder *b
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker% if op.variable_dests:
43*61046927SAndroid Build Coastguard Worker   , unsigned nr_dests
44*61046927SAndroid Build Coastguard Worker% endif
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker% for dest in range(dests):
47*61046927SAndroid Build Coastguard Worker   , agx_index dst${dest}
48*61046927SAndroid Build Coastguard Worker% endfor
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker% if op.variable_srcs:
51*61046927SAndroid Build Coastguard Worker   , unsigned nr_srcs
52*61046927SAndroid Build Coastguard Worker% endif
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker% for src in range(srcs):
55*61046927SAndroid Build Coastguard Worker   , agx_index src${src}
56*61046927SAndroid Build Coastguard Worker% endfor
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker% for imm in imms:
59*61046927SAndroid Build Coastguard Worker   , ${imm.ctype} ${imm.name}
60*61046927SAndroid Build Coastguard Worker% endfor
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker) {
63*61046927SAndroid Build Coastguard Worker   agx_instr *I = agx_alloc_instr(b, AGX_OPCODE_${opcode.upper()}, ${nr_dests}, ${nr_srcs});
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker% for dest in range(dests):
66*61046927SAndroid Build Coastguard Worker   I->dest[${dest}] = dst${dest};
67*61046927SAndroid Build Coastguard Worker% endfor
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker% for src in range(srcs):
70*61046927SAndroid Build Coastguard Worker   I->src[${src}] = src${src};
71*61046927SAndroid Build Coastguard Worker% endfor
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker% for imm in imms:
74*61046927SAndroid Build Coastguard Worker   I->${imm.name} = ${imm.name};
75*61046927SAndroid Build Coastguard Worker% endfor
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker   agx_builder_insert(&b->cursor, I);
78*61046927SAndroid Build Coastguard Worker   return I;
79*61046927SAndroid Build Coastguard Worker}
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker% if dests == 1 and not op.variable_srcs and not op.variable_dests:
82*61046927SAndroid Build Coastguard Workerstatic inline agx_index
83*61046927SAndroid Build Coastguard Workeragx_${opcode}(agx_builder *b
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker% if srcs == 0:
86*61046927SAndroid Build Coastguard Worker   , unsigned size
87*61046927SAndroid Build Coastguard Worker% endif
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Worker% for src in range(srcs):
90*61046927SAndroid Build Coastguard Worker   , agx_index src${src}
91*61046927SAndroid Build Coastguard Worker% endfor
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker% for imm in imms:
94*61046927SAndroid Build Coastguard Worker   , ${imm.ctype} ${imm.name}
95*61046927SAndroid Build Coastguard Worker% endfor
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker) {
98*61046927SAndroid Build Coastguard Worker<%
99*61046927SAndroid Build Coastguard Worker   args = ["tmp"]
100*61046927SAndroid Build Coastguard Worker   args += ["src" + str(i) for i in range(srcs)]
101*61046927SAndroid Build Coastguard Worker   args += [imm.name for imm in imms]
102*61046927SAndroid Build Coastguard Worker%>
103*61046927SAndroid Build Coastguard Worker% if srcs == 0:
104*61046927SAndroid Build Coastguard Worker   agx_index tmp = agx_temp(b->shader, agx_size_for_bits(size));
105*61046927SAndroid Build Coastguard Worker% else:
106*61046927SAndroid Build Coastguard Worker   agx_index tmp = agx_temp(b->shader, src0.size);
107*61046927SAndroid Build Coastguard Worker% endif
108*61046927SAndroid Build Coastguard Worker   agx_${opcode}_to(b, ${", ".join(args)});
109*61046927SAndroid Build Coastguard Worker   return tmp;
110*61046927SAndroid Build Coastguard Worker}
111*61046927SAndroid Build Coastguard Worker% endif
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker% endfor
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker/* Convenience methods */
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Workerenum agx_bitop_table {
118*61046927SAndroid Build Coastguard Worker   AGX_BITOP_NOR   = 0x1,
119*61046927SAndroid Build Coastguard Worker   AGX_BITOP_ANDN2 = 0x2,
120*61046927SAndroid Build Coastguard Worker   AGX_BITOP_ANDN1 = 0x4,
121*61046927SAndroid Build Coastguard Worker   AGX_BITOP_NOT   = 0x5,
122*61046927SAndroid Build Coastguard Worker   AGX_BITOP_XOR   = 0x6,
123*61046927SAndroid Build Coastguard Worker   AGX_BITOP_NAND  = 0x7,
124*61046927SAndroid Build Coastguard Worker   AGX_BITOP_AND   = 0x8,
125*61046927SAndroid Build Coastguard Worker   AGX_BITOP_XNOR  = 0x9,
126*61046927SAndroid Build Coastguard Worker   AGX_BITOP_MOV   = 0xA,
127*61046927SAndroid Build Coastguard Worker   AGX_BITOP_ORN2  = 0xB,
128*61046927SAndroid Build Coastguard Worker   AGX_BITOP_ORN1  = 0xD,
129*61046927SAndroid Build Coastguard Worker   AGX_BITOP_OR    = 0xE
130*61046927SAndroid Build Coastguard Worker};
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker#define BINOP_BITOP(name, table)                                                     \
133*61046927SAndroid Build Coastguard Worker   static inline agx_instr *                                                         \
134*61046927SAndroid Build Coastguard Worker   agx_## name ##_to(agx_builder *b, agx_index dst0, agx_index src0, agx_index src1) \
135*61046927SAndroid Build Coastguard Worker   {                                                                                 \
136*61046927SAndroid Build Coastguard Worker      return agx_bitop_to(b, dst0, src0, src1, AGX_BITOP_ ## table);                 \
137*61046927SAndroid Build Coastguard Worker   }                                                                                 \
138*61046927SAndroid Build Coastguard Worker                                                                                     \
139*61046927SAndroid Build Coastguard Worker   static inline agx_index                                                           \
140*61046927SAndroid Build Coastguard Worker   agx_## name (agx_builder *b, agx_index src0, agx_index src1)                      \
141*61046927SAndroid Build Coastguard Worker   {                                                                                 \
142*61046927SAndroid Build Coastguard Worker      agx_index tmp = agx_temp(b->shader, src0.size);                                \
143*61046927SAndroid Build Coastguard Worker      agx_##name##_to(b, tmp, src0, src1);                                           \
144*61046927SAndroid Build Coastguard Worker      return tmp;                                                                    \
145*61046927SAndroid Build Coastguard Worker   }
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(nor, NOR)
148*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(andn2, ANDN2)
149*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(andn1, ANDN1)
150*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(xor, XOR)
151*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(nand, NAND)
152*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(and, AND)
153*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(xnor, XNOR)
154*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(orn2, ORN2)
155*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(orn1, ORN1)
156*61046927SAndroid Build Coastguard WorkerBINOP_BITOP(or, OR)
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker#undef BINOP_BITOP
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Workerstatic inline agx_instr *
161*61046927SAndroid Build Coastguard Workeragx_fmov_to(agx_builder *b, agx_index dst0, agx_index src0)
162*61046927SAndroid Build Coastguard Worker{
163*61046927SAndroid Build Coastguard Worker   return agx_fadd_to(b, dst0, src0, agx_negzero());
164*61046927SAndroid Build Coastguard Worker}
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard Workerstatic inline agx_instr *
167*61046927SAndroid Build Coastguard Workeragx_push_exec(agx_builder *b, unsigned n)
168*61046927SAndroid Build Coastguard Worker{
169*61046927SAndroid Build Coastguard Worker   return agx_if_fcmp(b, agx_zero(), agx_zero(), n, AGX_FCOND_EQ, false, NULL);
170*61046927SAndroid Build Coastguard Worker}
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard Workerstatic inline agx_instr *
173*61046927SAndroid Build Coastguard Workeragx_ushr_to(agx_builder *b, agx_index dst, agx_index s0, agx_index s1)
174*61046927SAndroid Build Coastguard Worker{
175*61046927SAndroid Build Coastguard Worker    return agx_bfeil_to(b, dst, agx_zero(), s0, s1, 0);
176*61046927SAndroid Build Coastguard Worker}
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Workerstatic inline agx_index
179*61046927SAndroid Build Coastguard Workeragx_ushr(agx_builder *b, agx_index s0, agx_index s1)
180*61046927SAndroid Build Coastguard Worker{
181*61046927SAndroid Build Coastguard Worker    agx_index tmp = agx_temp(b->shader, s0.size);
182*61046927SAndroid Build Coastguard Worker    agx_ushr_to(b, tmp, s0, s1);
183*61046927SAndroid Build Coastguard Worker    return tmp;
184*61046927SAndroid Build Coastguard Worker}
185*61046927SAndroid Build Coastguard Worker
186*61046927SAndroid Build Coastguard Worker#endif
187*61046927SAndroid Build Coastguard Worker"""
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Workerfrom mako.template import Template
190*61046927SAndroid Build Coastguard Workerfrom agx_opcodes import opcodes
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Workerprint(Template(template).render(opcodes=opcodes))
193