Lines Matching refs:bld
44 convert_instr(nir_builder *bld, nir_op op,
55 af = nir_i2f32(bld, numer);
56 bf = nir_i2f32(bld, denom);
57 af = nir_fabs(bld, af);
58 bf = nir_fabs(bld, bf);
59 a = nir_iabs(bld, numer);
60 b = nir_iabs(bld, denom);
62 af = nir_u2f32(bld, numer);
63 bf = nir_u2f32(bld, denom);
69 bf = nir_frcp(bld, bf);
70 bf = nir_isub(bld, bf, nir_imm_int(bld, 2)); /* yes, really */
71 q = nir_fmul(bld, af, bf);
74 q = nir_f2i32(bld, q);
76 q = nir_f2u32(bld, q);
80 r = nir_imul(bld, q, b);
81 r = nir_isub(bld, a, r);
82 r = nir_u2f32(bld, r);
83 r = nir_fmul(bld, r, bf);
84 r = nir_f2u32(bld, r);
87 q = nir_iadd(bld, q, r);
90 r = nir_imul(bld, q, b);
91 r = nir_isub(bld, a, r);
92 rt = nir_uge(bld, r, b);
95 q = nir_bcsel(bld, rt, nir_isub(bld, r, b), r);
97 r = nir_b2i32(bld, rt);
99 q = nir_iadd(bld, q, r);
102 r = nir_ixor(bld, numer, denom);
103 r = nir_ilt(bld, r, nir_imm_int(bld, 0));
104 b = nir_ineg(bld, q);
105 q = nir_bcsel(bld, r, b, q);
108 q = nir_imul(bld, q, denom);
109 q = nir_isub(bld, numer, q);
111 q = nir_bcsel(bld, nir_ieq_imm(bld, q, 0),
112 nir_imm_int(bld, 0),
113 nir_bcsel(bld, r, nir_iadd(bld, q, denom), q));
124 emit_udiv(nir_builder *bld, nir_ssa_def *numer, nir_ssa_def *denom, bool modulo)
126 nir_ssa_def *rcp = nir_frcp(bld, nir_u2f32(bld, denom));
127 rcp = nir_f2u32(bld, nir_fmul_imm(bld, rcp, 4294966784.0));
130 nir_imul(bld, rcp, nir_ineg(bld, denom));
131 rcp = nir_iadd(bld, rcp, nir_umul_high(bld, rcp, neg_rcp_times_denom));
135 nir_ssa_def *quotient = nir_umul_high(bld, numer, rcp);
136 nir_ssa_def *num_s_remainder = nir_imul(bld, quotient, denom);
137 nir_ssa_def *remainder = nir_isub(bld, numer, num_s_remainder);
140 nir_ssa_def *remainder_ge_den = nir_uge(bld, remainder, denom);
142 quotient = nir_bcsel(bld, remainder_ge_den,
143 nir_iadd_imm(bld, quotient, 1), quotient);
145 remainder = nir_bcsel(bld, remainder_ge_den,
146 nir_isub(bld, remainder, denom), remainder);
149 remainder_ge_den = nir_uge(bld, remainder, denom);
151 return nir_bcsel(bld, remainder_ge_den, nir_isub(bld, remainder, denom),
154 return nir_bcsel(bld, remainder_ge_den, nir_iadd_imm(bld, quotient, 1),
161 emit_idiv(nir_builder *bld, nir_ssa_def *numer, nir_ssa_def *denom, nir_op op)
163 nir_ssa_def *lh_sign = nir_ilt(bld, numer, nir_imm_int(bld, 0));
164 nir_ssa_def *rh_sign = nir_ilt(bld, denom, nir_imm_int(bld, 0));
166 nir_ssa_def *lhs = nir_iabs(bld, numer);
167 nir_ssa_def *rhs = nir_iabs(bld, denom);
170 nir_ssa_def *d_sign = nir_ixor(bld, lh_sign, rh_sign);
171 nir_ssa_def *res = emit_udiv(bld, lhs, rhs, false);
172 return nir_bcsel(bld, d_sign, nir_ineg(bld, res), res);
174 nir_ssa_def *res = emit_udiv(bld, lhs, rhs, true);
175 res = nir_bcsel(bld, lh_sign, nir_ineg(bld, res), res);
177 nir_ssa_def *cond = nir_ieq_imm(bld, res, 0);
178 cond = nir_ior(bld, nir_ieq(bld, lh_sign, rh_sign), cond);
179 res = nir_bcsel(bld, cond, res, nir_iadd(bld, res, denom));
186 convert_instr_precise(nir_builder *bld, nir_op op,
190 return emit_udiv(bld, numer, denom, op == nir_op_umod);
192 return emit_idiv(bld, numer, denom, op);