On Fri, Mar 25, 2016 at 7:12 PM, Jason Ekstrand <[email protected]> wrote: > These are all needed for SPIR-V
Reviewed-by: Rob Clark <[email protected]> > --- > src/compiler/nir/nir_opcodes.py | 16 +++++++++++++++- > src/compiler/nir/nir_opt_algebraic.py | 1 + > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py > index 553f924..7c8a322 100644 > --- a/src/compiler/nir/nir_opcodes.py > +++ b/src/compiler/nir/nir_opcodes.py > @@ -382,9 +382,23 @@ binop_convert("uadd_carry", tuint, tuint, commutative, > "src0 + src1 < src0") > > binop_convert("usub_borrow", tuint, tuint, "", "src0 < src1") > > -binop("fmod", tfloat, "", "src0 - src1 * floorf(src0 / src1)") > binop("umod", tuint, "", "src1 == 0 ? 0 : src0 % src1") > > +# For signed integers, there are several different possible definitions of > +# "modulus" or "remainder". We follow the conventions used by LLVM and > +# SPIR-V. The irem opcode implements the standard C/C++ signed "%" > +# operation while the imod opcode implements the more mathematical > +# "modulus" operation. For details on the difference, see > +# > +# http://mathforum.org/library/drmath/view/52343.html > + > +binop("irem", tint, "", "src1 == 0 ? 0 : src0 % src1") > +binop("imod", tint, "", > + "src1 == 0 ? 0 : ((src0 % src1 == 0 || (src0 >= 0) == (src1 >= 0)) ?" > + " src0 % src1 : src0 % src1 + src1)") > +binop("fmod", tfloat, "", "src0 - src1 * floorf(src0 / src1)") > +binop("frem", tfloat, "", "src0 - src1 * truncf(src0 / src1)") > + > # > # Comparisons > # > diff --git a/src/compiler/nir/nir_opt_algebraic.py > b/src/compiler/nir/nir_opt_algebraic.py > index 5363323..a136e8e 100644 > --- a/src/compiler/nir/nir_opt_algebraic.py > +++ b/src/compiler/nir/nir_opt_algebraic.py > @@ -271,6 +271,7 @@ optimizations = [ > > # Misc. lowering > (('fmod', a, b), ('fsub', a, ('fmul', b, ('ffloor', ('fdiv', a, b)))), > 'options->lower_fmod'), > + (('frem', a, b), ('fsub', a, ('fmul', b, ('ftrunc', ('fdiv', a, b)))), > 'options->lower_fmod'), > (('uadd_carry', a, b), ('b2i', ('ult', ('iadd', a, b), a)), > 'options->lower_uadd_carry'), > (('usub_borrow', a, b), ('b2i', ('ult', a, b)), > 'options->lower_usub_borrow'), > > -- > 2.5.0.400.gff86faf > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
