On Tue, Mar 29, 2016 at 8:49 PM, Matt Turner <[email protected]> wrote:
> On Fri, Mar 25, 2016 at 4:12 PM, Jason Ekstrand <[email protected]> > wrote: > > --- > > src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 32 > ++++++++++++++++++++++++++++++ > > src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 32 > ++++++++++++++++++++++++++++++ > > 2 files changed, 64 insertions(+) > > > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > > index 14480fb..131f50e 100644 > > --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > > +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > > @@ -844,8 +844,40 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, > nir_alu_instr *instr) > > unreachable("Should have been lowered by borrow_to_arith()."); > > > > case nir_op_umod: > > + case nir_op_irem: > > + /* According to the sign table for INT DIV in the Ivy Bridge PRM, > it > > + * appears that our hardware just does the right thing for signed > > + * remainder. > > + */ > > + bld.emit(SHADER_OPCODE_INT_REMAINDER, result, op[0], op[1]); > > + break; > > + > > + case nir_op_imod: { > > + /* Get a regular C-style remainder. If a % b == 0, set the > predicate. */ > > bld.emit(SHADER_OPCODE_INT_REMAINDER, result, op[0], op[1]); > > + > > + /* Math instructions don't support conditional mod */ > > + inst = bld.MOV(bld.null_reg_d(), result); > > + inst->conditional_mod = BRW_CONDITIONAL_NZ; > > + > > + /* Now, we need to determine if signs of the sources are > different. > > + * When we XOR the sources, the top bit is 0 if they are the same > and 1 > > + * if they are different. We can then use a conditional modifier > to > > + * turn that into a predicate. This leads us to an XOR.l > instruction. > > + */ > > + fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_D); > > + inst = bld.XOR(tmp, op[0], op[1]); > > + inst->predicate = BRW_PREDICATE_NORMAL; > > + inst->conditional_mod = BRW_CONDITIONAL_L; > > This goes against the PRM: > > "This operation does not produce sign or overflow conditions. Only the > .e/.z or .ne/.nz conditional modifiers should be used." > D'oh... I thought I'd fixed that. I can add an AND.nz with 0x80000000
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
