diff --git a/src/intel/compiler/brw_compiler.c b/src/intel/compiler/brw_compiler.c index 2daadcb1b58..7ecf630be18 100644 --- a/src/intel/compiler/brw_compiler.c +++ b/src/intel/compiler/brw_compiler.c @@ -188,6 +188,7 @@ brw_compiler_create(void *mem_ctx, const struct intel_device_info *devinfo) nir_options->lower_rotate = devinfo->ver < 11; nir_options->lower_bitfield_reverse = devinfo->ver < 7; + nir_options->lower_find_lsb = devinfo->ver < 7; nir_options->has_iadd3 = devinfo->verx10 >= 125; nir_options->has_sdot_4x8 = devinfo->ver >= 12; diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index d9bfc06f1f5..36bbef7e87c 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -1737,27 +1737,8 @@ 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); - - if (devinfo->ver < 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]); - } + assert(devinfo->ver >= 7); + bld.FBL(result, op[0]); break; case nir_op_ubitfield_extract: diff --git a/src/intel/compiler/brw_vec4_nir.cpp b/src/intel/compiler/brw_vec4_nir.cpp index 6adb5e62d45..5f402889c65 100644 --- a/src/intel/compiler/brw_vec4_nir.cpp +++ b/src/intel/compiler/brw_vec4_nir.cpp @@ -1688,32 +1688,11 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr) break; } - case nir_op_find_lsb: { + case nir_op_find_lsb: assert(nir_dest_bit_size(instr->dest.dest) < 64); - vec4_builder bld = vec4_builder(this).at_end(); - - if (devinfo->ver < 7) { - dst_reg temp = bld.vgrf(BRW_REGISTER_TYPE_D); - - /* (x & -x) generates a value that consists of only the LSB of x. - * For all powers of 2, findMSB(y) == findLSB(y). - */ - src_reg src = src_reg(retype(op[0], BRW_REGISTER_TYPE_D)); - src_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, dst, src_reg(temp), false); - } else { - bld.FBL(dst, op[0]); - } + assert(devinfo->ver >= 7); + emit(FBL(dst, op[0])); break; - } case nir_op_ubitfield_extract: case nir_op_ibitfield_extract: