]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
math: Use acoshf from CORE-MATH
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 21 Oct 2024 13:51:09 +0000 (10:51 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 18 Dec 2024 20:24:43 +0000 (17:24 -0300)
The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows slight better performance to the generic acoshf.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (Neoverse-N1,
gcc 13.3.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      61.2471        58.7742         4.04%
x86_64-v2                   62.6519        59.0523         5.75%
x86_64-v3                   58.7408        50.1393        14.64%
aarch64                     24.8580        21.3317        14.19%
power10                     17.0469        13.1345        22.95%

reciprocal-throughput        master        patched   improvement
x86_64                      16.1618        15.1864         6.04%
x86_64-v2                   15.7729        14.7563         6.45%
x86_64-v3                   14.1669        11.9568        15.60%
aarch64                      10.911        9.5486         12.49%
power10                     6.38196        5.06734        20.60%

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: DJ Delorie <dj@redhat.com>
26 files changed:
SHARED-FILES
sysdeps/aarch64/libm-test-ulps
sysdeps/alpha/fpu/libm-test-ulps
sysdeps/arc/fpu/libm-test-ulps
sysdeps/arc/nofpu/libm-test-ulps
sysdeps/arm/libm-test-ulps
sysdeps/csky/fpu/libm-test-ulps
sysdeps/csky/nofpu/libm-test-ulps
sysdeps/hppa/fpu/libm-test-ulps
sysdeps/i386/fpu/e_acoshf.S [deleted file]
sysdeps/ieee754/flt-32/e_acoshf.c
sysdeps/loongarch/lp64/libm-test-ulps
sysdeps/m68k/m680x0/fpu/libm-test-ulps
sysdeps/microblaze/libm-test-ulps
sysdeps/mips/mips32/libm-test-ulps
sysdeps/mips/mips64/libm-test-ulps
sysdeps/or1k/fpu/libm-test-ulps
sysdeps/or1k/nofpu/libm-test-ulps
sysdeps/powerpc/fpu/libm-test-ulps
sysdeps/powerpc/nofpu/libm-test-ulps
sysdeps/riscv/nofpu/libm-test-ulps
sysdeps/riscv/rvd/libm-test-ulps
sysdeps/s390/fpu/libm-test-ulps
sysdeps/sh/libm-test-ulps
sysdeps/sparc/fpu/libm-test-ulps
sysdeps/x86_64/fpu/libm-test-ulps

index 3d32f0f3b6d1598a2f58b2b5d250749d0be9b46f..c29c1c8106a3a4de4102a83f84f2db1ca96d3ec1 100644 (file)
@@ -298,3 +298,7 @@ sysdeps/ieee754/flt-32/e_acosf.c:
   (src/binary32/acos/acosf.c in CORE-MATH)
   - The code was adapted to use glibc code style and internal
     functions to handle errno, overflow, and underflow.
+sysdeps/ieee754/flt-32/e_acoshf.c:
+  (src/binary32/acosh/acoshf.c in CORE-MATH)
+  - The code was adapted to use glibc code style and internal
+    functions to handle errno, overflow, and underflow.
index a925a3834c5342506d8907446f6392a476b96fe1..8ab673c4b73166a0337f3b5a9a6df987519c1b65 100644 (file)
@@ -27,7 +27,6 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_advsimd":
@@ -36,7 +35,6 @@ float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_sve":
@@ -45,12 +43,10 @@ float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acospi":
index aac2e3195102f3d383de2a1642d086dbbd26fb7b..d26fcb40c9faf4ba0423c57cee847b506d0634b9 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "asin":
index b80f97b5edb336005b04e2570ca598dd33e58ed3..0057716df0020de00726a544f5d90fea5aea0bf4 100644 (file)
@@ -15,19 +15,15 @@ double: 1
 
 Function: "acosh":
 double: 3
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 3
-float: 3
 
 Function: "asin":
 double: 1
index de1fdd9b1e9c92532d33113b0b5016212e09c8c8..2fa0c82346d2c45cfca3d7336f7581ec120ff88d 100644 (file)
@@ -6,7 +6,6 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "asin":
 double: 1
index 25c06306cd4011001481286d50d645e94552d00b..d6c56fd5b52acb6c632cedecac2aa04189e789c4 100644 (file)
@@ -15,19 +15,15 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 
 Function: "acospi":
 double: 1
index 3e7b07e81ad9648adda5222fddccffed27af5f6d..ebde72f4d79f1ec751efc96dbf7449441a32cbb2 100644 (file)
@@ -14,19 +14,15 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 
 Function: "asin":
 float: 1
index 58bd5eaa159307db25b6269e0a2482c7078b74a2..73b6a2042a962f53d70a98e8b7080c54dd0755a0 100644 (file)
@@ -14,19 +14,15 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 
 Function: "asin":
 float: 1
index 629fb5b4140464ce4f17136058dc4a22edbdffb2..f7f5d6b1b7c289d671c4f50b9df6fae9dce6d8fc 100644 (file)
@@ -15,19 +15,15 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 
 Function: "acospi":
 double: 1
diff --git a/sysdeps/i386/fpu/e_acoshf.S b/sysdeps/i386/fpu/e_acoshf.S
deleted file mode 100644 (file)
index 6eda9dc..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/* ix87 specific implementation of arcsinh.
-   Copyright (C) 1996-2024 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, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <machine/asm.h>
-#include <libm-alias-finite.h>
-
-       .section .rodata.cst8,"aM",@progbits,8
-
-       .p2align 3
-       .type one,@object
-one:   .double 1.0
-       ASM_SIZE_DIRECTIVE(one)
-       .type limit,@object
-limit: .double 0.29
-       ASM_SIZE_DIRECTIVE(limit)
-
-#ifdef PIC
-#define MO(op) op##@GOTOFF(%edx)
-#else
-#define MO(op) op
-#endif
-
-       .text
-ENTRY(__ieee754_acoshf)
-       movl    4(%esp), %ecx
-       cmpl    $0x3f800000, %ecx
-       jl      5f                      // < 1 => invalid
-       fldln2                          // log(2)
-       flds    4(%esp)                 // x : log(2)
-       cmpl    $0x47000000, %ecx
-       ja      3f                      // x > 2^14
-#ifdef PIC
-       LOAD_PIC_REG (dx)
-#endif
-       cmpl    $0x40000000, %ecx
-       ja      4f                      // x > 2
-
-       // 1 <= x <= 2 => y = log1p(x-1+sqrt(2*(x-1)+(x-1)^2))
-       fsubl   MO(one)                 // x-1 : log(2)
-       fabs                            // acosh(1) is +0 in all rounding modes
-       fld     %st                     // x-1 : x-1 : log(2)
-       fmul    %st(1)                  // (x-1)^2 : x-1 : log(2)
-       fadd    %st(1)                  // x-1+(x-1)^2 : x-1 : log(2)
-       fadd    %st(1)                  // 2*(x-1)+(x-1)^2 : x-1 : log(2)
-       fsqrt                           // sqrt(2*(x-1)+(x-1)^2) : x-1 : log(2)
-       faddp                           // x-1+sqrt(2*(x-1)+(x-1)^2) : log(2)
-       fcoml   MO(limit)
-       fnstsw
-       sahf
-       ja      2f
-       fyl2xp1                         // log1p(x-1+sqrt(2*(x-1)+(x-1)^2))
-       ret
-
-2:     faddl   MO(one)                 // x+sqrt(2*(x-1)+(x-1)^2) : log(2)
-       fyl2x                           // log(x+sqrt(2*(x-1)+(x-1)^2))
-       ret
-
-       // x > 2^14 => y = log(x) + log(2)
-       .align ALIGNARG(4)
-3:     fyl2x                           // log(x)
-       fldln2                          // log(2) : log(x)
-       faddp                           // log(x)+log(2)
-       ret
-
-       // 2^28 > x > 2 => y = log(2*x - 1/(x+sqrt(x*x-1)))
-       .align ALIGNARG(4)
-4:     fld     %st                     // x : x : log(2)
-       fadd    %st, %st(1)             // x : 2*x : log(2)
-       fld     %st                     // x : x : 2*x : log(2)
-       fmul    %st(1)                  // x^2 : x : 2*x : log(2)
-       fsubl   MO(one)                 // x^2-1 : x : 2*x : log(2)
-       fsqrt                           // sqrt(x^2-1) : x : 2*x : log(2)
-       faddp                           // x+sqrt(x^2-1) : 2*x : log(2)
-       fdivrl  MO(one)                 // 1/(x+sqrt(x^2-1)) : 2*x : log(2)
-       fsubrp                          // 2*x+1/(x+sqrt(x^2)-1) : log(2)
-       fyl2x                           // log(2*x+1/(x+sqrt(x^2-1)))
-       ret
-
-       // x < 1 (or -NaN) => NaN
-       .align ALIGNARG(4)
-5:     flds    4(%esp)
-       fsub    %st
-       fdiv    %st, %st(0)
-       ret
-END(__ieee754_acoshf)
-libm_alias_finite (__ieee754_acoshf, __acoshf)
index 2237af4ba4b3cfa5978d61543f2dc47552a90c5e..a0a0abc2ddc4e342988885315331a53f8beca0db 100644 (file)
-/* e_acoshf.c -- float version of e_acosh.c.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: e_acoshf.c,v 1.5 1995/05/12 04:57:20 jtc Exp $";
-#endif
+/* Correctly-rounded inverse hyperbolic cosine function for binary32 format.
+
+Copyright (c) 2023-2024 Alexei Sibidanov.
+
+The original version of this file was copied from the CORE-MATH
+project (file src/binary32/acosh/acoshf.c, revision d0b9ddd).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
 
 #include <math.h>
-#include <math_private.h>
+#include <stdint.h>
 #include <libm-alias-finite.h>
+#include "math_config.h"
 
-static const float
-one    = 1.0,
-ln2    = 6.9314718246e-01;  /* 0x3f317218 */
+static __attribute__ ((noinline)) float
+as_special (float x)
+{
+  uint32_t t = asuint (x);
+  if (t == 0x3f800000u)
+    return 0.0f;
+  if ((t << 1) > 0xff000000u)
+    return x + x; /* nan */
+  if (t == 0x7f800000u)
+    return x; /* inf */
+  return __math_invalidf (x);
+}
 
-float __ieee754_acoshf(float x)
+float
+__ieee754_acoshf (float x)
 {
-       float t;
-       int32_t hx;
-       GET_FLOAT_WORD(hx,x);
-       if(hx<0x3f800000) {             /* x < 1 */
-           return (x-x)/(x-x);
-       } else if(hx >=0x4d800000) {    /* x > 2**28 */
-           if(hx >=0x7f800000) {       /* x is inf of NaN */
-               return x+x;
-           } else
-               return __ieee754_logf(x)+ln2;   /* acosh(huge)=log(2x) */
-       } else if (hx==0x3f800000) {
-           return 0.0;                 /* acosh(1) = 0 */
-       } else if (hx > 0x40000000) {   /* 2**28 > x > 2 */
-           t=x*x;
-           return __ieee754_logf((float)2.0*x-one/(x+sqrtf(t-one)));
-       } else {                        /* 1<x<2 */
-           t = x-one;
-           return __log1pf(t+sqrtf((float)2.0*t+t*t));
+  static const double ix[] =
+    {
+      0x1p+0,           0x1.fc07f01fcp-1, 0x1.f81f81f82p-1, 0x1.f44659e4ap-1,
+      0x1.f07c1f07cp-1, 0x1.ecc07b302p-1, 0x1.e9131abfp-1,  0x1.e573ac902p-1,
+      0x1.e1e1e1e1ep-1, 0x1.de5d6e3f8p-1, 0x1.dae6076bap-1, 0x1.d77b654b8p-1,
+      0x1.d41d41d42p-1, 0x1.d0cb58f6ep-1, 0x1.cd8568904p-1, 0x1.ca4b3055ep-1,
+      0x1.c71c71c72p-1, 0x1.c3f8f01c4p-1, 0x1.c0e070382p-1, 0x1.bdd2b8994p-1,
+      0x1.bacf914c2p-1, 0x1.b7d6c3ddap-1, 0x1.b4e81b4e8p-1, 0x1.b2036406cp-1,
+      0x1.af286bca2p-1, 0x1.ac5701ac6p-1, 0x1.a98ef606ap-1, 0x1.a6d01a6dp-1,
+      0x1.a41a41a42p-1, 0x1.a16d3f97ap-1, 0x1.9ec8e951p-1,  0x1.9c2d14ee4p-1,
+      0x1.99999999ap-1, 0x1.970e4f80cp-1, 0x1.948b0fcd6p-1, 0x1.920fb49dp-1,
+      0x1.8f9c18f9cp-1, 0x1.8d3018d3p-1,  0x1.8acb90f6cp-1, 0x1.886e5f0acp-1,
+      0x1.861861862p-1, 0x1.83c977ab2p-1, 0x1.818181818p-1, 0x1.7f405fd02p-1,
+      0x1.7d05f417ep-1, 0x1.7ad2208ep-1,  0x1.78a4c8178p-1, 0x1.767dce434p-1,
+      0x1.745d1745ep-1, 0x1.724287f46p-1, 0x1.702e05c0cp-1, 0x1.6e1f76b44p-1,
+      0x1.6c16c16c2p-1, 0x1.6a13cd154p-1, 0x1.681681682p-1, 0x1.661ec6a52p-1,
+      0x1.642c8590cp-1, 0x1.623fa7702p-1, 0x1.605816058p-1, 0x1.5e75bb8dp-1,
+      0x1.5c9882b94p-1, 0x1.5ac056b02p-1, 0x1.58ed23082p-1, 0x1.571ed3c5p-1,
+      0x1.555555556p-1, 0x1.5390948f4p-1, 0x1.51d07eae2p-1, 0x1.501501502p-1,
+      0x1.4e5e0a73p-1,  0x1.4cab88726p-1, 0x1.4afd6a052p-1, 0x1.49539e3b2p-1,
+      0x1.47ae147aep-1, 0x1.460cbc7f6p-1, 0x1.446f86562p-1, 0x1.42d6625d6p-1,
+      0x1.414141414p-1, 0x1.3fb013fbp-1,  0x1.3e22cbce4p-1, 0x1.3c995a47cp-1,
+      0x1.3b13b13b2p-1, 0x1.3991c2c18p-1, 0x1.381381382p-1, 0x1.3698df3dep-1,
+      0x1.3521cfb2cp-1, 0x1.33ae45b58p-1, 0x1.323e34a2cp-1, 0x1.30d19013p-1,
+      0x1.2f684bda2p-1, 0x1.2e025c04cp-1, 0x1.2c9fb4d82p-1, 0x1.2b404ad02p-1,
+      0x1.29e4129e4p-1, 0x1.288b01288p-1, 0x1.27350b882p-1, 0x1.25e22708p-1,
+      0x1.24924924ap-1, 0x1.23456789ap-1, 0x1.21fb78122p-1, 0x1.20b470c68p-1,
+      0x1.1f7047dc2p-1, 0x1.1e2ef3b4p-1,  0x1.1cf06ada2p-1, 0x1.1bb4a4046p-1,
+      0x1.1a7b9611ap-1, 0x1.19453808cp-1, 0x1.181181182p-1, 0x1.16e068942p-1,
+      0x1.15b1e5f76p-1, 0x1.1485f0e0ap-1, 0x1.135c81136p-1, 0x1.12358e75ep-1,
+      0x1.111111112p-1, 0x1.0fef010fep-1, 0x1.0ecf56be6p-1, 0x1.0db20a89p-1,
+      0x1.0c9714fbcp-1, 0x1.0b7e6ec26p-1, 0x1.0a6810a68p-1, 0x1.0953f3902p-1,
+      0x1.084210842p-1, 0x1.073260a48p-1, 0x1.0624dd2f2p-1, 0x1.05197f7d8p-1,
+      0x1.041041042p-1, 0x1.03091b52p-1,  0x1.020408102p-1, 0x1.01010101p-1,
+      0x1p-1
+    };
+
+  static const double lix[] =
+    {
+      0x0p+0,               0x1.fe02a6b146789p-8, 0x1.fc0a8b0fa03e4p-7,
+      0x1.7b91b07de311bp-6, 0x1.f829b0e7c33p-6,   0x1.39e87b9fd7d6p-5,
+      0x1.77458f63edcfcp-5, 0x1.b42dd7117b1bfp-5, 0x1.f0a30c01362a6p-5,
+      0x1.16536eea7fae1p-4, 0x1.341d7961791d1p-4, 0x1.51b073f07983fp-4,
+      0x1.6f0d28ae3eb4cp-4, 0x1.8c345d6383b21p-4, 0x1.a926d3a475563p-4,
+      0x1.c5e548f63a743p-4, 0x1.e27076e28f2e6p-4, 0x1.fec9131dbaabbp-4,
+      0x1.0d77e7ccf6e59p-3, 0x1.1b72ad52f87ap-3,  0x1.29552f81eb523p-3,
+      0x1.371fc201f7f74p-3, 0x1.44d2b6ccbfd1ep-3, 0x1.526e5e3a41438p-3,
+      0x1.5ff3070a613d4p-3, 0x1.6d60fe717221dp-3, 0x1.7ab890212b909p-3,
+      0x1.87fa065214911p-3, 0x1.9525a9cf296b4p-3, 0x1.a23bc1fe42563p-3,
+      0x1.af3c94e81bff3p-3, 0x1.bc2867430acd6p-3, 0x1.c8ff7c7989a22p-3,
+      0x1.d5c216b535b91p-3, 0x1.e27076e2f92e6p-3, 0x1.ef0adcbe0d936p-3,
+      0x1.fb9186d5ebe2bp-3, 0x1.0402594b51041p-2, 0x1.0a324e27370e3p-2,
+      0x1.1058bf9ad7ad5p-2, 0x1.1675cabaa660ep-2, 0x1.1c898c16b91fbp-2,
+      0x1.22941fbcfb966p-2, 0x1.2895a13dd2ea3p-2, 0x1.2e8e2bade7d31p-2,
+      0x1.347dd9a9afd55p-2, 0x1.3a64c556b05eap-2, 0x1.40430868877e4p-2,
+      0x1.4618bc219dec2p-2, 0x1.4be5f9579e0a1p-2, 0x1.51aad872c982dp-2,
+      0x1.5767717432a6cp-2, 0x1.5d1bdbf5669cap-2, 0x1.62c82f2b83795p-2,
+      0x1.686c81e9964afp-2, 0x1.6e08eaa2929e4p-2, 0x1.739d7f6b95007p-2,
+      0x1.792a55fdb7fa2p-2, 0x1.7eaf83b82efc3p-2, 0x1.842d1da1ecb17p-2,
+      0x1.89a3386be825bp-2, 0x1.8f11e87347ac7p-2, 0x1.947941c1f26fbp-2,
+      0x1.99d958119208bp-2, 0x1.9f323ecbd984cp-2, 0x1.a484090e5eb0ap-2,
+      0x1.a9cec9a9cf84ap-2, 0x1.af1293245606bp-2, 0x1.b44f77bc98f63p-2,
+      0x1.b9858969218fbp-2, 0x1.beb4d9da96b7cp-2, 0x1.c3dd7a7d0354dp-2,
+      0x1.c8ff7c79ada22p-2, 0x1.ce1af0b855bebp-2, 0x1.d32fe7e039bd5p-2,
+      0x1.d83e72587673ep-2, 0x1.dd46a04c204a1p-2, 0x1.e24881a7cac26p-2,
+      0x1.e744261d8a788p-2, 0x1.ec399d2457ccp-2,  0x1.f128f5fac86edp-2,
+      0x1.f6123fa71c8acp-2, 0x1.faf588f76631fp-2, 0x1.ffd2e08580c98p-2,
+      0x1.02552a5a4f0ffp-1, 0x1.04bdf9da8b6d2p-1, 0x1.0723e5c1b4f4p-1,
+      0x1.0986f4f589521p-1, 0x1.0be72e423ca83p-1, 0x1.0e44985d0f48cp-1,
+      0x1.109f39e2be497p-1, 0x1.12f71959283bcp-1, 0x1.154c3d2f4f5eap-1,
+      0x1.179eabbd9c9a1p-1, 0x1.19ee6b466516fp-1, 0x1.1c3b81f723c25p-1,
+      0x1.1e85f5e6ec0dp-1,  0x1.20cdcd193f76ep-1, 0x1.23130d7beb743p-1,
+      0x1.2555bce9887cbp-1, 0x1.2795e1288211bp-1, 0x1.29d37fec2308bp-1,
+      0x1.2c0e9ed45768cp-1, 0x1.2e47436e5ae68p-1, 0x1.307d7334ff0bep-1,
+      0x1.32b1339134571p-1, 0x1.34e289d9b39d3p-1, 0x1.37117b5481bb6p-1,
+      0x1.393e0d3549a1ap-1, 0x1.3b6844a017823p-1, 0x1.3d9026a70eefbp-1,
+      0x1.3fb5b84cfeb42p-1, 0x1.41d8fe844b2aep-1, 0x1.43f9fe2fb9267p-1,
+      0x1.4618bc21d86c2p-1, 0x1.48353d1e928dfp-1, 0x1.4a4f85db1debbp-1,
+      0x1.4c679afcc323ap-1, 0x1.4e7d811b77bb1p-1, 0x1.50913cbff8c6bp-1,
+      0x1.52a2d265be5abp-1, 0x1.54b2467998498p-1, 0x1.56bf9d5b34b99p-1,
+      0x1.58cadb5cbe989p-1, 0x1.5ad404c33af2dp-1, 0x1.5cdb1dc6ad765p-1,
+      0x1.5ee02a9241e75p-1, 0x1.60e32f447a8d9p-1, 0x1.62e42fefa39efp-1
+    };
+
+  uint32_t t = asuint (x);
+  if (__glibc_unlikely (t <= 0x3f800000u))
+    return as_special (x);
+  else if (__glibc_unlikely (t <= 0x3f99db23u))   /* x <= 0x1.33b646p+0 */
+    {
+      float zf = x - 1.0f;
+      double z = zf;
+      double a = sqrt (2.0 * z);
+      static const double c[] =
+         {
+          -0x1.555555555491ep-4,  0x1.333333319c2p-6,
+          -0x1.6db6da26e5e0ep-8,  0x1.f1c698b7100cep-10,
+          -0x1.6e7ca9e152dc2p-11, 0x1.1b4cf187158bdp-12,
+          -0x1.b5137f11a88e5p-14, 0x1.056c6c57152b2p-15
+        };
+      double z2 = z * z;
+      double z4 = z2 * z2;
+      double f = ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3]))
+                + z4 * ((c[4] + z * c[5]) + z2 * (c[6] + z * c[7]));
+      double r = a + (a * z) * f;
+      return r;
+    }
+  else if (__glibc_likely (t < 0x7f800000u))
+    {
+      double xd = x;
+      double x2 = xd * xd;
+      uint64_t tp = asuint64 (xd + sqrt (x2 - 1));
+      uint64_t m = tp & (~UINT64_C(0) >> 12);
+      int j = (m + (UINT64_C(1) << (52 - 8))) >> (52 - 7);
+      int e = (tp >> 52) - 0x3ff;
+      double w = asdouble (m | UINT64_C(0x3ff) << 52);
+      double z = w * ix[j] - 1.0;
+      static const double c[] =
+       {
+         0x1.0000000066947p+0, -0x1.00007f053d8cbp-1, 0x1.555280111d914p-2
+       };
+      double z2 = z * z;
+      double r = ((lix[128] * e + lix[j]) + z * c[0])
+                 + z2 * (c[1] + z * c[2]);
+      if (__glibc_unlikely (((asuint64 (r) + 259000) & INT64_C(0xfffffff))
+                           < 260000)) /* accurate path */
+       {
+         static const double cp[] =
+           {
+              0x1p+0,               -0x1p-1,
+              0x1.55555555030bcp-2, -0x1.ffffffff2b4e5p-3,
+              0x1.999b5076a42f2p-3, -0x1.55570c45a647dp-3
+           };
+         z2 = z * z;
+         double c0 = cp[0] + z * cp[1];
+         double c2 = cp[2] + z * cp[3];
+         double c4 = cp[4] + z * cp[5];
+         c0 += z2 * (c2 + z2 * c4);
+         const double ln2l = 0x1.7f7d1cf79abcap-20;
+         const double ln2h = 0x1.62e4p-1;
+         double Lh = ln2h * e;
+         double Ll = ln2l * e;
+         r = fma (z, c0, Ll + lix[j]) + Lh;
+         if (__glibc_unlikely ((asuint64 (r) & UINT64_C(0xfffffff)) == 0))
+           {
+             double h = fma (z, c0, Ll + lix[j]) + (Lh - r);
+             r = r + 64.0 * h;
+           }
        }
+      return r;
+    }
+  else
+    return as_special (x);
 }
 libm_alias_finite (__ieee754_acoshf, __acoshf)
