Correct implementation of fmaf.

This commit is contained in:
Jakub Jelinek 2010-10-11 09:27:05 -04:00 committed by Ulrich Drepper
parent c579b20299
commit 9ff8d36f27
22 changed files with 115 additions and 19 deletions

View File

@ -1,3 +1,28 @@
2010-10-07 Jakub Jelinek <jakub@redhat.com>
[BZ #3268]
* math/libm-test.inc (fma_test): Add 2 fmaf tests.
* sysdeps/ieee754/dbl-64/s_fmaf.c: New file.
* sysdeps/i386/i686/multiarch/s_fmaf.c: Include
sysdeps/ieee754/dbl-64/s_fmaf.c instead of math/s_fmaf.c.
* sysdeps/x86_64/multiarch/s_fmaf.c: Likewise.
* include/fenv.h (feupdateenv, fetestexcept): Add libm_hidden_proto.
* math/feupdateenv.c (feupdateenv): Add libm_hidden_ver.
* sysdeps/i386/fpu/feupdateenv.c (feupdateenv): Likewise.
* sysdeps/powerpc/fpu/feupdateenv.c (feupdateenv): Likewise.
* sysdeps/x86_64/fpu/feupdateenv.c (feupdateenv): Likewise.
* sysdeps/sparc/fpu/feupdateenv.c (feupdateenv): Likewise.
* sysdeps/ia64/fpu/feupdateenv.c (feupdateenv): Add libm_hidden_def.
* sysdeps/s390/fpu/feupdateenv.c (feupdateenv): Likewise.
* math/ftestexcept.c (fetestexcept): Likewise.
* sysdeps/ia64/fpu/ftestexcept.c (fetestexcept): Likewise.
* sysdeps/i386/fpu/ftestexcept.c (fetestexcept): Likewise.
* sysdeps/s390/fpu/ftestexcept.c (fetestexcept): Likewise.
* sysdeps/powerpc/fpu/ftestexcept.c (fetestexcept): Likewise.
* sysdeps/x86_64/fpu/ftestexcept.c (fetestexcept): Likewise.
* sysdeps/sparc/fpu/ftestexcept.c (fetestexcept): Likewise.
* sysdeps/sh/sh4/fpu/ftestexcept.c (fetestexcept): Likewise.
2010-10-11 Ulrich Drepper <drepper@gmail.com>
[BZ #12107]

2
NEWS
View File

@ -9,7 +9,7 @@ Version 2.13
* The following bugs are resolved with this release:
7066, 10851, 11611, 11640, 11701, 11840, 11856, 11883, 11903, 11904,
3268, 7066, 10851, 11611, 11640, 11701, 11840, 11856, 11883, 11903, 11904,
11968, 11979, 12005, 12037, 12067, 12077, 12092, 12107
* New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark

View File

@ -17,5 +17,7 @@ libm_hidden_proto (fegetenv)
libm_hidden_proto (fesetenv)
libm_hidden_proto (fesetround)
libm_hidden_proto (feholdexcept)
libm_hidden_proto (feupdateenv)
libm_hidden_proto (fetestexcept)
#endif

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1997, 1999, 2000, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -31,6 +31,7 @@ __feupdateenv (const fenv_t *envp)
strong_alias (__feupdateenv, __old_feupdateenv)
compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1);
#endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);
stub_warning (feupdateenv)

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -25,5 +25,6 @@ fetestexcept (int excepts)
{
return 0;
}
libm_hidden_def (fetestexcept)
stub_warning (fetestexcept)
#include <stub-tag.h>

View File

@ -2789,6 +2789,10 @@ fma_test (void)
TEST_fff_f (fma, minus_infty, minus_infty, minus_infty, nan_value, INVALID_EXCEPTION);
TEST_fff_f (fma, 1.25L, 0.75L, 0.0625L, 1.0L);
#ifdef TEST_FLOAT
TEST_fff_f (fma, 0x1.7ff8p+13, 0x1.000002p+0, 0x1.ffffp-24, 0x1.7ff802p+13);
TEST_fff_f (fma, 0x1.fffp+0, 0x1.00001p+0, -0x1.fffp+0, 0x1.fffp-20);
#endif
END (fma);
}

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 1997,99,2000,01,07 Free Software Foundation, Inc.
Copyright (C) 1997,99,2000,01,07,2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -57,4 +57,5 @@ strong_alias (__feupdateenv, __old_feupdateenv)
compat_symbol (libm, BP_SYM (__old_feupdateenv), BP_SYM (feupdateenv), GLIBC_2_1);
#endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, BP_SYM (__feupdateenv), BP_SYM (feupdateenv), GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 1997, 2003, 2004, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -38,3 +38,4 @@ fetestexcept (int excepts)
return (temp | xtemp) & excepts & FE_ALL_EXCEPT;
}
libm_hidden_def (fetestexcept)

