alpha: Use dynamic rounding with sqrt insn
authorRichard Henderson <rth@twiddle.net>
Wed, 30 May 2012 22:49:01 +0000 (15:49 -0700)
committerRichard Henderson <rth@twiddle.net>
Wed, 30 May 2012 23:05:42 +0000 (16:05 -0700)
ChangeLog.alpha
sysdeps/alpha/alphaev6/fpu/e_sqrt.S
sysdeps/alpha/alphaev6/fpu/e_sqrtf.S
sysdeps/alpha/fpu/math_private.h

index f87c9d6..44ffdc7 100644 (file)
@@ -1,5 +1,10 @@
 2012-05-30  Richard Henderson  <rth@twiddle.net>
 
+       * 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.
 
index eae1fb4..c4625d0 100644 (file)
@@ -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
index c8217e5..5681f3a 100644 (file)
@@ -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
index eb2177d..4f270f7 100644 (file)
 
 #include_next <math_private.h>
 
+#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 */