diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2018-06-21 09:36:11 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2018-06-21 09:36:39 +0200 |
commit | cfe8c6c50469bde05d13c284e5edbde0d8d60708 (patch) | |
tree | 9599b9805792716ee69a3d130a8b20fdcb22a841 /newlib/libm/common/sincosf.c | |
parent | b7d9d27b0e168fc43938d1fe68c3467f65dcc4c0 (diff) | |
download | newlib-cfe8c6c50469bde05d13c284e5edbde0d8d60708.zip newlib-cfe8c6c50469bde05d13c284e5edbde0d8d60708.tar.gz newlib-cfe8c6c50469bde05d13c284e5edbde0d8d60708.tar.bz2 |
Revert "Improve performance of sinf/cosf/sincosf"
This reverts commit fca80a9d1b3fa6620cdaccec6b726eef1a6530a1.
Accidentally pushed a preliminary version
Diffstat (limited to 'newlib/libm/common/sincosf.c')
-rw-r--r-- | newlib/libm/common/sincosf.c | 104 |
1 files changed, 0 insertions, 104 deletions
diff --git a/newlib/libm/common/sincosf.c b/newlib/libm/common/sincosf.c deleted file mode 100644 index 85f1264..0000000 --- a/newlib/libm/common/sincosf.c +++ /dev/null @@ -1,104 +0,0 @@ -/* Single-precision sincos function. - Copyright (c) 2018 Arm Ltd. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the company may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS AND ANY EXPRESS OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include "fdlibm.h" -#if !__OBSOLETE_MATH - -#include <stdint.h> -#include <math.h> -#include "math_config.h" -#include "sincosf.h" - -/* Fast sincosf implementation. Worst-case ULP is 0.56072, maximum relative - error is 0.5303p-23. A single-step signed range reduction is used for - small values. Large inputs have their range reduced using fast integer - arithmetic. -*/ -void -sincosf (float y, float *sinp, float *cosp) -{ - double x = y; - double s; - int n; - sincos_t *p = &sincosf_table[0]; - - if (abstop12 (y) < abstop12 (pio4)) - { - double x2 = x * x; - - if (unlikely (abstop12 (y) < abstop12 (0x1p-12f))) - { - if (unlikely (abstop12 (y) < abstop12 (0x1p-126f))) - /* Force underflow for tiny y. */ - force_eval_float (x2); - *sinp = y; - *cosp = 1.0f; - return; - } - - sincosf_poly (x, x2, p, 0, sinp, cosp); - } - else if (abstop12 (y) < abstop12 (120.0f)) - { - x = reduce_fast (x, p, &n); - - /* Setup the signs for sin and cos. */ - s = p->sign[n & 3]; - - if (n & 2) - p = &sincosf_table[1]; - - sincosf_poly (x * s, x * x, p, n, sinp, cosp); - } - else if (likely (abstop12 (y) < abstop12 (INFINITY))) - { - uint32_t xi = asuint (y); - int sign = xi >> 31; - - x = reduce_large (xi, &n); - - /* Setup signs for sin and cos - include original sign. */ - s = p->sign[(n + sign) & 3]; - - if ((n + sign) & 2) - p = &sincosf_table[1]; - - sincosf_poly (x * s, x * x, p, n, sinp, cosp); - } - else - { - /* Return NaN if Inf or NaN for both sin and cos. */ - *sinp = *cosp = y - y; -#if WANT_ERRNO - /* Needed to set errno for +-Inf, the add is a hack to work - around a gcc register allocation issue: just passing y - affects code generation in the fast path. */ - __math_invalidf (y + y); -#endif - } -} - -#endif |