summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2016-06-22 13:12:26 -0700
committerIan Romanick <ian.d.romanick@intel.com>2016-07-19 12:19:29 -0700
commit3e7cebc8da5c9f16fa1b9a25ea72b8d31c86a440 (patch)
tree79342916637d30f355a0135fde4b21f8354512f2 /src/mesa/drivers/dri/i965/brw_fs_nir.cpp
parentc2019c6c261d5c46a4e5d3edc88836bcedf75f30 (diff)
downloadexternal_mesa3d-3e7cebc8da5c9f16fa1b9a25ea72b8d31c86a440.zip
external_mesa3d-3e7cebc8da5c9f16fa1b9a25ea72b8d31c86a440.tar.gz
external_mesa3d-3e7cebc8da5c9f16fa1b9a25ea72b8d31c86a440.tar.bz2
i965: Use LZD to implement nir_op_find_lsb on Gen < 7
v2: Rebase on changes to previous two patches. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Matt Turner <mattst88@gmail.com>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs_nir.cpp')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_nir.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
index 5bf9aa4..3da6d75 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
@@ -1387,7 +1387,27 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)
case nir_op_find_lsb:
assert(nir_dest_bit_size(instr->dest.dest) < 64);
- bld.FBL(result, op[0]);
+
+ if (devinfo->gen < 7) {
+ fs_reg temp = vgrf(glsl_type::int_type);
+
+ /* (x & -x) generates a value that consists of only the LSB of x.
+ * For all powers of 2, findMSB(y) == findLSB(y).
+ */
+ fs_reg src = retype(op[0], BRW_REGISTER_TYPE_D);
+ fs_reg negated_src = src;
+
+ /* One must be negated, and the other must be non-negated. It
+ * doesn't matter which is which.
+ */
+ negated_src.negate = true;
+ src.negate = false;
+
+ bld.AND(temp, src, negated_src);
+ emit_find_msb_using_lzd(bld, result, temp, false);
+ } else {
+ bld.FBL(result, op[0]);
+ }
break;
case nir_op_ubitfield_extract: