]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/alpha/fpu/e_sqrt.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / alpha / fpu / e_sqrt.c
index a74e353a1e3d94e3b554fa17d9a3d5bdb709fcd0..981ab023bf2808c14c5fe7c958d7d03aa119a290 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2015 Free Software Foundation, Inc.
    Contributed by David Mosberger (davidm@cs.arizona.edu).
    This file is part of the GNU C Library.
 
    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.  */
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
 
+#include <math.h>
+#include <math_private.h>
+#include <shlib-compat.h>
 
 #if !defined(_IEEE_FP_INEXACT)
 
@@ -32,7 +34,7 @@ const static struct sqrt_data_struct {
        unsigned long dn, up, half, almost_three_half;
        unsigned long one_and_a_half, two_to_minus_30, one, nan;
        const int T2[64];
-} sqrt_data = {
+} sqrt_data __attribute__((used)) = {
        0x3fefffffffffffff,     /* __dn = nextafter(1,-Inf) */
        0x3ff0000000000001,     /* __up = nextafter(1,+Inf) */
        0x3fe0000000000000,     /* half */
@@ -53,112 +55,133 @@ const static struct sqrt_data_struct {
 };
 
 asm ("\
-  /* Define offsets into the structure defined in C above.  */
-       $DN = 0*8
-       $UP = 1*8
-       $HALF = 2*8
-       $ALMOST_THREE_HALF = 3*8
-       $NAN = 7*8
-       $T2 = 8*8
-
-  /* Stack variables.  */
-       $K = 0
-       $Y = 8
-
-       .text
-       .align  5
-       .globl  __ieee754_sqrt
-       .ent    __ieee754_sqrt
-__ieee754_sqrt:
-       ldgp    $29, 0($27)
-       subq    $sp, 16, $sp
+  /* Define offsets into the structure defined in C above.  */         \n\
+       $DN = 0*8                                                       \n\
+       $UP = 1*8                                                       \n\
+       $HALF = 2*8                                                     \n\
+       $ALMOST_THREE_HALF = 3*8                                        \n\
+       $NAN = 7*8                                                      \n\
+       $T2 = 8*8                                                       \n\
+                                                                       \n\
+  /* Stack variables.  */                                              \n\
+       $K = 0                                                          \n\
+       $Y = 8                                                          \n\
+                                                                       \n\
+       .text                                                           \n\
+       .align  5                                                       \n\
+       .globl  __ieee754_sqrt                                          \n\
+       .ent    __ieee754_sqrt                                          \n\
+__ieee754_sqrt:                                                                \n\
+       ldgp    $29, 0($27)                                             \n\
+       subq    $sp, 16, $sp                                            \n\
        .frame  $sp, 16, $26, 0\n"
 #ifdef PROF
-"      lda     $28, _mcount
+"      lda     $28, _mcount                                            \n\
        jsr     $28, ($28), _mcount\n"
 #endif
-"      .prologue 1
-
-       .align 4
-       stt     $f16, $K($sp)           # e0    :
-       mult    $f31, $f31, $f31        # .. fm :
-       lda     $4, sqrt_data           # e0    :
-       fblt    $f16, $fixup            # .. fa :
-
-       ldah    $2, 0x5fe8              # e0    :
-       ldq     $3, $K($sp)             # .. e1 :
-       ldt     $f12, $HALF($4)         # e0    :
-       ldt     $f18, $ALMOST_THREE_HALF($4)    # .. e1 :
-
-       sll     $3, 52, $5              # e0    :
-       lda     $6, 0x7fd               # .. e1 :
-       fnop                            # .. fa :
-       fnop                            # .. fm :
-
-       subq    $5, 1, $5               # e1    :
-       srl     $3, 33, $1              # .. e0 :
-       cmpule  $5, $6, $5              # e0    :
-       beq     $5, $fixup              # .. e1 :
-
-       mult    $f16, $f12, $f11        # fm    : $f11 = x * 0.5
-       subl    $2, $1, $2              # .. e0 :
-       addt    $f12, $f12, $f17        # .. fa : $f17 = 1.0
-       srl     $2, 12, $1              # e0    :
-
-       and     $1, 0xfc, $1            # e0    :
-       addq    $1, $4, $1              # e1    :
-       ldl     $1, $T2($1)             # e0    :
-       addt    $f12, $f17, $f15        # .. fa : $f15 = 1.5
-
-       subl    $2, $1, $2              # e0    :
-       ldt     $f14, $DN($4)           # .. e1 :
-       sll     $2, 32, $2              # e0    :
-       stq     $2, $Y($sp)             # e0    :
-
-       ldt     $f13, $Y($sp)           # e0    :
-       mult/su $f11, $f13, $f10        # fm   2: $f10 = (x * 0.5) * y
-       mult    $f10, $f13, $f10        # fm   4: $f10 = ((x * 0.5) * y) * y
-       subt    $f15, $f10, $f1         # fa   4: $f1 = (1.5 - 0.5*x*y*y)
-
-       mult    $f13, $f1, $f13         # fm   4: yp = y*(1.5 - 0.5*x*y*y)
-       mult/su $f11, $f13, $f1         # fm   4: $f11 = x * 0.5 * yp
-       mult    $f1, $f13, $f11         # fm   4: $f11 = (x * 0.5 * yp) * yp
-       subt    $f18, $f11, $f1         # fa   4: $f1= (1.5-2^-30) - 0.5*x*yp*yp
-
-       mult    $f13, $f1, $f13         # fm   4: ypp = $f13 = yp*$f1
-       subt    $f15, $f12, $f1         # .. fa : $f1 = (1.5 - 0.5)
-       ldt     $f15, $UP($4)           # .. e0 :
-       mult/su $f16, $f13, $f10        # fm   4: z = $f10 = x * ypp
-
-       mult    $f10, $f13, $f11        # fm   4: $f11 = z*ypp
-       mult    $f10, $f12, $f12        # fm    : $f12 = z*0.5
-       subt    $f1, $f11, $f1          # fa   4: $f1 = 1 - z*ypp
-       mult    $f12, $f1, $f12         # fm   4: $f12 = z*0.5*(1 - z*ypp)
-
-       addt    $f10, $f12, $f0         # fa   4: zp=res= z + z*0.5*(1 - z*ypp)
-       mult/c  $f0, $f14, $f12         # fm   4: zmi = zp * DN
-       mult/c  $f0, $f15, $f11         # fm    : zpl = zp * UP
-       mult/c  $f0, $f12, $f1          # fm    : $f1 = zp * zmi
-
-       mult/c  $f0, $f11, $f15         # fm    : $f15 = zp * zpl
-       subt/su $f1, $f16, $f13         # .. fa : y1 = zp*zmi - x
-       subt/su $f15, $f16, $f14        # fa   4: y2 = zp*zpl - x
-       fcmovge $f13, $f12, $f0         # fa   3: res = (y1 >= 0) ? zmi : res
-
-       fcmovlt $f14, $f11, $f0         # fa   4: res = (y2 <  0) ? zpl : res
-       addq    $sp, 16, $sp            # .. e0 :
-       ret                             # .. e1 :
+"      .prologue 1                                                     \n\
+                                                                       \n\
+       .align 4                                                        \n\
+       stt     $f16, $K($sp)           # e0    :                       \n\
+       mult    $f31, $f31, $f31        # .. fm :                       \n\
+       lda     $4, sqrt_data           # e0    :                       \n\
+       fblt    $f16, $fixup            # .. fa :                       \n\
+                                                                       \n\
+       ldah    $2, 0x5fe8              # e0    :                       \n\
+       ldq     $3, $K($sp)             # .. e1 :                       \n\
+       ldt     $f12, $HALF($4)         # e0    :                       \n\
+       ldt     $f18, $ALMOST_THREE_HALF($4)    # .. e1 :               \n\
+                                                                       \n\
+       sll     $3, 52, $5              # e0    :                       \n\
+       lda     $6, 0x7fd               # .. e1 :                       \n\
+       fnop                            # .. fa :                       \n\
+       fnop                            # .. fm :                       \n\
+                                                                       \n\
+       subq    $5, 1, $5               # e1    :                       \n\
+       srl     $3, 33, $1              # .. e0 :                       \n\
+       cmpule  $5, $6, $5              # e0    :                       \n\
+       beq     $5, $fixup              # .. e1 :                       \n\
+                                                                       \n\
+       mult    $f16, $f12, $f11        # fm    : $f11 = x * 0.5        \n\
+       subl    $2, $1, $2              # .. e0 :                       \n\
+       addt    $f12, $f12, $f17        # .. fa : $f17 = 1.0            \n\
+       srl     $2, 12, $1              # e0    :                       \n\
+                                                                       \n\
+       and     $1, 0xfc, $1            # e0    :                       \n\
+       addq    $1, $4, $1              # e1    :                       \n\
+       ldl     $1, $T2($1)             # e0    :                       \n\
+       addt    $f12, $f17, $f15        # .. fa : $f15 = 1.5            \n\
+                                                                       \n\
+       subl    $2, $1, $2              # e0    :                       \n\
+       ldt     $f14, $DN($4)           # .. e1 :                       \n\
+       sll     $2, 32, $2              # e0    :                       \n\
+       stq     $2, $Y($sp)             # e0    :                       \n\
+                                                                       \n\
+       ldt     $f13, $Y($sp)           # e0    :                       \n\
+       mult/su $f11, $f13, $f10        # fm   2: $f10 = (x * 0.5) * y  \n\
+       mult    $f10, $f13, $f10        # fm   4: $f10 = ((x*0.5)*y)*y  \n\
+       subt    $f15, $f10, $f1         # fa   4: $f1 = (1.5-0.5*x*y*y) \n\
+                                                                       \n\
+       mult    $f13, $f1, $f13         # fm   4: yp = y*(1.5-0.5*x*y^2)\n\
+       mult/su $f11, $f13, $f1         # fm   4: $f11 = x * 0.5 * yp   \n\
+       mult    $f1, $f13, $f11         # fm   4: $f11 = (x*0.5*yp)*yp  \n\
+       subt    $f18, $f11, $f1         # fa   4: $f1=(1.5-2^-30)-x/2*yp^2\n\
+                                                                       \n\
+       mult    $f13, $f1, $f13         # fm   4: ypp = $f13 = yp*$f1   \n\
+       subt    $f15, $f12, $f1         # .. fa : $f1 = (1.5 - 0.5)     \n\
+       ldt     $f15, $UP($4)           # .. e0 :                       \n\
+       mult/su $f16, $f13, $f10        # fm   4: z = $f10 = x * ypp    \n\
+                                                                       \n\
+       mult    $f10, $f13, $f11        # fm   4: $f11 = z*ypp          \n\
+       mult    $f10, $f12, $f12        # fm    : $f12 = z*0.5          \n\
+       subt    $f1, $f11, $f1          # fa   4: $f1 = 1 - z*ypp       \n\
+       mult    $f12, $f1, $f12         # fm   4: $f12 = z/2*(1 - z*ypp)\n\
+                                                                       \n\
+       addt    $f10, $f12, $f0         # fa   4: zp=res= z+z/2*(1-z*ypp)\n\
+       mult/c  $f0, $f14, $f12         # fm   4: zmi = zp * DN         \n\
+       mult/c  $f0, $f15, $f11         # fm    : zpl = zp * UP         \n\
+       mult/c  $f0, $f12, $f1          # fm    : $f1 = zp * zmi        \n\
+                                                                       \n\
+       mult/c  $f0, $f11, $f15         # fm    : $f15 = zp * zpl       \n\
+       subt/su $f1, $f16, $f13         # .. fa : y1 = zp*zmi - x       \n\
+       subt/su $f15, $f16, $f14        # fa   4: y2 = zp*zpl - x       \n\
+       fcmovge $f13, $f12, $f0         # fa   3: res = (y1>=0)?zmi:res \n\
+                                                                       \n\
+       fcmovlt $f14, $f11, $f0         # fa   4: res = (y2<0)?zpl:res  \n\
+       addq    $sp, 16, $sp            # .. e0 :                       \n\
+       ret                             # .. e1 :                       \n\
+                                                                       \n\
+       .align 4                                                        \n\
+$fixup:                                                                        \n\
+       addq    $sp, 16, $sp                                            \n\
+       br      __full_ieee754_sqrt     !samegp                         \n\
+                                                                       \n\
+       .end    __ieee754_sqrt");
 
-       .align 4
-$fixup:
-       addq    $sp, 16, $sp
-       br      "ASM_ALPHA_NG_SYMBOL_PREFIX"__full_ieee754_sqrt..ng
+/* Avoid the __sqrt_finite alias that dbl-64/e_sqrt.c would give...  */
+#undef strong_alias
+#define strong_alias(a,b)
 
-       .end    __ieee754_sqrt");
+/* ... defining our own.  */
+#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18)
+asm (".global  __sqrt_finite1; __sqrt_finite1 = __ieee754_sqrt");
+#else
+asm (".global  __sqrt_finite; __sqrt_finite = __ieee754_sqrt");
+#endif
 
-static double __full_ieee754_sqrt(double) __attribute__((unused));
+static double __full_ieee754_sqrt(double) __attribute_used__;
 #define __ieee754_sqrt __full_ieee754_sqrt
 
+#elif SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18)
+# define __sqrt_finite __sqrt_finite1
 #endif /* _IEEE_FP_INEXACT */
 
 #include <sysdeps/ieee754/dbl-64/e_sqrt.c>
+
+/* Work around forgotten symbol in alphaev6 build.  */
+#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18)
+# undef __sqrt_finite
+# undef __ieee754_sqrt
+compat_symbol (libm, __sqrt_finite1, __sqrt_finite, GLIBC_2_15);
+versioned_symbol (libm, __ieee754_sqrt, __sqrt_finite, GLIBC_2_18);
+#endif