From 33a700be91be8adbcaf480c22e2eb4319ed29159 Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo Date: Sat, 7 Feb 2026 18:28:19 +0100 Subject: [PATCH] broadcom/compiler: hardware-accelerated 4x8-bit dot products on V3D 7.1+ VIR instructions and nir_to_vir implementation of 4x8-bit dot products using native HW accelerated ALU instructions. setnnmode instructions are marked as having side effects. Assisted-by: Claude Opus 4.6 Reviewed-by: Iago Toral Quiroga Part-of: --- src/broadcom/compiler/nir_to_vir.c | 18 ++++++++++++++++++ src/broadcom/compiler/v3d_compiler.h | 7 +++++++ src/broadcom/compiler/vir.c | 4 ++++ 3 files changed, 29 insertions(+) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 5db99c2e3f6..13e5d88fb82 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -1829,6 +1829,24 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr) vir_set_unpack(c->defs[result.index], 0, V3D71_QPU_UNPACK_MAX0); break; + case nir_op_udot_4x8_uadd: + assert(c->devinfo->ver >= 71); + vir_SETNNMODE_UU(c); + result = vir_ADD(c, vir_V8DOT(c, src[0], src[1]), src[2]); + break; + + case nir_op_sdot_4x8_iadd: + assert(c->devinfo->ver >= 71); + vir_SETNNMODE_SS(c); + result = vir_ADD(c, vir_V8DOT(c, src[0], src[1]), src[2]); + break; + + case nir_op_sudot_4x8_iadd: + assert(c->devinfo->ver >= 71); + vir_SETNNMODE_SU(c); + result = vir_ADD(c, vir_V8DOT(c, src[0], src[1]), src[2]); + break; + default: mesa_loge("Unknown NIR ALU inst: %s", nir_instr_as_str(&instr->instr, NULL)); diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index c1e290744a5..0b6ebeae86d 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -1506,6 +1506,13 @@ VIR_M_ALU1(FUNPACKSNORMHI) VIR_M_ALU1(VFTOUNORM10LO) VIR_M_ALU1(VFTOUNORM10HI) +/* V3D 7.1 v8dot and its signedness configuration */ +VIR_M_ALU2(V8DOT) +VIR_A_NODST_0(SETNNMODE_UU) +VIR_A_NODST_0(SETNNMODE_SU) +VIR_A_NODST_0(SETNNMODE_US) +VIR_A_NODST_0(SETNNMODE_SS) + static inline struct qinst * vir_MOV_cond(struct v3d_compile *c, enum v3d_qpu_cond cond, struct qreg dest, struct qreg src) diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index ca06b450e14..d2c3615b7a2 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -65,6 +65,10 @@ vir_has_side_effects(struct v3d_compile *c, struct qinst *inst) case V3D_QPU_A_STVPMP: case V3D_QPU_A_VPMWT: case V3D_QPU_A_TMUWT: + case V3D_QPU_A_SETNNMODE_UU: + case V3D_QPU_A_SETNNMODE_SU: + case V3D_QPU_A_SETNNMODE_US: + case V3D_QPU_A_SETNNMODE_SS: return true; default: break;