diff options
Diffstat (limited to 'src/compiler/nir/nir_opcodes.py')
-rw-r--r-- | src/compiler/nir/nir_opcodes.py | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index 8c5045e4a13..bc0c7fe2c0b 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -195,6 +195,21 @@ unop("mov", tuint, "src0") unop("ineg", tint, "-src0") unop("fneg", tfloat, "-src0") unop("inot", tint, "~src0") # invert every bit of the integer + +# nir_op_fsign roughly implements the OpenGL / Vulkan rules for sign(float). +# The GLSL.std.450 FSign instruction is defined as: +# +# Result is 1.0 if x > 0, 0.0 if x = 0, or -1.0 if x < 0. +# +# If the source is equal to zero, there is a preference for the result to have +# the same sign, but this is not required (it is required by OpenCL). If the +# source is not a number, there is a preference for the result to be +0.0, but +# this is not required (it is required by OpenCL). If the source is not a +# number, and the result is not +0.0, the result should definitely **not** be +# NaN. +# +# fsign(NaN) = (False ? 0.0 : (False ? 1.0 : -1.0) = -1.0. This is allowed by +# the spec, but it is not the preferred value. unop("fsign", tfloat, ("bit_size == 64 ? " + "((src0 == 0.0) ? 0.0 : ((src0 > 0.0) ? 1.0 : -1.0)) : " + "((src0 == 0.0f) ? 0.0f : ((src0 > 0.0f) ? 1.0f : -1.0f))")) |