The PRM for MAD states that F, DF and HF are supported, however, then it requires that the instruction includes a 2-bit mask specifying the types of each operand like this:
00: 32-bit float 01: 32-bit signed integer 10: 32-bit unsigned integer 11: 64-bit float So 16-bit float would not be supported. The driver also asserts that the types involved in ALING16 3-src operations are one of these (MAD is always emitted as an align16 instruction prior to gen10). --- src/intel/compiler/brw_fs_nir.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index 91283ab4911..58ddc456bae 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -1525,7 +1525,14 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr) break; case nir_op_ffma: - inst = bld.MAD(result, op[2], op[1], op[0]); + /* 3-src MAD doesn't support 16-bit operands */ + if (nir_dest_bit_size(instr->dest.dest) >= 32) { + inst = bld.MAD(result, op[2], op[1], op[0]); + } else { + fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_HF); + bld.MUL(tmp, op[1], op[0]); + inst = bld.ADD(result, tmp, op[2]); + } inst->saturate = instr->dest.saturate; break; -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev