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 <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41255>
This commit is contained in:
Jose Maria Casanova Crespo 2026-02-07 18:28:19 +01:00 committed by Marge Bot
parent afe4e321e1
commit 33a700be91
3 changed files with 29 additions and 0 deletions

View file

@ -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));

View file

@ -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)

View file

@ -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;