Signed-off-by: Elie Tournier <elie.tourn...@collabora.com> --- src/compiler/nir/nir.h | 3 ++- src/compiler/nir/nir_lower_double_ops.c | 33 +++++++++++++++++++++++++++++++++ src/intel/compiler/brw_nir.c | 3 ++- 3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index e891d21499..10dd6b1056 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2570,7 +2570,8 @@ typedef enum { nir_lower_dround_even = (1 << 7), nir_lower_dmod = (1 << 8), nir_lower_dabs = (1 << 9), - nir_lower_dneg = (1 << 10) + nir_lower_dneg = (1 << 10), + nir_lower_dsign = (1 << 11) } nir_lower_doubles_options; bool nir_lower_doubles(nir_shader *shader, nir_lower_doubles_options options); diff --git a/src/compiler/nir/nir_lower_double_ops.c b/src/compiler/nir/nir_lower_double_ops.c index eb16e513ae..5c0d62b554 100644 --- a/src/compiler/nir/nir_lower_double_ops.c +++ b/src/compiler/nir/nir_lower_double_ops.c @@ -502,6 +502,30 @@ lower_fneg64(nir_builder *b, nir_ssa_def *src) nir_pack_64_2x32_split(b, src_lo, src_hi)); } +static nir_ssa_def * +lower_fsign64(nir_builder *b, nir_ssa_def *src) +{ + nir_ssa_def *src_lo = nir_unpack_64_2x32_split_x(b, src); + nir_ssa_def *src_hi = nir_unpack_64_2x32_split_y(b, src); + + nir_ssa_def *is_zero = nir_ieq(b, + nir_ior(b, + nir_ishl(b, src_hi, + nir_imm_int(b, 1)), + src_lo), + nir_imm_int(b, 0)); + + nir_ssa_def *sign = nir_iand(b, src_hi, nir_imm_int(b, 0x80000000)); + nir_ssa_def *one = nir_imm_int(b, 0x3FF00000); + + return nir_bcsel(b, + is_zero, + nir_imm_double(b, 0), + nir_pack_64_2x32_split(b, + nir_imm_int(b, 0), + nir_ior(b, sign, one))); +} + static bool lower_doubles_instr(nir_alu_instr *instr, nir_lower_doubles_options options) { @@ -565,6 +589,11 @@ lower_doubles_instr(nir_alu_instr *instr, nir_lower_doubles_options options) return false; break; + case nir_op_fsign: + if (!(options & nir_lower_dsign)) + return false; + break; + default: return false; } @@ -619,6 +648,10 @@ lower_doubles_instr(nir_alu_instr *instr, nir_lower_doubles_options options) result = lower_fneg64(&bld, src); break; + case nir_op_fsign: + result = lower_fsign64(&bld, src); + break; + default: unreachable("unhandled opcode"); } diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c index bf6935b1c2..405d756e6c 100644 --- a/src/intel/compiler/brw_nir.c +++ b/src/intel/compiler/brw_nir.c @@ -511,7 +511,8 @@ nir_optimize(nir_shader *nir, const struct brw_compiler *compiler, nir_lower_dround_even | nir_lower_dmod | nir_lower_dabs | - nir_lower_dneg); + nir_lower_dneg | + nir_lower_dsign); OPT(nir_lower_64bit_pack); } while (progress); -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev