[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