From 7d412f24af4d115718e3f3ccc5e46e83cbd5ad03 Mon Sep 17 00:00:00 2001 From: mbuhl Date: Sat, 3 Sep 2022 08:26:05 +0000 Subject: [PATCH] Fix the failing libm/rint regress test by adding ieee754 implementations for the rounding functions. Input from kettenis@, OK miod@ --- lib/libc/arch/arm/quad/fixdfdi.c | 83 ++++++++++++++++++++++++++++ lib/libc/arch/arm/quad/fixsfdi.c | 76 +++++++++++++++++++++++++ lib/libc/arch/arm/quad/fixunsdfdi.c | 86 +++++++++++++++++++++++++++++ lib/libc/arch/arm/quad/fixunssfdi.c | 78 ++++++++++++++++++++++++++ 4 files changed, 323 insertions(+) create mode 100644 lib/libc/arch/arm/quad/fixdfdi.c create mode 100644 lib/libc/arch/arm/quad/fixsfdi.c create mode 100644 lib/libc/arch/arm/quad/fixunsdfdi.c create mode 100644 lib/libc/arch/arm/quad/fixunssfdi.c diff --git a/lib/libc/arch/arm/quad/fixdfdi.c b/lib/libc/arch/arm/quad/fixdfdi.c new file mode 100644 index 00000000000..de925563db9 --- /dev/null +++ b/lib/libc/arch/arm/quad/fixdfdi.c @@ -0,0 +1,83 @@ +/* $OpenBSD: fixdfdi.c,v 1.1 2022/09/03 08:26:05 mbuhl Exp $ */ +/* $NetBSD: fixdfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * 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. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 THE REGENTS OR CONTRIBUTORS 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 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fixdfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#if defined(SOFTFLOAT) || defined(__ARM_EABI__) +#include "softfloat/softfloat-for-gcc.h" +#endif + +#include "../../../quad/quad.h" +#include +#include +#include + +/* + * Convert double to signed quad. + * Not sure what to do with negative numbers---for now, anything out + * of range becomes UQUAD_MAX. + */ +quad_t +__fixdfdi(double x) +{ + struct ieee_double ux = *(struct ieee_double *)&x; + signed int exp = ux.dbl_exp - DBL_EXP_BIAS; + const bool neg = ux.dbl_sign; + quad_t r; + + if (exp > 62) + return neg ? QUAD_MIN : QUAD_MAX; + + r = 1 << DBL_FRACHBITS; /* implicit bit */ + r |= ux.dbl_frach; + exp -= DBL_FRACHBITS; + if (exp < 0) { + r >>= -exp; + } else if (exp > 0) { + r <<= DBL_FRACLBITS; + r |= ux.dbl_fracl; + exp -= DBL_FRACLBITS; + if (exp < 0) { + r >>= -exp; + } else if (exp > 0) { + r <<= exp; + } + } + return neg ? -r : r; +} diff --git a/lib/libc/arch/arm/quad/fixsfdi.c b/lib/libc/arch/arm/quad/fixsfdi.c new file mode 100644 index 00000000000..fa1135a0447 --- /dev/null +++ b/lib/libc/arch/arm/quad/fixsfdi.c @@ -0,0 +1,76 @@ +/* $OpenBSD: fixsfdi.c,v 1.1 2022/09/03 08:26:05 mbuhl Exp $ */ +/* $NetBSD: fixsfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * 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. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 THE REGENTS OR CONTRIBUTORS 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 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fixsfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#if defined(SOFTFLOAT) || defined(__ARM_EABI__) +#include "softfloat/softfloat-for-gcc.h" +#endif + +#include "../../../quad/quad.h" +#include +#include +#include + +/* + * Convert float to signed quad. + */ +quad_t +__fixsfdi(float x) +{ + struct ieee_single ux = *(struct ieee_single *)&x; + signed int exp = ux.sng_exp - SNG_EXP_BIAS; + const bool neg = ux.sng_sign; + quad_t r; + + if (exp < 0) + return 0; + if (exp > 62) + return neg ? QUAD_MIN : QUAD_MAX; + + r = 1 << SNG_FRACBITS; /* implicit bit */ + r |= ux.sng_frac; + exp -= SNG_FRACBITS; + if (exp < 0) { + r >>= -exp; + } else if (exp > 0) { + r <<= exp; + } + return neg ? -r : r; +} diff --git a/lib/libc/arch/arm/quad/fixunsdfdi.c b/lib/libc/arch/arm/quad/fixunsdfdi.c new file mode 100644 index 00000000000..d801fba0c58 --- /dev/null +++ b/lib/libc/arch/arm/quad/fixunsdfdi.c @@ -0,0 +1,86 @@ +/* $OpenBSD: fixunsdfdi.c,v 1.1 2022/09/03 08:26:05 mbuhl Exp $ */ +/* $NetBSD: fixunsdfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * 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. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 THE REGENTS OR CONTRIBUTORS 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 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fixunsdfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#if defined(SOFTFLOAT) || defined(__ARM_EABI__) +#include "softfloat/softfloat-for-gcc.h" +#endif + +#include "../../../quad/quad.h" +#include +#include + +/* + * Convert double to unsigned quad. + * Not sure what to do with negative numbers---for now, anything out + * of range becomes UQUAD_MAX. + */ +u_quad_t +__fixunsdfdi(double x) +{ + struct ieee_double ux = *(struct ieee_double *)&x; + signed int exp = ux.dbl_exp - DBL_EXP_BIAS; + u_quad_t r; + + if (ux.dbl_sign) + return UQUAD_MAX; + if (exp > 63) + return UQUAD_MAX; + if (exp < 0) + return 0; + + r = 1 << DBL_FRACHBITS; /* implicit bit */ + r |= ux.dbl_frach; + exp -= DBL_FRACHBITS; + if (exp == 0) + return r; + if (exp < 0) + return r >> -exp; + + r <<= DBL_FRACLBITS; + r |= ux.dbl_fracl; + exp -= DBL_FRACLBITS; + if (exp == 0) + return r; + if (exp < 0) + return r >> -exp; + + return r << exp; +} diff --git a/lib/libc/arch/arm/quad/fixunssfdi.c b/lib/libc/arch/arm/quad/fixunssfdi.c new file mode 100644 index 00000000000..25629cfe2ef --- /dev/null +++ b/lib/libc/arch/arm/quad/fixunssfdi.c @@ -0,0 +1,78 @@ +/* $OpenBSD: fixunssfdi.c,v 1.1 2022/09/03 08:26:05 mbuhl Exp $ */ +/* $NetBSD: fixunssfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * 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. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 THE REGENTS OR CONTRIBUTORS 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 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fixunssfdi_ieee754.c,v 1.1 2013/08/24 00:51:48 matt Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#if defined(SOFTFLOAT) || defined(__ARM_EABI__) +#include "softfloat/softfloat-for-gcc.h" +#endif + +#include "../../../quad/quad.h" +#include +#include + +/* + * Convert float to unsigned quad. + * Not sure what to do with negative numbers---for now, anything out + * of range becomes UQUAD_MAX. + */ +u_quad_t +__fixunssfdi(float x) +{ + struct ieee_single ux = *(struct ieee_single *)&x; + signed int exp = ux.sng_exp - SNG_EXP_BIAS; + u_quad_t r; + + if (ux.sng_sign) + return UQUAD_MAX; + if (exp > 63) + return UQUAD_MAX; + if (exp < 0) + return 0; + + r = 1 << SNG_FRACBITS; /* implicit bit */ + r |= ux.sng_frac; + exp -= SNG_FRACBITS; + if (exp == 0) + return r; + if (exp < 0) + return r >> -exp; + + return r << exp; +} -- 2.20.1