[Mesa-dev] [PATCH 09/22] intel/compiler: implement 16-bit multiply-add
Iago Toral Quiroga
itoral at igalia.com
Thu May 17 08:46:29 UTC 2018
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
More information about the mesa-dev
mailing list