X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_opt_idiv_const.c;h=688186779e6bf6162ecf34cb7e0adb9e9d539a0e;hb=f6b5abe91a78f78f07a3c9bbd5b2ea6a2f0fb736;hp=7fa739161bafbb9189fec91eea553bcd2ea4b80f;hpb=74492ebad9457679eb25d1a1159a674a988731d5;p=mesa.git diff --git a/src/compiler/nir/nir_opt_idiv_const.c b/src/compiler/nir/nir_opt_idiv_const.c index 7fa739161ba..688186779e6 100644 --- a/src/compiler/nir/nir_opt_idiv_const.c +++ b/src/compiler/nir/nir_opt_idiv_const.c @@ -65,15 +65,17 @@ build_umod(nir_builder *b, nir_ssa_def *n, uint64_t d) static nir_ssa_def * build_idiv(nir_builder *b, nir_ssa_def *n, int64_t d) { + uint64_t abs_d = d < 0 ? -d : d; + if (d == 0) { return nir_imm_intN_t(b, 0, n->bit_size); } else if (d == 1) { return n; } else if (d == -1) { return nir_ineg(b, n); - } else if (util_is_power_of_two_or_zero64(d)) { - uint64_t abs_d = d < 0 ? -d : d; - nir_ssa_def *uq = nir_ishr(b, n, nir_imm_int(b, util_logbase2_64(abs_d))); + } else if (util_is_power_of_two_or_zero64(abs_d)) { + nir_ssa_def *uq = nir_ushr(b, nir_iabs(b, n), + nir_imm_int(b, util_logbase2_64(abs_d))); nir_ssa_def *n_neg = nir_ilt(b, n, nir_imm_intN_t(b, 0, n->bit_size)); nir_ssa_def *neg = d < 0 ? nir_inot(b, n_neg) : n_neg; return nir_bcsel(b, neg, nir_ineg(b, uq), uq); @@ -119,16 +121,16 @@ nir_opt_idiv_const_instr(nir_builder *b, nir_alu_instr *alu) int64_t d; switch (bit_size) { case 8: - d = const_denom->i8[alu->src[1].swizzle[comp]]; + d = const_denom[alu->src[1].swizzle[comp]].i8; break; case 16: - d = const_denom->i16[alu->src[1].swizzle[comp]]; + d = const_denom[alu->src[1].swizzle[comp]].i16; break; case 32: - d = const_denom->i32[alu->src[1].swizzle[comp]]; + d = const_denom[alu->src[1].swizzle[comp]].i32; break; case 64: - d = const_denom->i64[alu->src[1].swizzle[comp]]; + d = const_denom[alu->src[1].swizzle[comp]].i64; break; default: unreachable("Invalid bit size");