From cac92fecaca7bf86d573b4e084a2456cea96cf74 Mon Sep 17 00:00:00 2001 From: Jose Maria Casanova Crespo Date: Wed, 29 Apr 2026 11:39:23 +0200 Subject: [PATCH] broadcom/qpu: support output pack on itof/utof itof and utof natively support packing the f32 result to f16 (.l/.h), but the encode/decode paths fell through to the default case and rejected any non-NONE pack, breaking nir_op_i2f16 / nir_op_u2f16 codegen with "Failed to pack instruction: itof rfN.l". Assisted-by: Claude Opus 4.7 Reviewed-by: Iago Toral Quiroga Part-of: --- src/broadcom/qpu/qpu_pack.c | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/broadcom/qpu/qpu_pack.c b/src/broadcom/qpu/qpu_pack.c index c82ac492d6d..215024e0f7e 100644 --- a/src/broadcom/qpu/qpu_pack.c +++ b/src/broadcom/qpu/qpu_pack.c @@ -1140,6 +1140,12 @@ v3d42_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst } break; + case V3D_QPU_A_ITOF: + case V3D_QPU_A_UTOF: + instr->alu.add.output_pack = mux_b & 0x3; + instr->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; + break; + case V3D_QPU_A_VFMIN: case V3D_QPU_A_VFMAX: if (!v3d_qpu_float16_unpack_unpack(op & 0x7, @@ -1292,6 +1298,12 @@ v3d71_qpu_add_unpack(const struct v3d_device_info *devinfo, uint64_t packed_inst } break; + case V3D_QPU_A_ITOF: + case V3D_QPU_A_UTOF: + instr->alu.add.output_pack = raddr_b & 0x3; + instr->alu.add.a.unpack = V3D_QPU_UNPACK_NONE; + break; + case V3D_QPU_A_VFMIN: case V3D_QPU_A_VFMAX: UNREACHABLE("pending v3d71 update"); @@ -1743,6 +1755,19 @@ v3d42_qpu_add_pack(const struct v3d_device_info *devinfo, break; + case V3D_QPU_A_ITOF: + case V3D_QPU_A_UTOF: { + uint32_t pack_packed; + if (instr->alu.add.a.unpack != V3D_QPU_UNPACK_NONE) + return false; + if (!v3d_qpu_float32_pack_pack(instr->alu.add.output_pack, + &pack_packed)) { + return false; + } + mux_b |= pack_packed; + break; + } + case V3D_QPU_A_VFMIN: case V3D_QPU_A_VFMAX: if (instr->alu.add.output_pack != V3D_QPU_PACK_NONE || @@ -1981,6 +2006,19 @@ v3d71_qpu_add_pack(const struct v3d_device_info *devinfo, break; + case V3D_QPU_A_ITOF: + case V3D_QPU_A_UTOF: { + uint32_t pack_packed; + if (instr->alu.add.a.unpack != V3D_QPU_UNPACK_NONE) + return false; + if (!v3d_qpu_float32_pack_pack(instr->alu.add.output_pack, + &pack_packed)) { + return false; + } + raddr_b |= pack_packed; + break; + } + case V3D_QPU_A_VFMIN: case V3D_QPU_A_VFMAX: if (instr->alu.add.output_pack != V3D_QPU_PACK_NONE ||