View File

@ -33,4 +33,4 @@ weak_alias (__fmaf, fmaf)
# define __fmaf __fmaf_ia32
#endif
#include <math/s_fmaf.c>
#include <sysdeps/ieee754/dbl-64/s_fmaf.c>

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 1997, 2000, 2007 Free Software Foundation, Inc.
Copyright (C) 1997, 2000, 2007, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999.
@ -38,3 +38,4 @@ feupdateenv (const fenv_t *envp)
/* Success. */
return 0;
}
libm_hidden_def (feupdateenv)

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1997, 1999, 2000, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999.
@ -30,3 +30,4 @@ fetestexcept (int excepts)
return (fpsr >> 13) & excepts & FE_ALL_EXCEPT;
}
libm_hidden_def (fetestexcept)

View File

@ -0,0 +1,50 @@
/* Compute x * y + z as ternary operation.
Copyright (C) 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2010.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <math.h>
#include <fenv.h>
#include <ieee754.h>
/* This implementation relies on double being more than twice as
precise as float and uses rounding to odd in order to avoid problems
with double rounding.
See a paper by Boldo and Melquiond:
http://www.lri.fr/~melquion/doc/08-tc.pdf */
float
__fmaf (float x, float y, float z)
{
fenv_t env;
/* Multiplication is always exact. */
double temp = (double) x * (double) y;
union ieee754_double u;
feholdexcept (&env);
fesetround (FE_TOWARDZERO);
/* Perform addition with round to odd. */
u.d = temp + (double) z;
if ((u.ieee.mantissa1 & 1) == 0 && u.ieee.exponent != 0xff)
u.ieee.mantissa1 |= fetestexcept (FE_INEXACT) != 0;
feupdateenv (&env);
/* And finally truncation with round to nearest. */
return (float) u.d;
}
#ifndef __fmaf
weak_alias (__fmaf, fmaf)
#endif

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 1997, 1999, 2000, 2001, 2007, 2008
Copyright (C) 1997, 1999, 2000, 2001, 2007, 2008, 2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -66,4 +66,5 @@ strong_alias (__feupdateenv, __old_feupdateenv)
compat_symbol (libm, BP_SYM (__old_feupdateenv), BP_SYM (feupdateenv), GLIBC_2_1);
#endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, BP_SYM (__feupdateenv), BP_SYM (feupdateenv), GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -31,3 +31,4 @@ fetestexcept (int excepts)
just: */
return u.l[1] & excepts;
}
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 2000 Free Software Foundation, Inc.
Copyright (C) 2000, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com).
@ -38,3 +38,4 @@ feupdateenv (const fenv_t *envp)
/* Success. */
return 0;
}
libm_hidden_def (feupdateenv)

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 2000 Free Software Foundation, Inc.
Copyright (C) 2000, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com).
@ -31,3 +31,4 @@ fetestexcept (int excepts)
temp = (temp >> FPC_DXC_SHIFT) | (temp >> FPC_FLAGS_SHIFT);
return temp & excepts & FE_ALL_EXCEPT;
}
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2000, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -30,3 +30,4 @@ fetestexcept (int excepts)
return temp & excepts & FE_ALL_EXCEPT;
}
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1997, 1999, 2000, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -46,4 +46,5 @@ strong_alias (__feupdateenv, __old_feupdateenv)
compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1);
#endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -28,3 +28,4 @@ fetestexcept (int excepts)
return tmp & excepts & FE_ALL_EXCEPT;
}
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions.
Copyright (C) 1997,99,2000,01,07 Free Software Foundation, Inc.
Copyright (C) 1997,99,2000,01,07,2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -48,4 +48,5 @@ strong_alias (__feupdateenv, __old_feupdateenv)
compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1);
#endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment.
Copyright (C) 2001 Free Software Foundation, Inc.
Copyright (C) 2001, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -31,3 +31,4 @@ fetestexcept (int excepts)
return (temp | mxscr) & excepts & FE_ALL_EXCEPT;
}
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* FMA version of fmaf.
Copyright (C) 2009 Free Software Foundation, Inc.
Copyright (C) 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -39,4 +39,4 @@ weak_alias (__fmaf, fmaf)
# define __fmaf __fmaf_sse2
#endif
#include <math/s_fmaf.c>
#include <sysdeps/ieee754/dbl-64/s_fmaf.c>