xref: /aosp_15_r20/external/mesa3d/src/broadcom/qpu/qpu_instr.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Broadcom
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
25*61046927SAndroid Build Coastguard Worker #include <string.h>
26*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
27*61046927SAndroid Build Coastguard Worker #include "broadcom/common/v3d_device_info.h"
28*61046927SAndroid Build Coastguard Worker #include "qpu_instr.h"
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_magic_waddr_name(const struct v3d_device_info * devinfo,enum v3d_qpu_waddr waddr)31*61046927SAndroid Build Coastguard Worker v3d_qpu_magic_waddr_name(const struct v3d_device_info *devinfo,
32*61046927SAndroid Build Coastguard Worker                          enum v3d_qpu_waddr waddr)
33*61046927SAndroid Build Coastguard Worker {
34*61046927SAndroid Build Coastguard Worker         /* V3D 4.x UNIFA aliases TMU in V3D 3.x in the table below */
35*61046927SAndroid Build Coastguard Worker         if (devinfo->ver < 40 && waddr == V3D_QPU_WADDR_TMU)
36*61046927SAndroid Build Coastguard Worker                 return "tmu";
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker         /* V3D 7.x QUAD and REP aliases R5 and R5REPT in the table below
39*61046927SAndroid Build Coastguard Worker          */
40*61046927SAndroid Build Coastguard Worker         if (devinfo->ver >= 71 && waddr == V3D_QPU_WADDR_QUAD)
41*61046927SAndroid Build Coastguard Worker                 return "quad";
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker         if (devinfo->ver >= 71 && waddr == V3D_QPU_WADDR_REP)
44*61046927SAndroid Build Coastguard Worker                 return "rep";
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker         static const char *waddr_magic[] = {
47*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_R0] = "r0",
48*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_R1] = "r1",
49*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_R2] = "r2",
50*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_R3] = "r3",
51*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_R4] = "r4",
52*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_R5] = "r5",
53*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_NOP] = "-",
54*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TLB] = "tlb",
55*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TLBU] = "tlbu",
56*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_UNIFA] = "unifa",
57*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUL] = "tmul",
58*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUD] = "tmud",
59*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUA] = "tmua",
60*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUAU] = "tmuau",
61*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_VPM] = "vpm",
62*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_VPMU] = "vpmu",
63*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_SYNC] = "sync",
64*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_SYNCU] = "syncu",
65*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_SYNCB] = "syncb",
66*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_RECIP] = "recip",
67*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_RSQRT] = "rsqrt",
68*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_EXP] = "exp",
69*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_LOG] = "log",
70*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_SIN] = "sin",
71*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_RSQRT2] = "rsqrt2",
72*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUC] = "tmuc",
73*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUS] = "tmus",
74*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUT] = "tmut",
75*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUR] = "tmur",
76*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUI] = "tmui",
77*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUB] = "tmub",
78*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUDREF] = "tmudref",
79*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUOFF] = "tmuoff",
80*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUSCM] = "tmuscm",
81*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUSF] = "tmusf",
82*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUSLOD] = "tmuslod",
83*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUHS] = "tmuhs",
84*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUHSCM] = "tmuscm",
85*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUHSF] = "tmuhsf",
86*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_TMUHSLOD] = "tmuhslod",
87*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_WADDR_R5REP] = "r5rep",
88*61046927SAndroid Build Coastguard Worker         };
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker         return waddr_magic[waddr];
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_add_op_name(enum v3d_qpu_add_op op)94*61046927SAndroid Build Coastguard Worker v3d_qpu_add_op_name(enum v3d_qpu_add_op op)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker         static const char *op_names[] = {
97*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FADD] = "fadd",
98*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FADDNF] = "faddnf",
99*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VFPACK] = "vfpack",
100*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ADD] = "add",
101*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SUB] = "sub",
102*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FSUB] = "fsub",
103*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_MIN] = "min",
104*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_MAX] = "max",
105*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_UMIN] = "umin",
106*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_UMAX] = "umax",
107*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SHL] = "shl",
108*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SHR] = "shr",
109*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ASR] = "asr",
110*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ROR] = "ror",
111*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FMIN] = "fmin",
112*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FMAX] = "fmax",
113*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VFMIN] = "vfmin",
114*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_AND] = "and",
115*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_OR] = "or",
116*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_XOR] = "xor",
117*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VADD] = "vadd",
118*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VSUB] = "vsub",
119*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_NOT] = "not",
120*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_NEG] = "neg",
121*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FLAPUSH] = "flapush",
122*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FLBPUSH] = "flbpush",
123*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FLPOP] = "flpop",
124*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_RECIP] = "recip",
125*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SETMSF] = "setmsf",
126*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SETREVF] = "setrevf",
127*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_NOP] = "nop",
128*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_TIDX] = "tidx",
129*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_EIDX] = "eidx",
130*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LR] = "lr",
131*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VFLA] = "vfla",
132*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VFLNA] = "vflna",
133*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VFLB] = "vflb",
134*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VFLNB] = "vflnb",
135*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FXCD] = "fxcd",
136*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_XCD] = "xcd",
137*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FYCD] = "fycd",
138*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_YCD] = "ycd",
139*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_MSF] = "msf",
140*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_REVF] = "revf",
141*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VDWWT] = "vdwwt",
142*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_IID] = "iid",
143*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SAMPID] = "sampid",
144*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_BARRIERID] = "barrierid",
145*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_TMUWT] = "tmuwt",
146*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VPMSETUP] = "vpmsetup",
147*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VPMWT] = "vpmwt",
148*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FLAFIRST] = "flafirst",
149*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FLNAFIRST] = "flnafirst",
150*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LDVPMV_IN] = "ldvpmv_in",
151*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LDVPMV_OUT] = "ldvpmv_out",
152*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LDVPMD_IN] = "ldvpmd_in",
153*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LDVPMD_OUT] = "ldvpmd_out",
154*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LDVPMP] = "ldvpmp",
155*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_RSQRT] = "rsqrt",
156*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_EXP] = "exp",
157*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LOG] = "log",
158*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SIN] = "sin",
159*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_RSQRT2] = "rsqrt2",
160*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LDVPMG_IN] = "ldvpmg_in",
161*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_LDVPMG_OUT] = "ldvpmg_out",
162*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FCMP] = "fcmp",
163*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VFMAX] = "vfmax",
164*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FROUND] = "fround",
165*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FTOIN] = "ftoin",
166*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FTRUNC] = "ftrunc",
167*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FTOIZ] = "ftoiz",
168*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FFLOOR] = "ffloor",
169*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FTOUZ] = "ftouz",
170*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FCEIL] = "fceil",
171*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FTOC] = "ftoc",
172*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FDX] = "fdx",
173*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FDY] = "fdy",
174*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_STVPMV] = "stvpmv",
175*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_STVPMD] = "stvpmd",
176*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_STVPMP] = "stvpmp",
177*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ITOF] = "itof",
178*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_CLZ] = "clz",
179*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_UTOF] = "utof",
180*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_MOV] = "mov",
181*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_FMOV] = "fmov",
182*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_VPACK] = "vpack",
183*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_V8PACK] = "v8pack",
184*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_V10PACK] = "v10pack",
185*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_V11FPACK] = "v11fpack",
186*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_BALLOT] = "ballot",
187*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_BCASTF] = "bcastf",
188*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ALLEQ] = "alleq",
189*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ALLFEQ] = "allfeq",
190*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ROTQ] = "rotq",
191*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_ROT] = "rot",
192*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_A_SHUFFLE] = "shuffle",
193*61046927SAndroid Build Coastguard Worker         };
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker         if (op >= ARRAY_SIZE(op_names))
196*61046927SAndroid Build Coastguard Worker                 return NULL;
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker         return op_names[op];
199*61046927SAndroid Build Coastguard Worker }
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_mul_op_name(enum v3d_qpu_mul_op op)202*61046927SAndroid Build Coastguard Worker v3d_qpu_mul_op_name(enum v3d_qpu_mul_op op)
203*61046927SAndroid Build Coastguard Worker {
204*61046927SAndroid Build Coastguard Worker         static const char *op_names[] = {
205*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_ADD] = "add",
206*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_SUB] = "sub",
207*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_UMUL24] = "umul24",
208*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_VFMUL] = "vfmul",
209*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_SMUL24] = "smul24",
210*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_MULTOP] = "multop",
211*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_FMOV] = "fmov",
212*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_MOV] = "mov",
213*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_NOP] = "nop",
214*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_FMUL] = "fmul",
215*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_FTOUNORM16] = "ftounorm16",
216*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_FTOSNORM16] = "ftosnorm16",
217*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_VFTOUNORM8] = "vftounorm8",
218*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_VFTOSNORM8] = "vftosnorm8",
219*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_VFTOUNORM10LO] = "vftounorm10lo",
220*61046927SAndroid Build Coastguard Worker                 [V3D_QPU_M_VFTOUNORM10HI] = "vftounorm10hi",
221*61046927SAndroid Build Coastguard Worker         };
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker         if (op >= ARRAY_SIZE(op_names))
224*61046927SAndroid Build Coastguard Worker                 return NULL;
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker         return op_names[op];
227*61046927SAndroid Build Coastguard Worker }
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_cond_name(enum v3d_qpu_cond cond)230*61046927SAndroid Build Coastguard Worker v3d_qpu_cond_name(enum v3d_qpu_cond cond)
231*61046927SAndroid Build Coastguard Worker {
232*61046927SAndroid Build Coastguard Worker         switch (cond) {
233*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_NONE:
234*61046927SAndroid Build Coastguard Worker                 return "";
235*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFA:
236*61046927SAndroid Build Coastguard Worker                 return ".ifa";
237*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFB:
238*61046927SAndroid Build Coastguard Worker                 return ".ifb";
239*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFNA:
240*61046927SAndroid Build Coastguard Worker                 return ".ifna";
241*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFNB:
242*61046927SAndroid Build Coastguard Worker                 return ".ifnb";
243*61046927SAndroid Build Coastguard Worker         default:
244*61046927SAndroid Build Coastguard Worker                 unreachable("bad cond value");
245*61046927SAndroid Build Coastguard Worker         }
246*61046927SAndroid Build Coastguard Worker }
247*61046927SAndroid Build Coastguard Worker 
248*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_branch_cond_name(enum v3d_qpu_branch_cond cond)249*61046927SAndroid Build Coastguard Worker v3d_qpu_branch_cond_name(enum v3d_qpu_branch_cond cond)
250*61046927SAndroid Build Coastguard Worker {
251*61046927SAndroid Build Coastguard Worker         switch (cond) {
252*61046927SAndroid Build Coastguard Worker         case V3D_QPU_BRANCH_COND_ALWAYS:
253*61046927SAndroid Build Coastguard Worker                 return "";
254*61046927SAndroid Build Coastguard Worker         case V3D_QPU_BRANCH_COND_A0:
255*61046927SAndroid Build Coastguard Worker                 return ".a0";
256*61046927SAndroid Build Coastguard Worker         case V3D_QPU_BRANCH_COND_NA0:
257*61046927SAndroid Build Coastguard Worker                 return ".na0";
258*61046927SAndroid Build Coastguard Worker         case V3D_QPU_BRANCH_COND_ALLA:
259*61046927SAndroid Build Coastguard Worker                 return ".alla";
260*61046927SAndroid Build Coastguard Worker         case V3D_QPU_BRANCH_COND_ANYNA:
261*61046927SAndroid Build Coastguard Worker                 return ".anyna";
262*61046927SAndroid Build Coastguard Worker         case V3D_QPU_BRANCH_COND_ANYA:
263*61046927SAndroid Build Coastguard Worker                 return ".anya";
264*61046927SAndroid Build Coastguard Worker         case V3D_QPU_BRANCH_COND_ALLNA:
265*61046927SAndroid Build Coastguard Worker                 return ".allna";
266*61046927SAndroid Build Coastguard Worker         default:
267*61046927SAndroid Build Coastguard Worker                 unreachable("bad branch cond value");
268*61046927SAndroid Build Coastguard Worker         }
269*61046927SAndroid Build Coastguard Worker }
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_msfign_name(enum v3d_qpu_msfign msfign)272*61046927SAndroid Build Coastguard Worker v3d_qpu_msfign_name(enum v3d_qpu_msfign msfign)
273*61046927SAndroid Build Coastguard Worker {
274*61046927SAndroid Build Coastguard Worker         switch (msfign) {
275*61046927SAndroid Build Coastguard Worker         case V3D_QPU_MSFIGN_NONE:
276*61046927SAndroid Build Coastguard Worker                 return "";
277*61046927SAndroid Build Coastguard Worker         case V3D_QPU_MSFIGN_P:
278*61046927SAndroid Build Coastguard Worker                 return "p";
279*61046927SAndroid Build Coastguard Worker         case V3D_QPU_MSFIGN_Q:
280*61046927SAndroid Build Coastguard Worker                 return "q";
281*61046927SAndroid Build Coastguard Worker         default:
282*61046927SAndroid Build Coastguard Worker                 unreachable("bad branch cond value");
283*61046927SAndroid Build Coastguard Worker         }
284*61046927SAndroid Build Coastguard Worker }
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_pf_name(enum v3d_qpu_pf pf)287*61046927SAndroid Build Coastguard Worker v3d_qpu_pf_name(enum v3d_qpu_pf pf)
288*61046927SAndroid Build Coastguard Worker {
289*61046927SAndroid Build Coastguard Worker         switch (pf) {
290*61046927SAndroid Build Coastguard Worker         case V3D_QPU_PF_NONE:
291*61046927SAndroid Build Coastguard Worker                 return "";
292*61046927SAndroid Build Coastguard Worker         case V3D_QPU_PF_PUSHZ:
293*61046927SAndroid Build Coastguard Worker                 return ".pushz";
294*61046927SAndroid Build Coastguard Worker         case V3D_QPU_PF_PUSHN:
295*61046927SAndroid Build Coastguard Worker                 return ".pushn";
296*61046927SAndroid Build Coastguard Worker         case V3D_QPU_PF_PUSHC:
297*61046927SAndroid Build Coastguard Worker                 return ".pushc";
298*61046927SAndroid Build Coastguard Worker         default:
299*61046927SAndroid Build Coastguard Worker                 unreachable("bad pf value");
300*61046927SAndroid Build Coastguard Worker         }
301*61046927SAndroid Build Coastguard Worker }
302*61046927SAndroid Build Coastguard Worker 
303*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_uf_name(enum v3d_qpu_uf uf)304*61046927SAndroid Build Coastguard Worker v3d_qpu_uf_name(enum v3d_qpu_uf uf)
305*61046927SAndroid Build Coastguard Worker {
306*61046927SAndroid Build Coastguard Worker         switch (uf) {
307*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_NONE:
308*61046927SAndroid Build Coastguard Worker                 return "";
309*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_ANDZ:
310*61046927SAndroid Build Coastguard Worker                 return ".andz";
311*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_ANDNZ:
312*61046927SAndroid Build Coastguard Worker                 return ".andnz";
313*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_NORZ:
314*61046927SAndroid Build Coastguard Worker                 return ".norz";
315*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_NORNZ:
316*61046927SAndroid Build Coastguard Worker                 return ".nornz";
317*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_ANDN:
318*61046927SAndroid Build Coastguard Worker                 return ".andn";
319*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_ANDNN:
320*61046927SAndroid Build Coastguard Worker                 return ".andnn";
321*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_NORN:
322*61046927SAndroid Build Coastguard Worker                 return ".norn";
323*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_NORNN:
324*61046927SAndroid Build Coastguard Worker                 return ".nornn";
325*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_ANDC:
326*61046927SAndroid Build Coastguard Worker                 return ".andc";
327*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_ANDNC:
328*61046927SAndroid Build Coastguard Worker                 return ".andnc";
329*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_NORC:
330*61046927SAndroid Build Coastguard Worker                 return ".norc";
331*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UF_NORNC:
332*61046927SAndroid Build Coastguard Worker                 return ".nornc";
333*61046927SAndroid Build Coastguard Worker         default:
334*61046927SAndroid Build Coastguard Worker                 unreachable("bad pf value");
335*61046927SAndroid Build Coastguard Worker         }
336*61046927SAndroid Build Coastguard Worker }
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_pack_name(enum v3d_qpu_output_pack pack)339*61046927SAndroid Build Coastguard Worker v3d_qpu_pack_name(enum v3d_qpu_output_pack pack)
340*61046927SAndroid Build Coastguard Worker {
341*61046927SAndroid Build Coastguard Worker         switch (pack) {
342*61046927SAndroid Build Coastguard Worker         case V3D_QPU_PACK_NONE:
343*61046927SAndroid Build Coastguard Worker                 return "";
344*61046927SAndroid Build Coastguard Worker         case V3D_QPU_PACK_L:
345*61046927SAndroid Build Coastguard Worker                 return ".l";
346*61046927SAndroid Build Coastguard Worker         case V3D_QPU_PACK_H:
347*61046927SAndroid Build Coastguard Worker                 return ".h";
348*61046927SAndroid Build Coastguard Worker         default:
349*61046927SAndroid Build Coastguard Worker                 unreachable("bad pack value");
350*61046927SAndroid Build Coastguard Worker         }
351*61046927SAndroid Build Coastguard Worker }
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker const char *
v3d_qpu_unpack_name(enum v3d_qpu_input_unpack unpack)354*61046927SAndroid Build Coastguard Worker v3d_qpu_unpack_name(enum v3d_qpu_input_unpack unpack)
355*61046927SAndroid Build Coastguard Worker {
356*61046927SAndroid Build Coastguard Worker         switch (unpack) {
357*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_NONE:
358*61046927SAndroid Build Coastguard Worker                 return "";
359*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_L:
360*61046927SAndroid Build Coastguard Worker                 return ".l";
361*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_H:
362*61046927SAndroid Build Coastguard Worker                 return ".h";
363*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_ABS:
364*61046927SAndroid Build Coastguard Worker                 return ".abs";
365*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_REPLICATE_32F_16:
366*61046927SAndroid Build Coastguard Worker                 return ".ff";
367*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_REPLICATE_L_16:
368*61046927SAndroid Build Coastguard Worker                 return ".ll";
369*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_REPLICATE_H_16:
370*61046927SAndroid Build Coastguard Worker                 return ".hh";
371*61046927SAndroid Build Coastguard Worker         case V3D_QPU_UNPACK_SWAP_16:
372*61046927SAndroid Build Coastguard Worker                 return ".swp";
373*61046927SAndroid Build Coastguard Worker         case V3D71_QPU_UNPACK_SAT:
374*61046927SAndroid Build Coastguard Worker                 return ".sat";
375*61046927SAndroid Build Coastguard Worker         case V3D71_QPU_UNPACK_NSAT:
376*61046927SAndroid Build Coastguard Worker                 return ".nsat";
377*61046927SAndroid Build Coastguard Worker         case V3D71_QPU_UNPACK_MAX0:
378*61046927SAndroid Build Coastguard Worker                 return ".max0";
379*61046927SAndroid Build Coastguard Worker         default:
380*61046927SAndroid Build Coastguard Worker                 unreachable("bad unpack value");
381*61046927SAndroid Build Coastguard Worker         }
382*61046927SAndroid Build Coastguard Worker }
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker #define D	1
385*61046927SAndroid Build Coastguard Worker #define A	2
386*61046927SAndroid Build Coastguard Worker #define B	4
387*61046927SAndroid Build Coastguard Worker static const uint8_t add_op_args[] = {
388*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FADD] = D | A | B,
389*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FADDNF] = D | A | B,
390*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFPACK] = D | A | B,
391*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ADD] = D | A | B,
392*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFPACK] = D | A | B,
393*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SUB] = D | A | B,
394*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFPACK] = D | A | B,
395*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FSUB] = D | A | B,
396*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_MIN] = D | A | B,
397*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_MAX] = D | A | B,
398*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_UMIN] = D | A | B,
399*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_UMAX] = D | A | B,
400*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SHL] = D | A | B,
401*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SHR] = D | A | B,
402*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ASR] = D | A | B,
403*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ROR] = D | A | B,
404*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FMIN] = D | A | B,
405*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FMAX] = D | A | B,
406*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFMIN] = D | A | B,
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_AND] = D | A | B,
409*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_OR] = D | A | B,
410*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_XOR] = D | A | B,
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VADD] = D | A | B,
413*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VSUB] = D | A | B,
414*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_NOT] = D | A,
415*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_NEG] = D | A,
416*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FLAPUSH] = D | A,
417*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FLBPUSH] = D | A,
418*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FLPOP] = D | A,
419*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_RECIP] = D | A,
420*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SETMSF] = D | A,
421*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SETREVF] = D | A,
422*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_NOP] = 0,
423*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_TIDX] = D,
424*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_EIDX] = D,
425*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LR] = D,
426*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFLA] = D,
427*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFLNA] = D,
428*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFLB] = D,
429*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFLNB] = D,
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FXCD] = D,
432*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_XCD] = D,
433*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FYCD] = D,
434*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_YCD] = D,
435*61046927SAndroid Build Coastguard Worker 
436*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_MSF] = D,
437*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_REVF] = D,
438*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VDWWT] = D,
439*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_IID] = D,
440*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SAMPID] = D,
441*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_BARRIERID] = D,
442*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_TMUWT] = D,
443*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VPMWT] = D,
444*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FLAFIRST] = D,
445*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FLNAFIRST] = D,
446*61046927SAndroid Build Coastguard Worker 
447*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VPMSETUP] = D | A,
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LDVPMV_IN] = D | A,
450*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LDVPMV_OUT] = D | A,
451*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LDVPMD_IN] = D | A,
452*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LDVPMD_OUT] = D | A,
453*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LDVPMP] = D | A,
454*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_RSQRT] = D | A,
455*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_EXP] = D | A,
456*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LOG] = D | A,
457*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SIN] = D | A,
458*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_RSQRT2] = D | A,
459*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LDVPMG_IN] = D | A | B,
460*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_LDVPMG_OUT] = D | A | B,
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker         /* FIXME: MOVABSNEG */
463*61046927SAndroid Build Coastguard Worker 
464*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FCMP] = D | A | B,
465*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VFMAX] = D | A | B,
466*61046927SAndroid Build Coastguard Worker 
467*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FROUND] = D | A,
468*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FTOIN] = D | A,
469*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FTRUNC] = D | A,
470*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FTOIZ] = D | A,
471*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FFLOOR] = D | A,
472*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FTOUZ] = D | A,
473*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FCEIL] = D | A,
474*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FTOC] = D | A,
475*61046927SAndroid Build Coastguard Worker 
476*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FDX] = D | A,
477*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FDY] = D | A,
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_STVPMV] = A | B,
480*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_STVPMD] = A | B,
481*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_STVPMP] = A | B,
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ITOF] = D | A,
484*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_CLZ] = D | A,
485*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_UTOF] = D | A,
486*61046927SAndroid Build Coastguard Worker 
487*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_MOV] = D | A,
488*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_FMOV] = D | A,
489*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_VPACK] = D | A | B,
490*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_V8PACK] = D | A | B,
491*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_V10PACK] = D | A | B,
492*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_V11FPACK] = D | A | B,
493*61046927SAndroid Build Coastguard Worker 
494*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_BALLOT] = D | A,
495*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_BCASTF] = D | A,
496*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ALLEQ] = D | A,
497*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ALLFEQ] = D | A,
498*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ROTQ] = D | A | B,
499*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_ROT] = D | A | B,
500*61046927SAndroid Build Coastguard Worker         [V3D_QPU_A_SHUFFLE] = D | A | B,
501*61046927SAndroid Build Coastguard Worker };
502*61046927SAndroid Build Coastguard Worker 
503*61046927SAndroid Build Coastguard Worker static const uint8_t mul_op_args[] = {
504*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_ADD] = D | A | B,
505*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_SUB] = D | A | B,
506*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_UMUL24] = D | A | B,
507*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_VFMUL] = D | A | B,
508*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_SMUL24] = D | A | B,
509*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_MULTOP] = D | A | B,
510*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_FMOV] = D | A,
511*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_NOP] = 0,
512*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_MOV] = D | A,
513*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_FMUL] = D | A | B,
514*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_FTOUNORM16] = D | A,
515*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_FTOSNORM16] = D | A,
516*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_VFTOUNORM8] = D | A,
517*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_VFTOSNORM8] = D | A,
518*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_VFTOUNORM10LO] = D | A,
519*61046927SAndroid Build Coastguard Worker         [V3D_QPU_M_VFTOUNORM10HI] = D | A,
520*61046927SAndroid Build Coastguard Worker };
521*61046927SAndroid Build Coastguard Worker 
522*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_add_op_has_dst(enum v3d_qpu_add_op op)523*61046927SAndroid Build Coastguard Worker v3d_qpu_add_op_has_dst(enum v3d_qpu_add_op op)
524*61046927SAndroid Build Coastguard Worker {
525*61046927SAndroid Build Coastguard Worker         assert(op < ARRAY_SIZE(add_op_args));
526*61046927SAndroid Build Coastguard Worker 
527*61046927SAndroid Build Coastguard Worker         return add_op_args[op] & D;
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_mul_op_has_dst(enum v3d_qpu_mul_op op)531*61046927SAndroid Build Coastguard Worker v3d_qpu_mul_op_has_dst(enum v3d_qpu_mul_op op)
532*61046927SAndroid Build Coastguard Worker {
533*61046927SAndroid Build Coastguard Worker         assert(op < ARRAY_SIZE(mul_op_args));
534*61046927SAndroid Build Coastguard Worker 
535*61046927SAndroid Build Coastguard Worker         return mul_op_args[op] & D;
536*61046927SAndroid Build Coastguard Worker }
537*61046927SAndroid Build Coastguard Worker 
538*61046927SAndroid Build Coastguard Worker int
v3d_qpu_add_op_num_src(enum v3d_qpu_add_op op)539*61046927SAndroid Build Coastguard Worker v3d_qpu_add_op_num_src(enum v3d_qpu_add_op op)
540*61046927SAndroid Build Coastguard Worker {
541*61046927SAndroid Build Coastguard Worker         assert(op < ARRAY_SIZE(add_op_args));
542*61046927SAndroid Build Coastguard Worker 
543*61046927SAndroid Build Coastguard Worker         uint8_t args = add_op_args[op];
544*61046927SAndroid Build Coastguard Worker         if (args & B)
545*61046927SAndroid Build Coastguard Worker                 return 2;
546*61046927SAndroid Build Coastguard Worker         else if (args & A)
547*61046927SAndroid Build Coastguard Worker                 return 1;
548*61046927SAndroid Build Coastguard Worker         else
549*61046927SAndroid Build Coastguard Worker                 return 0;
550*61046927SAndroid Build Coastguard Worker }
551*61046927SAndroid Build Coastguard Worker 
552*61046927SAndroid Build Coastguard Worker int
v3d_qpu_mul_op_num_src(enum v3d_qpu_mul_op op)553*61046927SAndroid Build Coastguard Worker v3d_qpu_mul_op_num_src(enum v3d_qpu_mul_op op)
554*61046927SAndroid Build Coastguard Worker {
555*61046927SAndroid Build Coastguard Worker         assert(op < ARRAY_SIZE(mul_op_args));
556*61046927SAndroid Build Coastguard Worker 
557*61046927SAndroid Build Coastguard Worker         uint8_t args = mul_op_args[op];
558*61046927SAndroid Build Coastguard Worker         if (args & B)
559*61046927SAndroid Build Coastguard Worker                 return 2;
560*61046927SAndroid Build Coastguard Worker         else if (args & A)
561*61046927SAndroid Build Coastguard Worker                 return 1;
562*61046927SAndroid Build Coastguard Worker         else
563*61046927SAndroid Build Coastguard Worker                 return 0;
564*61046927SAndroid Build Coastguard Worker }
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker enum v3d_qpu_cond
v3d_qpu_cond_invert(enum v3d_qpu_cond cond)567*61046927SAndroid Build Coastguard Worker v3d_qpu_cond_invert(enum v3d_qpu_cond cond)
568*61046927SAndroid Build Coastguard Worker {
569*61046927SAndroid Build Coastguard Worker         switch (cond) {
570*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFA:
571*61046927SAndroid Build Coastguard Worker                 return V3D_QPU_COND_IFNA;
572*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFNA:
573*61046927SAndroid Build Coastguard Worker                 return V3D_QPU_COND_IFA;
574*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFB:
575*61046927SAndroid Build Coastguard Worker                 return V3D_QPU_COND_IFNB;
576*61046927SAndroid Build Coastguard Worker         case V3D_QPU_COND_IFNB:
577*61046927SAndroid Build Coastguard Worker                 return V3D_QPU_COND_IFB;
578*61046927SAndroid Build Coastguard Worker         default:
579*61046927SAndroid Build Coastguard Worker                 unreachable("Non-invertible cond");
580*61046927SAndroid Build Coastguard Worker         }
581*61046927SAndroid Build Coastguard Worker }
582*61046927SAndroid Build Coastguard Worker 
583*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_magic_waddr_is_sfu(enum v3d_qpu_waddr waddr)584*61046927SAndroid Build Coastguard Worker v3d_qpu_magic_waddr_is_sfu(enum v3d_qpu_waddr waddr)
585*61046927SAndroid Build Coastguard Worker {
586*61046927SAndroid Build Coastguard Worker         switch (waddr) {
587*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_RECIP:
588*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_RSQRT:
589*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_EXP:
590*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_LOG:
591*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_SIN:
592*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_RSQRT2:
593*61046927SAndroid Build Coastguard Worker                 return true;
594*61046927SAndroid Build Coastguard Worker         default:
595*61046927SAndroid Build Coastguard Worker                 return false;
596*61046927SAndroid Build Coastguard Worker         }
597*61046927SAndroid Build Coastguard Worker }
598*61046927SAndroid Build Coastguard Worker 
599*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_magic_waddr_is_tmu(const struct v3d_device_info * devinfo,enum v3d_qpu_waddr waddr)600*61046927SAndroid Build Coastguard Worker v3d_qpu_magic_waddr_is_tmu(const struct v3d_device_info *devinfo,
601*61046927SAndroid Build Coastguard Worker                            enum v3d_qpu_waddr waddr)
602*61046927SAndroid Build Coastguard Worker {
603*61046927SAndroid Build Coastguard Worker         if (devinfo->ver >= 40) {
604*61046927SAndroid Build Coastguard Worker                 return ((waddr >= V3D_QPU_WADDR_TMUD &&
605*61046927SAndroid Build Coastguard Worker                          waddr <= V3D_QPU_WADDR_TMUAU) ||
606*61046927SAndroid Build Coastguard Worker                        (waddr >= V3D_QPU_WADDR_TMUC &&
607*61046927SAndroid Build Coastguard Worker                         waddr <= V3D_QPU_WADDR_TMUHSLOD));
608*61046927SAndroid Build Coastguard Worker         } else {
609*61046927SAndroid Build Coastguard Worker                 return ((waddr >= V3D_QPU_WADDR_TMU &&
610*61046927SAndroid Build Coastguard Worker                          waddr <= V3D_QPU_WADDR_TMUAU) ||
611*61046927SAndroid Build Coastguard Worker                        (waddr >= V3D_QPU_WADDR_TMUC &&
612*61046927SAndroid Build Coastguard Worker                         waddr <= V3D_QPU_WADDR_TMUHSLOD));
613*61046927SAndroid Build Coastguard Worker         }
614*61046927SAndroid Build Coastguard Worker }
615*61046927SAndroid Build Coastguard Worker 
616*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_waits_on_tmu(const struct v3d_qpu_instr * inst)617*61046927SAndroid Build Coastguard Worker v3d_qpu_waits_on_tmu(const struct v3d_qpu_instr *inst)
618*61046927SAndroid Build Coastguard Worker {
619*61046927SAndroid Build Coastguard Worker         return (inst->sig.ldtmu ||
620*61046927SAndroid Build Coastguard Worker                 (inst->type == V3D_QPU_INSTR_TYPE_ALU &&
621*61046927SAndroid Build Coastguard Worker                  inst->alu.add.op == V3D_QPU_A_TMUWT));
622*61046927SAndroid Build Coastguard Worker }
623*61046927SAndroid Build Coastguard Worker 
624*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_magic_waddr_is_tlb(enum v3d_qpu_waddr waddr)625*61046927SAndroid Build Coastguard Worker v3d_qpu_magic_waddr_is_tlb(enum v3d_qpu_waddr waddr)
626*61046927SAndroid Build Coastguard Worker {
627*61046927SAndroid Build Coastguard Worker         return (waddr == V3D_QPU_WADDR_TLB ||
628*61046927SAndroid Build Coastguard Worker                 waddr == V3D_QPU_WADDR_TLBU);
629*61046927SAndroid Build Coastguard Worker }
630*61046927SAndroid Build Coastguard Worker 
631*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_magic_waddr_is_vpm(enum v3d_qpu_waddr waddr)632*61046927SAndroid Build Coastguard Worker v3d_qpu_magic_waddr_is_vpm(enum v3d_qpu_waddr waddr)
633*61046927SAndroid Build Coastguard Worker {
634*61046927SAndroid Build Coastguard Worker         return (waddr == V3D_QPU_WADDR_VPM ||
635*61046927SAndroid Build Coastguard Worker                 waddr == V3D_QPU_WADDR_VPMU);
636*61046927SAndroid Build Coastguard Worker }
637*61046927SAndroid Build Coastguard Worker 
638*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_magic_waddr_is_tsy(enum v3d_qpu_waddr waddr)639*61046927SAndroid Build Coastguard Worker v3d_qpu_magic_waddr_is_tsy(enum v3d_qpu_waddr waddr)
640*61046927SAndroid Build Coastguard Worker {
641*61046927SAndroid Build Coastguard Worker         return (waddr == V3D_QPU_WADDR_SYNC ||
642*61046927SAndroid Build Coastguard Worker                 waddr == V3D_QPU_WADDR_SYNCB ||
643*61046927SAndroid Build Coastguard Worker                 waddr == V3D_QPU_WADDR_SYNCU);
644*61046927SAndroid Build Coastguard Worker }
645*61046927SAndroid Build Coastguard Worker 
646*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_magic_waddr_loads_unif(enum v3d_qpu_waddr waddr)647*61046927SAndroid Build Coastguard Worker v3d_qpu_magic_waddr_loads_unif(enum v3d_qpu_waddr waddr)
648*61046927SAndroid Build Coastguard Worker {
649*61046927SAndroid Build Coastguard Worker         switch (waddr) {
650*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_VPMU:
651*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_TLBU:
652*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_TMUAU:
653*61046927SAndroid Build Coastguard Worker         case V3D_QPU_WADDR_SYNCU:
654*61046927SAndroid Build Coastguard Worker                 return true;
655*61046927SAndroid Build Coastguard Worker         default:
656*61046927SAndroid Build Coastguard Worker                 return false;
657*61046927SAndroid Build Coastguard Worker         }
658*61046927SAndroid Build Coastguard Worker }
659*61046927SAndroid Build Coastguard Worker 
660*61046927SAndroid Build Coastguard Worker static bool
v3d_qpu_add_op_reads_vpm(enum v3d_qpu_add_op op)661*61046927SAndroid Build Coastguard Worker v3d_qpu_add_op_reads_vpm(enum  v3d_qpu_add_op op)
662*61046927SAndroid Build Coastguard Worker {
663*61046927SAndroid Build Coastguard Worker         switch (op) {
664*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_VPMSETUP:
665*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_LDVPMV_IN:
666*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_LDVPMV_OUT:
667*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_LDVPMD_IN:
668*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_LDVPMD_OUT:
669*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_LDVPMP:
670*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_LDVPMG_IN:
671*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_LDVPMG_OUT:
672*61046927SAndroid Build Coastguard Worker                 return true;
673*61046927SAndroid Build Coastguard Worker         default:
674*61046927SAndroid Build Coastguard Worker                 return false;
675*61046927SAndroid Build Coastguard Worker         }
676*61046927SAndroid Build Coastguard Worker }
677*61046927SAndroid Build Coastguard Worker 
678*61046927SAndroid Build Coastguard Worker static bool
v3d_qpu_add_op_writes_vpm(enum v3d_qpu_add_op op)679*61046927SAndroid Build Coastguard Worker v3d_qpu_add_op_writes_vpm(enum  v3d_qpu_add_op op)
680*61046927SAndroid Build Coastguard Worker {
681*61046927SAndroid Build Coastguard Worker         switch (op) {
682*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_VPMSETUP:
683*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_STVPMV:
684*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_STVPMD:
685*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_STVPMP:
686*61046927SAndroid Build Coastguard Worker                 return true;
687*61046927SAndroid Build Coastguard Worker         default:
688*61046927SAndroid Build Coastguard Worker                 return false;
689*61046927SAndroid Build Coastguard Worker         }
690*61046927SAndroid Build Coastguard Worker }
691*61046927SAndroid Build Coastguard Worker 
692*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_reads_tlb(const struct v3d_qpu_instr * inst)693*61046927SAndroid Build Coastguard Worker v3d_qpu_reads_tlb(const struct v3d_qpu_instr *inst)
694*61046927SAndroid Build Coastguard Worker {
695*61046927SAndroid Build Coastguard Worker         return inst->sig.ldtlb || inst->sig.ldtlbu;
696*61046927SAndroid Build Coastguard Worker }
697*61046927SAndroid Build Coastguard Worker 
698*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_tlb(const struct v3d_qpu_instr * inst)699*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_tlb(const struct v3d_qpu_instr *inst)
700*61046927SAndroid Build Coastguard Worker {
701*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
702*61046927SAndroid Build Coastguard Worker                 if (inst->alu.add.op != V3D_QPU_A_NOP &&
703*61046927SAndroid Build Coastguard Worker                     inst->alu.add.magic_write &&
704*61046927SAndroid Build Coastguard Worker                     v3d_qpu_magic_waddr_is_tlb(inst->alu.add.waddr)) {
705*61046927SAndroid Build Coastguard Worker                         return true;
706*61046927SAndroid Build Coastguard Worker                 }
707*61046927SAndroid Build Coastguard Worker 
708*61046927SAndroid Build Coastguard Worker                 if (inst->alu.mul.op != V3D_QPU_M_NOP &&
709*61046927SAndroid Build Coastguard Worker                     inst->alu.mul.magic_write &&
710*61046927SAndroid Build Coastguard Worker                     v3d_qpu_magic_waddr_is_tlb(inst->alu.mul.waddr)) {
711*61046927SAndroid Build Coastguard Worker                         return true;
712*61046927SAndroid Build Coastguard Worker                 }
713*61046927SAndroid Build Coastguard Worker         }
714*61046927SAndroid Build Coastguard Worker 
715*61046927SAndroid Build Coastguard Worker         return false;
716*61046927SAndroid Build Coastguard Worker }
717*61046927SAndroid Build Coastguard Worker 
718*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_uses_tlb(const struct v3d_qpu_instr * inst)719*61046927SAndroid Build Coastguard Worker v3d_qpu_uses_tlb(const struct v3d_qpu_instr *inst)
720*61046927SAndroid Build Coastguard Worker {
721*61046927SAndroid Build Coastguard Worker         return  v3d_qpu_writes_tlb(inst) || v3d_qpu_reads_tlb(inst);
722*61046927SAndroid Build Coastguard Worker }
723*61046927SAndroid Build Coastguard Worker 
724*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_uses_sfu(const struct v3d_qpu_instr * inst)725*61046927SAndroid Build Coastguard Worker v3d_qpu_uses_sfu(const struct v3d_qpu_instr *inst)
726*61046927SAndroid Build Coastguard Worker {
727*61046927SAndroid Build Coastguard Worker         return v3d_qpu_instr_is_sfu(inst) || v3d_qpu_instr_is_legacy_sfu(inst);
728*61046927SAndroid Build Coastguard Worker }
729*61046927SAndroid Build Coastguard Worker 
730*61046927SAndroid Build Coastguard Worker /* Checks whether the instruction implements a SFU operation by the writing
731*61046927SAndroid Build Coastguard Worker  * to specific magic register addresses instead of using SFU ALU opcodes.
732*61046927SAndroid Build Coastguard Worker  */
733*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_instr_is_legacy_sfu(const struct v3d_qpu_instr * inst)734*61046927SAndroid Build Coastguard Worker v3d_qpu_instr_is_legacy_sfu(const struct v3d_qpu_instr *inst)
735*61046927SAndroid Build Coastguard Worker {
736*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
737*61046927SAndroid Build Coastguard Worker                 if (inst->alu.add.op != V3D_QPU_A_NOP &&
738*61046927SAndroid Build Coastguard Worker                     inst->alu.add.magic_write &&
739*61046927SAndroid Build Coastguard Worker                     v3d_qpu_magic_waddr_is_sfu(inst->alu.add.waddr)) {
740*61046927SAndroid Build Coastguard Worker                         return true;
741*61046927SAndroid Build Coastguard Worker                 }
742*61046927SAndroid Build Coastguard Worker 
743*61046927SAndroid Build Coastguard Worker                 if (inst->alu.mul.op != V3D_QPU_M_NOP &&
744*61046927SAndroid Build Coastguard Worker                     inst->alu.mul.magic_write &&
745*61046927SAndroid Build Coastguard Worker                     v3d_qpu_magic_waddr_is_sfu(inst->alu.mul.waddr)) {
746*61046927SAndroid Build Coastguard Worker                         return true;
747*61046927SAndroid Build Coastguard Worker                 }
748*61046927SAndroid Build Coastguard Worker         }
749*61046927SAndroid Build Coastguard Worker 
750*61046927SAndroid Build Coastguard Worker         return false;
751*61046927SAndroid Build Coastguard Worker }
752*61046927SAndroid Build Coastguard Worker 
753*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_instr_is_sfu(const struct v3d_qpu_instr * inst)754*61046927SAndroid Build Coastguard Worker v3d_qpu_instr_is_sfu(const struct v3d_qpu_instr *inst)
755*61046927SAndroid Build Coastguard Worker {
756*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
757*61046927SAndroid Build Coastguard Worker                 switch (inst->alu.add.op) {
758*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_RECIP:
759*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_RSQRT:
760*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_EXP:
761*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_LOG:
762*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_SIN:
763*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_RSQRT2:
764*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_BALLOT:
765*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_BCASTF:
766*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_ALLEQ:
767*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_ALLFEQ:
768*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_ROTQ:
769*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_ROT:
770*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_SHUFFLE:
771*61046927SAndroid Build Coastguard Worker                         return true;
772*61046927SAndroid Build Coastguard Worker                 default:
773*61046927SAndroid Build Coastguard Worker                         return false;
774*61046927SAndroid Build Coastguard Worker                 }
775*61046927SAndroid Build Coastguard Worker         }
776*61046927SAndroid Build Coastguard Worker         return false;
777*61046927SAndroid Build Coastguard Worker }
778*61046927SAndroid Build Coastguard Worker 
779*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_tmu(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)780*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_tmu(const struct v3d_device_info *devinfo,
781*61046927SAndroid Build Coastguard Worker                    const struct v3d_qpu_instr *inst)
782*61046927SAndroid Build Coastguard Worker {
783*61046927SAndroid Build Coastguard Worker         return (inst->type == V3D_QPU_INSTR_TYPE_ALU &&
784*61046927SAndroid Build Coastguard Worker                 ((inst->alu.add.op != V3D_QPU_A_NOP &&
785*61046927SAndroid Build Coastguard Worker                   inst->alu.add.magic_write &&
786*61046927SAndroid Build Coastguard Worker                   v3d_qpu_magic_waddr_is_tmu(devinfo, inst->alu.add.waddr)) ||
787*61046927SAndroid Build Coastguard Worker                  (inst->alu.mul.op != V3D_QPU_M_NOP &&
788*61046927SAndroid Build Coastguard Worker                   inst->alu.mul.magic_write &&
789*61046927SAndroid Build Coastguard Worker                   v3d_qpu_magic_waddr_is_tmu(devinfo, inst->alu.mul.waddr))));
790*61046927SAndroid Build Coastguard Worker }
791*61046927SAndroid Build Coastguard Worker 
792*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_tmu_not_tmuc(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)793*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_tmu_not_tmuc(const struct v3d_device_info *devinfo,
794*61046927SAndroid Build Coastguard Worker                             const struct v3d_qpu_instr *inst)
795*61046927SAndroid Build Coastguard Worker {
796*61046927SAndroid Build Coastguard Worker         return v3d_qpu_writes_tmu(devinfo, inst) &&
797*61046927SAndroid Build Coastguard Worker                (!inst->alu.add.magic_write ||
798*61046927SAndroid Build Coastguard Worker                 inst->alu.add.waddr != V3D_QPU_WADDR_TMUC) &&
799*61046927SAndroid Build Coastguard Worker                (!inst->alu.mul.magic_write ||
800*61046927SAndroid Build Coastguard Worker                 inst->alu.mul.waddr != V3D_QPU_WADDR_TMUC);
801*61046927SAndroid Build Coastguard Worker }
802*61046927SAndroid Build Coastguard Worker 
803*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_reads_vpm(const struct v3d_qpu_instr * inst)804*61046927SAndroid Build Coastguard Worker v3d_qpu_reads_vpm(const struct v3d_qpu_instr *inst)
805*61046927SAndroid Build Coastguard Worker {
806*61046927SAndroid Build Coastguard Worker         if (inst->sig.ldvpm)
807*61046927SAndroid Build Coastguard Worker                 return true;
808*61046927SAndroid Build Coastguard Worker 
809*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
810*61046927SAndroid Build Coastguard Worker                 if (v3d_qpu_add_op_reads_vpm(inst->alu.add.op))
811*61046927SAndroid Build Coastguard Worker                         return true;
812*61046927SAndroid Build Coastguard Worker         }
813*61046927SAndroid Build Coastguard Worker 
814*61046927SAndroid Build Coastguard Worker         return false;
815*61046927SAndroid Build Coastguard Worker }
816*61046927SAndroid Build Coastguard Worker 
817*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_vpm(const struct v3d_qpu_instr * inst)818*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_vpm(const struct v3d_qpu_instr *inst)
819*61046927SAndroid Build Coastguard Worker {
820*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
821*61046927SAndroid Build Coastguard Worker                 if (v3d_qpu_add_op_writes_vpm(inst->alu.add.op))
822*61046927SAndroid Build Coastguard Worker                         return true;
823*61046927SAndroid Build Coastguard Worker 
824*61046927SAndroid Build Coastguard Worker                 if (inst->alu.add.op != V3D_QPU_A_NOP &&
825*61046927SAndroid Build Coastguard Worker                     inst->alu.add.magic_write &&
826*61046927SAndroid Build Coastguard Worker                     v3d_qpu_magic_waddr_is_vpm(inst->alu.add.waddr)) {
827*61046927SAndroid Build Coastguard Worker                         return true;
828*61046927SAndroid Build Coastguard Worker                 }
829*61046927SAndroid Build Coastguard Worker 
830*61046927SAndroid Build Coastguard Worker                 if (inst->alu.mul.op != V3D_QPU_M_NOP &&
831*61046927SAndroid Build Coastguard Worker                     inst->alu.mul.magic_write &&
832*61046927SAndroid Build Coastguard Worker                     v3d_qpu_magic_waddr_is_vpm(inst->alu.mul.waddr)) {
833*61046927SAndroid Build Coastguard Worker                         return true;
834*61046927SAndroid Build Coastguard Worker                 }
835*61046927SAndroid Build Coastguard Worker         }
836*61046927SAndroid Build Coastguard Worker 
837*61046927SAndroid Build Coastguard Worker         return false;
838*61046927SAndroid Build Coastguard Worker }
839*61046927SAndroid Build Coastguard Worker 
840*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_unifa(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)841*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_unifa(const struct v3d_device_info *devinfo,
842*61046927SAndroid Build Coastguard Worker                      const struct v3d_qpu_instr *inst)
843*61046927SAndroid Build Coastguard Worker {
844*61046927SAndroid Build Coastguard Worker         if (devinfo->ver < 40)
845*61046927SAndroid Build Coastguard Worker                 return false;
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
848*61046927SAndroid Build Coastguard Worker                 if (inst->alu.add.op != V3D_QPU_A_NOP &&
849*61046927SAndroid Build Coastguard Worker                     inst->alu.add.magic_write &&
850*61046927SAndroid Build Coastguard Worker                     inst->alu.add.waddr == V3D_QPU_WADDR_UNIFA) {
851*61046927SAndroid Build Coastguard Worker                         return true;
852*61046927SAndroid Build Coastguard Worker                 }
853*61046927SAndroid Build Coastguard Worker 
854*61046927SAndroid Build Coastguard Worker                 if (inst->alu.mul.op != V3D_QPU_M_NOP &&
855*61046927SAndroid Build Coastguard Worker                     inst->alu.mul.magic_write &&
856*61046927SAndroid Build Coastguard Worker                     inst->alu.mul.waddr == V3D_QPU_WADDR_UNIFA) {
857*61046927SAndroid Build Coastguard Worker                         return true;
858*61046927SAndroid Build Coastguard Worker                 }
859*61046927SAndroid Build Coastguard Worker 
860*61046927SAndroid Build Coastguard Worker                 if (v3d_qpu_sig_writes_address(devinfo, &inst->sig) &&
861*61046927SAndroid Build Coastguard Worker                     inst->sig_magic &&
862*61046927SAndroid Build Coastguard Worker                     inst->sig_addr == V3D_QPU_WADDR_UNIFA) {
863*61046927SAndroid Build Coastguard Worker                         return true;
864*61046927SAndroid Build Coastguard Worker                 }
865*61046927SAndroid Build Coastguard Worker         }
866*61046927SAndroid Build Coastguard Worker 
867*61046927SAndroid Build Coastguard Worker         return false;
868*61046927SAndroid Build Coastguard Worker }
869*61046927SAndroid Build Coastguard Worker 
870*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_waits_vpm(const struct v3d_qpu_instr * inst)871*61046927SAndroid Build Coastguard Worker v3d_qpu_waits_vpm(const struct v3d_qpu_instr *inst)
872*61046927SAndroid Build Coastguard Worker {
873*61046927SAndroid Build Coastguard Worker         return inst->type == V3D_QPU_INSTR_TYPE_ALU &&
874*61046927SAndroid Build Coastguard Worker                inst->alu.add.op == V3D_QPU_A_VPMWT;
875*61046927SAndroid Build Coastguard Worker }
876*61046927SAndroid Build Coastguard Worker 
877*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_reads_or_writes_vpm(const struct v3d_qpu_instr * inst)878*61046927SAndroid Build Coastguard Worker v3d_qpu_reads_or_writes_vpm(const struct v3d_qpu_instr *inst)
879*61046927SAndroid Build Coastguard Worker {
880*61046927SAndroid Build Coastguard Worker         return v3d_qpu_reads_vpm(inst) || v3d_qpu_writes_vpm(inst);
881*61046927SAndroid Build Coastguard Worker }
882*61046927SAndroid Build Coastguard Worker 
883*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_uses_vpm(const struct v3d_qpu_instr * inst)884*61046927SAndroid Build Coastguard Worker v3d_qpu_uses_vpm(const struct v3d_qpu_instr *inst)
885*61046927SAndroid Build Coastguard Worker {
886*61046927SAndroid Build Coastguard Worker         return v3d_qpu_reads_vpm(inst) ||
887*61046927SAndroid Build Coastguard Worker                v3d_qpu_writes_vpm(inst) ||
888*61046927SAndroid Build Coastguard Worker                v3d_qpu_waits_vpm(inst);
889*61046927SAndroid Build Coastguard Worker }
890*61046927SAndroid Build Coastguard Worker 
891*61046927SAndroid Build Coastguard Worker static bool
qpu_writes_magic_waddr_explicitly(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst,uint32_t waddr)892*61046927SAndroid Build Coastguard Worker qpu_writes_magic_waddr_explicitly(const struct v3d_device_info *devinfo,
893*61046927SAndroid Build Coastguard Worker                                   const struct v3d_qpu_instr *inst,
894*61046927SAndroid Build Coastguard Worker                                   uint32_t waddr)
895*61046927SAndroid Build Coastguard Worker {
896*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
897*61046927SAndroid Build Coastguard Worker                 if (inst->alu.add.op != V3D_QPU_A_NOP &&
898*61046927SAndroid Build Coastguard Worker                     inst->alu.add.magic_write && inst->alu.add.waddr == waddr)
899*61046927SAndroid Build Coastguard Worker                         return true;
900*61046927SAndroid Build Coastguard Worker 
901*61046927SAndroid Build Coastguard Worker                 if (inst->alu.mul.op != V3D_QPU_M_NOP &&
902*61046927SAndroid Build Coastguard Worker                     inst->alu.mul.magic_write && inst->alu.mul.waddr == waddr)
903*61046927SAndroid Build Coastguard Worker                         return true;
904*61046927SAndroid Build Coastguard Worker         }
905*61046927SAndroid Build Coastguard Worker 
906*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_sig_writes_address(devinfo, &inst->sig) &&
907*61046927SAndroid Build Coastguard Worker             inst->sig_magic && inst->sig_addr == waddr) {
908*61046927SAndroid Build Coastguard Worker                 return true;
909*61046927SAndroid Build Coastguard Worker         }
910*61046927SAndroid Build Coastguard Worker 
911*61046927SAndroid Build Coastguard Worker         return false;
912*61046927SAndroid Build Coastguard Worker }
913*61046927SAndroid Build Coastguard Worker 
914*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_r3(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)915*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_r3(const struct v3d_device_info *devinfo,
916*61046927SAndroid Build Coastguard Worker                   const struct v3d_qpu_instr *inst)
917*61046927SAndroid Build Coastguard Worker {
918*61046927SAndroid Build Coastguard Worker         if(!devinfo->has_accumulators)
919*61046927SAndroid Build Coastguard Worker                 return false;
920*61046927SAndroid Build Coastguard Worker 
921*61046927SAndroid Build Coastguard Worker         if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R3))
922*61046927SAndroid Build Coastguard Worker                 return true;
923*61046927SAndroid Build Coastguard Worker 
924*61046927SAndroid Build Coastguard Worker         return (devinfo->ver < 41 && inst->sig.ldvary) || inst->sig.ldvpm;
925*61046927SAndroid Build Coastguard Worker }
926*61046927SAndroid Build Coastguard Worker 
927*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_r4(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)928*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_r4(const struct v3d_device_info *devinfo,
929*61046927SAndroid Build Coastguard Worker                   const struct v3d_qpu_instr *inst)
930*61046927SAndroid Build Coastguard Worker {
931*61046927SAndroid Build Coastguard Worker         if (!devinfo->has_accumulators)
932*61046927SAndroid Build Coastguard Worker                 return false;
933*61046927SAndroid Build Coastguard Worker 
934*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
935*61046927SAndroid Build Coastguard Worker                 if (inst->alu.add.op != V3D_QPU_A_NOP &&
936*61046927SAndroid Build Coastguard Worker                     inst->alu.add.magic_write &&
937*61046927SAndroid Build Coastguard Worker                     (inst->alu.add.waddr == V3D_QPU_WADDR_R4 ||
938*61046927SAndroid Build Coastguard Worker                      v3d_qpu_magic_waddr_is_sfu(inst->alu.add.waddr))) {
939*61046927SAndroid Build Coastguard Worker                         return true;
940*61046927SAndroid Build Coastguard Worker                 }
941*61046927SAndroid Build Coastguard Worker 
942*61046927SAndroid Build Coastguard Worker                 if (inst->alu.mul.op != V3D_QPU_M_NOP &&
943*61046927SAndroid Build Coastguard Worker                     inst->alu.mul.magic_write &&
944*61046927SAndroid Build Coastguard Worker                     (inst->alu.mul.waddr == V3D_QPU_WADDR_R4 ||
945*61046927SAndroid Build Coastguard Worker                      v3d_qpu_magic_waddr_is_sfu(inst->alu.mul.waddr))) {
946*61046927SAndroid Build Coastguard Worker                         return true;
947*61046927SAndroid Build Coastguard Worker                 }
948*61046927SAndroid Build Coastguard Worker         }
949*61046927SAndroid Build Coastguard Worker 
950*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_sig_writes_address(devinfo, &inst->sig)) {
951*61046927SAndroid Build Coastguard Worker                 if (inst->sig_magic && inst->sig_addr == V3D_QPU_WADDR_R4)
952*61046927SAndroid Build Coastguard Worker                         return true;
953*61046927SAndroid Build Coastguard Worker         } else if (inst->sig.ldtmu) {
954*61046927SAndroid Build Coastguard Worker                 return true;
955*61046927SAndroid Build Coastguard Worker         }
956*61046927SAndroid Build Coastguard Worker 
957*61046927SAndroid Build Coastguard Worker         return false;
958*61046927SAndroid Build Coastguard Worker }
959*61046927SAndroid Build Coastguard Worker 
960*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_r5(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)961*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_r5(const struct v3d_device_info *devinfo,
962*61046927SAndroid Build Coastguard Worker                   const struct v3d_qpu_instr *inst)
963*61046927SAndroid Build Coastguard Worker {
964*61046927SAndroid Build Coastguard Worker         if (!devinfo->has_accumulators)
965*61046927SAndroid Build Coastguard Worker                 return false;
966*61046927SAndroid Build Coastguard Worker 
967*61046927SAndroid Build Coastguard Worker         if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R5))
968*61046927SAndroid Build Coastguard Worker                 return true;
969*61046927SAndroid Build Coastguard Worker 
970*61046927SAndroid Build Coastguard Worker         return inst->sig.ldvary || inst->sig.ldunif || inst->sig.ldunifa;
971*61046927SAndroid Build Coastguard Worker }
972*61046927SAndroid Build Coastguard Worker 
973*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_accum(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)974*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_accum(const struct v3d_device_info *devinfo,
975*61046927SAndroid Build Coastguard Worker                      const struct v3d_qpu_instr *inst)
976*61046927SAndroid Build Coastguard Worker {
977*61046927SAndroid Build Coastguard Worker         if (!devinfo->has_accumulators)
978*61046927SAndroid Build Coastguard Worker                 return false;
979*61046927SAndroid Build Coastguard Worker 
980*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_writes_r5(devinfo, inst))
981*61046927SAndroid Build Coastguard Worker                 return true;
982*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_writes_r4(devinfo, inst))
983*61046927SAndroid Build Coastguard Worker                 return true;
984*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_writes_r3(devinfo, inst))
985*61046927SAndroid Build Coastguard Worker                 return true;
986*61046927SAndroid Build Coastguard Worker         if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R2))
987*61046927SAndroid Build Coastguard Worker                 return true;
988*61046927SAndroid Build Coastguard Worker         if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R1))
989*61046927SAndroid Build Coastguard Worker                 return true;
990*61046927SAndroid Build Coastguard Worker         if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R0))
991*61046927SAndroid Build Coastguard Worker                 return true;
992*61046927SAndroid Build Coastguard Worker 
993*61046927SAndroid Build Coastguard Worker         return false;
994*61046927SAndroid Build Coastguard Worker }
995*61046927SAndroid Build Coastguard Worker 
996*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_rf0_implicitly(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst)997*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_rf0_implicitly(const struct v3d_device_info *devinfo,
998*61046927SAndroid Build Coastguard Worker                               const struct v3d_qpu_instr *inst)
999*61046927SAndroid Build Coastguard Worker {
1000*61046927SAndroid Build Coastguard Worker         if (devinfo->ver >= 71 &&
1001*61046927SAndroid Build Coastguard Worker             (inst->sig.ldvary || inst->sig.ldunif || inst->sig.ldunifa)) {
1002*61046927SAndroid Build Coastguard Worker                 return true;
1003*61046927SAndroid Build Coastguard Worker         }
1004*61046927SAndroid Build Coastguard Worker 
1005*61046927SAndroid Build Coastguard Worker         return false;
1006*61046927SAndroid Build Coastguard Worker }
1007*61046927SAndroid Build Coastguard Worker 
1008*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_uses_mux(const struct v3d_qpu_instr * inst,enum v3d_qpu_mux mux)1009*61046927SAndroid Build Coastguard Worker v3d_qpu_uses_mux(const struct v3d_qpu_instr *inst, enum v3d_qpu_mux mux)
1010*61046927SAndroid Build Coastguard Worker {
1011*61046927SAndroid Build Coastguard Worker         int add_nsrc = v3d_qpu_add_op_num_src(inst->alu.add.op);
1012*61046927SAndroid Build Coastguard Worker         int mul_nsrc = v3d_qpu_mul_op_num_src(inst->alu.mul.op);
1013*61046927SAndroid Build Coastguard Worker 
1014*61046927SAndroid Build Coastguard Worker         return ((add_nsrc > 0 && inst->alu.add.a.mux == mux) ||
1015*61046927SAndroid Build Coastguard Worker                 (add_nsrc > 1 && inst->alu.add.b.mux == mux) ||
1016*61046927SAndroid Build Coastguard Worker                 (mul_nsrc > 0 && inst->alu.mul.a.mux == mux) ||
1017*61046927SAndroid Build Coastguard Worker                 (mul_nsrc > 1 && inst->alu.mul.b.mux == mux));
1018*61046927SAndroid Build Coastguard Worker }
1019*61046927SAndroid Build Coastguard Worker 
1020*61046927SAndroid Build Coastguard Worker bool
v3d71_qpu_reads_raddr(const struct v3d_qpu_instr * inst,uint8_t raddr)1021*61046927SAndroid Build Coastguard Worker v3d71_qpu_reads_raddr(const struct v3d_qpu_instr *inst, uint8_t raddr)
1022*61046927SAndroid Build Coastguard Worker {
1023*61046927SAndroid Build Coastguard Worker         int add_nsrc = v3d_qpu_add_op_num_src(inst->alu.add.op);
1024*61046927SAndroid Build Coastguard Worker         int mul_nsrc = v3d_qpu_mul_op_num_src(inst->alu.mul.op);
1025*61046927SAndroid Build Coastguard Worker 
1026*61046927SAndroid Build Coastguard Worker         return (add_nsrc > 0 && !inst->sig.small_imm_a && inst->alu.add.a.raddr == raddr) ||
1027*61046927SAndroid Build Coastguard Worker                (add_nsrc > 1 && !inst->sig.small_imm_b && inst->alu.add.b.raddr == raddr) ||
1028*61046927SAndroid Build Coastguard Worker                (mul_nsrc > 0 && !inst->sig.small_imm_c && inst->alu.mul.a.raddr == raddr) ||
1029*61046927SAndroid Build Coastguard Worker                (mul_nsrc > 1 && !inst->sig.small_imm_d && inst->alu.mul.b.raddr == raddr);
1030*61046927SAndroid Build Coastguard Worker }
1031*61046927SAndroid Build Coastguard Worker 
1032*61046927SAndroid Build Coastguard Worker bool
v3d71_qpu_writes_waddr_explicitly(const struct v3d_device_info * devinfo,const struct v3d_qpu_instr * inst,uint8_t waddr)1033*61046927SAndroid Build Coastguard Worker v3d71_qpu_writes_waddr_explicitly(const struct v3d_device_info *devinfo,
1034*61046927SAndroid Build Coastguard Worker                                   const struct v3d_qpu_instr *inst,
1035*61046927SAndroid Build Coastguard Worker                                   uint8_t waddr)
1036*61046927SAndroid Build Coastguard Worker {
1037*61046927SAndroid Build Coastguard Worker         if (inst->type != V3D_QPU_INSTR_TYPE_ALU)
1038*61046927SAndroid Build Coastguard Worker                 return false;
1039*61046927SAndroid Build Coastguard Worker 
1040*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_add_op_has_dst(inst->alu.add.op) &&
1041*61046927SAndroid Build Coastguard Worker             !inst->alu.add.magic_write &&
1042*61046927SAndroid Build Coastguard Worker             inst->alu.add.waddr == waddr) {
1043*61046927SAndroid Build Coastguard Worker                 return true;
1044*61046927SAndroid Build Coastguard Worker         }
1045*61046927SAndroid Build Coastguard Worker 
1046*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_mul_op_has_dst(inst->alu.mul.op) &&
1047*61046927SAndroid Build Coastguard Worker             !inst->alu.mul.magic_write &&
1048*61046927SAndroid Build Coastguard Worker             inst->alu.mul.waddr == waddr) {
1049*61046927SAndroid Build Coastguard Worker                 return true;
1050*61046927SAndroid Build Coastguard Worker         }
1051*61046927SAndroid Build Coastguard Worker 
1052*61046927SAndroid Build Coastguard Worker         if (v3d_qpu_sig_writes_address(devinfo, &inst->sig) &&
1053*61046927SAndroid Build Coastguard Worker             !inst->sig_magic && inst->sig_addr == waddr) {
1054*61046927SAndroid Build Coastguard Worker                 return true;
1055*61046927SAndroid Build Coastguard Worker         }
1056*61046927SAndroid Build Coastguard Worker 
1057*61046927SAndroid Build Coastguard Worker         return false;
1058*61046927SAndroid Build Coastguard Worker }
1059*61046927SAndroid Build Coastguard Worker 
1060*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_sig_writes_address(const struct v3d_device_info * devinfo,const struct v3d_qpu_sig * sig)1061*61046927SAndroid Build Coastguard Worker v3d_qpu_sig_writes_address(const struct v3d_device_info *devinfo,
1062*61046927SAndroid Build Coastguard Worker                            const struct v3d_qpu_sig *sig)
1063*61046927SAndroid Build Coastguard Worker {
1064*61046927SAndroid Build Coastguard Worker         if (devinfo->ver < 41)
1065*61046927SAndroid Build Coastguard Worker                 return false;
1066*61046927SAndroid Build Coastguard Worker 
1067*61046927SAndroid Build Coastguard Worker         return (sig->ldunifrf ||
1068*61046927SAndroid Build Coastguard Worker                 sig->ldunifarf ||
1069*61046927SAndroid Build Coastguard Worker                 sig->ldvary ||
1070*61046927SAndroid Build Coastguard Worker                 sig->ldtmu ||
1071*61046927SAndroid Build Coastguard Worker                 sig->ldtlb ||
1072*61046927SAndroid Build Coastguard Worker                 sig->ldtlbu);
1073*61046927SAndroid Build Coastguard Worker }
1074*61046927SAndroid Build Coastguard Worker 
1075*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_reads_flags(const struct v3d_qpu_instr * inst)1076*61046927SAndroid Build Coastguard Worker v3d_qpu_reads_flags(const struct v3d_qpu_instr *inst)
1077*61046927SAndroid Build Coastguard Worker {
1078*61046927SAndroid Build Coastguard Worker         if (inst->type == V3D_QPU_INSTR_TYPE_BRANCH) {
1079*61046927SAndroid Build Coastguard Worker                 return inst->branch.cond != V3D_QPU_BRANCH_COND_ALWAYS;
1080*61046927SAndroid Build Coastguard Worker         } else if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
1081*61046927SAndroid Build Coastguard Worker                 if (inst->flags.ac != V3D_QPU_COND_NONE ||
1082*61046927SAndroid Build Coastguard Worker                     inst->flags.mc != V3D_QPU_COND_NONE ||
1083*61046927SAndroid Build Coastguard Worker                     inst->flags.auf != V3D_QPU_UF_NONE ||
1084*61046927SAndroid Build Coastguard Worker                     inst->flags.muf != V3D_QPU_UF_NONE)
1085*61046927SAndroid Build Coastguard Worker                         return true;
1086*61046927SAndroid Build Coastguard Worker 
1087*61046927SAndroid Build Coastguard Worker                 switch (inst->alu.add.op) {
1088*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_VFLA:
1089*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_VFLNA:
1090*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_VFLB:
1091*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_VFLNB:
1092*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_FLAPUSH:
1093*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_FLBPUSH:
1094*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_FLAFIRST:
1095*61046927SAndroid Build Coastguard Worker                 case V3D_QPU_A_FLNAFIRST:
1096*61046927SAndroid Build Coastguard Worker                         return true;
1097*61046927SAndroid Build Coastguard Worker                 default:
1098*61046927SAndroid Build Coastguard Worker                         break;
1099*61046927SAndroid Build Coastguard Worker                 }
1100*61046927SAndroid Build Coastguard Worker         }
1101*61046927SAndroid Build Coastguard Worker 
1102*61046927SAndroid Build Coastguard Worker         return false;
1103*61046927SAndroid Build Coastguard Worker }
1104*61046927SAndroid Build Coastguard Worker 
1105*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_writes_flags(const struct v3d_qpu_instr * inst)1106*61046927SAndroid Build Coastguard Worker v3d_qpu_writes_flags(const struct v3d_qpu_instr *inst)
1107*61046927SAndroid Build Coastguard Worker {
1108*61046927SAndroid Build Coastguard Worker         if (inst->flags.apf != V3D_QPU_PF_NONE ||
1109*61046927SAndroid Build Coastguard Worker             inst->flags.mpf != V3D_QPU_PF_NONE ||
1110*61046927SAndroid Build Coastguard Worker             inst->flags.auf != V3D_QPU_UF_NONE ||
1111*61046927SAndroid Build Coastguard Worker             inst->flags.muf != V3D_QPU_UF_NONE) {
1112*61046927SAndroid Build Coastguard Worker                 return true;
1113*61046927SAndroid Build Coastguard Worker         }
1114*61046927SAndroid Build Coastguard Worker 
1115*61046927SAndroid Build Coastguard Worker         return false;
1116*61046927SAndroid Build Coastguard Worker }
1117*61046927SAndroid Build Coastguard Worker 
1118*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_unpacks_f32(const struct v3d_qpu_instr * inst)1119*61046927SAndroid Build Coastguard Worker v3d_qpu_unpacks_f32(const struct v3d_qpu_instr *inst)
1120*61046927SAndroid Build Coastguard Worker {
1121*61046927SAndroid Build Coastguard Worker         if (inst->type != V3D_QPU_INSTR_TYPE_ALU)
1122*61046927SAndroid Build Coastguard Worker                 return false;
1123*61046927SAndroid Build Coastguard Worker 
1124*61046927SAndroid Build Coastguard Worker         switch (inst->alu.add.op) {
1125*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FADD:
1126*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FADDNF:
1127*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FSUB:
1128*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FMIN:
1129*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FMAX:
1130*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FCMP:
1131*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FROUND:
1132*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FTRUNC:
1133*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FFLOOR:
1134*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FCEIL:
1135*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FDX:
1136*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FDY:
1137*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FTOIN:
1138*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FTOIZ:
1139*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FTOUZ:
1140*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_FTOC:
1141*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_VFPACK:
1142*61046927SAndroid Build Coastguard Worker                 return true;
1143*61046927SAndroid Build Coastguard Worker                 break;
1144*61046927SAndroid Build Coastguard Worker         default:
1145*61046927SAndroid Build Coastguard Worker                 break;
1146*61046927SAndroid Build Coastguard Worker         }
1147*61046927SAndroid Build Coastguard Worker 
1148*61046927SAndroid Build Coastguard Worker         switch (inst->alu.mul.op) {
1149*61046927SAndroid Build Coastguard Worker         case V3D_QPU_M_FMOV:
1150*61046927SAndroid Build Coastguard Worker         case V3D_QPU_M_FMUL:
1151*61046927SAndroid Build Coastguard Worker                 return true;
1152*61046927SAndroid Build Coastguard Worker                 break;
1153*61046927SAndroid Build Coastguard Worker         default:
1154*61046927SAndroid Build Coastguard Worker                 break;
1155*61046927SAndroid Build Coastguard Worker         }
1156*61046927SAndroid Build Coastguard Worker 
1157*61046927SAndroid Build Coastguard Worker         return false;
1158*61046927SAndroid Build Coastguard Worker }
1159*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_unpacks_f16(const struct v3d_qpu_instr * inst)1160*61046927SAndroid Build Coastguard Worker v3d_qpu_unpacks_f16(const struct v3d_qpu_instr *inst)
1161*61046927SAndroid Build Coastguard Worker {
1162*61046927SAndroid Build Coastguard Worker         if (inst->type != V3D_QPU_INSTR_TYPE_ALU)
1163*61046927SAndroid Build Coastguard Worker                 return false;
1164*61046927SAndroid Build Coastguard Worker 
1165*61046927SAndroid Build Coastguard Worker         switch (inst->alu.add.op) {
1166*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_VFMIN:
1167*61046927SAndroid Build Coastguard Worker         case V3D_QPU_A_VFMAX:
1168*61046927SAndroid Build Coastguard Worker                 return true;
1169*61046927SAndroid Build Coastguard Worker                 break;
1170*61046927SAndroid Build Coastguard Worker         default:
1171*61046927SAndroid Build Coastguard Worker                 break;
1172*61046927SAndroid Build Coastguard Worker         }
1173*61046927SAndroid Build Coastguard Worker 
1174*61046927SAndroid Build Coastguard Worker         switch (inst->alu.mul.op) {
1175*61046927SAndroid Build Coastguard Worker         case V3D_QPU_M_VFMUL:
1176*61046927SAndroid Build Coastguard Worker                 return true;
1177*61046927SAndroid Build Coastguard Worker                 break;
1178*61046927SAndroid Build Coastguard Worker         default:
1179*61046927SAndroid Build Coastguard Worker                 break;
1180*61046927SAndroid Build Coastguard Worker         }
1181*61046927SAndroid Build Coastguard Worker 
1182*61046927SAndroid Build Coastguard Worker         return false;
1183*61046927SAndroid Build Coastguard Worker }
1184*61046927SAndroid Build Coastguard Worker 
1185*61046927SAndroid Build Coastguard Worker bool
v3d_qpu_is_nop(struct v3d_qpu_instr * inst)1186*61046927SAndroid Build Coastguard Worker v3d_qpu_is_nop(struct v3d_qpu_instr *inst)
1187*61046927SAndroid Build Coastguard Worker {
1188*61046927SAndroid Build Coastguard Worker         static const struct v3d_qpu_sig nosig = { 0 };
1189*61046927SAndroid Build Coastguard Worker 
1190*61046927SAndroid Build Coastguard Worker         if (inst->type != V3D_QPU_INSTR_TYPE_ALU)
1191*61046927SAndroid Build Coastguard Worker                 return false;
1192*61046927SAndroid Build Coastguard Worker         if (inst->alu.add.op != V3D_QPU_A_NOP)
1193*61046927SAndroid Build Coastguard Worker                 return false;
1194*61046927SAndroid Build Coastguard Worker         if (inst->alu.mul.op != V3D_QPU_M_NOP)
1195*61046927SAndroid Build Coastguard Worker                 return false;
1196*61046927SAndroid Build Coastguard Worker         if (memcmp(&inst->sig, &nosig, sizeof(nosig)))
1197*61046927SAndroid Build Coastguard Worker                 return false;
1198*61046927SAndroid Build Coastguard Worker         return true;
1199*61046927SAndroid Build Coastguard Worker }
1200