intel/compiler: Replicate 16 bit immediate value correctly
authorSagar Ghuge <sagar.ghuge@intel.com>
Tue, 26 Mar 2019 04:17:08 +0000 (21:17 -0700)
committerMatt Turner <mattst88@gmail.com>
Tue, 7 May 2019 21:33:48 +0000 (14:33 -0700)
For the W or UW (signed or unsigned word) source types, the 16-bit value
must be replicated in both the low and high words of the 32-bit
immediate value.

v2: Fix replication in other places as well
V3: fix a few nits (Matt Turner)

Signed-off-by: Sagar Ghuge <sagar.ghuge@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/intel/compiler/brw_fs.cpp
src/intel/compiler/brw_vec4_generator.cpp

index 335eaa0e934a788f516f4cef9936833246535de6..66ee7605bea76f0d5bb3f7b7935f9e4c45eb8e16 100644 (file)
@@ -4076,6 +4076,9 @@ fs_visitor::lower_integer_multiplication()
             mul->src[1].type = BRW_REGISTER_TYPE_UW;
             mul->src[1].stride *= 2;
 
+            if (mul->src[1].file == IMM) {
+               mul->src[1] = brw_imm_uw(mul->src[1].ud);
+            }
          } else if (devinfo->gen == 7 && !devinfo->is_haswell &&
                     inst->group > 0) {
             /* Among other things the quarter control bits influence which
index 05e6f50ebb60d632ba3fe6b64063586d4ca26d89..b6d2a0aba80bbc9602fdae773e17013dd0ef3721 100644 (file)
@@ -443,6 +443,9 @@ generate_gs_set_write_offset(struct brw_codegen *p,
       brw_MOV(p, suboffset(stride(dst, 2, 2, 1), 3),
               brw_imm_ud(src0.ud * src1.ud));
    } else {
+      if (src1.file == BRW_IMMEDIATE_VALUE) {
+         src1 = brw_imm_uw(src1.ud);
+      }
       brw_MUL(p, suboffset(stride(dst, 2, 2, 1), 3), stride(src0, 8, 2, 4),
               retype(src1, BRW_REGISTER_TYPE_UW));
    }