From 268f6dda11e8afc861cbd964b2f209eb0ff816a3 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 30 May 2012 15:49:01 -0700 Subject: [PATCH] alpha: Use dynamic rounding with sqrt insn --- ChangeLog.alpha | 5 +++++ sysdeps/alpha/alphaev6/fpu/e_sqrt.S | 6 +++--- sysdeps/alpha/alphaev6/fpu/e_sqrtf.S | 6 +++--- sysdeps/alpha/fpu/math_private.h | 26 ++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/ChangeLog.alpha b/ChangeLog.alpha index f87c9d69be..44ffdc74e3 100644 --- a/ChangeLog.alpha +++ b/ChangeLog.alpha @@ -1,5 +1,10 @@ 2012-05-30 Richard Henderson + * sysdeps/alpha/alphaev6/fpu/e_sqrt.S: Use dynamic rounding. + * sysdeps/alpha/alphaev6/fpu/e_sqrtf.S: Likewise. + * sysdeps/alpha/fpu/math_private.h (__ieee754_sqrt): New. + (__ieee754_sqrtf): New. + * sysdeps/unix/sysv/linux/alpha/nptl/pthread_once.c: Replace _internal alias by hidden_def. diff --git a/sysdeps/alpha/alphaev6/fpu/e_sqrt.S b/sysdeps/alpha/alphaev6/fpu/e_sqrt.S index eae1fb4e4c..c4625d0eca 100644 --- a/sysdeps/alpha/alphaev6/fpu/e_sqrt.S +++ b/sysdeps/alpha/alphaev6/fpu/e_sqrt.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 Free Software Foundation, Inc. +/* Copyright (C) 2000-2012 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 @@ -33,9 +33,9 @@ ENTRY(__ieee754_sqrt) .align 4 #ifdef _IEEE_FP_INEXACT - sqrtt/sui $f16, $f0 + sqrtt/suid $f16, $f0 #else - sqrtt/su $f16, $f0 + sqrtt/sud $f16, $f0 #endif ret nop diff --git a/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S b/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S index c8217e5454..5681f3a947 100644 --- a/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S +++ b/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 Free Software Foundation, Inc. +/* Copyright (C) 2000-2012 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 @@ -33,9 +33,9 @@ ENTRY(__ieee754_sqrtf) .align 4 #ifdef _IEEE_FP_INEXACT - sqrts/sui $f16, $f0 + sqrts/suid $f16, $f0 #else - sqrts/su $f16, $f0 + sqrts/sud $f16, $f0 #endif ret nop diff --git a/sysdeps/alpha/fpu/math_private.h b/sysdeps/alpha/fpu/math_private.h index eb2177d78d..4f270f7a3f 100644 --- a/sysdeps/alpha/fpu/math_private.h +++ b/sysdeps/alpha/fpu/math_private.h @@ -18,4 +18,30 @@ #include_next +#ifdef __alpha_fix__ +extern __always_inline double +__ieee754_sqrt (double d) +{ + double ret; +# ifdef _IEEE_FP_INEXACT + asm ("sqrtt/suid %1,%0" : "=f"(ret) : "f"(d)); +# else + asm ("sqrtt/sud %1,%0" : "=f"(ret) : "f"(d)); +# endif + return ret; +} + +extern __always_inline float +__ieee754_sqrtf (float d) +{ + float ret; +# ifdef _IEEE_FP_INEXACT + asm ("sqrts/suid %1,%0" : "=f"(ret) : "f"(d)); +# else + asm ("sqrts/sud %1,%0" : "=f"(ret) : "f"(d)); +# endif + return ret; +} +#endif /* FIX */ + #endif /* ALPHA_MATH_PRIVATE_H */