Re: [PATCH] libm/common: Split math_err.c and math_errf.c into per-function files
Jeff Johnston <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <CAOox84tF3_oPse=p0BiNva9HAa-BPnx17bfdeTJ2p_gmjn=0-A@mail.gmail.com> |
Hi Keith, I am fine with the patch. Could you please resend the git formatted patch as an attachment? Thanks, -- Jeff J. On Tue, Aug 13, 2019 at 7:20 PM Keith Packard <[email protected]> wrote: > 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 <[email protected]> > --- > 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 <errno.h> > -/* 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 <errno.h> > +/* 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 <errno.h> > -/* 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 <errno.h> > +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 > >