From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2134) id A15E63858CD1; Wed, 20 Dec 2023 21:54:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A15E63858CD1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1703109272; bh=icwMtkAj8D7/qMOLLTHkDxm35Gvx4UF96u3KqHtMVkQ=; h=From:To:Subject:Date:From; b=Xc2CQyG3oqyMcpngbPAMphhhLV74+spybpik46Zt6XOghVG2YnpGkaMM2UhXzb9tb 2W06DIj1dR8eIrvH8yetF8sL1KspTsfiBT2O9cpCdwXHgYaJ/2N+gJUDb6NN52uglN N2N+uLWqoh+FVWawcFksxbImd5oQGvmYwYtuROwc= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Jeff Johnston To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] newlib: Fix long double for unsupported rounding modes and exceptions X-Act-Checkin: newlib-cygwin X-Git-Author: Craig Blackmore X-Git-Refname: refs/heads/master X-Git-Oldrev: b639245932726602394ddf91f60883184191a643 X-Git-Newrev: 73bce6597c3de790750b80c2b705bf20172516d4 Message-Id: <20231220215432.A15E63858CD1@sourceware.org> Date: Wed, 20 Dec 2023 21:54:32 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D73bce6597c3= de790750b80c2b705bf20172516d4 commit 73bce6597c3de790750b80c2b705bf20172516d4 Author: Craig Blackmore Date: Wed Dec 20 20:32:24 2023 +0000 newlib: Fix long double for unsupported rounding modes and exceptions =20 RISC-V newlib fails to build for soft float multilibs since long double support was enabled in: =20 commit 04798b7bb69571452d2cfc7e0b052a9bbd3b619d Author: Kito Cheng Date: Mon Dec 4 15:41:39 2023 +0800 =20 RISC-V: Support long double math =20 Long double for RISC-V is using 128 bit IEEE 754 format like Aarc= h64, so we reference AArch64 to support that. =20 The RISC-V soft floating point environment only supports the FE_TONEAREST rounding mode and does not support exceptions. Guard long double rounding and exception support with ifdefs based on the presence of the relevant rounding modes and exceptions. =20 Tested on gcc/g++ testsuite using RISC-V GNU Newlib Toolchain built by riscv-gnu-toolchain with multilibs: =20 riscv-sim/-march=3Drv32i/-mabi=3Dilp32/-mcmodel=3Dmedlow riscv-sim/-march=3Drv32iac/-mabi=3Dilp32/-mcmodel=3Dmedlow riscv-sim/-march=3Drv32im/-mabi=3Dilp32/-mcmodel=3Dmedlow riscv-sim/-march=3Drv32imac/-mabi=3Dilp32/-mcmodel=3Dmedlow riscv-sim/-march=3Drv32imafc/-mabi=3Dilp32f/-mcmodel=3Dmedlow riscv-sim/-march=3Drv64imac/-mabi=3Dlp64/-mcmodel=3Dmedlow =20 Co-authored-by: Simon Cook Diff: --- newlib/libm/ld/s_fmal.c | 14 ++++++++++++-- newlib/libm/ld/s_lrint.c | 2 ++ newlib/libm/ld/s_lround.c | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/newlib/libm/ld/s_fmal.c b/newlib/libm/ld/s_fmal.c index a379346c1..281dd685b 100644 --- a/newlib/libm/ld/s_fmal.c +++ b/newlib/libm/ld/s_fmal.c @@ -199,27 +199,37 @@ fmal(long double x, long double y, long double z) * modes other than FE_TONEAREST are painful. */ if (spread < -LDBL_MANT_DIG) { +#ifdef FE_INEXACT feraiseexcept(FE_INEXACT); +#endif +#ifdef FE_UNDERFLOW if (!isnormal(z)) feraiseexcept(FE_UNDERFLOW); +#endif switch (oround) { - case FE_TONEAREST: + default: /* FE_TONEAREST */ return (z); +#ifdef FE_TOWARDZERO case FE_TOWARDZERO: if (x > 0.0 ^ y < 0.0 ^ z < 0.0) return (z); else return (nextafterl(z, 0)); +#endif +#ifdef FE_DOWNWARD case FE_DOWNWARD: if (x > 0.0 ^ y < 0.0) return (z); else return (nextafterl(z, -INFINITY)); - default: /* FE_UPWARD */ +#endif +#ifdef FE_UPWARD + case FE_UPWARD: if (x > 0.0 ^ y < 0.0) return (nextafterl(z, INFINITY)); else return (z); +#endif } } if (spread <=3D LDBL_MANT_DIG * 2) diff --git a/newlib/libm/ld/s_lrint.c b/newlib/libm/ld/s_lrint.c index ad9b978fa..dde3cc434 100644 --- a/newlib/libm/ld/s_lrint.c +++ b/newlib/libm/ld/s_lrint.c @@ -53,8 +53,10 @@ fn(type x) =20 feholdexcept(&env); d =3D (dtype)roundit(x); +#if defined(FE_INVALID) && defined(FE_INEXACT) if (fetestexcept(FE_INVALID)) feclearexcept(FE_INEXACT); +#endif feupdateenv(&env); return (d); } diff --git a/newlib/libm/ld/s_lround.c b/newlib/libm/ld/s_lround.c index f67f9fbeb..fefafa877 100644 --- a/newlib/libm/ld/s_lround.c +++ b/newlib/libm/ld/s_lround.c @@ -64,7 +64,9 @@ fn(type x) x =3D roundit(x); return ((dtype)x); } else { +#ifdef FE_INVALID feraiseexcept(FE_INVALID); +#endif return (DTYPE_MAX); } }