diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2016-06-21 15:14:03 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2016-07-19 12:19:29 -0700 |
commit | de20086eed47e6bfe7c25835d72383114f99c7a9 (patch) | |
tree | e39a73795c12c7694c544954f0dedd3002d9b532 /src/mesa/drivers/dri/i965/brw_fs_nir.cpp | |
parent | 26c7f04d4a55b694623a389a564c9516d91c0026 (diff) | |
download | external_mesa3d-de20086eed47e6bfe7c25835d72383114f99c7a9.zip external_mesa3d-de20086eed47e6bfe7c25835d72383114f99c7a9.tar.gz external_mesa3d-de20086eed47e6bfe7c25835d72383114f99c7a9.tar.bz2 |
i965: Use LZD to implement nir_op_ufind_msb
This uses one less instruction.
v2: Move emit_find_msb_using_lzd out of the visitor classes. Suggested
by Curro.
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.cpp | 26 |
1 files changed, 25 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 6265dc6..1121556 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -614,6 +614,25 @@ fs_visitor::optimize_frontfacing_ternary(nir_alu_instr *instr, return true; } +static void +emit_find_msb_using_lzd(const fs_builder &bld, + const fs_reg &result, + const fs_reg &src, + bool is_signed) +{ + fs_inst *inst; + + bld.LZD(retype(result, BRW_REGISTER_TYPE_UD), src); + + /* LZD counts from the MSB side, while GLSL's findMSB() wants the count + * from the LSB side. Subtract the result from 31 to convert the MSB + * count into an LSB count. If no bits are set, LZD will return 32. + * 31-32 = -1, which is exactly what findMSB() is supposed to return. + */ + inst = bld.ADD(result, retype(result, BRW_REGISTER_TYPE_D), brw_imm_d(31)); + inst->src[0].negate = true; +} + void fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr) { @@ -1310,7 +1329,12 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr) bld.CBIT(result, op[0]); break; - case nir_op_ufind_msb: + case nir_op_ufind_msb: { + assert(nir_dest_bit_size(instr->dest.dest) < 64); + emit_find_msb_using_lzd(bld, result, op[0], false); + break; + } + case nir_op_ifind_msb: { assert(nir_dest_bit_size(instr->dest.dest) < 64); bld.FBH(retype(result, BRW_REGISTER_TYPE_UD), op[0]); |