mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 15:38:09 +02:00
nir: Add more modulus opcodes
These are all needed for SPIR-V Reviewed-by: Rob Clark <robdclark@gmail.com> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
d880c6f9f5
commit
745b3d295e
2 changed files with 16 additions and 1 deletions
|
|
@ -443,9 +443,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
|
||||
#
|
||||
|
|
|
|||
|
|
@ -287,6 +287,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'),
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue