nir/lower_idiv: Use ilt instead of bit twiddling
authorJason Ekstrand <jason.ekstrand@intel.com>
Sun, 16 Dec 2018 06:42:01 +0000 (00:42 -0600)
committerJason Ekstrand <jason@jlekstrand.net>
Sun, 16 Dec 2018 21:03:02 +0000 (21:03 +0000)
The previous code was creating a boolean by doing an arithmetic right-
shift by 31 which produces a boolean which is true if the argument is
negative.  This is the same as the expression r < 0 which is much
simpler and doesn't depend on NIR's representation of booleans.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/compiler/nir/nir_lower_idiv.c

index b2a0a3c1899851b425fcef4dc793475bb541d518..4e7e2408ae8cc3b1dde02654adaaade5bd43a963 100644 (file)
@@ -101,7 +101,7 @@ convert_instr(nir_builder *bld, nir_alu_instr *alu)
    if (is_signed)  {
       /* fix the sign: */
       r = nir_ixor(bld, numer, denom);
-      r = nir_ishr(bld, r, nir_imm_int(bld, 31));
+      r = nir_ilt(bld, r, nir_imm_int(bld, 0));
       b = nir_ineg(bld, q);
       q = nir_bcsel(bld, r, b, q);
    }