* sysdeps/powerpc/powerpc64/fpu/e_sqrt.c: New file.

* sysdeps/powerpc/powerpc64/fpu/e_sqrtf.c: New file.
	* sysdeps/powerpc/fpu/bits/mathinline.h (__CPU_HAS_FSQRT): New macro.
	(__ieee754_sqrt, __ieee754_sqrtf): Use it.
This commit is contained in:
Roland McGrath 2006-01-21 19:41:11 +00:00
parent 5e758ac3d3
commit 5593c5ec78
4 changed files with 76 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2006-01-20 Jakub Jelinek <jakub@redhat.com>
* sysdeps/powerpc/powerpc64/fpu/e_sqrt.c: New file.
* sysdeps/powerpc/powerpc64/fpu/e_sqrtf.c: New file.
* sysdeps/powerpc/fpu/bits/mathinline.h (__CPU_HAS_FSQRT): New macro.
(__ieee754_sqrt, __ieee754_sqrtf): Use it.
2006-01-21 Roland McGrath <roland@redhat.com> 2006-01-21 Roland McGrath <roland@redhat.com>
* time/time.h [__need_timespec et al]: Include <bits/types.h> here too. * time/time.h [__need_timespec et al]: Include <bits/types.h> here too.

View File

@ -1,5 +1,5 @@
/* Inline math functions for powerpc. /* Inline math functions for powerpc.
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2004 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2004, 2006
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.
@ -123,12 +123,18 @@ __NTH (fdimf (float __x, float __y))
#endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ #endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */
/* This code is used internally in the GNU libc. */ /* This code is used internally in the GNU libc. */
# ifdef __LIBC_INTERNAL_MATH_INLINES #ifdef __LIBC_INTERNAL_MATH_INLINES
#include <sysdep.h> #include <sysdep.h>
#include <ldsodefs.h> #include <ldsodefs.h>
#include <dl-procinfo.h> #include <dl-procinfo.h>
# if __WORDSIZE == 64
# define __CPU_HAS_FSQRT 1
# else
# define __CPU_HAS_FSQRT ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0)
# endif
extern double __slow_ieee754_sqrt (double); extern double __slow_ieee754_sqrt (double);
__MATH_INLINE double __MATH_INLINE double
__NTH (__ieee754_sqrt (double __x)) __NTH (__ieee754_sqrt (double __x))
@ -136,7 +142,7 @@ __NTH (__ieee754_sqrt (double __x))
double __z; double __z;
/* If the CPU is 64-bit we can use the optional FP instructions we. */ /* If the CPU is 64-bit we can use the optional FP instructions we. */
if ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0) if (__CPU_HAS_FSQRT)
{ {
/* Volatile is required to prevent the compiler from moving the /* Volatile is required to prevent the compiler from moving the
fsqrt instruction above the branch. */ fsqrt instruction above the branch. */
@ -158,7 +164,7 @@ __NTH (__ieee754_sqrtf (float __x))
float __z; float __z;
/* If the CPU is 64-bit we can use the optional FP instructions we. */ /* If the CPU is 64-bit we can use the optional FP instructions we. */
if ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0) if (__CPU_HAS_FSQRT)
{ {
/* Volatile is required to prevent the compiler from moving the /* Volatile is required to prevent the compiler from moving the
fsqrts instruction above the branch. */ fsqrts instruction above the branch. */
@ -172,5 +178,5 @@ __NTH (__ieee754_sqrtf (float __x))
return __z; return __z;
} }
# endif /* __LIBC_INTERNAL_MATH_INLINES */ #endif /* __LIBC_INTERNAL_MATH_INLINES */
#endif /* __GNUC__ && !_SOFT_FLOAT */ #endif /* __GNUC__ && !_SOFT_FLOAT */

View File

@ -0,0 +1,29 @@
/* Double-precision floating point square root.
Copyright (C) 1997, 2002, 2003, 2004, 2006 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
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 <math_private.h>
double
__ieee754_sqrt (double x)
{
double z;
__asm __volatile ("fsqrt %0,%1" : "=f" (z) : "f" (x));
return z;
}

View File

@ -0,0 +1,29 @@
/* Single-precision floating point square root.
Copyright (C) 1997, 2003, 2004, 2006 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
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 <math_private.h>
float
__ieee754_sqrtf (float x)
{
double z;
__asm ("fsqrts %0,%1" : "=f" (z) : "f" (x));
return z;
}