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 <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41810>
This commit is contained in:
Jose Maria Casanova Crespo 2026-04-29 11:39:23 +02:00 committed by Marge Bot
parent 5943d01e86
commit cac92fecac

View file

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