index 67bf2d2f9f80ec89e790bdac9219e97339c2a380..63fd07fbe0766ce62d72b8cab3a7af4e65451c20 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "asin":
index 50080f46b31ca2d774553a131cf34c5e441f8fcd..73019999e0adf6675ad74442f301ab036abed083 100644 (file)
@@ -3,22 +3,18 @@
 # Maximal error of functions:
 Function: "acosh":
 double: 1
-float: 1
 ldouble: 1
 
 Function: "acosh_downward":
 double: 2
-float: 1
 ldouble: 1
 
 Function: "acosh_towardzero":
 double: 2
-float: 1
 ldouble: 1
 
 Function: "acosh_upward":
 double: 2
-float: 1
 ldouble: 1
 
 Function: "asin":
index c93ebfa21ba74bb48f22cc7906a472e54d40adb4..a9e3f3a318e02be089e7039c29b9aa837f742ed3 100644 (file)
@@ -5,7 +5,6 @@ Function: "acos":
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "asin":
 float: 1
index d23762642b8e81d4d83df9ba5ddf90851f34c1df..fc0d001750ed8587dd1a5a3d7b6bfb1b06f29a4e 100644 (file)
@@ -15,19 +15,15 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 
 Function: "asin":
 double: 1
index aece335d6b83f5a2a592728325ebf18e273c82e2..855b48e800cb73970ce58a27449273f7f1324c35 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "asin":
index 862ab6b559048c914e83a85906e3c37d2eed27f9..0cc7beccfc80564cc394e7a5cfaf1bf29c835b0f 100644 (file)
@@ -15,19 +15,15 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 
 Function: "asin":
 double: 1
index 27ddaf0510a26c6c32e325197c5d3bd7851962fd..4e3928a325da99f9c342d12a34592a02f8c74fa9 100644 (file)
@@ -15,19 +15,15 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 
 Function: "acospi":
 double: 1
index 6e0a9de7bb315a14af6738ef4e3a30249829d5c1..0fc38f8e702ec9a0509159462a2266eabe728903 100644 (file)
@@ -23,25 +23,21 @@ ldouble: 2
 
 Function: "acosh":
 double: 2
-float: 2
 float128: 4
 ldouble: 2
 
 Function: "acosh_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 float128: 2
 ldouble: 5
 
 Function: "acosh_upward":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
index 44cf9983dc51f6b5b9f371701ef179cdbc569141..f553da0caad881b04894d0e28a0e53ac631a6791 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 2
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 1
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 5
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "add_ldouble":
index 8d3b048e849662a501c7d2cb240deaa656b9d30d..3bf997c5d8720fbbe6fb9bace5c7cd11f9549672 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "asin":
index a1d85be3b658dd898866e75a7d4a187862533f7d..f85d9caf035ad438d4fbf8fe2a5acb91a840b43d 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "asin":
index 0d47af49bc66937d7ee11fde38353812e0081e8e..9433370865b8d1f38a2d16cbf40ecef11d2b1c0b 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "asin":
index d1e5b05531fdcb0770409c3885983aa75543ea23..d46c722ea198ca5d633ab74c253a32fd36d40c31 100644 (file)
@@ -8,11 +8,9 @@ double: 1
 
 Function: "acosh":
 double: 2
-float: 2
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 
 Function: "asin":
 float: 1
index fe2d1dd34ecdfcd3464179f7a8e599e873ea4f62..1fde571203e7ef6428f17bdd0a523ccf9e6d94b5 100644 (file)
@@ -19,22 +19,18 @@ ldouble: 1
 
 Function: "acosh":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "acosh_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "acosh_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "asin":
index f6c19d309dc6ae750cb10b23834fb684324ad0ee..3ad52717e76ed8b9824d0a3370a46a5387d10890 100644 (file)
@@ -43,25 +43,21 @@ float: 1
 
 Function: "acosh":
 double: 2
-float: 2
 float128: 4
 ldouble: 3
 
 Function: "acosh_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "acosh_towardzero":
 double: 2
-float: 2
 float128: 2
 ldouble: 4
 
 Function: "acosh_upward":
 double: 2
-float: 2
 float128: 3
 ldouble: 3