nir: Correctly constant fold fsign(NaN) and fsign(-0)
GLSL and SPIR-V GLSL.std.450 don't have any requirements for fsign(NaN), and both only require that FSign(-0.0) == 0.0. OpenCL, on the other hand, requires sign(-0.0) be exactly -0.0. It also requires that sign(NaN) be exactly 0.0. In practice, this change is difficult to test. Our GLSL frontend already constant folds sign(NaN) to 0.0 before even getting to NIR. As far as I can tell, glslang does the same. I don't have a good way to run an OpenCL SPIR-V test. Maybe SPIR-V GLSL.std.450 assembly? No shader-db or fossil-db changes on any Intel platform. Acked-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6358>
This commit is contained in:
parent
fe3c518277
commit
71961c73a9
|
@ -208,11 +208,11 @@ unop("inot", tint, "~src0") # invert every bit of the integer
|
|||
# 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.
|
||||
# The values returned for constant folding match the behavior required by
|
||||
# OpenCL.
|
||||
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))"))
|
||||
"(isnan(src0) ? 0.0 : ((src0 == 0.0 ) ? src0 : (src0 > 0.0 ) ? 1.0 : -1.0 )) : " +
|
||||
"(isnan(src0) ? 0.0f : ((src0 == 0.0f) ? src0 : (src0 > 0.0f) ? 1.0f : -1.0f))"))
|
||||
unop("isign", tint, "(src0 == 0) ? 0 : ((src0 > 0) ? 1 : -1)")
|
||||
unop("iabs", tint, "(src0 < 0) ? -src0 : src0")
|
||||
unop("fabs", tfloat, "fabs(src0)")
|
||||
|
|
Loading…
Reference in New Issue