[Mesa-dev] [PATCH 15/26] nir: Add more modulus opcodes

Rob Clark robdclark at gmail.com
Sat Mar 26 16:29:57 UTC 2016


On Fri, Mar 25, 2016 at 7:12 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> These are all needed for SPIR-V

Reviewed-by: Rob Clark <robdclark at gmail.com>

> ---
>  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
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list