[Mesa-dev] [PATCH 46/59] intel/compiler: fix integer to/from half-float in atom platforms

Iago Toral Quiroga itoral at igalia.com
Tue Dec 4 07:17:10 UTC 2018


Section Register Region Restriction of the 3D Media GPGPU chapter states:

   "Conversion between Integer and HF (Half Float) must be DWord
    aligned and strided by a DWord on the destination."

The same restriction shows up in all hardware platforms that support
half-float, however, empirical testing suggests that only atom
platforms are affected.
---
 src/intel/compiler/brw_fs_nir.cpp | 41 +++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)

diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp
index 3f98c6a4474..db3a8812ae3 100644
--- a/src/intel/compiler/brw_fs_nir.cpp
+++ b/src/intel/compiler/brw_fs_nir.cpp
@@ -917,6 +917,25 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)
          inst->saturate = instr->dest.saturate;
          break;
       }
+
+      /* CHV PRM, 3D Media GPGPU Engine, Register Region Restrictions,
+       * Special Restrictions:
+       *
+       *    "Conversion between Integer and HF (Half Float) must be DWord
+       *     aligned and strided by a DWord on the destination."
+       *
+       * The same restriction is listed for other hardware platforms, however,
+       * empirical testing suggests that only atom platforms are affected.
+       */
+      if ((devinfo->is_cherryview || gen_device_info_is_9lp(devinfo)) &&
+          nir_dest_bit_size(instr->dest.dest) == 16) {
+         assert(result.type == BRW_REGISTER_TYPE_HF);
+         fs_reg tmp =
+            horiz_stride(retype(bld.vgrf(BRW_REGISTER_TYPE_F, 1), result.type), 2);
+         bld.MOV(tmp, op[0]);
+         op[0] = tmp;
+      }
+
       inst = bld.MOV(result, op[0]);
       inst->saturate = instr->dest.saturate;
       break;
@@ -939,11 +958,29 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)
       }
       /* Fallthrough */
 
+   case nir_op_f2i16:
+   case nir_op_f2u16:
+      /* CHV PRM, 3D Media GPGPU Engine, Register Region Restrictions,
+       * Special Restrictions:
+       *
+       *    "Conversion between Integer and HF (Half Float) must be DWord
+       *     aligned and strided by a DWord on the destination."
+       *
+       * The same restriction is listed for other hardware platforms, however,
+       * empirical testing suggests that only atom platforms are affected.
+       */
+      if ((devinfo->is_cherryview || gen_device_info_is_9lp(devinfo)) &&
+          nir_src_bit_size(instr->src[0].src) == 16) {
+         fs_reg tmp =
+            horiz_stride(retype(bld.vgrf(BRW_REGISTER_TYPE_D, 1), result.type), 2);
+         bld.MOV(tmp, op[0]);
+         op[0] = tmp;
+      }
+      /* Fallthrough */
+
    case nir_op_f2f32:
    case nir_op_f2i32:
    case nir_op_f2u32:
-   case nir_op_f2i16:
-   case nir_op_f2u16:
    case nir_op_i2i32:
    case nir_op_u2u32:
    case nir_op_i2i16:
-- 
2.17.1



More information about the mesa-dev mailing list