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> 2010-10-11 Ulrich Drepper <drepper@gmail.com>
[BZ #12107] [BZ #12107]

2
NEWS
View File

@ -9,7 +9,7 @@ Version 2.13
* The following bugs are resolved with this release: * 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 11968, 11979, 12005, 12037, 12067, 12077, 12092, 12107
* New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark * 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 (fesetenv)
libm_hidden_proto (fesetround) libm_hidden_proto (fesetround)
libm_hidden_proto (feholdexcept) libm_hidden_proto (feholdexcept)
libm_hidden_proto (feupdateenv)
libm_hidden_proto (fetestexcept)
#endif #endif

View File

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

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -25,5 +25,6 @@ fetestexcept (int excepts)
{ {
return 0; return 0;
} }
libm_hidden_def (fetestexcept)
stub_warning (fetestexcept) stub_warning (fetestexcept)
#include <stub-tag.h> #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, minus_infty, minus_infty, minus_infty, nan_value, INVALID_EXCEPTION);
TEST_fff_f (fma, 1.25L, 0.75L, 0.0625L, 1.0L); 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); END (fma);
} }

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. 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); compat_symbol (libm, BP_SYM (__old_feupdateenv), BP_SYM (feupdateenv), GLIBC_2_1);
#endif #endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, BP_SYM (__feupdateenv), BP_SYM (feupdateenv), GLIBC_2_2); versioned_symbol (libm, BP_SYM (__feupdateenv), BP_SYM (feupdateenv), GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -38,3 +38,4 @@ fetestexcept (int excepts)
return (temp | xtemp) & excepts & FE_ALL_EXCEPT; 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 # define __fmaf __fmaf_ia32
#endif #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. /* 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. This file is part of the GNU C Library.
Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999. Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999.
@ -38,3 +38,4 @@ feupdateenv (const fenv_t *envp)
/* Success. */ /* Success. */
return 0; return 0;
} }
libm_hidden_def (feupdateenv)

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999. Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999.
@ -30,3 +30,4 @@ fetestexcept (int excepts)
return (fpsr >> 13) & excepts & FE_ALL_EXCEPT; 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. /* 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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. 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); compat_symbol (libm, BP_SYM (__old_feupdateenv), BP_SYM (feupdateenv), GLIBC_2_1);
#endif #endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, BP_SYM (__feupdateenv), BP_SYM (feupdateenv), GLIBC_2_2); versioned_symbol (libm, BP_SYM (__feupdateenv), BP_SYM (feupdateenv), GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -31,3 +31,4 @@ fetestexcept (int excepts)
just: */ just: */
return u.l[1] & excepts; return u.l[1] & excepts;
} }
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions. /* 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. This file is part of the GNU C Library.
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com). Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com).
@ -38,3 +38,4 @@ feupdateenv (const fenv_t *envp)
/* Success. */ /* Success. */
return 0; return 0;
} }
libm_hidden_def (feupdateenv)

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com). 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); temp = (temp >> FPC_DXC_SHIFT) | (temp >> FPC_FLAGS_SHIFT);
return temp & excepts & FE_ALL_EXCEPT; return temp & excepts & FE_ALL_EXCEPT;
} }
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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; return temp & excepts & FE_ALL_EXCEPT;
} }
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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); compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1);
#endif #endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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; return tmp & excepts & FE_ALL_EXCEPT;
} }
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* Install given floating-point environment and raise exceptions. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. 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); compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1);
#endif #endif
libm_hidden_ver (__feupdateenv, feupdateenv)
versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);

View File

@ -1,5 +1,5 @@
/* Test exception in current environment. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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; return (temp | mxscr) & excepts & FE_ALL_EXCEPT;
} }
libm_hidden_def (fetestexcept)

View File

@ -1,5 +1,5 @@
/* FMA version of fmaf. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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 # define __fmaf __fmaf_sse2
#endif #endif
#include <math/s_fmaf.c> #include <sysdeps/ieee754/dbl-64/s_fmaf.c>