- rcp = nir_f2u32(bld, nir_fmul_imm(bld, rcp, 4294967296.0));
- nir_ssa_def *rcp_lo = nir_imul(bld, rcp, denom);
- nir_ssa_def *rcp_hi = nir_umul_high(bld, rcp, denom);
- nir_ssa_def *rcp_hi_ne_zero = nir_ine(bld, rcp_hi, nir_imm_int(bld, 0));
- nir_ssa_def *neg_rcp_lo = nir_ineg(bld, rcp_lo);
- nir_ssa_def *abs_rcp_lo = nir_bcsel(bld, rcp_hi_ne_zero, rcp_lo, neg_rcp_lo);
- nir_ssa_def *e = nir_umul_high(bld, abs_rcp_lo, rcp);
- nir_ssa_def *rcp_plus_e = nir_iadd(bld, rcp, e);
- nir_ssa_def *rcp_minus_e = nir_isub(bld, rcp, e);
- nir_ssa_def *tmp0 = nir_bcsel(bld, rcp_hi_ne_zero, rcp_minus_e, rcp_plus_e);
- nir_ssa_def *quotient = nir_umul_high(bld, tmp0, numer);
+ rcp = nir_f2u32(bld, nir_fmul_imm(bld, rcp, 4294966784.0));
+
+ nir_ssa_def *neg_rcp_times_denom =
+ nir_imul(bld, rcp, nir_ineg(bld, denom));
+ rcp = nir_iadd(bld, rcp, nir_umul_high(bld, rcp, neg_rcp_times_denom));
+
+ /* Get initial estimate for quotient/remainder, then refine the estimate
+ * in two iterations after */
+ nir_ssa_def *quotient = nir_umul_high(bld, numer, rcp);