Hi tech@, Dear miod@, Dear kettenis@, On arm the lib/libm/rint regress test is failing. After adding some printf debugging into libm it turns out that the problem is the cast from double to long long. http://bluhm.genua.de/regress/results/2022-07-12T04%3A17%3A03Z/logs/lib/libm/rint/make.log:
==== run-regress-rint ==== cc -O2 -pipe -MD -MP -c /usr/src/regress/lib/libm/rint/rint.c cc -o rint rint.o -lm ./rint assertion "llrintf(4503599627370496.0F) == 4503599627370496LL" failed: file "/usr/src/regress/lib/libm/rint/rint.c", line 51, function "main" *** Signal SIGABRT in . (<bsd.regress.mk>:36 'run-regress-rint') FAILED After discussing this with kettenis@, he suggested copying the ieee754 implementations from NetBSD. The only modification I find worth mentioning is in fixdfdi.c: if (exp >= 63) the original code checked for 62, but this fails the regression test too: assertion "llrint(0x7ffffffffffffc00.0p0) == 0x7ffffffffffffc00LL" failed: file "/usr/src/regress/lib/libm/rint/rint.c", line 55, function "main" Any thoughts on this? mbuhl Index: lib/libc/arch/arm/quad/fixdfdi.c =================================================================== RCS file: lib/libc/arch/arm/quad/fixdfdi.c diff -N lib/libc/arch/arm/quad/fixdfdi.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libc/arch/arm/quad/fixdfdi.c 15 Jul 2022 10:57:41 -0000 @@ -0,0 +1,83 @@ +/* $OpenBSD$ */ +/* $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 <sys/cdefs.h> +#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 <limits.h> +#include <stdbool.h> +#include <machine/ieee.h> + +/* + * 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 >= 63) + 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; +} Index: lib/libc/arch/arm/quad/fixsfdi.c =================================================================== RCS file: lib/libc/arch/arm/quad/fixsfdi.c diff -N lib/libc/arch/arm/quad/fixsfdi.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libc/arch/arm/quad/fixsfdi.c 15 Jul 2022 10:56:06 -0000 @@ -0,0 +1,76 @@ +/* $OpenBSD$ */ +/* $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 <sys/cdefs.h> +#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 <limits.h> +#include <stdbool.h> +#include <machine/ieee.h> + +/* + * 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; +} Index: lib/libc/arch/arm/quad/fixunsdfdi.c =================================================================== RCS file: lib/libc/arch/arm/quad/fixunsdfdi.c diff -N lib/libc/arch/arm/quad/fixunsdfdi.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libc/arch/arm/quad/fixunsdfdi.c 15 Jul 2022 10:56:06 -0000 @@ -0,0 +1,86 @@ +/* $OpenBSD$ */ +/* $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 <sys/cdefs.h> +#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 <limits.h> +#include <machine/ieee.h> + +/* + * 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; +} Index: lib/libc/arch/arm/quad/fixunssfdi.c =================================================================== RCS file: lib/libc/arch/arm/quad/fixunssfdi.c diff -N lib/libc/arch/arm/quad/fixunssfdi.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libc/arch/arm/quad/fixunssfdi.c 15 Jul 2022 10:56:06 -0000 @@ -0,0 +1,78 @@ +/* $OpenBSD$ */ +/* $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 <sys/cdefs.h> +#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 <limits.h> +#include <machine/ieee.h> + +/* + * 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; +}