mesa: Sparc's IROUND() optimization is invalid.
authorDavid Miller <davem@davemloft.net>
Sat, 28 Feb 2009 07:34:41 +0000 (23:34 -0800)
committerBrian Paul <brianp@vmware.com>
Sat, 28 Feb 2009 16:36:56 +0000 (09:36 -0700)
commitae5c06b9ce1191afaa95dd784d7315f25ec729ff
tree88308e8f91dcbb34e41e3a2d35803069ce086917
parent389d50baff8234fdf4d7bcddeb09658d7d17012d
mesa: Sparc's IROUND() optimization is invalid.

We can't use the "fstoi" instruction like this.

Unlike other floating point instructions, "fstoi" always rounds
towards zero no matter what rounding mode the FPU has been set to.

This was validated using the following test program:

--------------------
static inline int iround(float f)
{
   int r;
   __asm__ ("fstoi %1, %0" : "=f" (r) : "f" (f));
   return r;
}
#define IROUND(x)  iround(x)

#define IROUND_REF(f)  ((int) (((f) >= 0.0F) ? ((f) + 0.5F) : ((f) - 0.5F)))

int main(void)
{
float f = -2.0;

while (f < 3.0f) {
int sparc_val = IROUND(f);
int ref_val = IROUND_REF(f);

if (sparc_val != ref_val)
printf("DIFFERENT[%f]: REF==%d SPARC==%d\n",
       f, ref_val, sparc_val);
f += 0.1f;
}

return 0;
}
--------------------

which prints out things like:

--------------------
DIFFERENT[-1.900000]: REF==-2 SPARC==-1
DIFFERENT[-1.800000]: REF==-2 SPARC==-1
DIFFERENT[-1.700000]: REF==-2 SPARC==-1
DIFFERENT[-1.600000]: REF==-2 SPARC==-1
DIFFERENT[-1.000000]: REF==-1 SPARC==0
DIFFERENT[-0.900000]: REF==-1 SPARC==0
DIFFERENT[-0.800000]: REF==-1 SPARC==0
DIFFERENT[-0.700000]: REF==-1 SPARC==0
DIFFERENT[-0.600000]: REF==-1 SPARC==0
DIFFERENT[0.500000]: REF==1 SPARC==0
DIFFERENT[0.600000]: REF==1 SPARC==0
...
--------------------

So we have to remove Sparc's IROUND() definition, it's wrong.

Signed-off-by: David S. Miller <davem@davemloft.net>
src/mesa/main/imports.h