1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Imagination Technologies Ltd.
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
5*61046927SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal
6*61046927SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights
7*61046927SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*61046927SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is
9*61046927SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18*61046927SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "rogue.h"
25*61046927SAndroid Build Coastguard Worker #include "rogue_builder.h"
26*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker /**
29*61046927SAndroid Build Coastguard Worker * \file rogue_builder.c
30*61046927SAndroid Build Coastguard Worker *
31*61046927SAndroid Build Coastguard Worker * \brief Contains helper functions for building Rogue shaders.
32*61046927SAndroid Build Coastguard Worker */
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker /**
35*61046927SAndroid Build Coastguard Worker * \brief Inserts an instruction at the current builder context position.
36*61046927SAndroid Build Coastguard Worker *
37*61046927SAndroid Build Coastguard Worker * \param[in] b The builder context.
38*61046927SAndroid Build Coastguard Worker * \param[in] instr The instruction to insert.
39*61046927SAndroid Build Coastguard Worker */
rogue_builder_insert_instr(rogue_builder * b,rogue_instr * instr)40*61046927SAndroid Build Coastguard Worker static inline void rogue_builder_insert_instr(rogue_builder *b,
41*61046927SAndroid Build Coastguard Worker rogue_instr *instr)
42*61046927SAndroid Build Coastguard Worker {
43*61046927SAndroid Build Coastguard Worker rogue_instr_insert(instr, b->cursor);
44*61046927SAndroid Build Coastguard Worker b->cursor = rogue_cursor_after_instr(instr);
45*61046927SAndroid Build Coastguard Worker }
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker /* ALU instructions */
48*61046927SAndroid Build Coastguard Worker
rogue_build_alu(rogue_builder * b,enum rogue_alu_op op,unsigned num_dsts,rogue_ref dsts[num_dsts],unsigned num_srcs,rogue_ref srcs[num_srcs])49*61046927SAndroid Build Coastguard Worker static inline rogue_alu_instr *rogue_build_alu(rogue_builder *b,
50*61046927SAndroid Build Coastguard Worker enum rogue_alu_op op,
51*61046927SAndroid Build Coastguard Worker unsigned num_dsts,
52*61046927SAndroid Build Coastguard Worker rogue_ref dsts[num_dsts],
53*61046927SAndroid Build Coastguard Worker unsigned num_srcs,
54*61046927SAndroid Build Coastguard Worker rogue_ref srcs[num_srcs])
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker rogue_alu_instr *alu =
57*61046927SAndroid Build Coastguard Worker rogue_alu_instr_create(rogue_cursor_block(b->cursor), op);
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_dsts; ++i) {
60*61046927SAndroid Build Coastguard Worker alu->dst[i].ref = dsts[i];
61*61046927SAndroid Build Coastguard Worker alu->dst[i].index = i;
62*61046927SAndroid Build Coastguard Worker }
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_srcs; ++i) {
65*61046927SAndroid Build Coastguard Worker alu->src[i].ref = srcs[i];
66*61046927SAndroid Build Coastguard Worker alu->src[i].index = i;
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker rogue_builder_insert_instr(b, &alu->instr);
70*61046927SAndroid Build Coastguard Worker return alu;
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker
rogue_build_alu11(rogue_builder * b,enum rogue_alu_op op,rogue_ref dst0,rogue_ref src0)73*61046927SAndroid Build Coastguard Worker static inline rogue_alu_instr *rogue_build_alu11(rogue_builder *b,
74*61046927SAndroid Build Coastguard Worker enum rogue_alu_op op,
75*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
76*61046927SAndroid Build Coastguard Worker rogue_ref src0)
77*61046927SAndroid Build Coastguard Worker {
78*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0 };
79*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0 };
80*61046927SAndroid Build Coastguard Worker return rogue_build_alu(b, op, 1, dsts, 1, srcs);
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker
rogue_build_alu12(rogue_builder * b,enum rogue_alu_op op,rogue_ref dst0,rogue_ref src0,rogue_ref src1)83*61046927SAndroid Build Coastguard Worker static inline rogue_alu_instr *rogue_build_alu12(rogue_builder *b,
84*61046927SAndroid Build Coastguard Worker enum rogue_alu_op op,
85*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
86*61046927SAndroid Build Coastguard Worker rogue_ref src0,
87*61046927SAndroid Build Coastguard Worker rogue_ref src1)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0 };
90*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1 };
91*61046927SAndroid Build Coastguard Worker return rogue_build_alu(b, op, 1, dsts, 2, srcs);
92*61046927SAndroid Build Coastguard Worker }
93*61046927SAndroid Build Coastguard Worker
rogue_build_alu13(rogue_builder * b,enum rogue_alu_op op,rogue_ref dst0,rogue_ref src0,rogue_ref src1,rogue_ref src2)94*61046927SAndroid Build Coastguard Worker static inline rogue_alu_instr *rogue_build_alu13(rogue_builder *b,
95*61046927SAndroid Build Coastguard Worker enum rogue_alu_op op,
96*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
97*61046927SAndroid Build Coastguard Worker rogue_ref src0,
98*61046927SAndroid Build Coastguard Worker rogue_ref src1,
99*61046927SAndroid Build Coastguard Worker rogue_ref src2)
100*61046927SAndroid Build Coastguard Worker {
101*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0 };
102*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1, src2 };
103*61046927SAndroid Build Coastguard Worker return rogue_build_alu(b, op, 1, dsts, 3, srcs);
104*61046927SAndroid Build Coastguard Worker }
105*61046927SAndroid Build Coastguard Worker
rogue_build_alu22(rogue_builder * b,enum rogue_alu_op op,rogue_ref dst0,rogue_ref dst1,rogue_ref src0,rogue_ref src1)106*61046927SAndroid Build Coastguard Worker static inline rogue_alu_instr *rogue_build_alu22(rogue_builder *b,
107*61046927SAndroid Build Coastguard Worker enum rogue_alu_op op,
108*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
109*61046927SAndroid Build Coastguard Worker rogue_ref dst1,
110*61046927SAndroid Build Coastguard Worker rogue_ref src0,
111*61046927SAndroid Build Coastguard Worker rogue_ref src1)
112*61046927SAndroid Build Coastguard Worker {
113*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0, dst1 };
114*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1 };
115*61046927SAndroid Build Coastguard Worker return rogue_build_alu(b, op, 2, dsts, 2, srcs);
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker
rogue_build_alu23(rogue_builder * b,enum rogue_alu_op op,rogue_ref dst0,rogue_ref dst1,rogue_ref src0,rogue_ref src1,rogue_ref src2)118*61046927SAndroid Build Coastguard Worker static inline rogue_alu_instr *rogue_build_alu23(rogue_builder *b,
119*61046927SAndroid Build Coastguard Worker enum rogue_alu_op op,
120*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
121*61046927SAndroid Build Coastguard Worker rogue_ref dst1,
122*61046927SAndroid Build Coastguard Worker rogue_ref src0,
123*61046927SAndroid Build Coastguard Worker rogue_ref src1,
124*61046927SAndroid Build Coastguard Worker rogue_ref src2)
125*61046927SAndroid Build Coastguard Worker {
126*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0, dst1 };
127*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1, src2 };
128*61046927SAndroid Build Coastguard Worker return rogue_build_alu(b, op, 2, dsts, 3, srcs);
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker
rogue_build_alu35(rogue_builder * b,enum rogue_alu_op op,rogue_ref dst0,rogue_ref dst1,rogue_ref dst2,rogue_ref src0,rogue_ref src1,rogue_ref src2,rogue_ref src3,rogue_ref src4)131*61046927SAndroid Build Coastguard Worker static inline rogue_alu_instr *rogue_build_alu35(rogue_builder *b,
132*61046927SAndroid Build Coastguard Worker enum rogue_alu_op op,
133*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
134*61046927SAndroid Build Coastguard Worker rogue_ref dst1,
135*61046927SAndroid Build Coastguard Worker rogue_ref dst2,
136*61046927SAndroid Build Coastguard Worker rogue_ref src0,
137*61046927SAndroid Build Coastguard Worker rogue_ref src1,
138*61046927SAndroid Build Coastguard Worker rogue_ref src2,
139*61046927SAndroid Build Coastguard Worker rogue_ref src3,
140*61046927SAndroid Build Coastguard Worker rogue_ref src4)
141*61046927SAndroid Build Coastguard Worker {
142*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0, dst1, dst2 };
143*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1, src2, src3, src4 };
144*61046927SAndroid Build Coastguard Worker return rogue_build_alu(b, op, 3, dsts, 5, srcs);
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker /* TODO: Static inline in rogue.h? */
148*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU11(op) \
149*61046927SAndroid Build Coastguard Worker PUBLIC \
150*61046927SAndroid Build Coastguard Worker rogue_alu_instr *rogue_##op(rogue_builder *b, \
151*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
152*61046927SAndroid Build Coastguard Worker rogue_ref src0) \
153*61046927SAndroid Build Coastguard Worker { \
154*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_dsts == 1); \
155*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_srcs == 1); \
156*61046927SAndroid Build Coastguard Worker return rogue_build_alu11(b, ROGUE_ALU_OP_##op, dst0, src0); \
157*61046927SAndroid Build Coastguard Worker }
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU12(op) \
160*61046927SAndroid Build Coastguard Worker PUBLIC \
161*61046927SAndroid Build Coastguard Worker rogue_alu_instr *rogue_##op(rogue_builder *b, \
162*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
163*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
164*61046927SAndroid Build Coastguard Worker rogue_ref src1) \
165*61046927SAndroid Build Coastguard Worker { \
166*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_dsts == 1); \
167*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_srcs == 2); \
168*61046927SAndroid Build Coastguard Worker return rogue_build_alu12(b, ROGUE_ALU_OP_##op, dst0, src0, src1); \
169*61046927SAndroid Build Coastguard Worker }
170*61046927SAndroid Build Coastguard Worker
171*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU13(op) \
172*61046927SAndroid Build Coastguard Worker PUBLIC \
173*61046927SAndroid Build Coastguard Worker rogue_alu_instr *rogue_##op(rogue_builder *b, \
174*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
175*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
176*61046927SAndroid Build Coastguard Worker rogue_ref src1, \
177*61046927SAndroid Build Coastguard Worker rogue_ref src2) \
178*61046927SAndroid Build Coastguard Worker { \
179*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_dsts == 1); \
180*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_srcs == 3); \
181*61046927SAndroid Build Coastguard Worker return rogue_build_alu13(b, ROGUE_ALU_OP_##op, dst0, src0, src1, src2); \
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker
184*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU22(op) \
185*61046927SAndroid Build Coastguard Worker PUBLIC \
186*61046927SAndroid Build Coastguard Worker rogue_alu_instr *rogue_##op(rogue_builder *b, \
187*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
188*61046927SAndroid Build Coastguard Worker rogue_ref dst1, \
189*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
190*61046927SAndroid Build Coastguard Worker rogue_ref src1) \
191*61046927SAndroid Build Coastguard Worker { \
192*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_dsts == 2); \
193*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_srcs == 2); \
194*61046927SAndroid Build Coastguard Worker return rogue_build_alu22(b, ROGUE_ALU_OP_##op, dst0, dst1, src0, src1); \
195*61046927SAndroid Build Coastguard Worker }
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU23(op) \
198*61046927SAndroid Build Coastguard Worker PUBLIC \
199*61046927SAndroid Build Coastguard Worker rogue_alu_instr *rogue_##op(rogue_builder *b, \
200*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
201*61046927SAndroid Build Coastguard Worker rogue_ref dst1, \
202*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
203*61046927SAndroid Build Coastguard Worker rogue_ref src1, \
204*61046927SAndroid Build Coastguard Worker rogue_ref src2) \
205*61046927SAndroid Build Coastguard Worker { \
206*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_dsts == 2); \
207*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_srcs == 3); \
208*61046927SAndroid Build Coastguard Worker return rogue_build_alu23(b, \
209*61046927SAndroid Build Coastguard Worker ROGUE_ALU_OP_##op, \
210*61046927SAndroid Build Coastguard Worker dst0, \
211*61046927SAndroid Build Coastguard Worker dst1, \
212*61046927SAndroid Build Coastguard Worker src0, \
213*61046927SAndroid Build Coastguard Worker src1, \
214*61046927SAndroid Build Coastguard Worker src2); \
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_ALU35(op) \
218*61046927SAndroid Build Coastguard Worker PUBLIC \
219*61046927SAndroid Build Coastguard Worker rogue_alu_instr *rogue_##op(rogue_builder *b, \
220*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
221*61046927SAndroid Build Coastguard Worker rogue_ref dst1, \
222*61046927SAndroid Build Coastguard Worker rogue_ref dst2, \
223*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
224*61046927SAndroid Build Coastguard Worker rogue_ref src1, \
225*61046927SAndroid Build Coastguard Worker rogue_ref src2, \
226*61046927SAndroid Build Coastguard Worker rogue_ref src3, \
227*61046927SAndroid Build Coastguard Worker rogue_ref src4) \
228*61046927SAndroid Build Coastguard Worker { \
229*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_dsts == 3); \
230*61046927SAndroid Build Coastguard Worker assert(rogue_alu_op_infos[ROGUE_ALU_OP_##op].num_srcs == 5); \
231*61046927SAndroid Build Coastguard Worker return rogue_build_alu35(b, \
232*61046927SAndroid Build Coastguard Worker ROGUE_ALU_OP_##op, \
233*61046927SAndroid Build Coastguard Worker dst0, \
234*61046927SAndroid Build Coastguard Worker dst1, \
235*61046927SAndroid Build Coastguard Worker dst2, \
236*61046927SAndroid Build Coastguard Worker src0, \
237*61046927SAndroid Build Coastguard Worker src1, \
238*61046927SAndroid Build Coastguard Worker src2, \
239*61046927SAndroid Build Coastguard Worker src3, \
240*61046927SAndroid Build Coastguard Worker src4); \
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker #include "rogue_alu_instrs.def"
244*61046927SAndroid Build Coastguard Worker
rogue_build_backend(rogue_builder * b,enum rogue_backend_op op,unsigned num_dsts,rogue_ref dsts[num_dsts],unsigned num_srcs,rogue_ref srcs[num_srcs])245*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *rogue_build_backend(rogue_builder *b,
246*61046927SAndroid Build Coastguard Worker enum rogue_backend_op op,
247*61046927SAndroid Build Coastguard Worker unsigned num_dsts,
248*61046927SAndroid Build Coastguard Worker rogue_ref dsts[num_dsts],
249*61046927SAndroid Build Coastguard Worker unsigned num_srcs,
250*61046927SAndroid Build Coastguard Worker rogue_ref srcs[num_srcs])
251*61046927SAndroid Build Coastguard Worker {
252*61046927SAndroid Build Coastguard Worker rogue_backend_instr *backend =
253*61046927SAndroid Build Coastguard Worker rogue_backend_instr_create(rogue_cursor_block(b->cursor), op);
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_dsts; ++i) {
256*61046927SAndroid Build Coastguard Worker backend->dst[i].ref = dsts[i];
257*61046927SAndroid Build Coastguard Worker backend->dst[i].index = i;
258*61046927SAndroid Build Coastguard Worker }
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_srcs; ++i) {
261*61046927SAndroid Build Coastguard Worker backend->src[i].ref = srcs[i];
262*61046927SAndroid Build Coastguard Worker backend->src[i].index = i;
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker rogue_builder_insert_instr(b, &backend->instr);
266*61046927SAndroid Build Coastguard Worker return backend;
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *
rogue_build_backend00(rogue_builder * b,enum rogue_backend_op op)270*61046927SAndroid Build Coastguard Worker rogue_build_backend00(rogue_builder *b, enum rogue_backend_op op)
271*61046927SAndroid Build Coastguard Worker {
272*61046927SAndroid Build Coastguard Worker return rogue_build_backend(b, op, 0, NULL, 0, NULL);
273*61046927SAndroid Build Coastguard Worker }
274*61046927SAndroid Build Coastguard Worker
275*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *
rogue_build_backend02(rogue_builder * b,enum rogue_backend_op op,rogue_ref src0,rogue_ref src1)276*61046927SAndroid Build Coastguard Worker rogue_build_backend02(rogue_builder *b,
277*61046927SAndroid Build Coastguard Worker enum rogue_backend_op op,
278*61046927SAndroid Build Coastguard Worker rogue_ref src0,
279*61046927SAndroid Build Coastguard Worker rogue_ref src1)
280*61046927SAndroid Build Coastguard Worker {
281*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1 };
282*61046927SAndroid Build Coastguard Worker return rogue_build_backend(b, op, 0, NULL, 2, srcs);
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *
rogue_build_backend11(rogue_builder * b,enum rogue_backend_op op,rogue_ref dst0,rogue_ref src0)286*61046927SAndroid Build Coastguard Worker rogue_build_backend11(rogue_builder *b,
287*61046927SAndroid Build Coastguard Worker enum rogue_backend_op op,
288*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
289*61046927SAndroid Build Coastguard Worker rogue_ref src0)
290*61046927SAndroid Build Coastguard Worker {
291*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0 };
292*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0 };
293*61046927SAndroid Build Coastguard Worker return rogue_build_backend(b, op, 1, dsts, 1, srcs);
294*61046927SAndroid Build Coastguard Worker }
295*61046927SAndroid Build Coastguard Worker
296*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *
rogue_build_backend13(rogue_builder * b,enum rogue_backend_op op,rogue_ref dst0,rogue_ref src0,rogue_ref src1,rogue_ref src2)297*61046927SAndroid Build Coastguard Worker rogue_build_backend13(rogue_builder *b,
298*61046927SAndroid Build Coastguard Worker enum rogue_backend_op op,
299*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
300*61046927SAndroid Build Coastguard Worker rogue_ref src0,
301*61046927SAndroid Build Coastguard Worker rogue_ref src1,
302*61046927SAndroid Build Coastguard Worker rogue_ref src2)
303*61046927SAndroid Build Coastguard Worker {
304*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0 };
305*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1, src2 };
306*61046927SAndroid Build Coastguard Worker return rogue_build_backend(b, op, 1, dsts, 3, srcs);
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *
rogue_build_backend14(rogue_builder * b,enum rogue_backend_op op,rogue_ref dst0,rogue_ref src0,rogue_ref src1,rogue_ref src2,rogue_ref src3)310*61046927SAndroid Build Coastguard Worker rogue_build_backend14(rogue_builder *b,
311*61046927SAndroid Build Coastguard Worker enum rogue_backend_op op,
312*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
313*61046927SAndroid Build Coastguard Worker rogue_ref src0,
314*61046927SAndroid Build Coastguard Worker rogue_ref src1,
315*61046927SAndroid Build Coastguard Worker rogue_ref src2,
316*61046927SAndroid Build Coastguard Worker rogue_ref src3)
317*61046927SAndroid Build Coastguard Worker {
318*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0 };
319*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1, src2, src3 };
320*61046927SAndroid Build Coastguard Worker return rogue_build_backend(b, op, 1, dsts, 4, srcs);
321*61046927SAndroid Build Coastguard Worker }
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *
rogue_build_backend06(rogue_builder * b,enum rogue_backend_op op,rogue_ref src0,rogue_ref src1,rogue_ref src2,rogue_ref src3,rogue_ref src4,rogue_ref src5)324*61046927SAndroid Build Coastguard Worker rogue_build_backend06(rogue_builder *b,
325*61046927SAndroid Build Coastguard Worker enum rogue_backend_op op,
326*61046927SAndroid Build Coastguard Worker rogue_ref src0,
327*61046927SAndroid Build Coastguard Worker rogue_ref src1,
328*61046927SAndroid Build Coastguard Worker rogue_ref src2,
329*61046927SAndroid Build Coastguard Worker rogue_ref src3,
330*61046927SAndroid Build Coastguard Worker rogue_ref src4,
331*61046927SAndroid Build Coastguard Worker rogue_ref src5)
332*61046927SAndroid Build Coastguard Worker {
333*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1, src2, src3, src4, src5 };
334*61046927SAndroid Build Coastguard Worker return rogue_build_backend(b, op, 0, NULL, 6, srcs);
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker static inline rogue_backend_instr *
rogue_build_backend16(rogue_builder * b,enum rogue_backend_op op,rogue_ref dst0,rogue_ref src0,rogue_ref src1,rogue_ref src2,rogue_ref src3,rogue_ref src4,rogue_ref src5)338*61046927SAndroid Build Coastguard Worker rogue_build_backend16(rogue_builder *b,
339*61046927SAndroid Build Coastguard Worker enum rogue_backend_op op,
340*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
341*61046927SAndroid Build Coastguard Worker rogue_ref src0,
342*61046927SAndroid Build Coastguard Worker rogue_ref src1,
343*61046927SAndroid Build Coastguard Worker rogue_ref src2,
344*61046927SAndroid Build Coastguard Worker rogue_ref src3,
345*61046927SAndroid Build Coastguard Worker rogue_ref src4,
346*61046927SAndroid Build Coastguard Worker rogue_ref src5)
347*61046927SAndroid Build Coastguard Worker {
348*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0 };
349*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1, src2, src3, src4, src5 };
350*61046927SAndroid Build Coastguard Worker return rogue_build_backend(b, op, 1, dsts, 6, srcs);
351*61046927SAndroid Build Coastguard Worker }
352*61046927SAndroid Build Coastguard Worker
353*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND00(op) \
354*61046927SAndroid Build Coastguard Worker PUBLIC \
355*61046927SAndroid Build Coastguard Worker rogue_backend_instr *rogue_##op(rogue_builder *b) \
356*61046927SAndroid Build Coastguard Worker { \
357*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_dsts == 0); \
358*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_srcs == 0); \
359*61046927SAndroid Build Coastguard Worker return rogue_build_backend00(b, ROGUE_BACKEND_OP_##op); \
360*61046927SAndroid Build Coastguard Worker }
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND02(op) \
363*61046927SAndroid Build Coastguard Worker PUBLIC \
364*61046927SAndroid Build Coastguard Worker rogue_backend_instr *rogue_##op(rogue_builder *b, \
365*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
366*61046927SAndroid Build Coastguard Worker rogue_ref src1) \
367*61046927SAndroid Build Coastguard Worker { \
368*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_dsts == 0); \
369*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_srcs == 2); \
370*61046927SAndroid Build Coastguard Worker return rogue_build_backend02(b, ROGUE_BACKEND_OP_##op, src0, src1); \
371*61046927SAndroid Build Coastguard Worker }
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND11(op) \
374*61046927SAndroid Build Coastguard Worker PUBLIC \
375*61046927SAndroid Build Coastguard Worker rogue_backend_instr *rogue_##op(rogue_builder *b, \
376*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
377*61046927SAndroid Build Coastguard Worker rogue_ref src0) \
378*61046927SAndroid Build Coastguard Worker { \
379*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_dsts == 1); \
380*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_srcs == 1); \
381*61046927SAndroid Build Coastguard Worker return rogue_build_backend11(b, ROGUE_BACKEND_OP_##op, dst0, src0); \
382*61046927SAndroid Build Coastguard Worker }
383*61046927SAndroid Build Coastguard Worker
384*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND13(op) \
385*61046927SAndroid Build Coastguard Worker PUBLIC \
386*61046927SAndroid Build Coastguard Worker rogue_backend_instr *rogue_##op(rogue_builder *b, \
387*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
388*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
389*61046927SAndroid Build Coastguard Worker rogue_ref src1, \
390*61046927SAndroid Build Coastguard Worker rogue_ref src2) \
391*61046927SAndroid Build Coastguard Worker { \
392*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_dsts == 1); \
393*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_srcs == 3); \
394*61046927SAndroid Build Coastguard Worker return rogue_build_backend13(b, \
395*61046927SAndroid Build Coastguard Worker ROGUE_BACKEND_OP_##op, \
396*61046927SAndroid Build Coastguard Worker dst0, \
397*61046927SAndroid Build Coastguard Worker src0, \
398*61046927SAndroid Build Coastguard Worker src1, \
399*61046927SAndroid Build Coastguard Worker src2); \
400*61046927SAndroid Build Coastguard Worker }
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND14(op) \
403*61046927SAndroid Build Coastguard Worker PUBLIC \
404*61046927SAndroid Build Coastguard Worker rogue_backend_instr *rogue_##op(rogue_builder *b, \
405*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
406*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
407*61046927SAndroid Build Coastguard Worker rogue_ref src1, \
408*61046927SAndroid Build Coastguard Worker rogue_ref src2, \
409*61046927SAndroid Build Coastguard Worker rogue_ref src3) \
410*61046927SAndroid Build Coastguard Worker { \
411*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_dsts == 1); \
412*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_srcs == 4); \
413*61046927SAndroid Build Coastguard Worker return rogue_build_backend14(b, \
414*61046927SAndroid Build Coastguard Worker ROGUE_BACKEND_OP_##op, \
415*61046927SAndroid Build Coastguard Worker dst0, \
416*61046927SAndroid Build Coastguard Worker src0, \
417*61046927SAndroid Build Coastguard Worker src1, \
418*61046927SAndroid Build Coastguard Worker src2, \
419*61046927SAndroid Build Coastguard Worker src3); \
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND06(op) \
423*61046927SAndroid Build Coastguard Worker PUBLIC \
424*61046927SAndroid Build Coastguard Worker rogue_backend_instr *rogue_##op(rogue_builder *b, \
425*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
426*61046927SAndroid Build Coastguard Worker rogue_ref src1, \
427*61046927SAndroid Build Coastguard Worker rogue_ref src2, \
428*61046927SAndroid Build Coastguard Worker rogue_ref src3, \
429*61046927SAndroid Build Coastguard Worker rogue_ref src4, \
430*61046927SAndroid Build Coastguard Worker rogue_ref src5) \
431*61046927SAndroid Build Coastguard Worker { \
432*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_dsts == 0); \
433*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_srcs == 6); \
434*61046927SAndroid Build Coastguard Worker return rogue_build_backend06(b, \
435*61046927SAndroid Build Coastguard Worker ROGUE_BACKEND_OP_##op, \
436*61046927SAndroid Build Coastguard Worker src0, \
437*61046927SAndroid Build Coastguard Worker src1, \
438*61046927SAndroid Build Coastguard Worker src2, \
439*61046927SAndroid Build Coastguard Worker src3, \
440*61046927SAndroid Build Coastguard Worker src4, \
441*61046927SAndroid Build Coastguard Worker src5); \
442*61046927SAndroid Build Coastguard Worker }
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BACKEND16(op) \
445*61046927SAndroid Build Coastguard Worker PUBLIC \
446*61046927SAndroid Build Coastguard Worker rogue_backend_instr *rogue_##op(rogue_builder *b, \
447*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
448*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
449*61046927SAndroid Build Coastguard Worker rogue_ref src1, \
450*61046927SAndroid Build Coastguard Worker rogue_ref src2, \
451*61046927SAndroid Build Coastguard Worker rogue_ref src3, \
452*61046927SAndroid Build Coastguard Worker rogue_ref src4, \
453*61046927SAndroid Build Coastguard Worker rogue_ref src5) \
454*61046927SAndroid Build Coastguard Worker { \
455*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_dsts == 1); \
456*61046927SAndroid Build Coastguard Worker assert(rogue_backend_op_infos[ROGUE_BACKEND_OP_##op].num_srcs == 6); \
457*61046927SAndroid Build Coastguard Worker return rogue_build_backend16(b, \
458*61046927SAndroid Build Coastguard Worker ROGUE_BACKEND_OP_##op, \
459*61046927SAndroid Build Coastguard Worker dst0, \
460*61046927SAndroid Build Coastguard Worker src0, \
461*61046927SAndroid Build Coastguard Worker src1, \
462*61046927SAndroid Build Coastguard Worker src2, \
463*61046927SAndroid Build Coastguard Worker src3, \
464*61046927SAndroid Build Coastguard Worker src4, \
465*61046927SAndroid Build Coastguard Worker src5); \
466*61046927SAndroid Build Coastguard Worker }
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker #include "rogue_backend_instrs.def"
469*61046927SAndroid Build Coastguard Worker
rogue_build_ctrl(rogue_builder * b,enum rogue_ctrl_op op,rogue_block * target_block,unsigned num_dsts,rogue_ref dsts[num_dsts],unsigned num_srcs,rogue_ref srcs[num_srcs])470*61046927SAndroid Build Coastguard Worker static inline rogue_ctrl_instr *rogue_build_ctrl(rogue_builder *b,
471*61046927SAndroid Build Coastguard Worker enum rogue_ctrl_op op,
472*61046927SAndroid Build Coastguard Worker rogue_block *target_block,
473*61046927SAndroid Build Coastguard Worker unsigned num_dsts,
474*61046927SAndroid Build Coastguard Worker rogue_ref dsts[num_dsts],
475*61046927SAndroid Build Coastguard Worker unsigned num_srcs,
476*61046927SAndroid Build Coastguard Worker rogue_ref srcs[num_srcs])
477*61046927SAndroid Build Coastguard Worker {
478*61046927SAndroid Build Coastguard Worker rogue_ctrl_instr *ctrl =
479*61046927SAndroid Build Coastguard Worker rogue_ctrl_instr_create(rogue_cursor_block(b->cursor), op);
480*61046927SAndroid Build Coastguard Worker
481*61046927SAndroid Build Coastguard Worker ctrl->target_block = target_block;
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_dsts; ++i) {
484*61046927SAndroid Build Coastguard Worker ctrl->dst[i].ref = dsts[i];
485*61046927SAndroid Build Coastguard Worker ctrl->dst[i].index = i;
486*61046927SAndroid Build Coastguard Worker }
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_srcs; ++i) {
489*61046927SAndroid Build Coastguard Worker ctrl->src[i].ref = srcs[i];
490*61046927SAndroid Build Coastguard Worker ctrl->src[i].index = i;
491*61046927SAndroid Build Coastguard Worker }
492*61046927SAndroid Build Coastguard Worker
493*61046927SAndroid Build Coastguard Worker rogue_builder_insert_instr(b, &ctrl->instr);
494*61046927SAndroid Build Coastguard Worker return ctrl;
495*61046927SAndroid Build Coastguard Worker }
496*61046927SAndroid Build Coastguard Worker
497*61046927SAndroid Build Coastguard Worker static inline rogue_ctrl_instr *
rogue_build_ctrlb(rogue_builder * b,enum rogue_ctrl_op op,rogue_block * block)498*61046927SAndroid Build Coastguard Worker rogue_build_ctrlb(rogue_builder *b, enum rogue_ctrl_op op, rogue_block *block)
499*61046927SAndroid Build Coastguard Worker {
500*61046927SAndroid Build Coastguard Worker return rogue_build_ctrl(b, op, block, 0, NULL, 0, NULL);
501*61046927SAndroid Build Coastguard Worker }
502*61046927SAndroid Build Coastguard Worker
rogue_build_ctrl00(rogue_builder * b,enum rogue_ctrl_op op)503*61046927SAndroid Build Coastguard Worker static inline rogue_ctrl_instr *rogue_build_ctrl00(rogue_builder *b,
504*61046927SAndroid Build Coastguard Worker enum rogue_ctrl_op op)
505*61046927SAndroid Build Coastguard Worker {
506*61046927SAndroid Build Coastguard Worker return rogue_build_ctrl(b, op, NULL, 0, NULL, 0, NULL);
507*61046927SAndroid Build Coastguard Worker }
508*61046927SAndroid Build Coastguard Worker
509*61046927SAndroid Build Coastguard Worker static inline rogue_ctrl_instr *
rogue_build_ctrl01(rogue_builder * b,enum rogue_ctrl_op op,rogue_ref src0)510*61046927SAndroid Build Coastguard Worker rogue_build_ctrl01(rogue_builder *b, enum rogue_ctrl_op op, rogue_ref src0)
511*61046927SAndroid Build Coastguard Worker {
512*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0 };
513*61046927SAndroid Build Coastguard Worker return rogue_build_ctrl(b, op, NULL, 0, NULL, 1, srcs);
514*61046927SAndroid Build Coastguard Worker }
515*61046927SAndroid Build Coastguard Worker
516*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_CTRLB(op) \
517*61046927SAndroid Build Coastguard Worker PUBLIC \
518*61046927SAndroid Build Coastguard Worker rogue_ctrl_instr *rogue_##op(rogue_builder *b, rogue_block *block) \
519*61046927SAndroid Build Coastguard Worker { \
520*61046927SAndroid Build Coastguard Worker assert(rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].has_target); \
521*61046927SAndroid Build Coastguard Worker assert(rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].num_dsts == 0); \
522*61046927SAndroid Build Coastguard Worker assert(rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].num_srcs == 0); \
523*61046927SAndroid Build Coastguard Worker return rogue_build_ctrlb(b, ROGUE_CTRL_OP_##op, block); \
524*61046927SAndroid Build Coastguard Worker }
525*61046927SAndroid Build Coastguard Worker
526*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_CTRL00(op) \
527*61046927SAndroid Build Coastguard Worker PUBLIC \
528*61046927SAndroid Build Coastguard Worker rogue_ctrl_instr *rogue_##op(rogue_builder *b) \
529*61046927SAndroid Build Coastguard Worker { \
530*61046927SAndroid Build Coastguard Worker assert(!rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].has_target); \
531*61046927SAndroid Build Coastguard Worker assert(rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].num_dsts == 0); \
532*61046927SAndroid Build Coastguard Worker assert(rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].num_srcs == 0); \
533*61046927SAndroid Build Coastguard Worker return rogue_build_ctrl00(b, ROGUE_CTRL_OP_##op); \
534*61046927SAndroid Build Coastguard Worker }
535*61046927SAndroid Build Coastguard Worker
536*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_CTRL01(op) \
537*61046927SAndroid Build Coastguard Worker PUBLIC \
538*61046927SAndroid Build Coastguard Worker rogue_ctrl_instr *rogue_##op(rogue_builder *b, rogue_ref src0) \
539*61046927SAndroid Build Coastguard Worker { \
540*61046927SAndroid Build Coastguard Worker assert(!rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].has_target); \
541*61046927SAndroid Build Coastguard Worker assert(rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].num_dsts == 0); \
542*61046927SAndroid Build Coastguard Worker assert(rogue_ctrl_op_infos[ROGUE_CTRL_OP_##op].num_srcs == 1); \
543*61046927SAndroid Build Coastguard Worker return rogue_build_ctrl01(b, ROGUE_CTRL_OP_##op, src0); \
544*61046927SAndroid Build Coastguard Worker }
545*61046927SAndroid Build Coastguard Worker
546*61046927SAndroid Build Coastguard Worker #include "rogue_ctrl_instrs.def"
547*61046927SAndroid Build Coastguard Worker
rogue_build_bitwise(rogue_builder * b,enum rogue_bitwise_op op,unsigned num_dsts,rogue_ref dsts[num_dsts],unsigned num_srcs,rogue_ref srcs[num_srcs])548*61046927SAndroid Build Coastguard Worker static inline rogue_bitwise_instr *rogue_build_bitwise(rogue_builder *b,
549*61046927SAndroid Build Coastguard Worker enum rogue_bitwise_op op,
550*61046927SAndroid Build Coastguard Worker unsigned num_dsts,
551*61046927SAndroid Build Coastguard Worker rogue_ref dsts[num_dsts],
552*61046927SAndroid Build Coastguard Worker unsigned num_srcs,
553*61046927SAndroid Build Coastguard Worker rogue_ref srcs[num_srcs])
554*61046927SAndroid Build Coastguard Worker {
555*61046927SAndroid Build Coastguard Worker rogue_bitwise_instr *bitwise =
556*61046927SAndroid Build Coastguard Worker rogue_bitwise_instr_create(rogue_cursor_block(b->cursor), op);
557*61046927SAndroid Build Coastguard Worker
558*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_dsts; ++i) {
559*61046927SAndroid Build Coastguard Worker bitwise->dst[i].ref = dsts[i];
560*61046927SAndroid Build Coastguard Worker bitwise->dst[i].index = i;
561*61046927SAndroid Build Coastguard Worker }
562*61046927SAndroid Build Coastguard Worker
563*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_srcs; ++i) {
564*61046927SAndroid Build Coastguard Worker bitwise->src[i].ref = srcs[i];
565*61046927SAndroid Build Coastguard Worker bitwise->src[i].index = i;
566*61046927SAndroid Build Coastguard Worker }
567*61046927SAndroid Build Coastguard Worker
568*61046927SAndroid Build Coastguard Worker rogue_builder_insert_instr(b, &bitwise->instr);
569*61046927SAndroid Build Coastguard Worker return bitwise;
570*61046927SAndroid Build Coastguard Worker }
571*61046927SAndroid Build Coastguard Worker
572*61046927SAndroid Build Coastguard Worker static inline rogue_bitwise_instr *
rogue_build_bitwise22(rogue_builder * b,enum rogue_bitwise_op op,rogue_ref dst0,rogue_ref dst1,rogue_ref src0,rogue_ref src1)573*61046927SAndroid Build Coastguard Worker rogue_build_bitwise22(rogue_builder *b,
574*61046927SAndroid Build Coastguard Worker enum rogue_bitwise_op op,
575*61046927SAndroid Build Coastguard Worker rogue_ref dst0,
576*61046927SAndroid Build Coastguard Worker rogue_ref dst1,
577*61046927SAndroid Build Coastguard Worker rogue_ref src0,
578*61046927SAndroid Build Coastguard Worker rogue_ref src1)
579*61046927SAndroid Build Coastguard Worker {
580*61046927SAndroid Build Coastguard Worker rogue_ref dsts[] = { dst0, dst1 };
581*61046927SAndroid Build Coastguard Worker rogue_ref srcs[] = { src0, src1 };
582*61046927SAndroid Build Coastguard Worker return rogue_build_bitwise(b, op, 2, dsts, 2, srcs);
583*61046927SAndroid Build Coastguard Worker }
584*61046927SAndroid Build Coastguard Worker
585*61046927SAndroid Build Coastguard Worker #define ROGUE_BUILDER_DEFINE_BITWISE22(op) \
586*61046927SAndroid Build Coastguard Worker PUBLIC \
587*61046927SAndroid Build Coastguard Worker rogue_bitwise_instr *rogue_##op(rogue_builder *b, \
588*61046927SAndroid Build Coastguard Worker rogue_ref dst0, \
589*61046927SAndroid Build Coastguard Worker rogue_ref dst1, \
590*61046927SAndroid Build Coastguard Worker rogue_ref src0, \
591*61046927SAndroid Build Coastguard Worker rogue_ref src1) \
592*61046927SAndroid Build Coastguard Worker { \
593*61046927SAndroid Build Coastguard Worker assert(rogue_bitwise_op_infos[ROGUE_BITWISE_OP_##op].num_dsts == 2); \
594*61046927SAndroid Build Coastguard Worker assert(rogue_bitwise_op_infos[ROGUE_BITWISE_OP_##op].num_srcs == 2); \
595*61046927SAndroid Build Coastguard Worker return rogue_build_bitwise22(b, \
596*61046927SAndroid Build Coastguard Worker ROGUE_BITWISE_OP_##op, \
597*61046927SAndroid Build Coastguard Worker dst0, \
598*61046927SAndroid Build Coastguard Worker dst1, \
599*61046927SAndroid Build Coastguard Worker src0, \
600*61046927SAndroid Build Coastguard Worker src1); \
601*61046927SAndroid Build Coastguard Worker }
602*61046927SAndroid Build Coastguard Worker
603*61046927SAndroid Build Coastguard Worker #include "rogue_bitwise_instrs.def"
604