xref: /aosp_15_r20/external/mesa3d/src/imagination/rogue/rogue_info.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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 
26*61046927SAndroid Build Coastguard Worker /**
27*61046927SAndroid Build Coastguard Worker  * \file rogue_info.c
28*61046927SAndroid Build Coastguard Worker  *
29*61046927SAndroid Build Coastguard Worker  * \brief Contains information and definitions for defined types and structures.
30*61046927SAndroid Build Coastguard Worker  */
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker /* TODO: Adjust according to core configurations. */
33*61046927SAndroid Build Coastguard Worker /* TODO: Remaining restrictions, e.g. some registers are only
34*61046927SAndroid Build Coastguard Worker  * usable by a particular instruction (vertex output) etc. */
35*61046927SAndroid Build Coastguard Worker #define S(n) BITFIELD64_BIT(ROGUE_IO_S##n - 1)
36*61046927SAndroid Build Coastguard Worker const rogue_reg_info rogue_reg_infos[ROGUE_REG_CLASS_COUNT] = {
37*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_INVALID] = { .name = "!INVALID!", .str = "!INVALID!", },
38*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_SSA] = { .name = "ssa", .str = "R", },
39*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_TEMP] = { .name = "temp", .str = "r", .num = 248, },
40*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_COEFF] = { .name = "coeff", .str = "cf", .num = 4096, .supported_io_srcs = S(0) | S(2) | S(3), },
41*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_SHARED] = { .name = "shared", .str = "sh", .num = 4096, .supported_io_srcs = S(0) | S(2) | S(3), },
42*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_SPECIAL] = { .name = "special", .str = "sr", .num = 240, }, /* TODO NEXT: Only S1, S2, S4. */
43*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_INTERNAL] = { .name = "internal", .str = "i", .num = 8, },
44*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_CONST] = { .name = "const", .str = "sc", .num = 240, },
45*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_PIXOUT] = { .name = "pixout", .str = "po", .num = 8, .supported_io_srcs = S(0) | S(2) | S(3), },
46*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_VTXIN] = { .name = "vtxin", .str = "vi", .num = 248, },
47*61046927SAndroid Build Coastguard Worker    [ROGUE_REG_CLASS_VTXOUT] = { .name = "vtxout", .str = "vo", .num = 256, },
48*61046927SAndroid Build Coastguard Worker };
49*61046927SAndroid Build Coastguard Worker #undef S
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker const rogue_regalloc_info regalloc_info[ROGUE_REGALLOC_CLASS_COUNT] = {
52*61046927SAndroid Build Coastguard Worker    [ROGUE_REGALLOC_CLASS_TEMP_1] = { .class = ROGUE_REG_CLASS_TEMP, .stride = 1, },
53*61046927SAndroid Build Coastguard Worker    [ROGUE_REGALLOC_CLASS_TEMP_2] = { .class = ROGUE_REG_CLASS_TEMP, .stride = 2, },
54*61046927SAndroid Build Coastguard Worker    [ROGUE_REGALLOC_CLASS_TEMP_4] = { .class = ROGUE_REG_CLASS_TEMP, .stride = 4, },
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker const rogue_reg_dst_info rogue_reg_dst_infos[ROGUE_REG_DST_VARIANTS] = {
58*61046927SAndroid Build Coastguard Worker    {
59*61046927SAndroid Build Coastguard Worker       .num_dsts = 1,
60*61046927SAndroid Build Coastguard Worker       .bank_bits = { 1 },
61*61046927SAndroid Build Coastguard Worker       .index_bits = { 6 },
62*61046927SAndroid Build Coastguard Worker       .bytes = 1,
63*61046927SAndroid Build Coastguard Worker    },
64*61046927SAndroid Build Coastguard Worker    {
65*61046927SAndroid Build Coastguard Worker       .num_dsts = 1,
66*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3 },
67*61046927SAndroid Build Coastguard Worker       .index_bits = { 11 },
68*61046927SAndroid Build Coastguard Worker       .bytes = 2,
69*61046927SAndroid Build Coastguard Worker    },
70*61046927SAndroid Build Coastguard Worker    {
71*61046927SAndroid Build Coastguard Worker       .num_dsts = 2,
72*61046927SAndroid Build Coastguard Worker       .bank_bits = { 1, 1 },
73*61046927SAndroid Build Coastguard Worker       .index_bits = { 7, 6 },
74*61046927SAndroid Build Coastguard Worker       .bytes = 2,
75*61046927SAndroid Build Coastguard Worker    },
76*61046927SAndroid Build Coastguard Worker    {
77*61046927SAndroid Build Coastguard Worker       .num_dsts = 2,
78*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 3 },
79*61046927SAndroid Build Coastguard Worker       .index_bits = { 8, 8 },
80*61046927SAndroid Build Coastguard Worker       .bytes = 3,
81*61046927SAndroid Build Coastguard Worker    },
82*61046927SAndroid Build Coastguard Worker    {
83*61046927SAndroid Build Coastguard Worker       .num_dsts = 2,
84*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 3 },
85*61046927SAndroid Build Coastguard Worker       .index_bits = { 11, 11 },
86*61046927SAndroid Build Coastguard Worker       .bytes = 4,
87*61046927SAndroid Build Coastguard Worker    },
88*61046927SAndroid Build Coastguard Worker };
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker const rogue_reg_src_info rogue_reg_lower_src_infos[ROGUE_REG_SRC_VARIANTS] = {
91*61046927SAndroid Build Coastguard Worker    {
92*61046927SAndroid Build Coastguard Worker       .num_srcs = 1,
93*61046927SAndroid Build Coastguard Worker       .mux_bits = 0,
94*61046927SAndroid Build Coastguard Worker       .bank_bits = { 1 },
95*61046927SAndroid Build Coastguard Worker       .index_bits = { 6 },
96*61046927SAndroid Build Coastguard Worker       .bytes = 1,
97*61046927SAndroid Build Coastguard Worker    },
98*61046927SAndroid Build Coastguard Worker    {
99*61046927SAndroid Build Coastguard Worker       .num_srcs = 1,
100*61046927SAndroid Build Coastguard Worker       .mux_bits = 2,
101*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3 },
102*61046927SAndroid Build Coastguard Worker       .index_bits = { 11 },
103*61046927SAndroid Build Coastguard Worker       .bytes = 3,
104*61046927SAndroid Build Coastguard Worker    },
105*61046927SAndroid Build Coastguard Worker    {
106*61046927SAndroid Build Coastguard Worker       .num_srcs = 2,
107*61046927SAndroid Build Coastguard Worker       .mux_bits = 0,
108*61046927SAndroid Build Coastguard Worker       .bank_bits = { 1, 1 },
109*61046927SAndroid Build Coastguard Worker       .index_bits = { 6, 5 },
110*61046927SAndroid Build Coastguard Worker       .bytes = 2,
111*61046927SAndroid Build Coastguard Worker    },
112*61046927SAndroid Build Coastguard Worker    {
113*61046927SAndroid Build Coastguard Worker       .num_srcs = 2,
114*61046927SAndroid Build Coastguard Worker       .mux_bits = 2,
115*61046927SAndroid Build Coastguard Worker       .bank_bits = { 2, 2 },
116*61046927SAndroid Build Coastguard Worker       .index_bits = { 7, 7 },
117*61046927SAndroid Build Coastguard Worker       .bytes = 3,
118*61046927SAndroid Build Coastguard Worker    },
119*61046927SAndroid Build Coastguard Worker    {
120*61046927SAndroid Build Coastguard Worker       .num_srcs = 2,
121*61046927SAndroid Build Coastguard Worker       .mux_bits = 3,
122*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 2 },
123*61046927SAndroid Build Coastguard Worker       .index_bits = { 11, 8 },
124*61046927SAndroid Build Coastguard Worker       .bytes = 4,
125*61046927SAndroid Build Coastguard Worker    },
126*61046927SAndroid Build Coastguard Worker    {
127*61046927SAndroid Build Coastguard Worker       .num_srcs = 3,
128*61046927SAndroid Build Coastguard Worker       .mux_bits = 2,
129*61046927SAndroid Build Coastguard Worker       .bank_bits = { 2, 2, 2 },
130*61046927SAndroid Build Coastguard Worker       .index_bits = { 7, 7, 6 },
131*61046927SAndroid Build Coastguard Worker       .bytes = 4,
132*61046927SAndroid Build Coastguard Worker    },
133*61046927SAndroid Build Coastguard Worker    {
134*61046927SAndroid Build Coastguard Worker       .num_srcs = 3,
135*61046927SAndroid Build Coastguard Worker       .mux_bits = 3,
136*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 2, 3 },
137*61046927SAndroid Build Coastguard Worker       .index_bits = { 8, 8, 8 },
138*61046927SAndroid Build Coastguard Worker       .bytes = 5,
139*61046927SAndroid Build Coastguard Worker    },
140*61046927SAndroid Build Coastguard Worker    {
141*61046927SAndroid Build Coastguard Worker       .num_srcs = 3,
142*61046927SAndroid Build Coastguard Worker       .mux_bits = 3,
143*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 2, 3 },
144*61046927SAndroid Build Coastguard Worker       .index_bits = { 11, 8, 11 },
145*61046927SAndroid Build Coastguard Worker       .bytes = 6,
146*61046927SAndroid Build Coastguard Worker    },
147*61046927SAndroid Build Coastguard Worker };
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker const rogue_reg_src_info rogue_reg_upper_src_infos[ROGUE_REG_SRC_VARIANTS] = {
150*61046927SAndroid Build Coastguard Worker    {
151*61046927SAndroid Build Coastguard Worker       .num_srcs = 1,
152*61046927SAndroid Build Coastguard Worker       .bank_bits = { 1 },
153*61046927SAndroid Build Coastguard Worker       .index_bits = { 6 },
154*61046927SAndroid Build Coastguard Worker       .bytes = 1,
155*61046927SAndroid Build Coastguard Worker    },
156*61046927SAndroid Build Coastguard Worker    {
157*61046927SAndroid Build Coastguard Worker       .num_srcs = 1,
158*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3 },
159*61046927SAndroid Build Coastguard Worker       .index_bits = { 11 },
160*61046927SAndroid Build Coastguard Worker       .bytes = 3,
161*61046927SAndroid Build Coastguard Worker    },
162*61046927SAndroid Build Coastguard Worker    {
163*61046927SAndroid Build Coastguard Worker       .num_srcs = 2,
164*61046927SAndroid Build Coastguard Worker       .bank_bits = { 1, 1 },
165*61046927SAndroid Build Coastguard Worker       .index_bits = { 6, 5 },
166*61046927SAndroid Build Coastguard Worker       .bytes = 2,
167*61046927SAndroid Build Coastguard Worker    },
168*61046927SAndroid Build Coastguard Worker    {
169*61046927SAndroid Build Coastguard Worker       .num_srcs = 2,
170*61046927SAndroid Build Coastguard Worker       .bank_bits = { 2, 2 },
171*61046927SAndroid Build Coastguard Worker       .index_bits = { 7, 7 },
172*61046927SAndroid Build Coastguard Worker       .bytes = 3,
173*61046927SAndroid Build Coastguard Worker    },
174*61046927SAndroid Build Coastguard Worker    {
175*61046927SAndroid Build Coastguard Worker       .num_srcs = 2,
176*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 2 },
177*61046927SAndroid Build Coastguard Worker       .index_bits = { 11, 8 },
178*61046927SAndroid Build Coastguard Worker       .bytes = 4,
179*61046927SAndroid Build Coastguard Worker    },
180*61046927SAndroid Build Coastguard Worker    {
181*61046927SAndroid Build Coastguard Worker       .num_srcs = 3,
182*61046927SAndroid Build Coastguard Worker       .bank_bits = { 2, 2, 2 },
183*61046927SAndroid Build Coastguard Worker       .index_bits = { 7, 7, 6 },
184*61046927SAndroid Build Coastguard Worker       .bytes = 4,
185*61046927SAndroid Build Coastguard Worker    },
186*61046927SAndroid Build Coastguard Worker    {
187*61046927SAndroid Build Coastguard Worker       .num_srcs = 3,
188*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 2, 2 },
189*61046927SAndroid Build Coastguard Worker       .index_bits = { 8, 8, 8 },
190*61046927SAndroid Build Coastguard Worker       .bytes = 5,
191*61046927SAndroid Build Coastguard Worker    },
192*61046927SAndroid Build Coastguard Worker    {
193*61046927SAndroid Build Coastguard Worker       .num_srcs = 3,
194*61046927SAndroid Build Coastguard Worker       .bank_bits = { 3, 2, 2 },
195*61046927SAndroid Build Coastguard Worker       .index_bits = { 11, 8, 8 },
196*61046927SAndroid Build Coastguard Worker       .bytes = 6,
197*61046927SAndroid Build Coastguard Worker    },
198*61046927SAndroid Build Coastguard Worker };
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker #define OM(op_mod) BITFIELD64_BIT(ROGUE_ALU_OP_MOD_##op_mod)
201*61046927SAndroid Build Coastguard Worker const rogue_alu_op_mod_info rogue_alu_op_mod_infos[ROGUE_ALU_OP_MOD_COUNT] = {
202*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_LP] = { .str = "lp", },
203*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_SAT] = { .str = "sat", },
204*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_SCALE] = { .str = "scale", },
205*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_ROUNDZERO] = { .str = "roundzero", },
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_Z] = { .str = "z", .exclude = OM(GZ) | OM(GEZ) | OM(C) | OM(E) | OM(G) | OM(GE) | OM(NE) | OM(L) | OM(LE) },
208*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_GZ] = { .str = "gz", .exclude = OM(Z) | OM(GEZ) | OM(C) | OM(E) | OM(G) | OM(GE) | OM(NE) | OM(L) | OM(LE) },
209*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_GEZ] = { .str = "gez", .exclude = OM(Z) | OM(GZ) | OM(C) | OM(E) | OM(G) | OM(GE) | OM(NE) | OM(L) | OM(LE) },
210*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_C] = { .str = "c", .exclude = OM(Z) | OM(GZ) | OM(GEZ) | OM(E) | OM(G) | OM(GE) | OM(NE) | OM(L) | OM(LE) },
211*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_E] = { .str = "e", .exclude = OM(Z) | OM(GZ) | OM(GEZ) | OM(C) | OM(G) | OM(GE) | OM(NE) | OM(L) | OM(LE) },
212*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_G] = { .str = "g", .exclude = OM(Z) | OM(GZ) | OM(GEZ) | OM(C) | OM(E) | OM(GE) | OM(NE) | OM(L) | OM(LE) },
213*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_GE] = { .str = "ge", .exclude = OM(Z) | OM(GZ) | OM(GEZ) | OM(C) | OM(E) | OM(G) | OM(NE) | OM(L) | OM(LE) },
214*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_NE] = { .str = "ne", .exclude = OM(Z) | OM(GZ) | OM(GEZ) | OM(C) | OM(E) | OM(G) | OM(GE) | OM(L) | OM(LE) },
215*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_L] = { .str = "l", .exclude = OM(Z) | OM(GZ) | OM(GEZ) | OM(C) | OM(E) | OM(G) | OM(GE) | OM(NE) | OM(LE) },
216*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_LE] = { .str = "le", .exclude = OM(Z) | OM(GZ) | OM(GEZ) | OM(C) | OM(E) | OM(G) | OM(GE) | OM(NE) | OM(L) },
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_F32] = { .str = "f32", .exclude = OM(U16) | OM(S16) | OM(U8) | OM(S8) | OM(U32) | OM(S32) },
219*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_U16] = { .str = "u16", .exclude = OM(F32) | OM(S16) | OM(U8) | OM(S8) | OM(U32) | OM(S32) },
220*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_S16] = { .str = "s16", .exclude = OM(F32) | OM(U16) | OM(U8) | OM(S8) | OM(U32) | OM(S32) },
221*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_U8] = { .str = "u8", .exclude = OM(F32) | OM(U16) | OM(S16) | OM(S8) | OM(U32) | OM(S32) },
222*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_S8] = { .str = "s8", .exclude = OM(F32) | OM(U16) | OM(S16) | OM(U8) | OM(U32) | OM(S32) },
223*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_U32] = { .str = "u32", .exclude = OM(F32) | OM(U16) | OM(S16) | OM(U8) | OM(S8) | OM(S32) },
224*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOD_S32] = { .str = "s32", .exclude = OM(F32) | OM(U16) | OM(S16) | OM(U8) | OM(S8) | OM(U32) },
225*61046927SAndroid Build Coastguard Worker };
226*61046927SAndroid Build Coastguard Worker #undef OM
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker const rogue_alu_dst_mod_info rogue_alu_dst_mod_infos[ROGUE_ALU_DST_MOD_COUNT] = {
229*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_DST_MOD_E0] = { .str = "e0", },
230*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_DST_MOD_E1] = { .str = "e1", },
231*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_DST_MOD_E2] = { .str = "e2", },
232*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_DST_MOD_E3] = { .str = "e3", },
233*61046927SAndroid Build Coastguard Worker };
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker const rogue_alu_src_mod_info rogue_alu_src_mod_infos[ROGUE_ALU_SRC_MOD_COUNT] = {
236*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_SRC_MOD_FLR] = { .str = "flr", },
237*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_SRC_MOD_ABS] = { .str = "abs", },
238*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_SRC_MOD_NEG] = { .str = "neg", },
239*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_SRC_MOD_E0] = { .str = "e0", },
240*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_SRC_MOD_E1] = { .str = "e1", },
241*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_SRC_MOD_E2] = { .str = "e2", },
242*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_SRC_MOD_E3] = { .str = "e3", },
243*61046927SAndroid Build Coastguard Worker };
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker #define OM(op_mod) BITFIELD64_BIT(ROGUE_CTRL_OP_MOD_##op_mod)
246*61046927SAndroid Build Coastguard Worker const rogue_ctrl_op_mod_info rogue_ctrl_op_mod_infos[ROGUE_CTRL_OP_MOD_COUNT] = {
247*61046927SAndroid Build Coastguard Worker    [ROGUE_CTRL_OP_MOD_LINK] = { .str = "link", },
248*61046927SAndroid Build Coastguard Worker    [ROGUE_CTRL_OP_MOD_ALLINST] = { .str = "allinst", .exclude = OM(ANYINST) },
249*61046927SAndroid Build Coastguard Worker    [ROGUE_CTRL_OP_MOD_ANYINST] = { .str = "anyinst", .exclude = OM(ALLINST) },
250*61046927SAndroid Build Coastguard Worker    [ROGUE_CTRL_OP_MOD_END] = { .str = "end", },
251*61046927SAndroid Build Coastguard Worker };
252*61046927SAndroid Build Coastguard Worker #undef OM
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker #define OM(op_mod) BITFIELD64_BIT(ROGUE_CTRL_OP_MOD_##op_mod)
255*61046927SAndroid Build Coastguard Worker #define T(type) BITFIELD64_BIT(ROGUE_REF_TYPE_##type - 1)
256*61046927SAndroid Build Coastguard Worker const rogue_ctrl_op_info rogue_ctrl_op_infos[ROGUE_CTRL_OP_COUNT] = {
257*61046927SAndroid Build Coastguard Worker 	[ROGUE_CTRL_OP_INVALID] = { .str = "!INVALID!", },
258*61046927SAndroid Build Coastguard Worker 	[ROGUE_CTRL_OP_END] = { .str = "end", .ends_block = true, },
259*61046927SAndroid Build Coastguard Worker 	[ROGUE_CTRL_OP_NOP] = { .str = "nop",
260*61046927SAndroid Build Coastguard Worker 		.supported_op_mods = OM(END),
261*61046927SAndroid Build Coastguard Worker 	},
262*61046927SAndroid Build Coastguard Worker 	[ROGUE_CTRL_OP_WOP] = { .str = "wop", },
263*61046927SAndroid Build Coastguard Worker 	[ROGUE_CTRL_OP_BR] = { .str = "br", .has_target = true, .ends_block = true,
264*61046927SAndroid Build Coastguard Worker 		.supported_op_mods = OM(LINK) | OM(ALLINST) | OM(ANYINST),
265*61046927SAndroid Build Coastguard Worker    },
266*61046927SAndroid Build Coastguard Worker 	[ROGUE_CTRL_OP_BA] = { .str = "ba", .ends_block = true, .num_srcs = 1,
267*61046927SAndroid Build Coastguard Worker 		.supported_op_mods = OM(LINK) | OM(ALLINST) | OM(ANYINST),
268*61046927SAndroid Build Coastguard Worker       .supported_src_types = { [0] = T(VAL), },
269*61046927SAndroid Build Coastguard Worker    },
270*61046927SAndroid Build Coastguard Worker 	[ROGUE_CTRL_OP_WDF] = { .str = "wdf", .num_srcs = 1,
271*61046927SAndroid Build Coastguard Worker       .supported_src_types = { [0] = T(DRC), },
272*61046927SAndroid Build Coastguard Worker    },
273*61046927SAndroid Build Coastguard Worker };
274*61046927SAndroid Build Coastguard Worker #undef T
275*61046927SAndroid Build Coastguard Worker #undef OM
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker #define IO(io) ROGUE_IO_##io
278*61046927SAndroid Build Coastguard Worker #define OM(op_mod) BITFIELD64_BIT(ROGUE_BACKEND_OP_MOD_##op_mod)
279*61046927SAndroid Build Coastguard Worker #define T(type) BITFIELD64_BIT(ROGUE_REF_TYPE_##type - 1)
280*61046927SAndroid Build Coastguard Worker #define B(n) BITFIELD64_BIT(n)
281*61046927SAndroid Build Coastguard Worker const rogue_backend_op_info rogue_backend_op_infos[ROGUE_BACKEND_OP_COUNT] = {
282*61046927SAndroid Build Coastguard Worker 	[ROGUE_BACKEND_OP_INVALID] = { .str = "!INVALID!", },
283*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_UVSW_WRITE] = { .str = "uvsw.write", .num_dsts = 1, .num_srcs = 1,
284*61046927SAndroid Build Coastguard Worker       .phase_io = { .src[0] = IO(W0), },
285*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG), },
286*61046927SAndroid Build Coastguard Worker       .supported_src_types = { [0] = T(REG), },
287*61046927SAndroid Build Coastguard Worker    },
288*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_UVSW_EMIT] = { .str = "uvsw.emit", },
289*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_UVSW_ENDTASK] = { .str = "uvsw.endtask", },
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_UVSW_EMITTHENENDTASK] = { .str = "uvsw.emitthenendtask", },
292*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_UVSW_WRITETHENEMITTHENENDTASK] = { .str = "uvsw.writethenemitthenendtask", .num_dsts = 1, .num_srcs = 1,
293*61046927SAndroid Build Coastguard Worker       .phase_io = { .src[0] = IO(W0), },
294*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG), },
295*61046927SAndroid Build Coastguard Worker       .supported_src_types = { [0] = T(REG), },
296*61046927SAndroid Build Coastguard Worker    },
297*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_IDF] = { .str = "idf", .num_srcs = 2,
298*61046927SAndroid Build Coastguard Worker       .phase_io = { .src[1] = IO(S0), },
299*61046927SAndroid Build Coastguard Worker       .supported_src_types = { [0] = T(DRC), [1] = T(REGARRAY), },
300*61046927SAndroid Build Coastguard Worker       .src_stride = {
301*61046927SAndroid Build Coastguard Worker          [1] = 1,
302*61046927SAndroid Build Coastguard Worker       },
303*61046927SAndroid Build Coastguard Worker    },
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_EMITPIX] = { .str = "emitpix", .num_srcs = 2,
306*61046927SAndroid Build Coastguard Worker       .phase_io = { .src[0] = IO(S0), .src[1] = IO(S2), },
307*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(FREEP),
308*61046927SAndroid Build Coastguard Worker       .supported_src_types = { [0] = T(REG), [1] = T(REG), },
309*61046927SAndroid Build Coastguard Worker    },
310*61046927SAndroid Build Coastguard Worker    /* .src[1] and .src[2] can actually be S0-5. */
311*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_LD] = { .str = "ld", .num_dsts = 1, .num_srcs = 3,
312*61046927SAndroid Build Coastguard Worker       .phase_io = { .dst[0] = IO(S3), .src[2] = IO(S0), },
313*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(BYPASS) | OM(FORCELINEFILL) | OM(SLCBYPASS) | OM(SLCNOALLOC),
314*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), },
315*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
316*61046927SAndroid Build Coastguard Worker          [0] = T(DRC),
317*61046927SAndroid Build Coastguard Worker          [1] = T(VAL),
318*61046927SAndroid Build Coastguard Worker          [2] = T(REGARRAY),
319*61046927SAndroid Build Coastguard Worker       },
320*61046927SAndroid Build Coastguard Worker       .dst_stride = {
321*61046927SAndroid Build Coastguard Worker          [0] = ~0U,
322*61046927SAndroid Build Coastguard Worker       },
323*61046927SAndroid Build Coastguard Worker       .src_stride = {
324*61046927SAndroid Build Coastguard Worker          [2] = 1,
325*61046927SAndroid Build Coastguard Worker       },
326*61046927SAndroid Build Coastguard Worker    },
327*61046927SAndroid Build Coastguard Worker    /* .src[0] and .src[4] can actually be S0-5. */
328*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_ST] = { .str = "st", .num_srcs = 6,
329*61046927SAndroid Build Coastguard Worker       .phase_io = { .src[0] = IO(S3), .src[4] = IO(S0), },
330*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(TILED) | OM(WRITETHROUGH) | OM(WRITEBACK) | OM(LAZYWRITEBACK) |
331*61046927SAndroid Build Coastguard Worker          OM(SLCBYPASS) | OM(SLCWRITEBACK) | OM(SLCWRITETHROUGH) | OM(SLCNOALLOC),
332*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
333*61046927SAndroid Build Coastguard Worker          [0] = T(REG) | T(REGARRAY),
334*61046927SAndroid Build Coastguard Worker          [1] = T(VAL),
335*61046927SAndroid Build Coastguard Worker          [2] = T(DRC),
336*61046927SAndroid Build Coastguard Worker          [3] = T(VAL),
337*61046927SAndroid Build Coastguard Worker          [4] = T(REGARRAY),
338*61046927SAndroid Build Coastguard Worker          [5] = T(IO),
339*61046927SAndroid Build Coastguard Worker       },
340*61046927SAndroid Build Coastguard Worker       .src_stride = {
341*61046927SAndroid Build Coastguard Worker          [4] = 1,
342*61046927SAndroid Build Coastguard Worker       },
343*61046927SAndroid Build Coastguard Worker    },
344*61046927SAndroid Build Coastguard Worker 	[ROGUE_BACKEND_OP_FITR_PIXEL] = { .str = "fitr.pixel", .num_dsts = 1, .num_srcs = 3,
345*61046927SAndroid Build Coastguard Worker       .phase_io = { .dst[0] = IO(S3), .src[1] = IO(S0), },
346*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(SAT),
347*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), },
348*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
349*61046927SAndroid Build Coastguard Worker          [0] = T(DRC),
350*61046927SAndroid Build Coastguard Worker          [1] = T(REGARRAY),
351*61046927SAndroid Build Coastguard Worker          [2] = T(VAL),
352*61046927SAndroid Build Coastguard Worker       },
353*61046927SAndroid Build Coastguard Worker       .dst_stride = {
354*61046927SAndroid Build Coastguard Worker          [0] = ~0U,
355*61046927SAndroid Build Coastguard Worker       },
356*61046927SAndroid Build Coastguard Worker       .src_stride = {
357*61046927SAndroid Build Coastguard Worker          [1] = ~0U,
358*61046927SAndroid Build Coastguard Worker       },
359*61046927SAndroid Build Coastguard Worker    },
360*61046927SAndroid Build Coastguard Worker 	[ROGUE_BACKEND_OP_FITRP_PIXEL] = { .str = "fitrp.pixel", .num_dsts = 1, .num_srcs = 4,
361*61046927SAndroid Build Coastguard Worker       .phase_io = { .dst[0] = IO(S3), .src[1] = IO(S0), .src[2] = IO(S2), },
362*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(SAT),
363*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG), },
364*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
365*61046927SAndroid Build Coastguard Worker          [0] = T(DRC),
366*61046927SAndroid Build Coastguard Worker          [1] = T(REGARRAY),
367*61046927SAndroid Build Coastguard Worker          [2] = T(REGARRAY),
368*61046927SAndroid Build Coastguard Worker          [3] = T(VAL),
369*61046927SAndroid Build Coastguard Worker       },
370*61046927SAndroid Build Coastguard Worker       .src_stride = {
371*61046927SAndroid Build Coastguard Worker          [1] = 3,
372*61046927SAndroid Build Coastguard Worker          [2] = ~0U,
373*61046927SAndroid Build Coastguard Worker       },
374*61046927SAndroid Build Coastguard Worker    },
375*61046927SAndroid Build Coastguard Worker 	[ROGUE_BACKEND_OP_SMP1D] = { .str = "smp1d", .num_dsts = 1, .num_srcs = 6,
376*61046927SAndroid Build Coastguard Worker       .phase_io = { .dst[0] = IO(S4), .src[1] = IO(S0), .src[2] = IO(S1), .src[3] = IO(S2), },
377*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(PROJ) | OM(FCNORM) | OM(NNCOORDS) | OM(BIAS) | OM(REPLACE) |
378*61046927SAndroid Build Coastguard Worker          OM(GRADIENT) | OM(PPLOD) | OM(TAO) | OM(SOO) | OM(SNO) | OM(WRT) | OM(DATA) |
379*61046927SAndroid Build Coastguard Worker          OM(INFO) | OM(BOTH) | OM(BYPASS) | OM(FORCELINEFILL) | OM(WRITETHROUGH) |
380*61046927SAndroid Build Coastguard Worker          OM(WRITEBACK) | OM(LAZYWRITEBACK) | OM(SLCBYPASS) | OM(SLCWRITEBACK) |
381*61046927SAndroid Build Coastguard Worker          OM(SLCWRITETHROUGH) | OM(SLCNOALLOC) | OM(ARRAY) | OM(INTEGER) | OM(SCHEDSWAP) |
382*61046927SAndroid Build Coastguard Worker          OM(F16),
383*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), },
384*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
385*61046927SAndroid Build Coastguard Worker          [0] = T(DRC),
386*61046927SAndroid Build Coastguard Worker          [1] = T(REGARRAY),
387*61046927SAndroid Build Coastguard Worker          [2] = T(REG) | T(REGARRAY),
388*61046927SAndroid Build Coastguard Worker          [3] = T(REGARRAY),
389*61046927SAndroid Build Coastguard Worker          [4] = T(REGARRAY) | T(IO),
390*61046927SAndroid Build Coastguard Worker          [5] = T(VAL),
391*61046927SAndroid Build Coastguard Worker       },
392*61046927SAndroid Build Coastguard Worker       /* TODO: This may depend on the other options set. */
393*61046927SAndroid Build Coastguard Worker       .src_stride = {
394*61046927SAndroid Build Coastguard Worker          [1] = 3,
395*61046927SAndroid Build Coastguard Worker          [2] = ~0U,
396*61046927SAndroid Build Coastguard Worker          [3] = 3,
397*61046927SAndroid Build Coastguard Worker          [4] = 1,
398*61046927SAndroid Build Coastguard Worker       },
399*61046927SAndroid Build Coastguard Worker       .dst_stride = {
400*61046927SAndroid Build Coastguard Worker          [0] = ~0U,
401*61046927SAndroid Build Coastguard Worker       },
402*61046927SAndroid Build Coastguard Worker    },
403*61046927SAndroid Build Coastguard Worker 	[ROGUE_BACKEND_OP_SMP2D] = { .str = "smp2d", .num_dsts = 1, .num_srcs = 6,
404*61046927SAndroid Build Coastguard Worker       .phase_io = { .dst[0] = IO(S4), .src[1] = IO(S0), .src[2] = IO(S1), .src[3] = IO(S2), },
405*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(PROJ) | OM(FCNORM) | OM(NNCOORDS) | OM(BIAS) | OM(REPLACE) |
406*61046927SAndroid Build Coastguard Worker          OM(GRADIENT) | OM(PPLOD) | OM(TAO) | OM(SOO) | OM(SNO) | OM(WRT) | OM(DATA) |
407*61046927SAndroid Build Coastguard Worker          OM(INFO) | OM(BOTH) | OM(BYPASS) | OM(FORCELINEFILL) | OM(WRITETHROUGH) |
408*61046927SAndroid Build Coastguard Worker          OM(WRITEBACK) | OM(LAZYWRITEBACK) | OM(SLCBYPASS) | OM(SLCWRITEBACK) |
409*61046927SAndroid Build Coastguard Worker          OM(SLCWRITETHROUGH) | OM(SLCNOALLOC) | OM(ARRAY) | OM(INTEGER) | OM(SCHEDSWAP) |
410*61046927SAndroid Build Coastguard Worker          OM(F16),
411*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), },
412*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
413*61046927SAndroid Build Coastguard Worker          [0] = T(DRC),
414*61046927SAndroid Build Coastguard Worker          [1] = T(REGARRAY),
415*61046927SAndroid Build Coastguard Worker          [2] = T(REG) | T(REGARRAY),
416*61046927SAndroid Build Coastguard Worker          [3] = T(REGARRAY),
417*61046927SAndroid Build Coastguard Worker          [4] = T(REGARRAY) | T(IO),
418*61046927SAndroid Build Coastguard Worker          [5] = T(VAL),
419*61046927SAndroid Build Coastguard Worker       },
420*61046927SAndroid Build Coastguard Worker       /* TODO: This may depend on the other options set. */
421*61046927SAndroid Build Coastguard Worker       .src_stride = {
422*61046927SAndroid Build Coastguard Worker          [1] = 3,
423*61046927SAndroid Build Coastguard Worker          [2] = ~0U,
424*61046927SAndroid Build Coastguard Worker          [3] = 3,
425*61046927SAndroid Build Coastguard Worker          [4] = 1,
426*61046927SAndroid Build Coastguard Worker       },
427*61046927SAndroid Build Coastguard Worker       .dst_stride = {
428*61046927SAndroid Build Coastguard Worker          [0] = ~0U,
429*61046927SAndroid Build Coastguard Worker       },
430*61046927SAndroid Build Coastguard Worker    },
431*61046927SAndroid Build Coastguard Worker 	[ROGUE_BACKEND_OP_SMP3D] = { .str = "smp3d", .num_dsts = 1, .num_srcs = 6,
432*61046927SAndroid Build Coastguard Worker       .phase_io = { .dst[0] = IO(S4), .src[1] = IO(S0), .src[2] = IO(S1), .src[3] = IO(S2), },
433*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(PROJ) | OM(FCNORM) | OM(NNCOORDS) | OM(BIAS) | OM(REPLACE) |
434*61046927SAndroid Build Coastguard Worker          OM(GRADIENT) | OM(PPLOD) | OM(TAO) | OM(SOO) | OM(SNO) | OM(WRT) | OM(DATA) |
435*61046927SAndroid Build Coastguard Worker          OM(INFO) | OM(BOTH) | OM(BYPASS) | OM(FORCELINEFILL) | OM(WRITETHROUGH) |
436*61046927SAndroid Build Coastguard Worker          OM(WRITEBACK) | OM(LAZYWRITEBACK) | OM(SLCBYPASS) | OM(SLCWRITEBACK) |
437*61046927SAndroid Build Coastguard Worker          OM(SLCWRITETHROUGH) | OM(SLCNOALLOC) | OM(ARRAY) | OM(INTEGER) | OM(SCHEDSWAP) |
438*61046927SAndroid Build Coastguard Worker          OM(F16),
439*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), },
440*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
441*61046927SAndroid Build Coastguard Worker          [0] = T(DRC),
442*61046927SAndroid Build Coastguard Worker          [1] = T(REGARRAY),
443*61046927SAndroid Build Coastguard Worker          [2] = T(REG) | T(REGARRAY),
444*61046927SAndroid Build Coastguard Worker          [3] = T(REGARRAY),
445*61046927SAndroid Build Coastguard Worker          [4] = T(REGARRAY) | T(IO),
446*61046927SAndroid Build Coastguard Worker          [5] = T(VAL),
447*61046927SAndroid Build Coastguard Worker       },
448*61046927SAndroid Build Coastguard Worker       /* TODO: This may depend on the other options set. */
449*61046927SAndroid Build Coastguard Worker       .src_stride = {
450*61046927SAndroid Build Coastguard Worker          [1] = 3,
451*61046927SAndroid Build Coastguard Worker          [2] = ~0U,
452*61046927SAndroid Build Coastguard Worker          [3] = 3,
453*61046927SAndroid Build Coastguard Worker          [4] = 1,
454*61046927SAndroid Build Coastguard Worker       },
455*61046927SAndroid Build Coastguard Worker       .dst_stride = {
456*61046927SAndroid Build Coastguard Worker          [0] = ~0U,
457*61046927SAndroid Build Coastguard Worker       },
458*61046927SAndroid Build Coastguard Worker    },
459*61046927SAndroid Build Coastguard Worker };
460*61046927SAndroid Build Coastguard Worker #undef B
461*61046927SAndroid Build Coastguard Worker #undef T
462*61046927SAndroid Build Coastguard Worker #undef OM
463*61046927SAndroid Build Coastguard Worker #undef IO
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker #define OM(op_mod) BITFIELD64_BIT(ROGUE_BACKEND_OP_MOD_##op_mod)
466*61046927SAndroid Build Coastguard Worker const rogue_backend_op_mod_info rogue_backend_op_mod_infos[ROGUE_BACKEND_OP_MOD_COUNT] = {
467*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_PROJ]  = { .str = "proj", },
468*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_FCNORM]  = { .str = "fcnorm", },
469*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_NNCOORDS]  = { .str = "nncoords", },
470*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_BIAS]  = { .str = "bias", .exclude = OM(REPLACE) | OM(GRADIENT) },
471*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_REPLACE]  = { .str = "replace", .exclude = OM(BIAS) | OM(GRADIENT) },
472*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_GRADIENT]  = { .str = "gradient", .exclude = OM(BIAS) | OM(REPLACE) },
473*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_PPLOD]  = { .str = "pplod", .require = OM(BIAS) | OM(REPLACE) },
474*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_TAO]  = { .str = "tao", },
475*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SOO]  = { .str = "soo", },
476*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SNO]  = { .str = "sno", },
477*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_WRT]  = { .str = "wrt", },
478*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_DATA]  = { .str = "data", .exclude = OM(INFO) | OM(BOTH) },
479*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_INFO]  = { .str = "info", .exclude = OM(DATA) | OM(BOTH) },
480*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_BOTH]  = { .str = "both", .exclude = OM(DATA) | OM(INFO) },
481*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_TILED] = { .str = "tiled", },
482*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_BYPASS]  = { .str = "bypass", .exclude = OM(FORCELINEFILL) | OM(WRITETHROUGH) | OM(WRITEBACK) | OM(LAZYWRITEBACK) },
483*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_FORCELINEFILL]  = { .str = "forcelinefill", .exclude = OM(BYPASS) | OM(WRITETHROUGH) | OM(WRITEBACK) | OM(LAZYWRITEBACK) },
484*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_WRITETHROUGH]  = { .str = "writethrough", .exclude = OM(BYPASS) | OM(FORCELINEFILL) | OM(WRITEBACK) | OM(LAZYWRITEBACK) },
485*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_WRITEBACK]  = { .str = "writeback", .exclude = OM(BYPASS) | OM(FORCELINEFILL) | OM(WRITETHROUGH) | OM(LAZYWRITEBACK) },
486*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_LAZYWRITEBACK]  = { .str = "lazywriteback", .exclude = OM(BYPASS) | OM(FORCELINEFILL) | OM(WRITETHROUGH) | OM(WRITEBACK) },
487*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SLCBYPASS]  = { .str = "slcbypass", .exclude = OM(SLCWRITEBACK) | OM(SLCWRITETHROUGH) | OM(SLCNOALLOC) },
488*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SLCWRITEBACK]  = { .str = "slcwriteback", .exclude = OM(SLCBYPASS) | OM(SLCWRITETHROUGH) | OM(SLCNOALLOC) },
489*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SLCWRITETHROUGH]  = { .str = "slcwritethrough", .exclude = OM(SLCBYPASS) | OM(SLCWRITEBACK) | OM(SLCNOALLOC) },
490*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SLCNOALLOC]  = { .str = "slcnoalloc", .exclude = OM(SLCBYPASS) | OM(SLCWRITEBACK) | OM(SLCWRITETHROUGH) },
491*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_ARRAY]  = { .str = "array", },
492*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_INTEGER]  = { .str = "integer", },
493*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SCHEDSWAP]  = { .str = "schedswap", },
494*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_F16]  = { .str = "f16", },
495*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_SAT]  = { .str = "sat", },
496*61046927SAndroid Build Coastguard Worker    [ROGUE_BACKEND_OP_MOD_FREEP] = { .str = "freep", },
497*61046927SAndroid Build Coastguard Worker };
498*61046927SAndroid Build Coastguard Worker #undef OM
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker #define OM(op_mod) BITFIELD64_BIT(ROGUE_BITWISE_OP_MOD_##op_mod)
501*61046927SAndroid Build Coastguard Worker const rogue_bitwise_op_mod_info
502*61046927SAndroid Build Coastguard Worker    rogue_bitwise_op_mod_infos[ROGUE_BITWISE_OP_MOD_COUNT] = {
503*61046927SAndroid Build Coastguard Worker       [ROGUE_BITWISE_OP_MOD_TWB] = { .str = "twb",
504*61046927SAndroid Build Coastguard Worker                                      .exclude = OM(PWB) | OM(MTB) | OM(FTB) },
505*61046927SAndroid Build Coastguard Worker       [ROGUE_BITWISE_OP_MOD_PWB] = { .str = "pwb",
506*61046927SAndroid Build Coastguard Worker                                      .exclude = OM(TWB) | OM(MTB) | OM(FTB) },
507*61046927SAndroid Build Coastguard Worker       [ROGUE_BITWISE_OP_MOD_MTB] = { .str = "mtb",
508*61046927SAndroid Build Coastguard Worker                                      .exclude = OM(TWB) | OM(PWB) | OM(FTB) },
509*61046927SAndroid Build Coastguard Worker       [ROGUE_BITWISE_OP_MOD_FTB] = { .str = "ftb",
510*61046927SAndroid Build Coastguard Worker                                      .exclude = OM(TWB) | OM(PWB) | OM(MTB) },
511*61046927SAndroid Build Coastguard Worker    };
512*61046927SAndroid Build Coastguard Worker #undef OM
513*61046927SAndroid Build Coastguard Worker 
514*61046927SAndroid Build Coastguard Worker #define P(type) BITFIELD64_BIT(ROGUE_INSTR_PHASE_##type)
515*61046927SAndroid Build Coastguard Worker #define PH(type) ROGUE_INSTR_PHASE_##type
516*61046927SAndroid Build Coastguard Worker #define IO(io) ROGUE_IO_##io
517*61046927SAndroid Build Coastguard Worker #define T(type) BITFIELD64_BIT(ROGUE_REF_TYPE_##type - 1)
518*61046927SAndroid Build Coastguard Worker const rogue_bitwise_op_info rogue_bitwise_op_infos[ROGUE_BITWISE_OP_COUNT] = {
519*61046927SAndroid Build Coastguard Worker    [ROGUE_BITWISE_OP_INVALID] = { .str = "", },
520*61046927SAndroid Build Coastguard Worker    [ROGUE_BITWISE_OP_BYP0] = { .str = "byp", .num_dsts = 2, .num_srcs = 2,
521*61046927SAndroid Build Coastguard Worker       .supported_phases = P(0_BITMASK),
522*61046927SAndroid Build Coastguard Worker       .phase_io[PH(0_BITMASK)] = { .dst[1] = IO(FT1), },
523*61046927SAndroid Build Coastguard Worker       .supported_dst_types = {
524*61046927SAndroid Build Coastguard Worker          [0] = T(REG) | T(REGARRAY) | T(IO),
525*61046927SAndroid Build Coastguard Worker          [1] = T(REG) | T(REGARRAY) | T(IO),
526*61046927SAndroid Build Coastguard Worker       },
527*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
528*61046927SAndroid Build Coastguard Worker          [0] = T(REG) | T(REGARRAY) | T(IO),
529*61046927SAndroid Build Coastguard Worker          [1] = T(REG) | T(REGARRAY) | T(IO) | T(VAL),
530*61046927SAndroid Build Coastguard Worker       },
531*61046927SAndroid Build Coastguard Worker    },
532*61046927SAndroid Build Coastguard Worker };
533*61046927SAndroid Build Coastguard Worker #undef T
534*61046927SAndroid Build Coastguard Worker #undef IO
535*61046927SAndroid Build Coastguard Worker #undef PH
536*61046927SAndroid Build Coastguard Worker #undef P
537*61046927SAndroid Build Coastguard Worker 
538*61046927SAndroid Build Coastguard Worker const rogue_io_info rogue_io_infos[ROGUE_IO_COUNT] = {
539*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_INVALID] = { .str = "!INVALID!", },
540*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_S0] = { .str = "s0", },
541*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_S1] = { .str = "s1", },
542*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_S2] = { .str = "s2", },
543*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_S3] = { .str = "s3", },
544*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_S4] = { .str = "s4", },
545*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_S5] = { .str = "s5", },
546*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_W0] = { .str = "w0", },
547*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_W1] = { .str = "w1", },
548*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_IS0] = { .str = "is0", },
549*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_IS1] = { .str = "is1", },
550*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_IS2] = { .str = "is2", },
551*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_IS3] = { .str = "is3", },
552*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_IS4] = { .str = "is4/w0", },
553*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_IS5] = { .str = "is5/w1", },
554*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FT0] = { .str = "ft0", },
555*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FT1] = { .str = "ft1", },
556*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FT2] = { .str = "ft2", },
557*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FTE] = { .str = "fte", },
558*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FT3] = { .str = "ft3", },
559*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FT4] = { .str = "ft4", },
560*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FT5] = { .str = "ft5", },
561*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_FTT] = { .str = "ftt", },
562*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_P0] = { .str = "p0", },
563*61046927SAndroid Build Coastguard Worker    [ROGUE_IO_NONE] = { .str = "_", },
564*61046927SAndroid Build Coastguard Worker };
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker #define SM(src_mod) BITFIELD64_BIT(ROGUE_ALU_SRC_MOD_##src_mod)
567*61046927SAndroid Build Coastguard Worker #define DM(dst_mod) BITFIELD64_BIT(ROGUE_ALU_DST_MOD_##dst_mod)
568*61046927SAndroid Build Coastguard Worker #define OM(op_mod) BITFIELD64_BIT(ROGUE_ALU_OP_MOD_##op_mod)
569*61046927SAndroid Build Coastguard Worker #define P(type) BITFIELD64_BIT(ROGUE_INSTR_PHASE_##type)
570*61046927SAndroid Build Coastguard Worker #define PH(type) ROGUE_INSTR_PHASE_##type
571*61046927SAndroid Build Coastguard Worker #define IO(io) ROGUE_IO_##io
572*61046927SAndroid Build Coastguard Worker #define T(type) BITFIELD64_BIT(ROGUE_REF_TYPE_##type - 1)
573*61046927SAndroid Build Coastguard Worker #define B(n) BITFIELD64_BIT(n)
574*61046927SAndroid Build Coastguard Worker const rogue_alu_op_info rogue_alu_op_infos[ROGUE_ALU_OP_COUNT] = {
575*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_INVALID] = { .str = "!INVALID!", },
576*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MBYP] = { .str = "mbyp", .num_dsts = 1, .num_srcs = 1,
577*61046927SAndroid Build Coastguard Worker       .supported_phases = P(0),
578*61046927SAndroid Build Coastguard Worker       .phase_io[PH(0)] = { .dst[0] = IO(FT0), .src[0] = IO(S0), },
579*61046927SAndroid Build Coastguard Worker       .supported_src_mods = {
580*61046927SAndroid Build Coastguard Worker          [0] = SM(ABS) | SM(NEG),
581*61046927SAndroid Build Coastguard Worker       },
582*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY) | T(IO), },
583*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
584*61046927SAndroid Build Coastguard Worker          [0] = T(REG) | T(REGARRAY),
585*61046927SAndroid Build Coastguard Worker       },
586*61046927SAndroid Build Coastguard Worker    },
587*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FADD] = { .str = "fadd", .num_dsts = 1, .num_srcs = 2,
588*61046927SAndroid Build Coastguard Worker       .supported_phases = P(0),
589*61046927SAndroid Build Coastguard Worker       .phase_io[PH(0)] = { .dst[0] = IO(FT0), .src[0] = IO(S0), .src[1] = IO(S1), },
590*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(LP) | OM(SAT),
591*61046927SAndroid Build Coastguard Worker       .supported_src_mods = {
592*61046927SAndroid Build Coastguard Worker          [0] = SM(FLR) | SM(ABS) | SM(NEG),
593*61046927SAndroid Build Coastguard Worker          [1] = SM(ABS),
594*61046927SAndroid Build Coastguard Worker       },
595*61046927SAndroid Build Coastguard Worker    },
596*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FMUL] = { .str = "fmul", .num_dsts = 1, .num_srcs = 2,
597*61046927SAndroid Build Coastguard Worker       .supported_phases = P(0),
598*61046927SAndroid Build Coastguard Worker       .phase_io[PH(0)] = { .dst[0] = IO(FT0), .src[0] = IO(S0), .src[1] = IO(S1), },
599*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(LP) | OM(SAT),
600*61046927SAndroid Build Coastguard Worker       .supported_src_mods = {
601*61046927SAndroid Build Coastguard Worker          [0] = SM(FLR) | SM(ABS) | SM(NEG),
602*61046927SAndroid Build Coastguard Worker          [1] = SM(ABS),
603*61046927SAndroid Build Coastguard Worker       },
604*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG), },
605*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
606*61046927SAndroid Build Coastguard Worker          [0] = T(REG),
607*61046927SAndroid Build Coastguard Worker          [1] = T(REG),
608*61046927SAndroid Build Coastguard Worker       },
609*61046927SAndroid Build Coastguard Worker    },
610*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FMAD] = { .str = "fmad", .num_dsts = 1, .num_srcs = 3,
611*61046927SAndroid Build Coastguard Worker       .supported_phases = P(0),
612*61046927SAndroid Build Coastguard Worker       .phase_io[PH(0)] = { .dst[0] = IO(FT0), .src[0] = IO(S0), .src[1] = IO(S1), .src[2] = IO(S2), },
613*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(LP) | OM(SAT),
614*61046927SAndroid Build Coastguard Worker       .supported_src_mods = {
615*61046927SAndroid Build Coastguard Worker          [0] = SM(ABS) | SM(NEG),
616*61046927SAndroid Build Coastguard Worker          [1] = SM(ABS) | SM(NEG),
617*61046927SAndroid Build Coastguard Worker          [2] = SM(FLR) | SM(ABS) | SM(NEG),
618*61046927SAndroid Build Coastguard Worker       },
619*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG), },
620*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
621*61046927SAndroid Build Coastguard Worker          [0] = T(REG),
622*61046927SAndroid Build Coastguard Worker          [1] = T(REG),
623*61046927SAndroid Build Coastguard Worker          [2] = T(REG),
624*61046927SAndroid Build Coastguard Worker       },
625*61046927SAndroid Build Coastguard Worker    },
626*61046927SAndroid Build Coastguard Worker    /* TODO NEXT!: Validate - can/must only select element if non-32-bit type, element has to be same for both args if both args present, 16-bit must be 0 or 1, 32-bit must be 0-3 (can't have no element set)
627*61046927SAndroid Build Coastguard Worker     * Also validate number of sources provided/nulled out based on test op */
628*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_TST] = { .str = "tst", .num_dsts = 2, .num_srcs = 2,
629*61046927SAndroid Build Coastguard Worker       .supported_phases = P(2_TST),
630*61046927SAndroid Build Coastguard Worker       .phase_io[PH(2_TST)] = { .src[0] = IO(IS1), .src[1] = IO(IS2), },
631*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(Z) | OM(GZ) | OM(GEZ) | OM(C) | OM(E) | OM(G) | OM(GE) | OM(NE) | OM(L) | OM(LE) |
632*61046927SAndroid Build Coastguard Worker          OM(F32) | OM(U16) | OM(S16) | OM(U8) | OM(S8) | OM(U32) | OM(S32),
633*61046927SAndroid Build Coastguard Worker       .supported_src_mods = {
634*61046927SAndroid Build Coastguard Worker          [0] = SM(E0) | SM(E1) | SM(E2) | SM(E3),
635*61046927SAndroid Build Coastguard Worker          [1] = SM(E0) | SM(E1) | SM(E2) | SM(E3),
636*61046927SAndroid Build Coastguard Worker       },
637*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(IO), [1] = T(IO), }, /* FTT and either P0 or NONE */
638*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
639*61046927SAndroid Build Coastguard Worker          [0] = T(REG) | T(IO),
640*61046927SAndroid Build Coastguard Worker          [1] = T(REG) | T(IO),
641*61046927SAndroid Build Coastguard Worker       },
642*61046927SAndroid Build Coastguard Worker    },
643*61046927SAndroid Build Coastguard Worker    /* TODO: Support fully. */
644*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOVC] = { .str = "movc", .num_dsts = 2, .num_srcs = 3,
645*61046927SAndroid Build Coastguard Worker       .supported_phases = P(2_MOV),
646*61046927SAndroid Build Coastguard Worker       .phase_io[PH(2_MOV)] = { .dst[0] = IO(W0), .src[1] = IO(FTE), },
647*61046927SAndroid Build Coastguard Worker       .supported_dst_mods = {
648*61046927SAndroid Build Coastguard Worker          [0] = DM(E0) | DM(E1) | DM(E2) | DM(E3),
649*61046927SAndroid Build Coastguard Worker       },
650*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), [1] = T(REG) | T(REGARRAY) | T(IO), },
651*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
652*61046927SAndroid Build Coastguard Worker          [0] = T(IO),
653*61046927SAndroid Build Coastguard Worker          [1] = T(REG) | T(REGARRAY) | T(IO),
654*61046927SAndroid Build Coastguard Worker          [2] = T(REG) | T(REGARRAY) | T(IO),
655*61046927SAndroid Build Coastguard Worker       },
656*61046927SAndroid Build Coastguard Worker    },
657*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_ADD64] = { .str = "add64", .num_dsts = 3, .num_srcs = 5,
658*61046927SAndroid Build Coastguard Worker       .supported_phases = P(0),
659*61046927SAndroid Build Coastguard Worker       .phase_io[PH(0)] = { .dst[0] = IO(FT0), .dst[1] = IO(FTE), .src[0] = IO(S0), .src[1] = IO(S1), .src[2] = IO(S2), .src[3] = IO(IS0), },
660*61046927SAndroid Build Coastguard Worker       .supported_src_mods = {
661*61046927SAndroid Build Coastguard Worker          [0] = SM(ABS) | SM(NEG),
662*61046927SAndroid Build Coastguard Worker          [1] = SM(ABS) | SM(NEG),
663*61046927SAndroid Build Coastguard Worker          [2] = SM(ABS) | SM(NEG),
664*61046927SAndroid Build Coastguard Worker          [3] = SM(ABS) | SM(NEG),
665*61046927SAndroid Build Coastguard Worker       },
666*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), [1] = T(REG) | T(REGARRAY) | T(IO), [2] = T(IO) },
667*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
668*61046927SAndroid Build Coastguard Worker          [0] = T(REG) | T(REGARRAY),
669*61046927SAndroid Build Coastguard Worker          [1] = T(REG) | T(REGARRAY),
670*61046927SAndroid Build Coastguard Worker          [2] = T(REG) | T(REGARRAY) | T(IMM),
671*61046927SAndroid Build Coastguard Worker          [3] = T(REG) | T(REGARRAY)| T(IO) | T(IMM),
672*61046927SAndroid Build Coastguard Worker          [4] = T(IO),
673*61046927SAndroid Build Coastguard Worker       },
674*61046927SAndroid Build Coastguard Worker    },
675*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_PCK_U8888] = { .str = "pck.u8888", .num_dsts = 1, .num_srcs = 1,
676*61046927SAndroid Build Coastguard Worker       .supported_phases = P(2_PCK),
677*61046927SAndroid Build Coastguard Worker       .phase_io[PH(2_PCK)] = { .dst[0] = IO(FT2), .src[0] = IO(IS3), },
678*61046927SAndroid Build Coastguard Worker       .supported_op_mods = OM(SCALE) | OM(ROUNDZERO),
679*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG), },
680*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
681*61046927SAndroid Build Coastguard Worker          [0] = T(REGARRAY),
682*61046927SAndroid Build Coastguard Worker       },
683*61046927SAndroid Build Coastguard Worker       .src_repeat_mask = B(0),
684*61046927SAndroid Build Coastguard Worker    },
685*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_MOV] = { .str = "mov", .num_dsts = 1, .num_srcs = 1,
686*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG) | T(REGARRAY), },
687*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
688*61046927SAndroid Build Coastguard Worker          [0] = T(REG) | T(REGARRAY) | T(IMM),
689*61046927SAndroid Build Coastguard Worker       },
690*61046927SAndroid Build Coastguard Worker    },
691*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_CMOV] = { .str = "cmov", .num_dsts = 1, .num_srcs = 3,
692*61046927SAndroid Build Coastguard Worker       .supported_dst_types = { [0] = T(REG), },
693*61046927SAndroid Build Coastguard Worker       .supported_src_types = {
694*61046927SAndroid Build Coastguard Worker          [0] = T(IO),
695*61046927SAndroid Build Coastguard Worker          [1] = T(REG),
696*61046927SAndroid Build Coastguard Worker          [2] = T(REG),
697*61046927SAndroid Build Coastguard Worker       },
698*61046927SAndroid Build Coastguard Worker    },
699*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FABS] = { .str = "fabs", .num_dsts = 1, .num_srcs = 1, },
700*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FNEG] = { .str = "fneg", .num_dsts = 1, .num_srcs = 1, },
701*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FNABS] = { .str = "fnabs", .num_dsts = 1, .num_srcs = 1, },
702*61046927SAndroid Build Coastguard Worker 
703*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FMAX] = { .str = "fmax", .num_dsts = 1, .num_srcs = 2, }, /* TODO */
704*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_OP_FMIN] = { .str = "fmin", .num_dsts = 1, .num_srcs = 2, }, /* TODO */
705*61046927SAndroid Build Coastguard Worker };
706*61046927SAndroid Build Coastguard Worker #undef B
707*61046927SAndroid Build Coastguard Worker #undef T
708*61046927SAndroid Build Coastguard Worker #undef IO
709*61046927SAndroid Build Coastguard Worker #undef PH
710*61046927SAndroid Build Coastguard Worker #undef P
711*61046927SAndroid Build Coastguard Worker #undef OM
712*61046927SAndroid Build Coastguard Worker #undef DM
713*61046927SAndroid Build Coastguard Worker #undef SM
714*61046927SAndroid Build Coastguard Worker 
715*61046927SAndroid Build Coastguard Worker const char *rogue_exec_cond_str[ROGUE_EXEC_COND_COUNT] = {
716*61046927SAndroid Build Coastguard Worker    [ROGUE_EXEC_COND_INVALID] = "!INVALID!",
717*61046927SAndroid Build Coastguard Worker    [ROGUE_EXEC_COND_PE_TRUE] = "if(pe)",
718*61046927SAndroid Build Coastguard Worker    [ROGUE_EXEC_COND_P0_TRUE] = "if(p0)",
719*61046927SAndroid Build Coastguard Worker    [ROGUE_EXEC_COND_PE_ANY] = "any(pe)",
720*61046927SAndroid Build Coastguard Worker    [ROGUE_EXEC_COND_P0_FALSE] = "if(!p0)",
721*61046927SAndroid Build Coastguard Worker };
722*61046927SAndroid Build Coastguard Worker 
723*61046927SAndroid Build Coastguard Worker const char *rogue_instr_type_str[ROGUE_INSTR_TYPE_COUNT] = {
724*61046927SAndroid Build Coastguard Worker    [ROGUE_INSTR_TYPE_INVALID] = "!INVALID!",
725*61046927SAndroid Build Coastguard Worker 
726*61046927SAndroid Build Coastguard Worker    [ROGUE_INSTR_TYPE_ALU] = "alu",
727*61046927SAndroid Build Coastguard Worker    /* [ROGUE_INSTR_TYPE_CMPLX] = "cmplx", */
728*61046927SAndroid Build Coastguard Worker    [ROGUE_INSTR_TYPE_BACKEND] = "backend",
729*61046927SAndroid Build Coastguard Worker    [ROGUE_INSTR_TYPE_CTRL] = "ctrl",
730*61046927SAndroid Build Coastguard Worker    [ROGUE_INSTR_TYPE_BITWISE] = "bitwise",
731*61046927SAndroid Build Coastguard Worker    /* [ROGUE_INSTR_TYPE_F16SOP] = "f16sop", */
732*61046927SAndroid Build Coastguard Worker };
733*61046927SAndroid Build Coastguard Worker 
734*61046927SAndroid Build Coastguard Worker const char *const rogue_alu_str[ROGUE_ALU_COUNT] = {
735*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_INVALID] = "!INVALID!",
736*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_MAIN] = "main",
737*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_BITWISE] = "bitwise",
738*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_CONTROL] = "control",
739*61046927SAndroid Build Coastguard Worker };
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker const char *const rogue_instr_phase_str[ROGUE_ALU_COUNT][ROGUE_INSTR_PHASE_COUNT] = {
742*61046927SAndroid Build Coastguard Worker    /** Main/ALU (and backend) instructions. */
743*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_MAIN] = {
744*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_0] = "p0",
745*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_1] = "p1",
746*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_2_PCK] = "p2pck",
747*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_2_TST] = "p2tst",
748*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_2_MOV] = "p2mov",
749*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_BACKEND] = "backend",
750*61046927SAndroid Build Coastguard Worker    },
751*61046927SAndroid Build Coastguard Worker 
752*61046927SAndroid Build Coastguard Worker    /** Bitwise instructions. */
753*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_BITWISE] = {
754*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_0_BITMASK] = "p0bm",
755*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_0_SHIFT1] = "p0shf1",
756*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_0_COUNT] = "p0cnt",
757*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_1_LOGICAL] = "p1log",
758*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_2_SHIFT2] = "p2shf2",
759*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_2_TEST] = "p2tst",
760*61046927SAndroid Build Coastguard Worker    },
761*61046927SAndroid Build Coastguard Worker 
762*61046927SAndroid Build Coastguard Worker    /** Control instructions (no co-issuing). */
763*61046927SAndroid Build Coastguard Worker    [ROGUE_ALU_CONTROL] = {
764*61046927SAndroid Build Coastguard Worker       [ROGUE_INSTR_PHASE_CTRL] = "ctrl",
765*61046927SAndroid Build Coastguard Worker    },
766*61046927SAndroid Build Coastguard Worker };
767