[Mesa-dev] [PATCH v3 134/133] nir/opcodes: Add algebraic properties metadata

Matt Turner mattst88 at gmail.com
Fri Dec 19 18:02:59 PST 2014


On Fri, Dec 19, 2014 at 5:04 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> v3: fmin and fmax technically aren't commutative or associative.  Things
>     get funny when one of the arguments is a NaN.

I have a difficult time believing that the GLSL definitions of min()
and max() intentionally have that effect.

To recap, the definition of min() in GLSL is

> Returns y if y < x, otherwise it returns x.

and since comparisons against NaN are always false, min(x, y) where x
or y is NaN will always return x, regardless of which argument is NaN.
That doesn't seem like a useful behavior.

Indeed the GLSL spec says

> Operations and built-in functions that operate on a NaN are not required to return a NaN as the result.

I think based on that text alone, min() and max() should be considered
commutative and associative.

Ian, perhaps we should clarify this with Khronos?

An IEEE 754 spec draft [1] defines minNum(x, y) as "y if x<y, x if
y<x, the canonicalized floating-point
number if one operand is a floating-point number and the other a NaN.
Otherwise it is either x
or y."

i965's SEL instruction implements that behavior.

[1] http://754r.ucbtest.org/drafts/archive/2006-10-04.pdf


More information about the mesa-dev mailing list