2 * Copyright © 2016 Broadcom
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 #include "util/macros.h"
26 #include "broadcom/common/v3d_device_info.h"
27 #include "qpu_instr.h"
30 #define QPU_MASK(high, low) ((((uint64_t)1<<((high)-(low)+1))-1)<<(low))
31 /* Using the GNU statement expression extension */
32 #define QPU_SET_FIELD(value, field) \
34 uint64_t fieldval = (uint64_t)(value) << field ## _SHIFT; \
35 assert((fieldval & ~ field ## _MASK) == 0); \
36 fieldval & field ## _MASK; \
39 #define QPU_GET_FIELD(word, field) ((uint32_t)(((word) & field ## _MASK) >> field ## _SHIFT))
41 #define QPU_UPDATE_FIELD(inst, value, field) \
42 (((inst) & ~(field ## _MASK)) | QPU_SET_FIELD(value, field))
45 #define VC5_QPU_OP_MUL_SHIFT 58
46 #define VC5_QPU_OP_MUL_MASK QPU_MASK(63, 58)
48 #define VC5_QPU_SIG_SHIFT 53
49 #define VC5_QPU_SIG_MASK QPU_MASK(57, 53)
50 # define VC5_QPU_SIG_THRSW_BIT 0x1
51 # define VC5_QPU_SIG_LDUNIF_BIT 0x2
52 # define VC5_QPU_SIG_LDTMU_BIT 0x4
53 # define VC5_QPU_SIG_LDVARY_BIT 0x8
55 #define VC5_QPU_COND_SHIFT 46
56 #define VC5_QPU_COND_MASK QPU_MASK(52, 46)
58 #define VC5_QPU_COND_IFA 0
59 #define VC5_QPU_COND_IFB 1
60 #define VC5_QPU_COND_IFNA 2
61 #define VC5_QPU_COND_IFNB 3
63 #define VC5_QPU_MM QPU_MASK(45, 45)
64 #define VC5_QPU_MA QPU_MASK(44, 44)
66 #define V3D_QPU_WADDR_M_SHIFT 38
67 #define V3D_QPU_WADDR_M_MASK QPU_MASK(43, 38)
69 #define VC5_QPU_BRANCH_ADDR_LOW_SHIFT 35
70 #define VC5_QPU_BRANCH_ADDR_LOW_MASK QPU_MASK(55, 35)
72 #define V3D_QPU_WADDR_A_SHIFT 32
73 #define V3D_QPU_WADDR_A_MASK QPU_MASK(37, 32)
75 #define VC5_QPU_BRANCH_COND_SHIFT 32
76 #define VC5_QPU_BRANCH_COND_MASK QPU_MASK(34, 32)
78 #define VC5_QPU_BRANCH_ADDR_HIGH_SHIFT 24
79 #define VC5_QPU_BRANCH_ADDR_HIGH_MASK QPU_MASK(31, 24)
81 #define VC5_QPU_OP_ADD_SHIFT 24
82 #define VC5_QPU_OP_ADD_MASK QPU_MASK(31, 24)
84 #define VC5_QPU_MUL_B_SHIFT 21
85 #define VC5_QPU_MUL_B_MASK QPU_MASK(23, 21)
87 #define VC5_QPU_BRANCH_MSFIGN_SHIFT 21
88 #define VC5_QPU_BRANCH_MSFIGN_MASK QPU_MASK(22, 21)
90 #define VC5_QPU_MUL_A_SHIFT 18
91 #define VC5_QPU_MUL_A_MASK QPU_MASK(20, 18)
93 #define VC5_QPU_ADD_B_SHIFT 15
94 #define VC5_QPU_ADD_B_MASK QPU_MASK(17, 15)
96 #define VC5_QPU_BRANCH_BDU_SHIFT 15
97 #define VC5_QPU_BRANCH_BDU_MASK QPU_MASK(17, 15)
99 #define VC5_QPU_BRANCH_UB QPU_MASK(14, 14)
101 #define VC5_QPU_ADD_A_SHIFT 12
102 #define VC5_QPU_ADD_A_MASK QPU_MASK(14, 12)
104 #define VC5_QPU_BRANCH_BDI_SHIFT 12
105 #define VC5_QPU_BRANCH_BDI_MASK QPU_MASK(13, 12)
107 #define VC5_QPU_RADDR_A_SHIFT 6
108 #define VC5_QPU_RADDR_A_MASK QPU_MASK(11, 6)
110 #define VC5_QPU_RADDR_B_SHIFT 0
111 #define VC5_QPU_RADDR_B_MASK QPU_MASK(5, 0)
114 v3d_qpu_magic_waddr_name(enum v3d_qpu_waddr waddr
)
116 static const char *waddr_magic
[] = {
117 [V3D_QPU_WADDR_R0
] = "r0",
118 [V3D_QPU_WADDR_R1
] = "r1",
119 [V3D_QPU_WADDR_R2
] = "r2",
120 [V3D_QPU_WADDR_R3
] = "r3",
121 [V3D_QPU_WADDR_R4
] = "r4",
122 [V3D_QPU_WADDR_R5
] = "r5",
123 [V3D_QPU_WADDR_NOP
] = "-",
124 [V3D_QPU_WADDR_TLB
] = "tlb",
125 [V3D_QPU_WADDR_TLBU
] = "tlbu",
126 [V3D_QPU_WADDR_TMU
] = "tmu",
127 [V3D_QPU_WADDR_TMUL
] = "tmul",
128 [V3D_QPU_WADDR_TMUD
] = "tmud",
129 [V3D_QPU_WADDR_TMUA
] = "tmua",
130 [V3D_QPU_WADDR_TMUAU
] = "tmuau",
131 [V3D_QPU_WADDR_VPM
] = "vpm",
132 [V3D_QPU_WADDR_VPMU
] = "vpmu",
133 [V3D_QPU_WADDR_SYNC
] = "sync",
134 [V3D_QPU_WADDR_SYNCU
] = "syncu",
135 [V3D_QPU_WADDR_RECIP
] = "recip",
136 [V3D_QPU_WADDR_RSQRT
] = "rsqrt",
137 [V3D_QPU_WADDR_EXP
] = "exp",
138 [V3D_QPU_WADDR_LOG
] = "log",
139 [V3D_QPU_WADDR_SIN
] = "sin",
140 [V3D_QPU_WADDR_RSQRT2
] = "rsqrt2",
143 return waddr_magic
[waddr
];
147 v3d_qpu_add_op_name(enum v3d_qpu_add_op op
)
149 static const char *op_names
[] = {
150 [V3D_QPU_A_FADD
] = "fadd",
151 [V3D_QPU_A_FADDNF
] = "faddnf",
152 [V3D_QPU_A_VFPACK
] = "vfpack",
153 [V3D_QPU_A_ADD
] = "add",
154 [V3D_QPU_A_SUB
] = "sub",
155 [V3D_QPU_A_FSUB
] = "fsub",
156 [V3D_QPU_A_MIN
] = "min",
157 [V3D_QPU_A_MAX
] = "max",
158 [V3D_QPU_A_UMIN
] = "umin",
159 [V3D_QPU_A_UMAX
] = "umax",
160 [V3D_QPU_A_SHL
] = "shl",
161 [V3D_QPU_A_SHR
] = "shr",
162 [V3D_QPU_A_ASR
] = "asr",
163 [V3D_QPU_A_ROR
] = "ror",
164 [V3D_QPU_A_FMIN
] = "fmin",
165 [V3D_QPU_A_FMAX
] = "fmax",
166 [V3D_QPU_A_VFMIN
] = "vfmin",
167 [V3D_QPU_A_AND
] = "and",
168 [V3D_QPU_A_OR
] = "or",
169 [V3D_QPU_A_XOR
] = "xor",
170 [V3D_QPU_A_VADD
] = "vadd",
171 [V3D_QPU_A_VSUB
] = "vsub",
172 [V3D_QPU_A_NOT
] = "not",
173 [V3D_QPU_A_NEG
] = "neg",
174 [V3D_QPU_A_FLAPUSH
] = "flapush",
175 [V3D_QPU_A_FLBPUSH
] = "flbpush",
176 [V3D_QPU_A_FLBPOP
] = "flbpop",
177 [V3D_QPU_A_SETMSF
] = "setmsf",
178 [V3D_QPU_A_SETREVF
] = "setrevf",
179 [V3D_QPU_A_NOP
] = "nop",
180 [V3D_QPU_A_TIDX
] = "tidx",
181 [V3D_QPU_A_EIDX
] = "eidx",
182 [V3D_QPU_A_LR
] = "lr",
183 [V3D_QPU_A_VFLA
] = "vfla",
184 [V3D_QPU_A_VFLNA
] = "vflna",
185 [V3D_QPU_A_VFLB
] = "vflb",
186 [V3D_QPU_A_VFLNB
] = "vflnb",
187 [V3D_QPU_A_FXCD
] = "fxcd",
188 [V3D_QPU_A_XCD
] = "xcd",
189 [V3D_QPU_A_FYCD
] = "fycd",
190 [V3D_QPU_A_YCD
] = "ycd",
191 [V3D_QPU_A_MSF
] = "msf",
192 [V3D_QPU_A_REVF
] = "revf",
193 [V3D_QPU_A_VDWWT
] = "vdwwt",
194 [V3D_QPU_A_IID
] = "iid",
195 [V3D_QPU_A_SAMPID
] = "sampid",
196 [V3D_QPU_A_PATCHID
] = "patchid",
197 [V3D_QPU_A_TMUWT
] = "tmuwt",
198 [V3D_QPU_A_VPMSETUP
] = "vpmsetup",
199 [V3D_QPU_A_VPMWT
] = "vpmwt",
200 [V3D_QPU_A_LDVPMV
] = "ldvpmv",
201 [V3D_QPU_A_LDVPMD
] = "ldvpmd",
202 [V3D_QPU_A_LDVPMP
] = "ldvpmp",
203 [V3D_QPU_A_LDVPMG
] = "ldvpmg",
204 [V3D_QPU_A_FCMP
] = "fcmp",
205 [V3D_QPU_A_VFMAX
] = "vfmax",
206 [V3D_QPU_A_FROUND
] = "fround",
207 [V3D_QPU_A_FTOIN
] = "ftoin",
208 [V3D_QPU_A_FTRUNC
] = "ftrunc",
209 [V3D_QPU_A_FTOIZ
] = "ftoiz",
210 [V3D_QPU_A_FFLOOR
] = "ffloor",
211 [V3D_QPU_A_FTOUZ
] = "ftouz",
212 [V3D_QPU_A_FCEIL
] = "fceil",
213 [V3D_QPU_A_FTOC
] = "ftoc",
214 [V3D_QPU_A_FDX
] = "fdx",
215 [V3D_QPU_A_FDY
] = "fdy",
216 [V3D_QPU_A_STVPMV
] = "stvpmv",
217 [V3D_QPU_A_STVPMD
] = "stvpmd",
218 [V3D_QPU_A_STVPMP
] = "stvpmp",
219 [V3D_QPU_A_ITOF
] = "itof",
220 [V3D_QPU_A_CLZ
] = "clz",
221 [V3D_QPU_A_UTOF
] = "utof",
224 if (op
>= ARRAY_SIZE(op_names
))
231 v3d_qpu_mul_op_name(enum v3d_qpu_mul_op op
)
233 static const char *op_names
[] = {
234 [V3D_QPU_M_ADD
] = "add",
235 [V3D_QPU_M_SUB
] = "sub",
236 [V3D_QPU_M_UMUL24
] = "umul24",
237 [V3D_QPU_M_VFMUL
] = "vfmul",
238 [V3D_QPU_M_SMUL24
] = "smul24",
239 [V3D_QPU_M_MULTOP
] = "multop",
240 [V3D_QPU_M_FMOV
] = "fmov",
241 [V3D_QPU_M_MOV
] = "mov",
242 [V3D_QPU_M_NOP
] = "nop",
243 [V3D_QPU_M_FMUL
] = "fmul",
246 if (op
>= ARRAY_SIZE(op_names
))
253 v3d_qpu_cond_name(enum v3d_qpu_cond cond
)
256 case V3D_QPU_COND_NONE
:
258 case V3D_QPU_COND_IFA
:
260 case V3D_QPU_COND_IFB
:
262 case V3D_QPU_COND_IFNA
:
264 case V3D_QPU_COND_IFNB
:
267 unreachable("bad cond value");
272 v3d_qpu_branch_cond_name(enum v3d_qpu_branch_cond cond
)
275 case V3D_QPU_BRANCH_COND_ALWAYS
:
277 case V3D_QPU_BRANCH_COND_A0
:
279 case V3D_QPU_BRANCH_COND_NA0
:
281 case V3D_QPU_BRANCH_COND_ALLA
:
283 case V3D_QPU_BRANCH_COND_ANYNA
:
285 case V3D_QPU_BRANCH_COND_ANYA
:
287 case V3D_QPU_BRANCH_COND_ALLNA
:
290 unreachable("bad branch cond value");
295 v3d_qpu_msfign_name(enum v3d_qpu_msfign msfign
)
298 case V3D_QPU_MSFIGN_NONE
:
300 case V3D_QPU_MSFIGN_P
:
302 case V3D_QPU_MSFIGN_Q
:
305 unreachable("bad branch cond value");
310 v3d_qpu_pf_name(enum v3d_qpu_pf pf
)
313 case V3D_QPU_PF_NONE
:
315 case V3D_QPU_PF_PUSHZ
:
317 case V3D_QPU_PF_PUSHN
:
319 case V3D_QPU_PF_PUSHC
:
322 unreachable("bad pf value");
327 v3d_qpu_uf_name(enum v3d_qpu_uf uf
)
330 case V3D_QPU_UF_NONE
:
332 case V3D_QPU_UF_ANDZ
:
334 case V3D_QPU_UF_ANDNZ
:
336 case V3D_QPU_UF_NORZ
:
338 case V3D_QPU_UF_NORNZ
:
340 case V3D_QPU_UF_ANDN
:
342 case V3D_QPU_UF_ANDNN
:
344 case V3D_QPU_UF_NORN
:
346 case V3D_QPU_UF_NORNN
:
348 case V3D_QPU_UF_ANDC
:
350 case V3D_QPU_UF_ANDNC
:
352 case V3D_QPU_UF_NORC
:
354 case V3D_QPU_UF_NORNC
:
357 unreachable("bad pf value");
362 v3d_qpu_pack_name(enum v3d_qpu_output_pack pack
)
365 case V3D_QPU_PACK_NONE
:
372 unreachable("bad pack value");
377 v3d_qpu_unpack_name(enum v3d_qpu_input_unpack unpack
)
380 case V3D_QPU_UNPACK_NONE
:
382 case V3D_QPU_UNPACK_L
:
384 case V3D_QPU_UNPACK_H
:
386 case V3D_QPU_UNPACK_ABS
:
388 case V3D_QPU_UNPACK_REPLICATE_32F_16
:
390 case V3D_QPU_UNPACK_REPLICATE_L_16
:
392 case V3D_QPU_UNPACK_REPLICATE_H_16
:
394 case V3D_QPU_UNPACK_SWAP_16
:
397 unreachable("bad unpack value");
404 static const uint8_t add_op_args
[] = {
405 [V3D_QPU_A_FADD
] = D
| A
| B
,
406 [V3D_QPU_A_FADDNF
] = D
| A
| B
,
407 [V3D_QPU_A_VFPACK
] = D
| A
| B
,
408 [V3D_QPU_A_ADD
] = D
| A
| B
,
409 [V3D_QPU_A_VFPACK
] = D
| A
| B
,
410 [V3D_QPU_A_SUB
] = D
| A
| B
,
411 [V3D_QPU_A_VFPACK
] = D
| A
| B
,
412 [V3D_QPU_A_FSUB
] = D
| A
| B
,
413 [V3D_QPU_A_MIN
] = D
| A
| B
,
414 [V3D_QPU_A_MAX
] = D
| A
| B
,
415 [V3D_QPU_A_UMIN
] = D
| A
| B
,
416 [V3D_QPU_A_UMAX
] = D
| A
| B
,
417 [V3D_QPU_A_SHL
] = D
| A
| B
,
418 [V3D_QPU_A_SHR
] = D
| A
| B
,
419 [V3D_QPU_A_ASR
] = D
| A
| B
,
420 [V3D_QPU_A_ROR
] = D
| A
| B
,
421 [V3D_QPU_A_FMIN
] = D
| A
| B
,
422 [V3D_QPU_A_FMAX
] = D
| A
| B
,
423 [V3D_QPU_A_VFMIN
] = D
| A
| B
,
425 [V3D_QPU_A_AND
] = D
| A
| B
,
426 [V3D_QPU_A_OR
] = D
| A
| B
,
427 [V3D_QPU_A_XOR
] = D
| A
| B
,
429 [V3D_QPU_A_VADD
] = D
| A
| B
,
430 [V3D_QPU_A_VSUB
] = D
| A
| B
,
431 [V3D_QPU_A_NOT
] = D
| A
,
432 [V3D_QPU_A_NEG
] = D
| A
,
433 [V3D_QPU_A_FLAPUSH
] = D
| A
,
434 [V3D_QPU_A_FLBPUSH
] = D
| A
,
435 [V3D_QPU_A_FLBPOP
] = D
| A
,
436 [V3D_QPU_A_SETMSF
] = D
| A
,
437 [V3D_QPU_A_SETREVF
] = D
| A
,
439 [V3D_QPU_A_TIDX
] = D
,
440 [V3D_QPU_A_EIDX
] = D
,
442 [V3D_QPU_A_VFLA
] = D
,
443 [V3D_QPU_A_VFLNA
] = D
,
444 [V3D_QPU_A_VFLB
] = D
,
445 [V3D_QPU_A_VFLNB
] = D
,
447 [V3D_QPU_A_FXCD
] = D
,
449 [V3D_QPU_A_FYCD
] = D
,
453 [V3D_QPU_A_REVF
] = D
,
454 [V3D_QPU_A_VDWWT
] = D
,
456 [V3D_QPU_A_SAMPID
] = D
,
457 [V3D_QPU_A_PATCHID
] = D
,
458 [V3D_QPU_A_TMUWT
] = D
,
459 [V3D_QPU_A_VPMWT
] = D
,
461 [V3D_QPU_A_VPMSETUP
] = D
| A
,
463 [V3D_QPU_A_LDVPMV
] = D
| A
,
464 [V3D_QPU_A_LDVPMD
] = D
| A
,
465 [V3D_QPU_A_LDVPMP
] = D
| A
,
466 [V3D_QPU_A_LDVPMG
] = D
| A
| B
,
468 /* FIXME: MOVABSNEG */
470 [V3D_QPU_A_FCMP
] = D
| A
| B
,
471 [V3D_QPU_A_VFMAX
] = D
| A
| B
,
473 [V3D_QPU_A_FROUND
] = D
| A
,
474 [V3D_QPU_A_FTOIN
] = D
| A
,
475 [V3D_QPU_A_FTRUNC
] = D
| A
,
476 [V3D_QPU_A_FTOIZ
] = D
| A
,
477 [V3D_QPU_A_FFLOOR
] = D
| A
,
478 [V3D_QPU_A_FTOUZ
] = D
| A
,
479 [V3D_QPU_A_FCEIL
] = D
| A
,
480 [V3D_QPU_A_FTOC
] = D
| A
,
482 [V3D_QPU_A_FDX
] = D
| A
,
483 [V3D_QPU_A_FDY
] = D
| A
,
485 [V3D_QPU_A_STVPMV
] = A
| B
,
486 [V3D_QPU_A_STVPMD
] = A
| B
,
487 [V3D_QPU_A_STVPMP
] = A
| B
,
489 [V3D_QPU_A_ITOF
] = D
| A
,
490 [V3D_QPU_A_CLZ
] = D
| A
,
491 [V3D_QPU_A_UTOF
] = D
| A
,
494 static const uint8_t mul_op_args
[] = {
495 [V3D_QPU_M_ADD
] = D
| A
| B
,
496 [V3D_QPU_M_SUB
] = D
| A
| B
,
497 [V3D_QPU_M_UMUL24
] = D
| A
| B
,
498 [V3D_QPU_M_VFMUL
] = D
| A
| B
,
499 [V3D_QPU_M_SMUL24
] = D
| A
| B
,
500 [V3D_QPU_M_MULTOP
] = D
| A
| B
,
501 [V3D_QPU_M_FMOV
] = D
| A
,
503 [V3D_QPU_M_MOV
] = D
| A
,
504 [V3D_QPU_M_FMUL
] = D
| A
| B
,
508 v3d_qpu_add_op_has_dst(enum v3d_qpu_add_op op
)
510 assert(op
< ARRAY_SIZE(add_op_args
));
512 return add_op_args
[op
] & D
;
516 v3d_qpu_mul_op_has_dst(enum v3d_qpu_mul_op op
)
518 assert(op
< ARRAY_SIZE(mul_op_args
));
520 return mul_op_args
[op
] & D
;
524 v3d_qpu_add_op_num_src(enum v3d_qpu_add_op op
)
526 assert(op
< ARRAY_SIZE(add_op_args
));
528 uint8_t args
= add_op_args
[op
];
538 v3d_qpu_mul_op_num_src(enum v3d_qpu_mul_op op
)
540 assert(op
< ARRAY_SIZE(mul_op_args
));
542 uint8_t args
= mul_op_args
[op
];
552 v3d_qpu_magic_waddr_is_sfu(enum v3d_qpu_waddr waddr
)
555 case V3D_QPU_WADDR_RECIP
:
556 case V3D_QPU_WADDR_RSQRT
:
557 case V3D_QPU_WADDR_EXP
:
558 case V3D_QPU_WADDR_LOG
:
559 case V3D_QPU_WADDR_SIN
:
560 case V3D_QPU_WADDR_RSQRT2
:
568 v3d_qpu_magic_waddr_is_tmu(enum v3d_qpu_waddr waddr
)
571 case V3D_QPU_WADDR_TMU
:
572 case V3D_QPU_WADDR_TMUL
:
573 case V3D_QPU_WADDR_TMUD
:
574 case V3D_QPU_WADDR_TMUA
:
575 case V3D_QPU_WADDR_TMUAU
:
583 v3d_qpu_magic_waddr_is_tlb(enum v3d_qpu_waddr waddr
)
585 return (waddr
== V3D_QPU_WADDR_TLB
||
586 waddr
== V3D_QPU_WADDR_TLBU
);
590 v3d_qpu_magic_waddr_is_vpm(enum v3d_qpu_waddr waddr
)
592 return (waddr
== V3D_QPU_WADDR_VPM
||
593 waddr
== V3D_QPU_WADDR_VPMU
);
597 v3d_qpu_magic_waddr_is_tsy(enum v3d_qpu_waddr waddr
)
599 return (waddr
== V3D_QPU_WADDR_SYNC
||
600 waddr
== V3D_QPU_WADDR_SYNCU
);
604 v3d_qpu_writes_r3(const struct v3d_device_info
*devinfo
,
605 const struct v3d_qpu_instr
*inst
)
607 if (inst
->type
== V3D_QPU_INSTR_TYPE_ALU
) {
608 if (inst
->alu
.add
.magic_write
&&
609 inst
->alu
.add
.waddr
== V3D_QPU_WADDR_R3
) {
613 if (inst
->alu
.mul
.magic_write
&&
614 inst
->alu
.mul
.waddr
== V3D_QPU_WADDR_R3
) {
619 if (v3d_qpu_sig_writes_address(devinfo
, &inst
->sig
) &&
620 inst
->sig_magic
&& inst
->sig_addr
== V3D_QPU_WADDR_R3
) {
624 return inst
->sig
.ldvary
|| inst
->sig
.ldvpm
;
628 v3d_qpu_writes_r4(const struct v3d_device_info
*devinfo
,
629 const struct v3d_qpu_instr
*inst
)
634 if (inst
->type
== V3D_QPU_INSTR_TYPE_ALU
) {
635 if (inst
->alu
.add
.magic_write
&&
636 (inst
->alu
.add
.waddr
== V3D_QPU_WADDR_R4
||
637 v3d_qpu_magic_waddr_is_sfu(inst
->alu
.add
.waddr
))) {
641 if (inst
->alu
.mul
.magic_write
&&
642 (inst
->alu
.mul
.waddr
== V3D_QPU_WADDR_R4
||
643 v3d_qpu_magic_waddr_is_sfu(inst
->alu
.mul
.waddr
))) {
648 if (v3d_qpu_sig_writes_address(devinfo
, &inst
->sig
) &&
649 inst
->sig_magic
&& inst
->sig_addr
== V3D_QPU_WADDR_R4
) {
657 v3d_qpu_writes_r5(const struct v3d_device_info
*devinfo
,
658 const struct v3d_qpu_instr
*inst
)
660 if (inst
->type
== V3D_QPU_INSTR_TYPE_ALU
) {
661 if (inst
->alu
.add
.magic_write
&&
662 inst
->alu
.add
.waddr
== V3D_QPU_WADDR_R5
) {
666 if (inst
->alu
.mul
.magic_write
&&
667 inst
->alu
.mul
.waddr
== V3D_QPU_WADDR_R5
) {
672 if (v3d_qpu_sig_writes_address(devinfo
, &inst
->sig
) &&
673 inst
->sig_magic
&& inst
->sig_addr
== V3D_QPU_WADDR_R5
) {
677 return inst
->sig
.ldvary
|| inst
->sig
.ldunif
|| inst
->sig
.ldunifa
;
681 v3d_qpu_uses_mux(const struct v3d_qpu_instr
*inst
, enum v3d_qpu_mux mux
)
683 int add_nsrc
= v3d_qpu_add_op_num_src(inst
->alu
.add
.op
);
684 int mul_nsrc
= v3d_qpu_mul_op_num_src(inst
->alu
.mul
.op
);
686 return ((add_nsrc
> 0 && inst
->alu
.add
.a
== mux
) ||
687 (add_nsrc
> 1 && inst
->alu
.add
.b
== mux
) ||
688 (mul_nsrc
> 0 && inst
->alu
.mul
.a
== mux
) ||
689 (mul_nsrc
> 1 && inst
->alu
.mul
.b
== mux
));
693 v3d_qpu_sig_writes_address(const struct v3d_device_info
*devinfo
,
694 const struct v3d_qpu_sig
*sig
)
696 if (devinfo
->ver
< 41)
699 return (sig
->ldunifrf
||