summaryrefslogtreecommitdiff
path: root/libgcc-math/dbl-64/e_sqrt.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-31 11:56:46 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-31 11:56:46 +0000
commit145b0ed135ab825570329d97ffc4f881bd5b2fc0 (patch)
tree1bd09a73712c40d7c7750282692a1f094c832bba /libgcc-math/dbl-64/e_sqrt.c
parent8ec3c5c2f80dd6d2561899354c2d9d1d66551f12 (diff)
downloadgcc-145b0ed135ab825570329d97ffc4f881bd5b2fc0.tar.gz
2006-01-31 Richard Guenther <rguenther@suse.de>
Paolo Bonzini <bonzini@gnu.org> * Makefile.def (target_modules): Add libgcc-math target module. * configure.in (target_libraries): Add libgcc-math target library. (--enable-libgcc-math): New configure switch. * Makefile.in: Re-generate. * configure: Re-generate. * libgcc-math: New toplevel directory. * doc/install.texi (--disable-libgcc-math): Document. libgcc-math/ * configure.ac: New file. * Makefile.am: Likewise. * configure: New generated file. * Makefile.in: Likewise. * aclocal.m4: Likewise. * libtool-version: New file. * include/ieee754.h: New file. * include/libc-symbols.h: Likewise. * include/math_private.h: Likewise. * i386/Makefile.am: New file. * i386/Makefile.in: New generated file. * i386/sse2.h: New file. * i386/endian.h: Likewise. * i386/sse2.map: Linker script for SSE2 ABI math intrinsics. * flt-32/: Import from glibc. * dbl-64/: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110434 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc-math/dbl-64/e_sqrt.c')
-rw-r--r--libgcc-math/dbl-64/e_sqrt.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/libgcc-math/dbl-64/e_sqrt.c b/libgcc-math/dbl-64/e_sqrt.c
new file mode 100644
index 00000000000..f7e80554917
--- /dev/null
+++ b/libgcc-math/dbl-64/e_sqrt.c
@@ -0,0 +1,88 @@
+/*
+ * IBM Accurate Mathematical Library
+ * written by International Business Machines Corp.
+ * Copyright (C) 2001 Free Software Foundation
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+/*********************************************************************/
+/* MODULE_NAME: uroot.c */
+/* */
+/* FUNCTION: usqrt */
+/* */
+/* FILES NEEDED: dla.h endian.h mydefs.h uroot.h */
+/* uroot.tbl */
+/* */
+/* An ultimate sqrt routine. Given an IEEE double machine number x */
+/* it computes the correctly rounded (to nearest) value of square */
+/* root of x. */
+/* Assumption: Machine arithmetic operations are performed in */
+/* round to nearest mode of IEEE 754 standard. */
+/* */
+/*********************************************************************/
+
+#include "endian.h"
+#include "mydefs.h"
+#include "dla.h"
+#include "MathLib.h"
+#include "root.tbl"
+#include "math_private.h"
+
+/*********************************************************************/
+/* An ultimate sqrt routine. Given an IEEE double machine number x */
+/* it computes the correctly rounded (to nearest) value of square */
+/* root of x. */
+/*********************************************************************/
+double __ieee754_sqrt(double x) {
+#include "uroot.h"
+ static const double
+ rt0 = 9.99999999859990725855365213134618E-01,
+ rt1 = 4.99999999495955425917856814202739E-01,
+ rt2 = 3.75017500867345182581453026130850E-01,
+ rt3 = 3.12523626554518656309172508769531E-01;
+ static const double big = 134217728.0;
+ double y,t,del,res,res1,hy,z,zz,p,hx,tx,ty,s;
+ mynumber a,c={{0,0}};
+ int4 k;
+
+ a.x=x;
+ k=a.i[HIGH_HALF];
+ a.i[HIGH_HALF]=(k&0x001fffff)|0x3fe00000;
+ t=inroot[(k&0x001fffff)>>14];
+ s=a.x;
+ /*----------------- 2^-1022 <= | x |< 2^1024 -----------------*/
+ if (k>0x000fffff && k<0x7ff00000) {
+ y=1.0-t*(t*s);
+ t=t*(rt0+y*(rt1+y*(rt2+y*rt3)));
+ c.i[HIGH_HALF]=0x20000000+((k&0x7fe00000)>>1);
+ y=t*s;
+ hy=(y+big)-big;
+ del=0.5*t*((s-hy*hy)-(y-hy)*(y+hy));
+ res=y+del;
+ if (res == (res+1.002*((y-res)+del))) return res*c.x;
+ else {
+ res1=res+1.5*((y-res)+del);
+ EMULV(res,res1,z,zz,p,hx,tx,hy,ty); /* (z+zz)=res*res1 */
+ return ((((z-s)+zz)<0)?max(res,res1):min(res,res1))*c.x;
+ }
+ }
+ else {
+ if ((k & 0x7ff00000) == 0x7ff00000)
+ return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf, sqrt(-inf)=sNaN */
+ if (x==0) return x; /* sqrt(+0)=+0, sqrt(-0)=-0 */
+ if (k<0) return (x-x)/(x-x); /* sqrt(-ve)=sNaN */
+ return tm256.x*__ieee754_sqrt(x*t512.x);
+ }
+}