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