From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 83973 invoked by alias); 13 Aug 2019 23:20:21 -0000 Mailing-List: contact newlib-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-owner@sourceware.org Received: (qmail 83919 invoked by uid 89); 13 Aug 2019 23:20:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 spammy=BUSINESS, profits, LIMITED, SERVICES X-HELO: elaine.keithp.com Received: from home.keithp.com (HELO elaine.keithp.com) (63.227.221.253) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 13 Aug 2019 23:20:14 +0000 Received: from localhost (localhost [127.0.0.1]) by elaine.keithp.com (Postfix) with ESMTP id 9F6413F28DAE for ; Tue, 13 Aug 2019 16:20:12 -0700 (PDT) Received: from elaine.keithp.com ([127.0.0.1]) by localhost (elaine.keithp.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id PKwCSeHdxsfJ; Tue, 13 Aug 2019 16:20:11 -0700 (PDT) Received: from keithp.com (koto.keithp.com [10.0.0.2]) by elaine.keithp.com (Postfix) with ESMTPSA id 23D5C3F28D66; Tue, 13 Aug 2019 16:20:11 -0700 (PDT) Received: by keithp.com (Postfix, from userid 1000) id F416B15820DA; Tue, 13 Aug 2019 16:20:10 -0700 (PDT) From: Keith Packard To: newlib@sourceware.org Cc: Keith Packard Subject: [PATCH] libm/common: Split math_err.c and math_errf.c into per-function files Date: Tue, 13 Aug 2019 23:20:00 -0000 Message-Id: <20190813232004.8178-1-keithp@keithp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2019/txt/msg00481.txt.bz2 This avoids bringing in additional code when using error functions without --gc-sections. Two functions from each file are now global and have been renamed to start with __math: with_errno → __math_with_errno with_errnof → __math_with_errnof xflow → __math_xflow xflowf → __math_xflowf There should be no functional changes to the resulting code. Signed-off-by: Keith Packard --- newlib/libm/common/Makefile.am | 11 +++- newlib/libm/common/math_config.h | 17 +++++ newlib/libm/common/math_err_check_oflow.c | 37 +++++++++++ newlib/libm/common/math_err_check_uflow.c | 37 +++++++++++ newlib/libm/common/math_err_divzero.c | 36 +++++++++++ newlib/libm/common/math_err_invalid.c | 36 +++++++++++ .../{math_err.c => math_err_may_uflow.c} | 64 +------------------ newlib/libm/common/math_err_oflow.c | 35 ++++++++++ newlib/libm/common/math_err_uflow.c | 35 ++++++++++ newlib/libm/common/math_err_with_errno.c | 41 ++++++++++++ newlib/libm/common/math_err_xflow.c | 36 +++++++++++ newlib/libm/common/math_errf_divzerof.c | 39 +++++++++++ newlib/libm/common/math_errf_invalidf.c | 39 +++++++++++ .../{math_errf.c => math_errf_may_uflowf.c} | 52 +-------------- newlib/libm/common/math_errf_oflowf.c | 36 +++++++++++ newlib/libm/common/math_errf_uflowf.c | 38 +++++++++++ newlib/libm/common/math_errf_with_errnof.c | 41 ++++++++++++ newlib/libm/common/math_errf_xflowf.c | 38 +++++++++++ 18 files changed, 552 insertions(+), 116 deletions(-) create mode 100644 newlib/libm/common/math_err_check_oflow.c create mode 100644 newlib/libm/common/math_err_check_uflow.c create mode 100644 newlib/libm/common/math_err_divzero.c create mode 100644 newlib/libm/common/math_err_invalid.c rename newlib/libm/common/{math_err.c => math_err_may_uflow.c} (60%) create mode 100644 newlib/libm/common/math_err_oflow.c create mode 100644 newlib/libm/common/math_err_uflow.c create mode 100644 newlib/libm/common/math_err_with_errno.c create mode 100644 newlib/libm/common/math_err_xflow.c create mode 100644 newlib/libm/common/math_errf_divzerof.c create mode 100644 newlib/libm/common/math_errf_invalidf.c rename newlib/libm/common/{math_errf.c => math_errf_may_uflowf.c} (66%) create mode 100644 newlib/libm/common/math_errf_oflowf.c create mode 100644 newlib/libm/common/math_errf_uflowf.c create mode 100644 newlib/libm/common/math_errf_with_errnof.c create mode 100644 newlib/libm/common/math_errf_xflowf.c diff --git a/newlib/libm/common/Makefile.am b/newlib/libm/common/Makefile.am index 1eef0236a..5f0d96258 100644 --- a/newlib/libm/common/Makefile.am +++ b/newlib/libm/common/Makefile.am @@ -13,7 +13,11 @@ src = s_finite.c s_copysign.c s_modf.c s_scalbn.c \ s_lrint.c s_llrint.c \ s_lround.c s_llround.c s_nearbyint.c s_remquo.c s_round.c s_scalbln.c \ s_signbit.c s_trunc.c \ - exp.c exp2.c exp_data.c math_err.c log.c log_data.c log2.c log2_data.c \ + exp.c exp2.c exp_data.c \ + math_err_with_errno.c math_err_xflow.c math_err_uflow.c \ + math_err_oflow.c math_err_divzero.c math_err_invalid.c \ + math_err_may_uflow.c math_err_check_uflow.c math_err_check_oflow.c \ + log.c log_data.c log2.c log2_data.c \ pow.c pow_log_data.c fsrc = sf_finite.c sf_copysign.c sf_modf.c sf_scalbn.c \ @@ -27,7 +31,10 @@ fsrc = sf_finite.c sf_copysign.c sf_modf.c sf_scalbn.c \ sf_scalbln.c sf_trunc.c \ sf_exp.c sf_exp2.c sf_exp2_data.c sf_log.c sf_log_data.c \ sf_log2.c sf_log2_data.c sf_pow_log2_data.c sf_pow.c \ - sinf.c cosf.c sincosf.c sincosf_data.c math_errf.c + sinf.c cosf.c sincosf.c sincosf_data.c \ + math_errf_with_errnof.c math_errf_xflowf.c math_errf_uflowf.c \ + math_errf_may_uflowf.c math_errf_oflowf.c math_errf_divzerof.c \ + math_errf_invalidf.c lsrc = atanl.c cosl.c sinl.c tanl.c tanhl.c frexpl.c modfl.c ceill.c fabsl.c \ floorl.c log1pl.c expm1l.c acosl.c asinl.c atan2l.c coshl.c sinhl.c \ diff --git a/newlib/libm/common/math_config.h b/newlib/libm/common/math_config.h index 1a2d0f639..97f4b4d2c 100644 --- a/newlib/libm/common/math_config.h +++ b/newlib/libm/common/math_config.h @@ -417,4 +417,21 @@ extern const struct pow_log_data struct {double invc, pad, logc, logctail;} tab[1 << POW_LOG_TABLE_BITS]; } __pow_log_data HIDDEN; +#if WANT_ERRNO +HIDDEN double +__math_with_errno (double y, int e); + +HIDDEN float +__math_with_errnof (float y, int e); +#else +#define __math_with_errno(x, e) (x) +#define __math_with_errnof(x, e) (x) +#endif + +HIDDEN double +__math_xflow (uint32_t sign, double y); + +HIDDEN float +__math_xflowf (uint32_t sign, float y); + #endif diff --git a/newlib/libm/common/math_err_check_oflow.c b/newlib/libm/common/math_err_check_oflow.c new file mode 100644 index 000000000..27afe41cb --- /dev/null +++ b/newlib/libm/common/math_err_check_oflow.c @@ -0,0 +1,37 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +/* Check result and set errno if necessary. */ + +HIDDEN double +__math_check_oflow (double y) +{ + return isinf (y) ? __math_with_errno (y, ERANGE) : y; +} diff --git a/newlib/libm/common/math_err_check_uflow.c b/newlib/libm/common/math_err_check_uflow.c new file mode 100644 index 000000000..c61d12f4a --- /dev/null +++ b/newlib/libm/common/math_err_check_uflow.c @@ -0,0 +1,37 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +/* Check result and set errno if necessary. */ + +HIDDEN double +__math_check_uflow (double y) +{ + return y == 0.0 ? __math_with_errno (y, ERANGE) : y; +} diff --git a/newlib/libm/common/math_err_divzero.c b/newlib/libm/common/math_err_divzero.c new file mode 100644 index 000000000..6ca5f845d --- /dev/null +++ b/newlib/libm/common/math_err_divzero.c @@ -0,0 +1,36 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +HIDDEN double +__math_divzero (uint32_t sign) +{ + double y = opt_barrier_double (sign ? -1.0 : 1.0) / 0.0; + return __math_with_errno (y, ERANGE); +} diff --git a/newlib/libm/common/math_err_invalid.c b/newlib/libm/common/math_err_invalid.c new file mode 100644 index 000000000..2f2dc299f --- /dev/null +++ b/newlib/libm/common/math_err_invalid.c @@ -0,0 +1,36 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +HIDDEN double +__math_invalid (double x) +{ + double y = (x - x) / (x - x); + return isnan (x) ? y : __math_with_errno (y, EDOM); +} diff --git a/newlib/libm/common/math_err.c b/newlib/libm/common/math_err_may_uflow.c similarity index 60% rename from newlib/libm/common/math_err.c rename to newlib/libm/common/math_err_may_uflow.c index 6eb77c8da..1eaefcdba 100644 --- a/newlib/libm/common/math_err.c +++ b/newlib/libm/common/math_err_may_uflow.c @@ -28,74 +28,12 @@ #include "math_config.h" -#if WANT_ERRNO -#include -/* NOINLINE reduces code size and avoids making math functions non-leaf - when the error handling is inlined. */ -NOINLINE static double -with_errno (double y, int e) -{ - errno = e; - return y; -} -#else -#define with_errno(x, e) (x) -#endif - -/* NOINLINE reduces code size. */ -NOINLINE static double -xflow (uint32_t sign, double y) -{ - y = opt_barrier_double (sign ? -y : y) * y; - return with_errno (y, ERANGE); -} - -HIDDEN double -__math_uflow (uint32_t sign) -{ - return xflow (sign, 0x1p-767); -} - #if WANT_ERRNO_UFLOW /* Underflows to zero in some non-nearest rounding mode, setting errno is valid even if the result is non-zero, but in the subnormal range. */ HIDDEN double __math_may_uflow (uint32_t sign) { - return xflow (sign, 0x1.8p-538); + return __math_xflow (sign, 0x1.8p-538); } #endif - -HIDDEN double -__math_oflow (uint32_t sign) -{ - return xflow (sign, 0x1p769); -} - -HIDDEN double -__math_divzero (uint32_t sign) -{ - double y = opt_barrier_double (sign ? -1.0 : 1.0) / 0.0; - return with_errno (y, ERANGE); -} - -HIDDEN double -__math_invalid (double x) -{ - double y = (x - x) / (x - x); - return isnan (x) ? y : with_errno (y, EDOM); -} - -/* Check result and set errno if necessary. */ - -HIDDEN double -__math_check_uflow (double y) -{ - return y == 0.0 ? with_errno (y, ERANGE) : y; -} - -HIDDEN double -__math_check_oflow (double y) -{ - return isinf (y) ? with_errno (y, ERANGE) : y; -} diff --git a/newlib/libm/common/math_err_oflow.c b/newlib/libm/common/math_err_oflow.c new file mode 100644 index 000000000..667e9a0e8 --- /dev/null +++ b/newlib/libm/common/math_err_oflow.c @@ -0,0 +1,35 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +HIDDEN double +__math_oflow (uint32_t sign) +{ + return __math_xflow (sign, 0x1p769); +} diff --git a/newlib/libm/common/math_err_uflow.c b/newlib/libm/common/math_err_uflow.c new file mode 100644 index 000000000..7c4fe5131 --- /dev/null +++ b/newlib/libm/common/math_err_uflow.c @@ -0,0 +1,35 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +HIDDEN double +__math_uflow (uint32_t sign) +{ + return __math_xflow (sign, 0x1p-767); +} diff --git a/newlib/libm/common/math_err_with_errno.c b/newlib/libm/common/math_err_with_errno.c new file mode 100644 index 000000000..fa5834880 --- /dev/null +++ b/newlib/libm/common/math_err_with_errno.c @@ -0,0 +1,41 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +#if WANT_ERRNO +#include +/* NOINLINE reduces code size and avoids making math functions non-leaf + when the error handling is inlined. */ +NOINLINE HIDDEN double +__math_with_errno (double y, int e) +{ + errno = e; + return y; +} +#endif diff --git a/newlib/libm/common/math_err_xflow.c b/newlib/libm/common/math_err_xflow.c new file mode 100644 index 000000000..50cbdf5e1 --- /dev/null +++ b/newlib/libm/common/math_err_xflow.c @@ -0,0 +1,36 @@ +/* Double-precision math error handling. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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 "math_config.h" + +HIDDEN double +__math_xflow (uint32_t sign, double y) +{ + y = opt_barrier_double (sign ? -y : y) * y; + return __math_with_errno (y, ERANGE); +} diff --git a/newlib/libm/common/math_errf_divzerof.c b/newlib/libm/common/math_errf_divzerof.c new file mode 100644 index 000000000..c5f56367d --- /dev/null +++ b/newlib/libm/common/math_errf_divzerof.c @@ -0,0 +1,39 @@ +/* Single-precision math error handling. + Copyright (c) 2017-2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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" +#include "math_config.h" + +#if !__OBSOLETE_MATH +HIDDEN float +__math_divzerof (uint32_t sign) +{ + float y = 0; + return __math_with_errnof ((sign ? -1 : 1) / y, ERANGE); +} +#endif diff --git a/newlib/libm/common/math_errf_invalidf.c b/newlib/libm/common/math_errf_invalidf.c new file mode 100644 index 000000000..cf1b70994 --- /dev/null +++ b/newlib/libm/common/math_errf_invalidf.c @@ -0,0 +1,39 @@ +/* Single-precision math error handling. + Copyright (c) 2017-2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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" +#include "math_config.h" + +#if !__OBSOLETE_MATH +HIDDEN float +__math_invalidf (float x) +{ + float y = (x - x) / (x - x); + return isnan (x) ? y : __math_with_errnof (y, EDOM); +} +#endif /* !__OBSOLETE_MATH */ diff --git a/newlib/libm/common/math_errf.c b/newlib/libm/common/math_errf_may_uflowf.c similarity index 66% rename from newlib/libm/common/math_errf.c rename to newlib/libm/common/math_errf_may_uflowf.c index 762fc2799..b863c805c 100644 --- a/newlib/libm/common/math_errf.c +++ b/newlib/libm/common/math_errf_may_uflowf.c @@ -29,64 +29,14 @@ #include "fdlibm.h" #include "math_config.h" -#if WANT_ERRNO -#include -/* NOINLINE reduces code size and avoids making math functions non-leaf - when the error handling is inlined. */ -NOINLINE static float -with_errnof (float y, int e) -{ - errno = e; - return y; -} -#else -#define with_errnof(x, e) (x) -#endif - -/* NOINLINE prevents fenv semantics breaking optimizations. */ -NOINLINE static float -xflowf (uint32_t sign, float y) -{ - y = (sign ? -y : y) * y; - return with_errnof (y, ERANGE); -} - #if !__OBSOLETE_MATH -HIDDEN float -__math_uflowf (uint32_t sign) -{ - return xflowf (sign, 0x1p-95f); -} - #if WANT_ERRNO_UFLOW /* Underflows to zero in some non-nearest rounding mode, setting errno is valid even if the result is non-zero, but in the subnormal range. */ HIDDEN float __math_may_uflowf (uint32_t sign) { - return xflowf (sign, 0x1.4p-75f); + return __math_xflowf (sign, 0x1.4p-75f); } #endif #endif /* !__OBSOLETE_MATH */ - -HIDDEN float -__math_oflowf (uint32_t sign) -{ - return xflowf (sign, 0x1p97f); -} - -#if !__OBSOLETE_MATH -HIDDEN float -__math_divzerof (uint32_t sign) -{ - float y = 0; - return with_errnof ((sign ? -1 : 1) / y, ERANGE); -} - -HIDDEN float -__math_invalidf (float x) -{ - float y = (x - x) / (x - x); - return isnan (x) ? y : with_errnof (y, EDOM); -} -#endif /* !__OBSOLETE_MATH */ diff --git a/newlib/libm/common/math_errf_oflowf.c b/newlib/libm/common/math_errf_oflowf.c new file mode 100644 index 000000000..71360fbf6 --- /dev/null +++ b/newlib/libm/common/math_errf_oflowf.c @@ -0,0 +1,36 @@ +/* Single-precision math error handling. + Copyright (c) 2017-2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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" +#include "math_config.h" + +HIDDEN float +__math_oflowf (uint32_t sign) +{ + return __math_xflowf (sign, 0x1p97f); +} diff --git a/newlib/libm/common/math_errf_uflowf.c b/newlib/libm/common/math_errf_uflowf.c new file mode 100644 index 000000000..c4876e55d --- /dev/null +++ b/newlib/libm/common/math_errf_uflowf.c @@ -0,0 +1,38 @@ +/* Single-precision math error handling. + Copyright (c) 2017-2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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" +#include "math_config.h" + +#if !__OBSOLETE_MATH +HIDDEN float +__math_uflowf (uint32_t sign) +{ + return __math_xflowf (sign, 0x1p-95f); +} +#endif diff --git a/newlib/libm/common/math_errf_with_errnof.c b/newlib/libm/common/math_errf_with_errnof.c new file mode 100644 index 000000000..9c0fa06cf --- /dev/null +++ b/newlib/libm/common/math_errf_with_errnof.c @@ -0,0 +1,41 @@ +/* Single-precision math error handling. + Copyright (c) 2017-2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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" +#include "math_config.h" + +#if WANT_ERRNO +#include +HIDDEN float +__math_with_errnof (float y, int e) +{ + errno = e; + return y; +} +#endif + diff --git a/newlib/libm/common/math_errf_xflowf.c b/newlib/libm/common/math_errf_xflowf.c new file mode 100644 index 000000000..88d593adb --- /dev/null +++ b/newlib/libm/common/math_errf_xflowf.c @@ -0,0 +1,38 @@ +/* Single-precision math error handling. + Copyright (c) 2017-2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + 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" +#include "math_config.h" + +/* NOINLINE prevents fenv semantics breaking optimizations. */ +HIDDEN float +__math_xflowf (uint32_t sign, float y) +{ + y = (sign ? -y : y) * y; + return __math_with_errnof (y, ERANGE); +} -- 2.23.0.rc1