From 190f166df85b5d9bbcb18afd7b65fe1b96301bb1 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Wed, 5 Feb 2025 09:21:09 +0100 Subject: [PATCH] glibc: 2.40-66 -> 2.42-47 Announcements: * https://lists.gnu.org/archive/html/info-gnu/2025-01/msg00014.html * https://lists.gnu.org/archive/html/info-gnu/2025-07/msg00011.html --- ...l-usage-of-BASH-or-BASH-in-installed.patch | 38 +- .../libraries/glibc/2.40-master.patch | 43310 ---------------- .../libraries/glibc/2.42-master.patch | 5372 ++ pkgs/development/libraries/glibc/common.nix | 23 +- 4 files changed, 5398 insertions(+), 43345 deletions(-) delete mode 100644 pkgs/development/libraries/glibc/2.40-master.patch create mode 100644 pkgs/development/libraries/glibc/2.42-master.patch diff --git a/pkgs/development/libraries/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch b/pkgs/development/libraries/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch index 100bf31c3b00..25cb329e086e 100644 --- a/pkgs/development/libraries/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch +++ b/pkgs/development/libraries/glibc/0001-Revert-Remove-all-usage-of-BASH-or-BASH-in-installed.patch @@ -1,4 +1,4 @@ -From e207c3dbcff1d3d09c60eec99b6fec2a698b01bd Mon Sep 17 00:00:00 2001 +From c1c36f73aa3085a856c7cf36d69c21d18d3ef5ac Mon Sep 17 00:00:00 2001 From: Bernardo Meurer Date: Fri, 22 Jul 2022 22:11:07 -0700 Subject: [PATCH] Revert "Remove all usage of @BASH@ or ${BASH} in installed @@ -22,10 +22,10 @@ Co-authored-by: Maximilian Bosch 8 files changed, 15 insertions(+), 10 deletions(-) diff --git a/debug/Makefile b/debug/Makefile -index 3903cc97a3..b041acca71 100644 +index 6a05205ce6..dd63b16ae8 100644 --- a/debug/Makefile +++ b/debug/Makefile -@@ -343,8 +343,9 @@ $(objpfx)pcprofiledump: $(objpfx)pcprofiledump.o +@@ -345,8 +345,9 @@ $(objpfx)pcprofiledump: $(objpfx)pcprofiledump.o $(objpfx)xtrace: xtrace.sh rm -f $@.new @@ -38,20 +38,20 @@ index 3903cc97a3..b041acca71 100644 && rm -f $@ && mv $@.new $@ && chmod +x $@ diff --git a/debug/xtrace.sh b/debug/xtrace.sh -index 77ec1d84df..5614404a71 100755 +index 00bafd33db..d0f9fca9a9 100755 --- a/debug/xtrace.sh +++ b/debug/xtrace.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#! @BASH@ - # Copyright (C) 1999-2024 Free Software Foundation, Inc. + # Copyright (C) 1999-2025 Free Software Foundation, Inc. # This file is part of the GNU C Library. diff --git a/elf/Makefile b/elf/Makefile -index 5d78b659ce..a2145d7b64 100644 +index 4b1d0d8741..bbcf688c99 100644 --- a/elf/Makefile +++ b/elf/Makefile -@@ -249,7 +249,8 @@ $(objpfx)sotruss-lib.so: $(common-objpfx)libc.so $(objpfx)ld.so \ +@@ -250,7 +250,8 @@ $(objpfx)sotruss-lib.so: $(common-objpfx)libc.so $(objpfx)ld.so \ $(common-objpfx)libc_nonshared.a $(objpfx)sotruss: sotruss.sh $(common-objpfx)config.make @@ -61,7 +61,7 @@ index 5d78b659ce..a2145d7b64 100644 -e 's%@TEXTDOMAINDIR@%$(localedir)%g' \ -e 's%@PREFIX@%$(prefix)%g' \ -e 's|@PKGVERSION@|$(PKGVERSION)|g' \ -@@ -1392,6 +1393,7 @@ ldd-rewrite = -e 's%@RTLD@%$(rtlddir)/$(rtld-installed-name)%g' \ +@@ -1556,6 +1557,7 @@ ldd-rewrite = -e 's%@RTLD@%$(rtlddir)/$(rtld-installed-name)%g' \ -e 's%@VERSION@%$(version)%g' \ -e 's|@PKGVERSION@|$(PKGVERSION)|g' \ -e 's|@REPORT_BUGS_TO@|$(REPORT_BUGS_TO)|g' \ @@ -70,30 +70,30 @@ index 5d78b659ce..a2145d7b64 100644 ifeq ($(ldd-rewrite-script),no) diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in -index d6b640df66..46111670cd 100644 +index 2d3df6e57e..0faf83dc86 100644 --- a/elf/ldd.bash.in +++ b/elf/ldd.bash.in @@ -1,4 +1,4 @@ -#!/bin/bash +#! @BASH@ - # Copyright (C) 1996-2024 Free Software Foundation, Inc. + # Copyright (C) 1996-2025 Free Software Foundation, Inc. # This file is part of the GNU C Library. diff --git a/elf/sotruss.sh b/elf/sotruss.sh -index ac1a83984e..2bf17c518e 100755 +index 8944645df9..1c36981b22 100755 --- a/elf/sotruss.sh +++ b/elf/sotruss.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#! @BASH@ - # Copyright (C) 2011-2024 Free Software Foundation, Inc. + # Copyright (C) 2011-2025 Free Software Foundation, Inc. # This file is part of the GNU C Library. diff --git a/malloc/Makefile b/malloc/Makefile -index c83ade5f10..8dd9174b79 100644 +index e2b2c1ae1b..67a399f1dd 100644 --- a/malloc/Makefile +++ b/malloc/Makefile -@@ -312,8 +312,9 @@ $(objpfx)mtrace: mtrace.pl +@@ -359,8 +359,9 @@ $(objpfx)mtrace: mtrace.pl $(objpfx)memusage: memusage.sh rm -f $@.new @@ -106,20 +106,20 @@ index c83ade5f10..8dd9174b79 100644 && rm -f $@ && mv $@.new $@ && chmod +x $@ diff --git a/malloc/memusage.sh b/malloc/memusage.sh -index d2d9d17ea8..2e7efc9049 100755 +index 8ae435d2f8..c929d16af7 100755 --- a/malloc/memusage.sh +++ b/malloc/memusage.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#! @BASH@ - # Copyright (C) 1999-2024 Free Software Foundation, Inc. + # Copyright (C) 1999-2025 Free Software Foundation, Inc. # This file is part of the GNU C Library. diff --git a/timezone/Makefile b/timezone/Makefile -index d7acb387ba..c8e203ea3a 100644 +index ebe5cf73a1..e9cf92861c 100644 --- a/timezone/Makefile +++ b/timezone/Makefile -@@ -132,7 +132,8 @@ $(testdata)/XT5: testdata/gen-XT5.sh +@@ -139,7 +139,8 @@ $(testdata)/XT5: testdata/gen-XT5.sh mv $@.tmp $@ $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make @@ -130,5 +130,5 @@ index d7acb387ba..c8e203ea3a 100644 -e '/PKGVERSION=/s|=.*|="$(PKGVERSION)"|' \ -e '/REPORT_BUGS_TO=/s|=.*|="$(REPORT_BUGS_TO)"|' \ -- -2.42.0 +2.47.2 diff --git a/pkgs/development/libraries/glibc/2.40-master.patch b/pkgs/development/libraries/glibc/2.40-master.patch deleted file mode 100644 index 3384de16dc3b..000000000000 --- a/pkgs/development/libraries/glibc/2.40-master.patch +++ /dev/null @@ -1,43310 +0,0 @@ -commit 6daa77104520ca992a9369bd01cccd4d98c82984 -Author: Andreas K. Hüttel -Date: Sun Jul 21 19:02:10 2024 +0200 - - Replace advisories directory - - Signed-off-by: Andreas K. Hüttel - -diff --git a/advisories/GLIBC-SA-2023-0001 b/advisories/GLIBC-SA-2023-0001 -deleted file mode 100644 -index 3d19c91b6a..0000000000 ---- a/advisories/GLIBC-SA-2023-0001 -+++ /dev/null -@@ -1,14 +0,0 @@ --printf: incorrect output for integers with thousands separator and width field -- --When the printf family of functions is called with a format specifier --that uses an (enable grouping) and a minimum width --specifier, the resulting output could be larger than reasonably expected --by a caller that computed a tight bound on the buffer size. The --resulting larger than expected output could result in a buffer overflow --in the printf family of functions. -- --CVE-Id: CVE-2023-25139 --Public-Date: 2023-02-02 --Vulnerable-Commit: e88b9f0e5cc50cab57a299dc7efe1a4eb385161d (2.37) --Fix-Commit: c980549cc6a1c03c23cc2fe3e7b0fe626a0364b0 (2.38) --Fix-Commit: 07b9521fc6369d000216b96562ff7c0ed32a16c4 (2.37-4) -diff --git a/advisories/GLIBC-SA-2023-0002 b/advisories/GLIBC-SA-2023-0002 -deleted file mode 100644 -index 5122669a64..0000000000 ---- a/advisories/GLIBC-SA-2023-0002 -+++ /dev/null -@@ -1,15 +0,0 @@ --getaddrinfo: Stack read overflow in no-aaaa mode -- --If the system is configured in no-aaaa mode via /etc/resolv.conf, --getaddrinfo is called for the AF_UNSPEC address family, and a DNS --response is received over TCP that is larger than 2048 bytes, --getaddrinfo may potentially disclose stack contents via the returned --address data, or crash. -- --CVE-Id: CVE-2023-4527 --Public-Date: 2023-09-12 --Vulnerable-Commit: f282cdbe7f436c75864e5640a409a10485e9abb2 (2.36) --Fix-Commit: bd77dd7e73e3530203be1c52c8a29d08270cb25d (2.39) --Fix-Commit: 4ea972b7edd7e36610e8cde18bf7a8149d7bac4f (2.36-113) --Fix-Commit: b7529346025a130fee483d42178b5c118da971bb (2.37-38) --Fix-Commit: b25508dd774b617f99419bdc3cf2ace4560cd2d6 (2.38-19) -diff --git a/advisories/GLIBC-SA-2023-0003 b/advisories/GLIBC-SA-2023-0003 -deleted file mode 100644 -index d3aef80348..0000000000 ---- a/advisories/GLIBC-SA-2023-0003 -+++ /dev/null -@@ -1,15 +0,0 @@ --getaddrinfo: Potential use-after-free -- --When an NSS plugin only implements the _gethostbyname2_r and --_getcanonname_r callbacks, getaddrinfo could use memory that was freed --during buffer resizing, potentially causing a crash or read or write to --arbitrary memory. -- --CVE-Id: CVE-2023-4806 --Public-Date: 2023-09-12 --Fix-Commit: 973fe93a5675c42798b2161c6f29c01b0e243994 (2.39) --Fix-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) --Fix-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) --Fix-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) --Fix-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) --Fix-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) -diff --git a/advisories/GLIBC-SA-2023-0004 b/advisories/GLIBC-SA-2023-0004 -deleted file mode 100644 -index 5286a7aa54..0000000000 ---- a/advisories/GLIBC-SA-2023-0004 -+++ /dev/null -@@ -1,16 +0,0 @@ --tunables: local privilege escalation through buffer overflow -- --If a tunable of the form NAME=NAME=VAL is passed in the environment of a --setuid program and NAME is valid, it may result in a buffer overflow, --which could be exploited to achieve escalated privileges. This flaw was --introduced in glibc 2.34. -- --CVE-Id: CVE-2023-4911 --Public-Date: 2023-10-03 --Vulnerable-Commit: 2ed18c5b534d9e92fc006202a5af0df6b72e7aca (2.34) --Fix-Commit: 1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa (2.39) --Fix-Commit: dcc367f148bc92e7f3778a125f7a416b093964d9 (2.34-423) --Fix-Commit: c84018a05aec80f5ee6f682db0da1130b0196aef (2.35-274) --Fix-Commit: 22955ad85186ee05834e47e665056148ca07699c (2.36-118) --Fix-Commit: b4e23c75aea756b4bddc4abcf27a1c6dca8b6bd3 (2.37-45) --Fix-Commit: 750a45a783906a19591fb8ff6b7841470f1f5701 (2.38-27) -diff --git a/advisories/GLIBC-SA-2023-0005 b/advisories/GLIBC-SA-2023-0005 -deleted file mode 100644 -index cc4eb90b82..0000000000 ---- a/advisories/GLIBC-SA-2023-0005 -+++ /dev/null -@@ -1,18 +0,0 @@ --getaddrinfo: DoS due to memory leak -- --The fix for CVE-2023-4806 introduced a memory leak when an application --calls getaddrinfo for AF_INET6 with AI_CANONNAME, AI_ALL and AI_V4MAPPED --flags set. -- --CVE-Id: CVE-2023-5156 --Public-Date: 2023-09-25 --Vulnerable-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) --Vulnerable-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) --Vulnerable-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) --Vulnerable-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) --Vulnerable-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) --Fix-Commit: 8006457ab7e1cd556b919f477348a96fe88f2e49 (2.34-421) --Fix-Commit: 17092c0311f954e6f3c010f73ce3a78c24ac279a (2.35-272) --Fix-Commit: 856bac55f98dc840e7c27cfa82262b933385de90 (2.36-116) --Fix-Commit: 4473d1b87d04b25cdd0e0354814eeaa421328268 (2.37-42) --Fix-Commit: 5ee59ca371b99984232d7584fe2b1a758b4421d3 (2.38-24) -diff --git a/advisories/GLIBC-SA-2024-0001 b/advisories/GLIBC-SA-2024-0001 -deleted file mode 100644 -index 28931c75ae..0000000000 ---- a/advisories/GLIBC-SA-2024-0001 -+++ /dev/null -@@ -1,15 +0,0 @@ --syslog: Heap buffer overflow in __vsyslog_internal -- --__vsyslog_internal did not handle a case where printing a SYSLOG_HEADER --containing a long program name failed to update the required buffer --size, leading to the allocation and overflow of a too-small buffer on --the heap. -- --CVE-Id: CVE-2023-6246 --Public-Date: 2024-01-30 --Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) --Fix-Commit: 6bd0e4efcc78f3c0115e5ea9739a1642807450da (2.39) --Fix-Commit: 23514c72b780f3da097ecf33a793b7ba9c2070d2 (2.38-42) --Fix-Commit: 97a4292aa4a2642e251472b878d0ec4c46a0e59a (2.37-57) --Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) --Fix-Commit: d1a83b6767f68b3cb5b4b4ea2617254acd040c82 (2.36-126) -diff --git a/advisories/GLIBC-SA-2024-0002 b/advisories/GLIBC-SA-2024-0002 -deleted file mode 100644 -index 940bfcf2fc..0000000000 ---- a/advisories/GLIBC-SA-2024-0002 -+++ /dev/null -@@ -1,15 +0,0 @@ --syslog: Heap buffer overflow in __vsyslog_internal -- --__vsyslog_internal used the return value of snprintf/vsnprintf to --calculate buffer sizes for memory allocation. If these functions (for --any reason) failed and returned -1, the resulting buffer would be too --small to hold output. -- --CVE-Id: CVE-2023-6779 --Public-Date: 2024-01-30 --Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) --Fix-Commit: 7e5a0c286da33159d47d0122007aac016f3e02cd (2.39) --Fix-Commit: d0338312aace5bbfef85e03055e1212dd0e49578 (2.38-43) --Fix-Commit: 67062eccd9a65d7fda9976a56aeaaf6c25a80214 (2.37-58) --Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) --Fix-Commit: 2bc9d7c002bdac38b5c2a3f11b78e309d7765b83 (2.36-127) -diff --git a/advisories/GLIBC-SA-2024-0003 b/advisories/GLIBC-SA-2024-0003 -deleted file mode 100644 -index b43a5150ab..0000000000 ---- a/advisories/GLIBC-SA-2024-0003 -+++ /dev/null -@@ -1,13 +0,0 @@ --syslog: Integer overflow in __vsyslog_internal -- --__vsyslog_internal calculated a buffer size by adding two integers, but --did not first check if the addition would overflow. -- --CVE-Id: CVE-2023-6780 --Public-Date: 2024-01-30 --Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) --Fix-Commit: ddf542da94caf97ff43cc2875c88749880b7259b (2.39) --Fix-Commit: d37c2b20a4787463d192b32041c3406c2bd91de0 (2.38-44) --Fix-Commit: 2b58cba076e912961ceaa5fa58588e4b10f791c0 (2.37-59) --Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) --Fix-Commit: b9b7d6a27aa0632f334352fa400771115b3c69b7 (2.36-128) -diff --git a/advisories/GLIBC-SA-2024-0004 b/advisories/GLIBC-SA-2024-0004 -deleted file mode 100644 -index 08df2b3118..0000000000 ---- a/advisories/GLIBC-SA-2024-0004 -+++ /dev/null -@@ -1,28 +0,0 @@ --ISO-2022-CN-EXT: fix out-of-bound writes when writing escape sequence -- --The iconv() function in the GNU C Library versions 2.39 and older may --overflow the output buffer passed to it by up to 4 bytes when converting --strings to the ISO-2022-CN-EXT character set, which may be used to --crash an application or overwrite a neighbouring variable. -- --ISO-2022-CN-EXT uses escape sequences to indicate character set changes --(as specified by RFC 1922). While the SOdesignation has the expected --bounds checks, neither SS2designation nor SS3designation have its; --allowing a write overflow of 1, 2, or 3 bytes with fixed values: --'$+I', '$+J', '$+K', '$+L', '$+M', or '$*H'. -- --CVE-Id: CVE-2024-2961 --Public-Date: 2024-04-17 --Vulnerable-Commit: 755104edc75c53f4a0e7440334e944ad3c6b32fc (2.1.93-169) --Fix-Commit: f9dc609e06b1136bb0408be9605ce7973a767ada (2.40) --Fix-Commit: 31da30f23cddd36db29d5b6a1c7619361b271fb4 (2.39-31) --Fix-Commit: e1135387deded5d73924f6ca20c72a35dc8e1bda (2.38-66) --Fix-Commit: 89ce64b269a897a7780e4c73a7412016381c6ecf (2.37-89) --Fix-Commit: 4ed98540a7fd19f458287e783ae59c41e64df7b5 (2.36-164) --Fix-Commit: 36280d1ce5e245aabefb877fe4d3c6cff95dabfa (2.35-315) --Fix-Commit: a8b0561db4b9847ebfbfec20075697d5492a363c (2.34-459) --Fix-Commit: ed4f16ff6bed3037266f1fa682ebd32a18fce29c (2.33-263) --Fix-Commit: 682ad4c8623e611a971839990ceef00346289cc9 (2.32-140) --Fix-Commit: 3703c32a8d304c1ee12126134ce69be965f38000 (2.31-154) -- --Reported-By: Charles Fol -diff --git a/advisories/GLIBC-SA-2024-0005 b/advisories/GLIBC-SA-2024-0005 -deleted file mode 100644 -index a59596610a..0000000000 ---- a/advisories/GLIBC-SA-2024-0005 -+++ /dev/null -@@ -1,22 +0,0 @@ --nscd: Stack-based buffer overflow in netgroup cache -- --If the Name Service Cache Daemon's (nscd) fixed size cache is exhausted --by client requests then a subsequent client request for netgroup data --may result in a stack-based buffer overflow. This flaw was introduced --in glibc 2.15 when the cache was added to nscd. -- --This vulnerability is only present in the nscd binary. -- --CVE-Id: CVE-2024-33599 --Public-Date: 2024-04-23 --Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) --Fix-Commit: 69c58d5ef9f584ea198bd00f7964d364d0e6b921 (2.31-155) --Fix-Commit: a77064893bfe8a701770e2f53a4d33805bc47a5a (2.32-141) --Fix-Commit: 5c75001a96abcd50cbdb74df24c3f013188d076e (2.33-264) --Fix-Commit: 52f73e5c4e29b14e79167272297977f360ae1e97 (2.34-460) --Fix-Commit: 7a95873543ce225376faf13bb71c43dea6d24f86 (2.35-316) --Fix-Commit: caa3151ca460bdd9330adeedd68c3112d97bffe4 (2.36-165) --Fix-Commit: f75c298e747b2b8b41b1c2f551c011a52c41bfd1 (2.37-91) --Fix-Commit: 5968aebb86164034b8f8421b4abab2f837a5bdaf (2.38-72) --Fix-Commit: 1263d583d2e28afb8be53f8d6922f0842036f35d (2.39-35) --Fix-Commit: 87801a8fd06db1d654eea3e4f7626ff476a9bdaa (2.40) -diff --git a/advisories/GLIBC-SA-2024-0006 b/advisories/GLIBC-SA-2024-0006 -deleted file mode 100644 -index d44148d3d9..0000000000 ---- a/advisories/GLIBC-SA-2024-0006 -+++ /dev/null -@@ -1,32 +0,0 @@ --nscd: Null pointer crash after notfound response -- --If the Name Service Cache Daemon's (nscd) cache fails to add a not-found --netgroup response to the cache, the client request can result in a null --pointer dereference. This flaw was introduced in glibc 2.15 when the --cache was added to nscd. -- --This vulnerability is only present in the nscd binary. -- --CVE-Id: CVE-2024-33600 --Public-Date: 2024-04-24 --Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) --Fix-Commit: b048a482f088e53144d26a61c390bed0210f49f2 (2.40) --Fix-Commit: 7835b00dbce53c3c87bbbb1754a95fb5e58187aa (2.40) --Fix-Commit: c99f886de54446cd4447db6b44be93dabbdc2f8b (2.39-37) --Fix-Commit: 5a508e0b508c8ad53bd0d2fb48fd71b242626341 (2.39-36) --Fix-Commit: 2ae9446c1b7a3064743b4a51c0bbae668ee43e4c (2.38-74) --Fix-Commit: 541ea5172aa658c4bd5c6c6d6fd13903c3d5bb0a (2.38-73) --Fix-Commit: a8070b31043c7585c36ba68a74298c4f7af075c3 (2.37-93) --Fix-Commit: 5eea50c4402e39588de98aa1d4469a79774703d4 (2.37-92) --Fix-Commit: f205b3af56740e3b014915b1bd3b162afe3407ef (2.36-167) --Fix-Commit: c34f470a615b136170abd16142da5dd0c024f7d1 (2.36-166) --Fix-Commit: bafadc589fbe21ae330e8c2af74db9da44a17660 (2.35-318) --Fix-Commit: 4370bef52b0f3f3652c6aa13d7a9bb3ac079746d (2.35-317) --Fix-Commit: 1f94122289a9bf7dba573f5d60327aaa2b85cf2e (2.34-462) --Fix-Commit: 966d6ac9e40222b84bb21674cc4f83c8d72a5a26 (2.34-461) --Fix-Commit: e3eef1b8fbdd3a7917af466ca9c4b7477251ca79 (2.33-266) --Fix-Commit: f20a8d696b13c6261b52a6434899121f8b19d5a7 (2.33-265) --Fix-Commit: be602180146de37582a3da3a0caa4b719645de9c (2.32-143) --Fix-Commit: 394eae338199078b7961b051c191539870742d7b (2.32-142) --Fix-Commit: 8d7949183760170c61e55def723c1d8050187874 (2.31-157) --Fix-Commit: 304ce5fe466c4762b21b36c26926a4657b59b53e (2.31-156) -diff --git a/advisories/GLIBC-SA-2024-0007 b/advisories/GLIBC-SA-2024-0007 -deleted file mode 100644 -index b6928fa27a..0000000000 ---- a/advisories/GLIBC-SA-2024-0007 -+++ /dev/null -@@ -1,28 +0,0 @@ --nscd: netgroup cache may terminate daemon on memory allocation failure -- --The Name Service Cache Daemon's (nscd) netgroup cache uses xmalloc or --xrealloc and these functions may terminate the process due to a memory --allocation failure resulting in a denial of service to the clients. The --flaw was introduced in glibc 2.15 when the cache was added to nscd. -- --This vulnerability is only present in the nscd binary. -- --Subsequent refactoring of the netgroup cache only added more uses of --xmalloc and xrealloc. Uses of xmalloc and xrealloc in other parts of --nscd only occur during startup of the daemon and so are not affected by --client requests that could trigger an out of memory followed by --termination. -- --CVE-Id: CVE-2024-33601 --Public-Date: 2024-04-24 --Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) --Fix-Commit: c04a21e050d64a1193a6daab872bca2528bda44b (2.40) --Fix-Commit: a9a8d3eebb145779a18d90e3966009a1daa63cd8 (2.39-38) --Fix-Commit: 71af8ca864345d39b746d5cee84b94b430fad5db (2.38-75) --Fix-Commit: 6e106dc214d6a033a4e945d1c6cf58061f1c5f1f (2.37-94) --Fix-Commit: b6742463694b1dfdd5120b91ee21cf05d15ec2e2 (2.36-168) --Fix-Commit: 7a5864cac60e06000394128a5a2817b03542f5a3 (2.35-319) --Fix-Commit: 86f1d5f4129c373ac6fb6df5bcf38273838843cb (2.34-463) --Fix-Commit: 4d27d4b9a188786fc6a56745506cec2acfc51f83 (2.33-267) --Fix-Commit: 3ed195a8ec89da281e3c4bf887a13d281b72d8f4 (2.32-144) --Fix-Commit: bbf5a58ccb55679217f94de706164d15372fbbc0 (2.31-158) -diff --git a/advisories/GLIBC-SA-2024-0008 b/advisories/GLIBC-SA-2024-0008 -deleted file mode 100644 -index d93e2a6f0b..0000000000 ---- a/advisories/GLIBC-SA-2024-0008 -+++ /dev/null -@@ -1,26 +0,0 @@ --nscd: netgroup cache assumes NSS callback uses in-buffer strings -- --The Name Service Cache Daemon's (nscd) netgroup cache can corrupt memory --when the NSS callback does not store all strings in the provided buffer. --The flaw was introduced in glibc 2.15 when the cache was added to nscd. -- --This vulnerability is only present in the nscd binary. -- --There is no guarantee from the NSS callback API that the returned --strings are all within the buffer. However, the netgroup cache code --assumes that the NSS callback uses in-buffer strings and if it doesn't --the buffer resizing logic could lead to potential memory corruption. -- --CVE-Id: CVE-2024-33602 --Public-Date: 2024-04-24 --Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) --Fix-Commit: c04a21e050d64a1193a6daab872bca2528bda44b (2.40) --Fix-Commit: a9a8d3eebb145779a18d90e3966009a1daa63cd8 (2.39-38) --Fix-Commit: 71af8ca864345d39b746d5cee84b94b430fad5db (2.38-75) --Fix-Commit: 6e106dc214d6a033a4e945d1c6cf58061f1c5f1f (2.37-94) --Fix-Commit: b6742463694b1dfdd5120b91ee21cf05d15ec2e2 (2.36-168) --Fix-Commit: 7a5864cac60e06000394128a5a2817b03542f5a3 (2.35-319) --Fix-Commit: 86f1d5f4129c373ac6fb6df5bcf38273838843cb (2.34-463) --Fix-Commit: 4d27d4b9a188786fc6a56745506cec2acfc51f83 (2.33-267) --Fix-Commit: 3ed195a8ec89da281e3c4bf887a13d281b72d8f4 (2.32-144) --Fix-Commit: bbf5a58ccb55679217f94de706164d15372fbbc0 (2.31-158) -diff --git a/advisories/README b/advisories/README -deleted file mode 100644 -index b8f8a829ca..0000000000 ---- a/advisories/README -+++ /dev/null -@@ -1,77 +0,0 @@ --GNU C Library Security Advisory Format --====================================== -- --Security advisories in this directory follow a simple git commit log --format, with a heading and free-format description augmented with tags --to allow parsing key information. References to code changes are --specific to the glibc repository and follow a specific format: -- -- Tag-name: (release-version) -- --The indicates a specific commit in the repository. The --release-version indicates the publicly consumable release in which this --commit is known to exist. The release-version is derived from the --git-describe format, (i.e. stripped out from glibc-2.34.NNN-gxxxx) and --is of the form 2.34-NNN. If the -NNN suffix is absent, it means that --the change is in that release tarball, otherwise the change is on the --release/2.YY/master branch and not in any released tarball. -- --The following tags are currently being used: -- --CVE-Id: --This is the CVE-Id assigned under the CVE Program --(https://www.cve.org/). -- --Public-Date: --The date this issue became publicly known. -- --Vulnerable-Commit: --The commit that introduced this vulnerability. There could be multiple --entries, one for each release branch in the glibc repository; the --release-version portion of this tag should tell you which branch this is --on. -- --Fix-Commit: --The commit that fixed this vulnerability. There could be multiple --entries for each release branch in the glibc repository, indicating that --all of those commits contributed to fixing that issue in each of those --branches. -- --Reported-By: --The entity that reported this issue. There could be multiple entries, one for --each reporter. -- --Adding an Advisory -------------------- -- --An advisory for a CVE needs to be added on the master branch in two steps: -- --1. Add the text of the advisory without any Fix-Commit tags along with -- the fix for the CVE. Add the Vulnerable-Commit tag, if applicable. -- The advisories directory does not exist in release branches, so keep -- the advisory text commit distinct from the code changes, to ease -- backports. Ask for the GLIBC-SA advisory number from the security -- team. -- --2. Finish all backports on release branches and then back on the msater -- branch, add all commit refs to the advisory using the Fix-Commit -- tags. Don't bother adding the release-version subscript since the -- next step will overwrite it. -- --3. Run the process-advisories.sh script in the scripts directory on the -- advisory: -- -- scripts/process-advisories.sh update GLIBC-SA-YYYY-NNNN -- -- (replace YYYY-NNNN with the actual advisory number). -- --4. Verify the updated advisory and push the result. -- --Getting a NEWS snippet from advisories ---------------------------------------- -- --Run: -- -- scripts/process-advisories.sh news -- --and copy the content into the NEWS file. - -commit 8bbb8d7b16cae777eed06bc9d2e059fc00be24e9 -Author: Florian Weimer -Date: Wed Jul 24 12:06:47 2024 +0200 - - resolv: Allow short error responses to match any query (bug 31890) - - Reviewed-by: DJ Delorie - (cherry picked from commit 691a3b2e9bfaba842e46a5ccb7f5e6ea144c3ade) - -diff --git a/NEWS b/NEWS -index 31281ac408..66b755ed34 100644 ---- a/NEWS -+++ b/NEWS -@@ -5,6 +5,12 @@ See the end for copying conditions. - Please send GNU C library bug reports via - using `glibc' in the "product" field. - -+Version 2.41 -+ -+The following bugs are resolved with this release: -+ -+ [31890] resolv: Allow short error responses to match any DNS query -+ - Version 2.40 - - Major new features: -diff --git a/resolv/Makefile b/resolv/Makefile -index 5f44f5896b..d927e337d9 100644 ---- a/resolv/Makefile -+++ b/resolv/Makefile -@@ -106,6 +106,7 @@ tests += \ - tst-resolv-nondecimal \ - tst-resolv-res_init-multi \ - tst-resolv-search \ -+ tst-resolv-short-response \ - tst-resolv-trailing \ - - # This test calls __res_context_send directly, which is not exported -@@ -299,6 +300,8 @@ $(objpfx)tst-resolv-nondecimal: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-qtypes: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-rotate: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-search: $(objpfx)libresolv.so $(shared-thread-library) -+$(objpfx)tst-resolv-short-response: $(objpfx)libresolv.so \ -+ $(shared-thread-library) - $(objpfx)tst-resolv-trailing: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-threads: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-txnid-collision: $(objpfx)libresolv.a \ -diff --git a/resolv/res_send.c b/resolv/res_send.c -index ea7cf192b2..572e72c32f 100644 ---- a/resolv/res_send.c -+++ b/resolv/res_send.c -@@ -1199,19 +1199,30 @@ send_dg(res_state statp, - } - - /* Check for the correct header layout and a matching -- question. */ -+ question. Some recursive resolvers send REFUSED -+ without copying back the question section -+ (producing a response that is only HFIXEDSZ bytes -+ long). Skip query matching in this case. */ -+ bool thisansp_error = (anhp->rcode == SERVFAIL || -+ anhp->rcode == NOTIMP || -+ anhp->rcode == REFUSED); -+ bool skip_query_match = (*thisresplenp == HFIXEDSZ -+ && ntohs (anhp->qdcount) == 0 -+ && thisansp_error); - int matching_query = 0; /* Default to no matching query. */ - if (!recvresp1 - && anhp->id == hp->id -- && __libc_res_queriesmatch (buf, buf + buflen, -- *thisansp, -- *thisansp + *thisanssizp)) -+ && (skip_query_match -+ || __libc_res_queriesmatch (buf, buf + buflen, -+ *thisansp, -+ *thisansp + *thisanssizp))) - matching_query = 1; - if (!recvresp2 - && anhp->id == hp2->id -- && __libc_res_queriesmatch (buf2, buf2 + buflen2, -- *thisansp, -- *thisansp + *thisanssizp)) -+ && (skip_query_match -+ || __libc_res_queriesmatch (buf2, buf2 + buflen2, -+ *thisansp, -+ *thisansp + *thisanssizp))) - matching_query = 2; - if (matching_query == 0) - /* Spurious UDP packet. Drop it and continue -@@ -1221,9 +1232,7 @@ send_dg(res_state statp, - goto wait; - } - -- if (anhp->rcode == SERVFAIL || -- anhp->rcode == NOTIMP || -- anhp->rcode == REFUSED) { -+ if (thisansp_error) { - next_ns: - if (recvresp1 || (buf2 != NULL && recvresp2)) { - *resplen2 = 0; -diff --git a/resolv/tst-resolv-short-response.c b/resolv/tst-resolv-short-response.c -new file mode 100644 -index 0000000000..cf1e39876f ---- /dev/null -+++ b/resolv/tst-resolv-short-response.c -@@ -0,0 +1,112 @@ -+/* Test for spurious timeouts with short 12-byte responses (bug 31890). -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+/* The rcode in the initial response. */ -+static volatile int rcode; -+ -+static void -+response (const struct resolv_response_context *ctx, -+ struct resolv_response_builder *b, -+ const char *qname, uint16_t qclass, uint16_t qtype) -+{ -+ switch (ctx->server_index) -+ { -+ case 0: -+ /* First server times out. */ -+ struct resolv_response_flags flags = {.rcode = rcode}; -+ resolv_response_init (b, flags); -+ break; -+ case 1: -+ /* Second server sends reply. */ -+ resolv_response_init (b, (struct resolv_response_flags) {}); -+ resolv_response_add_question (b, qname, qclass, qtype); -+ resolv_response_section (b, ns_s_an); -+ resolv_response_open_record (b, qname, qclass, qtype, 0); -+ switch (qtype) -+ { -+ case T_A: -+ { -+ char ipv4[4] = {192, 0, 2, 17}; -+ resolv_response_add_data (b, &ipv4, sizeof (ipv4)); -+ } -+ break; -+ case T_AAAA: -+ { -+ char ipv6[16] -+ = {0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; -+ resolv_response_add_data (b, &ipv6, sizeof (ipv6)); -+ } -+ break; -+ default: -+ FAIL_EXIT1 ("unexpected TYPE%d query", qtype); -+ } -+ resolv_response_close_record (b); -+ break; -+ default: -+ FAIL_EXIT1 ("unexpected query to server %d", ctx->server_index); -+ } -+} -+ -+static void -+check_one (void) -+{ -+ -+ /* The buggy 1-second query timeout results in 30 seconds of delay, -+ which triggers a test timeout failure. */ -+ for (int i = 0; i < 10; ++i) -+ { -+ check_hostent ("www.example", gethostbyname ("www.example"), -+ "name: www.example\n" -+ "address: 192.0.2.17\n"); -+ check_hostent ("www.example", gethostbyname2 ("www.example", AF_INET6), -+ "name: www.example\n" -+ "address: 2001:db8::1\n"); -+ } -+} -+ -+static int -+do_test (void) -+{ -+ struct resolv_test *aux = resolv_test_start -+ ((struct resolv_redirect_config) -+ { -+ .response_callback = response, -+ }); -+ -+ _res.options |= RES_SNGLKUP; -+ -+ rcode = 2; /* SERVFAIL. */ -+ check_one (); -+ -+ rcode = 4; /* NOTIMP. */ -+ check_one (); -+ -+ rcode = 5; /* REFUSED. */ -+ check_one (); -+ -+ resolv_test_end (aux); -+ -+ return 0; -+} -+ -+#include - -commit ef141426630da0946f0af8732eddce9b9a52b2d3 -Author: Florian Weimer -Date: Wed Jul 24 12:06:47 2024 +0200 - - resolv: Do not wait for non-existing second DNS response after error (bug 30081) - - In single-request mode, there is no second response after an error - because the second query has not been sent yet. Waiting for it - introduces an unnecessary timeout. - - Reviewed-by: DJ Delorie - (cherry picked from commit af625987d619388a100b153520d3ee308bda9889) - -diff --git a/NEWS b/NEWS -index 66b755ed34..4d7100b21c 100644 ---- a/NEWS -+++ b/NEWS -@@ -9,6 +9,7 @@ Version 2.41 - - The following bugs are resolved with this release: - -+ [30081] resolv: Do not wait for non-existing second DNS response after error - [31890] resolv: Allow short error responses to match any DNS query - - Version 2.40 -diff --git a/resolv/Makefile b/resolv/Makefile -index d927e337d9..abff7fc007 100644 ---- a/resolv/Makefile -+++ b/resolv/Makefile -@@ -106,6 +106,7 @@ tests += \ - tst-resolv-nondecimal \ - tst-resolv-res_init-multi \ - tst-resolv-search \ -+ tst-resolv-semi-failure \ - tst-resolv-short-response \ - tst-resolv-trailing \ - -@@ -300,6 +301,8 @@ $(objpfx)tst-resolv-nondecimal: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-qtypes: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-rotate: $(objpfx)libresolv.so $(shared-thread-library) - $(objpfx)tst-resolv-search: $(objpfx)libresolv.so $(shared-thread-library) -+$(objpfx)tst-resolv-semi-failure: $(objpfx)libresolv.so \ -+ $(shared-thread-library) - $(objpfx)tst-resolv-short-response: $(objpfx)libresolv.so \ - $(shared-thread-library) - $(objpfx)tst-resolv-trailing: $(objpfx)libresolv.so $(shared-thread-library) -diff --git a/resolv/res_send.c b/resolv/res_send.c -index 572e72c32f..9c77613f37 100644 ---- a/resolv/res_send.c -+++ b/resolv/res_send.c -@@ -1238,7 +1238,7 @@ send_dg(res_state statp, - *resplen2 = 0; - return resplen; - } -- if (buf2 != NULL) -+ if (buf2 != NULL && !single_request) - { - /* No data from the first reply. */ - resplen = 0; -diff --git a/resolv/tst-resolv-semi-failure.c b/resolv/tst-resolv-semi-failure.c -new file mode 100644 -index 0000000000..aa9798b5a7 ---- /dev/null -+++ b/resolv/tst-resolv-semi-failure.c -@@ -0,0 +1,133 @@ -+/* Test parallel failure/success responses (bug 30081). -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+/* The rcode in the initial response. */ -+static volatile int rcode; -+ -+/* Whether to fail the initial A query (!fail_aaaa) or the initial -+ AAAA query (fail_aaaa). */ -+static volatile bool fail_aaaa; -+ -+static void -+response (const struct resolv_response_context *ctx, -+ struct resolv_response_builder *b, -+ const char *qname, uint16_t qclass, uint16_t qtype) -+{ -+ /* Handle the failing query. */ -+ if ((fail_aaaa && qtype == T_AAAA) && ctx->server_index == 0) -+ { -+ struct resolv_response_flags flags = {.rcode = rcode}; -+ resolv_response_init (b, flags); -+ return; -+ } -+ -+ /* Otherwise produce a response. */ -+ resolv_response_init (b, (struct resolv_response_flags) {}); -+ resolv_response_add_question (b, qname, qclass, qtype); -+ resolv_response_section (b, ns_s_an); -+ resolv_response_open_record (b, qname, qclass, qtype, 0); -+ switch (qtype) -+ { -+ case T_A: -+ { -+ char ipv4[4] = {192, 0, 2, 17}; -+ resolv_response_add_data (b, &ipv4, sizeof (ipv4)); -+ } -+ break; -+ case T_AAAA: -+ { -+ char ipv6[16] -+ = {0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; -+ resolv_response_add_data (b, &ipv6, sizeof (ipv6)); -+ } -+ break; -+ default: -+ FAIL_EXIT1 ("unexpected TYPE%d query", qtype); -+ } -+ resolv_response_close_record (b); -+} -+ -+static void -+check_one (void) -+{ -+ -+ /* The buggy 1-second query timeout results in 30 seconds of delay, -+ which triggers are test timeout failure. */ -+ for (int i = 0; i < 30; ++i) -+ { -+ static const struct addrinfo hints = -+ { -+ .ai_family = AF_UNSPEC, -+ .ai_socktype = SOCK_STREAM, -+ }; -+ struct addrinfo *ai; -+ int ret = getaddrinfo ("www.example", "80", &hints, &ai); -+ const char *expected; -+ if (ret == 0 && ai->ai_next != NULL) -+ expected = ("address: STREAM/TCP 192.0.2.17 80\n" -+ "address: STREAM/TCP 2001:db8::1 80\n"); -+ else -+ /* Only one response because the AAAA lookup failure is -+ treated as an ignoreable error. */ -+ expected = "address: STREAM/TCP 192.0.2.17 80\n"; -+ check_addrinfo ("www.example", ai, ret, expected); -+ if (ret == 0) -+ freeaddrinfo (ai); -+ } -+} -+ -+static int -+do_test (void) -+{ -+ for (int do_single_lookup = 0; do_single_lookup < 2; ++do_single_lookup) -+ { -+ struct resolv_test *aux = resolv_test_start -+ ((struct resolv_redirect_config) -+ { -+ .response_callback = response, -+ }); -+ -+ if (do_single_lookup) -+ _res.options |= RES_SNGLKUP; -+ -+ for (int do_fail_aaaa = 0; do_fail_aaaa < 2; ++do_fail_aaaa) -+ { -+ fail_aaaa = do_fail_aaaa; -+ -+ rcode = 2; /* SERVFAIL. */ -+ check_one (); -+ -+ rcode = 4; /* NOTIMP. */ -+ check_one (); -+ -+ rcode = 5; /* REFUSED. */ -+ check_one (); -+ } -+ -+ resolv_test_end (aux); -+ } -+ -+ return 0; -+} -+ -+#include -diff --git a/resolv/tst-resolv-short-response.c b/resolv/tst-resolv-short-response.c -index cf1e39876f..be354ae1c7 100644 ---- a/resolv/tst-resolv-short-response.c -+++ b/resolv/tst-resolv-short-response.c -@@ -81,6 +81,18 @@ check_one (void) - check_hostent ("www.example", gethostbyname2 ("www.example", AF_INET6), - "name: www.example\n" - "address: 2001:db8::1\n"); -+ static const struct addrinfo hints = -+ { -+ .ai_family = AF_UNSPEC, -+ .ai_socktype = SOCK_STREAM, -+ }; -+ struct addrinfo *ai; -+ int ret = getaddrinfo ("www.example", "80", &hints, &ai); -+ check_addrinfo ("www.example", ai, ret, -+ "address: STREAM/TCP 192.0.2.17 80\n" -+ "address: STREAM/TCP 2001:db8::1 80\n"); -+ if (ret == 0) -+ freeaddrinfo (ai); - } - } - - -commit b6aeba2de157ba0cdc8fb0aed67b632b3490f383 -Author: Florian Weimer -Date: Wed Jul 24 12:50:17 2024 +0200 - - manual: Do not mention STATIC_TLS in dynamic linker hardening recommendations - - The current toolchain does not consistently generate it, and - glibc does not use it. - - Reviewed-by: Szabolcs Nagy - (cherry picked from commit 90842d3980064ef410b998b22170ad409b76b9fd) - -diff --git a/manual/dynlink.texi b/manual/dynlink.texi -index 03565d4fb0..1500a53de6 100644 ---- a/manual/dynlink.texi -+++ b/manual/dynlink.texi -@@ -993,21 +993,21 @@ The dynamic segment should also mention @code{BIND_NOW} on the - enough). - - @item --For shared objects (not main programs), if the program header has a --@code{PT_TLS} segment, the dynamic segment (as shown by @samp{readelf ---dW}) should contain the @code{STATIC_TLS} flag on the @code{FLAGS} --line. -- --If @code{STATIC_TLS} is missing in shared objects, ensure that the --appropriate relocations for GNU2 TLS descriptors are used (for example, -+Ensure that only static TLS relocations (thread-pointer relative offset -+locations) are used, for example @code{R_AARCH64_TLS_TPREL} and -+@code{X86_64_TPOFF64}. As the second-best option, and only if -+compatibility with non-hardened applications using @code{dlopen} is -+needed, GNU2 TLS descriptor relocations can be used (for example, - @code{R_AARCH64_TLSDESC} or @code{R_X86_64_TLSDESC}). - - @item --There should not be a reference to the symbols @code{__tls_get_addr}, --@code{__tls_get_offset}, @code{__tls_get_addr_opt} in the dynamic symbol --table (in the @samp{readelf -sDW} output). Thread-local storage must be --accessed using the initial-exec (static) model, or using GNU2 TLS --descriptors. -+There should not be references to the traditional TLS function symbols -+@code{__tls_get_addr}, @code{__tls_get_offset}, -+@code{__tls_get_addr_opt} in the dynamic symbol table (in the -+@samp{readelf -sDW} output). Supporting global dynamic TLS relocations -+(such as @code{R_AARCH64_TLS_DTPMOD}, @code{R_AARCH64_TLS_DTPREL}, -+@code{R_X86_64_DTPMOD64}, @code{R_X86_64_DTPOFF64}) should not be used, -+either. - - @item - Likewise, the functions @code{dlopen}, @code{dlmopen}, @code{dlclose} - -commit 145b5886379c8de4f0a1bca3556a4c3d7b6c24b2 -Author: Florian Weimer -Date: Wed Jul 24 13:42:16 2024 +0200 - - Fix version number in NEWS file - -diff --git a/NEWS b/NEWS -index 4d7100b21c..6b62f55658 100644 ---- a/NEWS -+++ b/NEWS -@@ -5,7 +5,7 @@ See the end for copying conditions. - Please send GNU C library bug reports via - using `glibc' in the "product" field. - --Version 2.41 -+Version 2.40.1 - - The following bugs are resolved with this release: - - -commit 2aebac5e158277d852b87b0cbd4af2b2d10ac387 -Author: Miguel Martín -Date: Tue Jul 16 17:14:56 2024 +0200 - - malloc: avoid global locks in tst-aligned_alloc-lib.c - - Make sure the DSO used by aligned_alloc/calloc/malloc tests does not get - a global lock on multithreaded tests. - Reviewed-by: Arjun Shankar - - (cherry picked from commit 9a27b566b2048f599048f2f4afe1cce06c4ef43d) - -diff --git a/malloc/tst-aligned_alloc-lib.c b/malloc/tst-aligned_alloc-lib.c -index 0205df5acf..9ef1f839c1 100644 ---- a/malloc/tst-aligned_alloc-lib.c -+++ b/malloc/tst-aligned_alloc-lib.c -@@ -17,37 +17,38 @@ - License along with the GNU C Library; see the file COPYING.LIB. If - not, see . */ - --#include - #include - #include -+#include - - extern void *__libc_malloc (size_t size); - extern void *__libc_calloc (size_t n, size_t size); - -+__thread unsigned int seed = 0; -+ - int aligned_alloc_count = 0; - int libc_malloc_count = 0; - int libc_calloc_count = 0; - --/* Get a random alignment value. Biased towards the smaller values. Must be -- a power of 2. */ --static size_t get_random_alignment (void) --{ -- size_t aligns[] = { -- 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 -- }; -- -- return aligns[random () % array_length (aligns)]; --} -- --static void *get_random_alloc (size_t size) -+static void * -+get_random_alloc (size_t size) - { - void *retval; - size_t align; -+ struct timespec tp; -+ -+ if (seed == 0) -+ { -+ clock_gettime (CLOCK_REALTIME, &tp); -+ seed = tp.tv_nsec; -+ } - -- switch (random() % 3) -- { -+ switch (rand_r (&seed) % 3) -+ { - case 1: -- align = get_random_alignment (); -+ /* Get a random alignment value. Biased towards the smaller -+ * values up to 16384. Must be a power of 2. */ -+ align = 1 << rand_r (&seed) % 15; - retval = aligned_alloc (align, size); - aligned_alloc_count++; - break; -@@ -59,13 +60,13 @@ static void *get_random_alloc (size_t size) - retval = __libc_malloc (size); - libc_malloc_count++; - break; -- } -+ } - - return retval; - } - -- --void * __random_malloc (size_t size) -+void * -+__random_malloc (size_t size) - { - return get_random_alloc (size); - } - -commit 5d2a931a8167a288374c3a38dc10fe0492ab5ffe -Author: Miguel Martín -Date: Tue Jul 16 17:14:57 2024 +0200 - - malloc: add multi-threaded tests for aligned_alloc/calloc/malloc - - Improve aligned_alloc/calloc/malloc test coverage by adding - multi-threaded tests with random memory allocations and with/without - cross-thread memory deallocations. - - Perform a number of memory allocation calls with random sizes limited - to 0xffff. - - Use the existing DSO ('malloc/tst-aligned_alloc-lib.c') to randomize - allocator selection. - - The multi-threaded allocation/deallocation is staged as described below: - - - Stage 1: Half of the threads will be allocating memory and the - other half will be waiting for them to finish the allocation. - - Stage 2: Half of the threads will be allocating memory and the - other half will be deallocating memory. - - Stage 3: Half of the threads will be deallocating memory and the - second half waiting on them to finish. - - Add 'malloc/tst-aligned-alloc-random-thread.c' where each thread will - deallocate only the memory that was previously allocated by itself. - - Add 'malloc/tst-aligned-alloc-random-thread-cross.c' where each thread - will deallocate memory that was previously allocated by another thread. - - The intention is to be able to utilize existing malloc testing to ensure - that similar allocation APIs are also exposed to the same rigors. - Reviewed-by: Arjun Shankar - - (cherry picked from commit b0fbcb7d0051a68baf26b2aed51a8a31c34d68e5) - -diff --git a/malloc/Makefile b/malloc/Makefile -index 02aff1bd1d..98d507a6eb 100644 ---- a/malloc/Makefile -+++ b/malloc/Makefile -@@ -28,6 +28,8 @@ tests := \ - mallocbug \ - tst-aligned-alloc \ - tst-aligned-alloc-random \ -+ tst-aligned-alloc-random-thread \ -+ tst-aligned-alloc-random-thread-cross \ - tst-alloc_buffer \ - tst-calloc \ - tst-free-errno \ -@@ -151,6 +153,8 @@ ifeq ($(have-GLIBC_2.23)$(build-shared),yesyes) - # the tests expect specific internal behavior that is changed due to linking to - # libmcheck.a. - tests-exclude-mcheck = \ -+ tst-aligned-alloc-random-thread \ -+ tst-aligned-alloc-random-thread-cross \ - tst-compathooks-off \ - tst-compathooks-on \ - tst-malloc-backtrace \ -@@ -415,7 +419,11 @@ $(objpfx)tst-mallocstate: $(objpfx)libc_malloc_debug.so - $(objpfx)tst-mallocstate-malloc-check: $(objpfx)libc_malloc_debug.so - - $(objpfx)tst-aligned-alloc-random.out: $(objpfx)tst-aligned_alloc-lib.so -+$(objpfx)tst-aligned-alloc-random-thread.out: $(objpfx)tst-aligned_alloc-lib.so -+$(objpfx)tst-aligned-alloc-random-thread-cross.out: $(objpfx)tst-aligned_alloc-lib.so - $(objpfx)tst-malloc-random.out: $(objpfx)tst-aligned_alloc-lib.so - - tst-aligned-alloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so -+tst-aligned-alloc-random-thread-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so -+tst-aligned-alloc-random-thread-cross-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so - tst-malloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so -diff --git a/malloc/tst-aligned-alloc-random-thread-cross.c b/malloc/tst-aligned-alloc-random-thread-cross.c -new file mode 100644 -index 0000000000..360ecc56ee ---- /dev/null -+++ b/malloc/tst-aligned-alloc-random-thread-cross.c -@@ -0,0 +1,19 @@ -+/* multi-threaded memory allocation and cross-thread deallocation test. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public License as -+ published by the Free Software Foundation; either version 2.1 of the -+ License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; see the file COPYING.LIB. If -+ not, see . */ -+#define CROSS_THREAD_DEALLOC -+#include "tst-aligned-alloc-random-thread.c" -diff --git a/malloc/tst-aligned-alloc-random-thread.c b/malloc/tst-aligned-alloc-random-thread.c -new file mode 100644 -index 0000000000..e95f79250a ---- /dev/null -+++ b/malloc/tst-aligned-alloc-random-thread.c -@@ -0,0 +1,145 @@ -+/* multi-threaded memory allocation/deallocation test. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public License as -+ published by the Free Software Foundation; either version 2.1 of the -+ License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; see the file COPYING.LIB. If -+ not, see . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifndef ITERATIONS -+# define ITERATIONS 16 -+#endif -+ -+#ifndef NUM_THREADS -+# define NUM_THREADS 8 -+#endif -+ -+#ifndef NUM_ALLOCATIONS -+# define NUM_ALLOCATIONS 2048 -+#endif -+ -+static pthread_barrier_t barrier; -+ -+__thread unsigned int seed; -+ -+typedef struct -+{ -+ int id; -+ pthread_t thread; -+} thread; -+ -+thread threads[NUM_THREADS]; -+ -+void *allocations[NUM_THREADS][NUM_ALLOCATIONS]; -+ -+void -+run_thread_dealloc (int id) -+{ -+ for (int i = 0; i < NUM_ALLOCATIONS; i++) -+ { -+ free (allocations[id][i]); -+ allocations[id][i] = NULL; -+ } -+} -+ -+void -+run_thread_alloc (int id) -+{ -+ size_t msb, size; -+ for (int i = 0; i < NUM_ALLOCATIONS; i++) -+ { -+ msb = 1 << rand_r (&seed) % 16; -+ size = msb + rand_r (&seed) % msb; -+ allocations[id][i] = malloc (size); -+ TEST_VERIFY_EXIT (allocations[id][i] != NULL); -+ } -+} -+ -+void * -+run_allocations (void *arg) -+{ -+ int id = *((int *) arg); -+ seed = time (NULL) + id; -+ -+ /* Stage 1: First half o the threads allocating memory and the second -+ * half waiting for them to finish -+ */ -+ if (id < NUM_THREADS / 2) -+ run_thread_alloc (id); -+ -+ xpthread_barrier_wait (&barrier); -+ -+ /* Stage 2: Half of the threads allocationg memory and the other -+ * half deallocating: -+ * - In the non cross-thread dealloc scenario the first half will be -+ * deallocating the memory allocated by themselves in stage 1 and the -+ * second half will be allocating memory. -+ * - In the cross-thread dealloc scenario the first half will continue -+ * to allocate memory and the second half will deallocate the memory -+ * allocated by the first half in stage 1. -+ */ -+ if (id < NUM_THREADS / 2) -+#ifndef CROSS_THREAD_DEALLOC -+ run_thread_dealloc (id); -+#else -+ run_thread_alloc (id + NUM_THREADS / 2); -+#endif -+ else -+#ifndef CROSS_THREAD_DEALLOC -+ run_thread_alloc (id); -+#else -+ run_thread_dealloc (id - NUM_THREADS / 2); -+#endif -+ -+ xpthread_barrier_wait (&barrier); -+ -+ // Stage 3: Second half of the threads deallocating and the first half -+ // waiting for them to finish. -+ if (id >= NUM_THREADS / 2) -+ run_thread_dealloc (id); -+ -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ xpthread_barrier_init (&barrier, NULL, NUM_THREADS); -+ -+ for (int i = 0; i < ITERATIONS; i++) -+ { -+ for (int t = 0; t < NUM_THREADS; t++) -+ { -+ threads[t].id = t; -+ threads[t].thread -+ = xpthread_create (NULL, run_allocations, &threads[t].id); -+ } -+ -+ for (int t = 0; t < NUM_THREADS; t++) -+ xpthread_join (threads[t].thread); -+ } -+ -+ return 0; -+} -+ -+#include - -commit 65fbcfe58991194301a7e4fb9c53ab936573e711 -Author: Arjun Shankar -Date: Mon Jul 29 14:30:59 2024 +0200 - - manual/stdio: Clarify putc and putwc - - The manual entry for `putc' described what "most systems" do instead of - describing the glibc implementation and its guarantees. This commit - fixes that by warning that putc may be implemented as a macro that - double-evaluates `stream', and removing the performance claim. - - Even though the current `putc' implementation does not double-evaluate - `stream', offering this obscure guarantee as an extension to what - POSIX allows does not seem very useful. - - The entry for `putwc' is also edited to bring it in line with `putc'. - Reviewed-by: Florian Weimer - - (cherry picked from commit 10de4a47ef3f481592e3c62eb07bcda23e9fde4d) - -diff --git a/manual/stdio.texi b/manual/stdio.texi -index f5e289d58a..f9529a098d 100644 ---- a/manual/stdio.texi -+++ b/manual/stdio.texi -@@ -903,21 +903,21 @@ This function is a GNU extension. - @deftypefun int putc (int @var{c}, FILE *@var{stream}) - @standards{ISO, stdio.h} - @safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} --This is just like @code{fputc}, except that most systems implement it as -+This is just like @code{fputc}, except that it may be implemented as - a macro, making it faster. One consequence is that it may evaluate the - @var{stream} argument more than once, which is an exception to the --general rule for macros. @code{putc} is usually the best function to --use for writing a single character. -+general rule for macros. Therefore, @var{stream} should never be an -+expression with side-effects. - @end deftypefun - - @deftypefun wint_t putwc (wchar_t @var{wc}, FILE *@var{stream}) - @standards{ISO, wchar.h} - @safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} --This is just like @code{fputwc}, except that it can be implement as -+This is just like @code{fputwc}, except that it may be implemented as - a macro, making it faster. One consequence is that it may evaluate the - @var{stream} argument more than once, which is an exception to the --general rule for macros. @code{putwc} is usually the best function to --use for writing a single wide character. -+general rule for macros. Therefore, @var{stream} should never be an -+expression with side-effects. - @end deftypefun - - @deftypefun int putc_unlocked (int @var{c}, FILE *@var{stream}) - -commit 132a72f93cb4ad9f16b8469dc061de5f75f6a44e -Author: Lukas Bulwahn -Date: Mon Jul 29 11:08:17 2024 +0200 - - manual: make setrlimit() description less ambiguous - - The existing description for setrlimit() has some ambiguity. It could be - understood to have the semantics of getrlimit(), i.e., the limits from the - process are stored in the provided rlp pointer. - - Make the description more explicit that rlp are the input values, and that - the limits of the process is changed with this function. - - Reviewed-by: Florian Weimer - (cherry picked from commit aedbf08891069fc029ed021e4dba933eb877b394) - -diff --git a/manual/resource.texi b/manual/resource.texi -index c9b21dedeb..25966bcb64 100644 ---- a/manual/resource.texi -+++ b/manual/resource.texi -@@ -192,8 +192,8 @@ If the sources are compiled with @code{_FILE_OFFSET_BITS == 64} on a - @standards{BSD, sys/resource.h} - @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} - @c Direct syscall on most systems; lock-taking critical section on HURD. --Store the current and maximum limits for the resource @var{resource} --in @code{*@var{rlp}}. -+Change the current and maximum limits of the process for the resource -+@var{resource} to the values provided in @code{*@var{rlp}}. - - The return value is @code{0} on success and @code{-1} on failure. The - following @code{errno} error condition is possible: - -commit 509166c9a53ad81217a28cc67ba2a688f02fc477 -Author: Florian Weimer -Date: Wed Jun 26 11:27:54 2024 +0200 - - Enhance test coverage for strnlen, wcsnlen - - This commit adds string/test-strnlen-nonarray and - wcsmbs/test-wcsnlen-nonarray. - - Reviewed-by: Noah Goldstein - (cherry picked from commit 783d4c0b81889c39a9ddf13b60d0fde4040fb1c0) - -diff --git a/string/Makefile b/string/Makefile -index 8f31fa49e6..2e20fc00fd 100644 ---- a/string/Makefile -+++ b/string/Makefile -@@ -184,6 +184,7 @@ tests := \ - test-strncpy \ - test-strndup \ - test-strnlen \ -+ test-strnlen-nonarray \ - test-strpbrk \ - test-strrchr \ - test-strspn \ -diff --git a/string/test-Xnlen-nonarray.c b/string/test-Xnlen-nonarray.c -new file mode 100644 -index 0000000000..499bef2041 ---- /dev/null -+++ b/string/test-Xnlen-nonarray.c -@@ -0,0 +1,133 @@ -+/* Test non-array inputs to string length functions. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* This skeleton file is included from string/test-strnlen-nonarray.c -+ and wcsmbs/test-wcsnlen-nonarray.c to test that reading of the array -+ stops at the first null character. -+ -+ TEST_IDENTIFIER must be the test function identifier. TEST_NAME is -+ the same as a string. -+ -+ CHAR must be defined as the character type. */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+typedef __typeof (TEST_IDENTIFIER) *proto_t; -+ -+#define TEST_MAIN -+#include "test-string.h" -+ -+IMPL (TEST_IDENTIFIER, 1) -+ -+static int -+test_main (void) -+{ -+ enum { buffer_length = 256 }; -+ TEST_VERIFY_EXIT (sysconf (_SC_PAGESIZE) >= buffer_length); -+ -+ test_init (); -+ -+ /* Buffer layout: There are a_count 'A' character followed by -+ zero_count null character, for a total of buffer_length -+ character: -+ -+ AAAAA...AAAAA 00000 ... 00000 (unmapped page follows) -+ \ / \ / -+ (a_count) (zero_count) -+ \___ (buffer_length) ___/ -+ ^ -+ | -+ start_offset -+ -+ The buffer length does not change, but a_count (and thus _zero) -+ and start_offset vary. -+ -+ If start_offset == buffer_length, only 0 is a valid length -+ argument. The result is 0. -+ -+ Otherwwise, if zero_count > 0 (if there a null characters in the -+ buffer), then any length argument is valid. If start_offset < -+ a_count (i.e., there is a non-null character at start_offset), the -+ result is the minimum of a_count - start_offset and the length -+ argument. Otherwise the result is 0. -+ -+ Otherwise, there are no null characters before the unmapped page. -+ The length argument must not be greater than buffer_length - -+ start_offset, and the result is the length argument. */ -+ -+ struct support_next_to_fault ntf -+ = support_next_to_fault_allocate (buffer_length * sizeof (CHAR)); -+ CHAR *buffer = (CHAR *) ntf.buffer; -+ -+ FOR_EACH_IMPL (impl, 0) -+ { -+ printf ("info: testing %s\n", impl->name); -+ for (size_t i = 0; i < buffer_length; ++i) -+ buffer[i] = 'A'; -+ -+ for (int zero_count = 0; zero_count <= buffer_length; ++zero_count) -+ { -+ if (zero_count > 0) -+ buffer[buffer_length - zero_count] = 0; -+ int a_count = buffer_length - zero_count; -+ for (int start_offset = 0; start_offset <= buffer_length; -+ ++start_offset) -+ { -+ CHAR *start_pointer = buffer + start_offset; -+ if (start_offset == buffer_length) -+ TEST_COMPARE (CALL (impl, buffer + start_offset, 0), 0); -+ else if (zero_count > 0) -+ for (int length_argument = 0; -+ length_argument <= 2 * buffer_length; -+ ++length_argument) -+ { -+ if (test_verbose) -+ printf ("zero_count=%d a_count=%d start_offset=%d" -+ " length_argument=%d\n", -+ zero_count, a_count, start_offset, -+ length_argument); -+ if (start_offset < a_count) -+ TEST_COMPARE (CALL (impl, start_pointer, length_argument), -+ MIN (a_count - start_offset, -+ length_argument)); -+ else -+ TEST_COMPARE (CALL (impl, start_pointer, length_argument), -+ 0); -+ } -+ else -+ for (int length_argument = 0; -+ length_argument <= buffer_length - start_offset; -+ ++length_argument) -+ TEST_COMPARE (CALL (impl, start_pointer, length_argument), -+ length_argument); -+ } -+ } -+ } -+ -+ support_next_to_fault_free (&ntf); -+ -+ return 0; -+} -+ -+#include -diff --git a/string/test-strnlen-nonarray.c b/string/test-strnlen-nonarray.c -new file mode 100644 -index 0000000000..0ad05756d9 ---- /dev/null -+++ b/string/test-strnlen-nonarray.c -@@ -0,0 +1,4 @@ -+#define TEST_IDENTIFIER strnlen -+#define TEST_NAME "strnlen" -+typedef char CHAR; -+#include "test-Xnlen-nonarray.c" -diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile -index 1cddd8cc6d..c51c9b4f1f 100644 ---- a/wcsmbs/Makefile -+++ b/wcsmbs/Makefile -@@ -160,6 +160,7 @@ tests := \ - test-wcsncmp \ - test-wcsncpy \ - test-wcsnlen \ -+ test-wcsnlen-nonarray \ - test-wcspbrk \ - test-wcsrchr \ - test-wcsspn \ -diff --git a/wcsmbs/test-wcsnlen-nonarray.c b/wcsmbs/test-wcsnlen-nonarray.c -new file mode 100644 -index 0000000000..a4b21fecd3 ---- /dev/null -+++ b/wcsmbs/test-wcsnlen-nonarray.c -@@ -0,0 +1,5 @@ -+#include -+#define TEST_IDENTIFIER wcsnlen -+#define TEST_NAME "wcsnlen" -+typedef wchar_t CHAR; -+#include "../string/test-Xnlen-nonarray.c" - -commit 46f19b234244f4654b9e3898ac1c27de86068222 -Author: Florian Weimer -Date: Thu Jun 27 16:26:56 2024 +0200 - - Enhanced test coverage for strncmp, wcsncmp - - Add string/test-strncmp-nonarray and - wcsmbs/test-wcsncmp-nonarray. - - This is the test that uncovered bug 31934. Test run time - is more than one minute on a fairly current system, so turn - these into xtests that do not run automatically. - - Reviewed-by: Noah Goldstein - (cherry picked from commit 54252394c25ddf0062e288d4a6ab7a885f8ae009) - -diff --git a/string/Makefile b/string/Makefile -index 2e20fc00fd..1dff405c27 100644 ---- a/string/Makefile -+++ b/string/Makefile -@@ -236,7 +236,10 @@ tests-unsupported += $(tests-translation) - endif - - # This test allocates a lot of memory and can run for a long time. --xtests = tst-strcoll-overflow -+xtests += tst-strcoll-overflow -+ -+# This test runs for a long time. -+xtests += test-strncmp-nonarray - - # This test needs libdl. - ifeq (yes,$(build-shared)) -diff --git a/string/test-Xncmp-nonarray.c b/string/test-Xncmp-nonarray.c -new file mode 100644 -index 0000000000..9f3a3ca75d ---- /dev/null -+++ b/string/test-Xncmp-nonarray.c -@@ -0,0 +1,183 @@ -+/* Test non-array inputs to string comparison functions. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* This skeleton file is included from string/test-strncmp-nonarray.c and -+ wcsmbs/test-wcsncmp-nonarray.c to test that reading of the arrays stops -+ at the first null character. -+ -+ TEST_IDENTIFIER must be the test function identifier. TEST_NAME is -+ the same as a string. -+ -+ CHAR must be defined as the character type. */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Much shorter than test-Xnlen-nonarray.c because of deeply nested loops. */ -+enum { buffer_length = 80 }; -+ -+/* The test buffer layout follows what is described test-Xnlen-nonarray.c, -+ except that there two buffers, left and right. The variables -+ a_count, zero_count, start_offset are all duplicated. */ -+ -+/* Return the maximum string length for a string that starts at -+ start_offset. */ -+static int -+string_length (int a_count, int start_offset) -+{ -+ if (start_offset == buffer_length || start_offset >= a_count) -+ return 0; -+ else -+ return a_count - start_offset; -+} -+ -+/* This is the valid maximum length argument computation for -+ strnlen/wcsnlen. See text-Xnlen-nonarray.c. */ -+static int -+maximum_length (int start_offset, int zero_count) -+{ -+ if (start_offset == buffer_length) -+ return 0; -+ else if (zero_count > 0) -+ /* Effectively unbounded, but we need to stop fairly low, -+ otherwise testing takes too long. */ -+ return buffer_length + 32; -+ else -+ return buffer_length - start_offset; -+} -+ -+typedef __typeof (TEST_IDENTIFIER) *proto_t; -+ -+#define TEST_MAIN -+#include "test-string.h" -+ -+IMPL (TEST_IDENTIFIER, 1) -+ -+static int -+test_main (void) -+{ -+ TEST_VERIFY_EXIT (sysconf (_SC_PAGESIZE) >= buffer_length); -+ test_init (); -+ -+ struct support_next_to_fault left_ntf -+ = support_next_to_fault_allocate (buffer_length * sizeof (CHAR)); -+ CHAR *left_buffer = (CHAR *) left_ntf.buffer; -+ struct support_next_to_fault right_ntf -+ = support_next_to_fault_allocate (buffer_length * sizeof (CHAR)); -+ CHAR *right_buffer = (CHAR *) right_ntf.buffer; -+ -+ FOR_EACH_IMPL (impl, 0) -+ { -+ printf ("info: testing %s\n", impl->name); -+ for (size_t i = 0; i < buffer_length; ++i) -+ left_buffer[i] = 'A'; -+ -+ for (int left_zero_count = 0; left_zero_count <= buffer_length; -+ ++left_zero_count) -+ { -+ if (left_zero_count > 0) -+ left_buffer[buffer_length - left_zero_count] = 0; -+ int left_a_count = buffer_length - left_zero_count; -+ for (size_t i = 0; i < buffer_length; ++i) -+ right_buffer[i] = 'A'; -+ for (int right_zero_count = 0; right_zero_count <= buffer_length; -+ ++right_zero_count) -+ { -+ if (right_zero_count > 0) -+ right_buffer[buffer_length - right_zero_count] = 0; -+ int right_a_count = buffer_length - right_zero_count; -+ for (int left_start_offset = 0; -+ left_start_offset <= buffer_length; -+ ++left_start_offset) -+ { -+ CHAR *left_start_pointer = left_buffer + left_start_offset; -+ int left_maxlen -+ = maximum_length (left_start_offset, left_zero_count); -+ int left_length -+ = string_length (left_a_count, left_start_offset); -+ for (int right_start_offset = 0; -+ right_start_offset <= buffer_length; -+ ++right_start_offset) -+ { -+ CHAR *right_start_pointer -+ = right_buffer + right_start_offset; -+ int right_maxlen -+ = maximum_length (right_start_offset, right_zero_count); -+ int right_length -+ = string_length (right_a_count, right_start_offset); -+ -+ /* Maximum length is modelled after strnlen/wcsnlen, -+ and must be valid for both pointer arguments at -+ the same time. */ -+ int maxlen = MIN (left_maxlen, right_maxlen); -+ -+ for (int length_argument = 0; length_argument <= maxlen; -+ ++length_argument) -+ { -+ if (test_verbose) -+ { -+ printf ("left: zero_count=%d" -+ " a_count=%d start_offset=%d\n", -+ left_zero_count, left_a_count, -+ left_start_offset); -+ printf ("right: zero_count=%d" -+ " a_count=%d start_offset=%d\n", -+ right_zero_count, right_a_count, -+ right_start_offset); -+ printf ("length argument: %d\n", -+ length_argument); -+ } -+ -+ /* Effective lengths bounded by length argument. -+ The effective length determines the -+ outcome of the comparison. */ -+ int left_effective -+ = MIN (left_length, length_argument); -+ int right_effective -+ = MIN (right_length, length_argument); -+ if (left_effective == right_effective) -+ TEST_COMPARE (CALL (impl, -+ left_start_pointer, -+ right_start_pointer, -+ length_argument), 0); -+ else if (left_effective < right_effective) -+ TEST_COMPARE (CALL (impl, -+ left_start_pointer, -+ right_start_pointer, -+ length_argument) < 0, 1); -+ else -+ TEST_COMPARE (CALL (impl, -+ left_start_pointer, -+ right_start_pointer, -+ length_argument) > 0, 1); -+ } -+ } -+ } -+ } -+ } -+ } -+ -+ return 0; -+} -+ -+#include -diff --git a/string/test-strncmp-nonarray.c b/string/test-strncmp-nonarray.c -new file mode 100644 -index 0000000000..581e52d01b ---- /dev/null -+++ b/string/test-strncmp-nonarray.c -@@ -0,0 +1,4 @@ -+#define TEST_IDENTIFIER strncmp -+#define TEST_NAME "strncmp" -+typedef char CHAR; -+#include "test-Xncmp-nonarray.c" -diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile -index c51c9b4f1f..63adf0e8ef 100644 ---- a/wcsmbs/Makefile -+++ b/wcsmbs/Makefile -@@ -206,6 +206,10 @@ tests := \ - wcsmbs-tst1 \ - # tests - -+# This test runs for a long time. -+xtests += test-wcsncmp-nonarray -+ -+ - include ../Rules - - ifeq ($(run-built-tests),yes) -diff --git a/wcsmbs/test-wcsncmp-nonarray.c b/wcsmbs/test-wcsncmp-nonarray.c -new file mode 100644 -index 0000000000..1ad9ebd8fd ---- /dev/null -+++ b/wcsmbs/test-wcsncmp-nonarray.c -@@ -0,0 +1,5 @@ -+#include -+#define TEST_IDENTIFIER wcsncmp -+#define TEST_NAME "wcsncmp" -+typedef wchar_t CHAR; -+#include "../string/test-Xncmp-nonarray.c" - -commit 3433a358428bcec2d203fa408b85f442c9a465ca -Author: H.J. Lu -Date: Wed Jul 24 14:05:13 2024 -0700 - - linux: Update the mremap C implementation [BZ #31968] - - Update the mremap C implementation to support the optional argument for - MREMAP_DONTUNMAP added in Linux 5.7 since it may not always be correct - to implement a variadic function as a non-variadic function on all Linux - targets. Return MAP_FAILED and set errno to EINVAL for unknown flag bits. - This fixes BZ #31968. - - Note: A test must be added when a new flag bit is introduced. - - Signed-off-by: H.J. Lu - Reviewed-by: Adhemerval Zanella - (cherry picked from commit 6c40cb0e9f893d49dc7caee580a055de53562206) - -diff --git a/NEWS b/NEWS -index 6b62f55658..5948704ef9 100644 ---- a/NEWS -+++ b/NEWS -@@ -11,6 +11,7 @@ The following bugs are resolved with this release: - - [30081] resolv: Do not wait for non-existing second DNS response after error - [31890] resolv: Allow short error responses to match any DNS query -+ [31968] mremap implementation in C does not handle arguments correctly - - Version 2.40 - -diff --git a/sysdeps/unix/sysv/linux/mremap.c b/sysdeps/unix/sysv/linux/mremap.c -index 4f770799c4..1ada5c1f40 100644 ---- a/sysdeps/unix/sysv/linux/mremap.c -+++ b/sysdeps/unix/sysv/linux/mremap.c -@@ -20,6 +20,12 @@ - #include - #include - #include -+#include -+ -+#define MREMAP_KNOWN_BITS \ -+ (MREMAP_MAYMOVE \ -+ | MREMAP_FIXED \ -+ | MREMAP_DONTUNMAP) - - void * - __mremap (void *addr, size_t old_len, size_t new_len, int flags, ...) -@@ -27,7 +33,13 @@ __mremap (void *addr, size_t old_len, size_t new_len, int flags, ...) - va_list va; - void *new_addr = NULL; - -- if (flags & MREMAP_FIXED) -+ if (flags & ~(MREMAP_KNOWN_BITS)) -+ { -+ __set_errno (EINVAL); -+ return MAP_FAILED; -+ } -+ -+ if (flags & (MREMAP_FIXED | MREMAP_DONTUNMAP)) - { - va_start (va, flags); - new_addr = va_arg (va, void *); - -commit 2eb2d78ca75d7432bd1d11d227f4c899554ea02e -Author: H.J. Lu -Date: Wed Jul 24 14:05:14 2024 -0700 - - mremap: Update manual entry - - Update mremap manual entry: - - 1. Change mremap to variadic. - 2. Document MREMAP_FIXED and MREMAP_DONTUNMAP. - - Signed-off-by: H.J. Lu - Reviewed-by: Adhemerval Zanella - (cherry picked from commit cb2dee4eccf46642eef588bee64f9c875c408f1c) - -diff --git a/NEWS b/NEWS -index 5948704ef9..8da0408ad9 100644 ---- a/NEWS -+++ b/NEWS -@@ -10,6 +10,7 @@ Version 2.40.1 - The following bugs are resolved with this release: - - [30081] resolv: Do not wait for non-existing second DNS response after error -+ [31968] mremap implementation in C does not handle arguments correctly - [31890] resolv: Allow short error responses to match any DNS query - [31968] mremap implementation in C does not handle arguments correctly - -diff --git a/manual/llio.texi b/manual/llio.texi -index 6f0a48609b..ea84196abd 100644 ---- a/manual/llio.texi -+++ b/manual/llio.texi -@@ -1892,7 +1892,7 @@ There is no existing mapping in at least part of the given region. - - @end deftypefun - --@deftypefun {void *} mremap (void *@var{address}, size_t @var{length}, size_t @var{new_length}, int @var{flag}) -+@deftypefun {void *} mremap (void *@var{address}, size_t @var{length}, size_t @var{new_length}, int @var{flag}, ... /* void *@var{new_address} */) - @standards{GNU, sys/mman.h} - @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} - -@@ -1901,12 +1901,40 @@ area. @var{address} and @var{length} must cover a region entirely mapped - in the same @code{mmap} statement. A new mapping with the same - characteristics will be returned with the length @var{new_length}. - --One option is possible, @code{MREMAP_MAYMOVE}. If it is given in --@var{flags}, the system may remove the existing mapping and create a new --one of the desired length in another location. -+Possible flags are - --The address of the resulting mapping is returned, or @math{-1}. Possible --error codes include: -+@table @code -+ -+@item MREMAP_MAYMOVE -+If it is given in @var{flags}, the system may remove the existing mapping -+and create a new one of the desired length in another location. -+ -+@item MREMAP_FIXED -+If it is given in @var{flags}, @code{mremap} accepts a fifth argument, -+@code{void *new_address}, which specifies a page-aligned address to -+which the mapping must be moved. Any previous mapping at the address -+range specified by @var{new_address} and @var{new_size} is unmapped. -+ -+@code{MREMAP_FIXED} must be used together with @code{MREMAP_MAYMOVE}. -+ -+@item MREMAP_DONTUNMAP -+If it is given in @var{flags}, @code{mremap} accepts a fifth argument, -+@code{void *new_address}, which specifies a page-aligned address. Any -+previous mapping at the address range specified by @var{new_address} and -+@var{new_size} is unmapped. If @var{new_address} is @code{NULL}, the -+kernel chooses the page-aligned address at which to create the mapping. -+Otherwise, the kernel takes it as a hint about where to place the mapping. -+The mapping at the address range specified by @var{old_address} and -+@var{old_size} isn't unmapped. -+ -+@code{MREMAP_DONTUNMAP} must be used together with @code{MREMAP_MAYMOVE}. -+@var{old_size} must be the same as @var{new_size}. This flag bit is -+Linux-specific. -+ -+@end table -+ -+The address of the resulting mapping is returned, or @code{MAP_FAILED}. -+Possible error codes include: - - @table @code - -@@ -1915,7 +1943,7 @@ There is no existing mapping in at least part of the original region, or - the region covers two or more distinct mappings. - - @item EINVAL --The address given is misaligned or inappropriate. -+Any arguments are inappropriate, including unknown @var{flags} values. - - @item EAGAIN - The region has pages locked, and if extended it would exceed the - -commit ca53bc68ab92ab413a7d53e951227d380a85ebd8 -Author: H.J. Lu -Date: Wed Jul 24 14:05:15 2024 -0700 - - Add mremap tests - - Add tests for MREMAP_MAYMOVE and MREMAP_FIXED. On Linux, also test - MREMAP_DONTUNMAP. - - Signed-off-by: H.J. Lu - Reviewed-by: Adhemerval Zanella - (cherry picked from commit ff0320bec2810192d453c579623482fab87bfa01) - -diff --git a/misc/Makefile b/misc/Makefile -index 5d17c562fe..7b7f8351bf 100644 ---- a/misc/Makefile -+++ b/misc/Makefile -@@ -257,6 +257,8 @@ tests := \ - tst-mntent-blank-passno \ - tst-mntent-escape \ - tst-mntent2 \ -+ tst-mremap1 \ -+ tst-mremap2 \ - tst-preadvwritev \ - tst-preadvwritev2 \ - tst-preadvwritev64 \ -diff --git a/misc/tst-mremap1.c b/misc/tst-mremap1.c -new file mode 100644 -index 0000000000..0469991a6c ---- /dev/null -+++ b/misc/tst-mremap1.c -@@ -0,0 +1,46 @@ -+/* Test mremap with MREMAP_MAYMOVE. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int -+do_test (void) -+{ -+ size_t old_size = getpagesize (); -+ char *old_addr = xmmap (NULL, old_size, PROT_READ | PROT_WRITE, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1); -+ old_addr[0] = 1; -+ old_addr[old_size - 1] = 2; -+ -+ /* Test MREMAP_MAYMOVE. */ -+ size_t new_size = old_size + old_size; -+ char *new_addr = mremap (old_addr, old_size, new_size, MREMAP_MAYMOVE); -+ TEST_VERIFY_EXIT (new_addr != MAP_FAILED); -+ new_addr[0] = 1; -+ new_addr[new_size - 1] = 2; -+ xmunmap (new_addr, new_size); -+ -+ return 0; -+} -+ -+#include -diff --git a/misc/tst-mremap2.c b/misc/tst-mremap2.c -new file mode 100644 -index 0000000000..45be7f0369 ---- /dev/null -+++ b/misc/tst-mremap2.c -@@ -0,0 +1,54 @@ -+/* Test mremap with MREMAP_FIXED. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int -+do_test (void) -+{ -+ size_t old_size = getpagesize (); -+ size_t new_size = old_size + old_size; -+ char *old_addr = xmmap (NULL, old_size, PROT_READ | PROT_WRITE, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1); -+ old_addr[0] = 1; -+ old_addr[old_size - 1] = 2; -+ -+ char *fixed_addr = xmmap (NULL, new_size, PROT_READ | PROT_WRITE, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1); -+ fixed_addr[0] = 1; -+ fixed_addr[new_size - 1] = 2; -+ -+ /* Test MREMAP_FIXED. */ -+ char *new_addr = mremap (old_addr, old_size, new_size, -+ MREMAP_FIXED | MREMAP_MAYMOVE, -+ fixed_addr); -+ if (new_addr == MAP_FAILED) -+ return mremap_failure_exit (errno); -+ new_addr[0] = 1; -+ new_addr[new_size - 1] = 2; -+ xmunmap (new_addr, new_size); -+ -+ return 0; -+} -+ -+#include -diff --git a/sysdeps/generic/mremap-failure.h b/sysdeps/generic/mremap-failure.h -new file mode 100644 -index 0000000000..bc0d476368 ---- /dev/null -+++ b/sysdeps/generic/mremap-failure.h -@@ -0,0 +1,25 @@ -+/* mremap failure handling. Generic version. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* Return exit value on mremap failure with errno ERR. */ -+ -+static int -+mremap_failure_exit (int err) -+{ -+ return EXIT_FAILURE; -+} -diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile -index 097b5a26fc..59998c7af4 100644 ---- a/sysdeps/unix/sysv/linux/Makefile -+++ b/sysdeps/unix/sysv/linux/Makefile -@@ -206,6 +206,7 @@ tests += \ - tst-getauxval \ - tst-gettid \ - tst-gettid-kill \ -+ tst-linux-mremap1 \ - tst-memfd_create \ - tst-misalign-clone \ - tst-mlock2 \ -diff --git a/sysdeps/unix/sysv/linux/mremap-failure.h b/sysdeps/unix/sysv/linux/mremap-failure.h -new file mode 100644 -index 0000000000..c99ab30ca9 ---- /dev/null -+++ b/sysdeps/unix/sysv/linux/mremap-failure.h -@@ -0,0 +1,30 @@ -+/* mremap failure handling. Linux version. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+ -+/* Return exit value on mremap failure with errno ERR. */ -+ -+static int -+mremap_failure_exit (int err) -+{ -+ if (err != EINVAL) -+ return EXIT_FAILURE; -+ -+ return EXIT_UNSUPPORTED; -+} -diff --git a/sysdeps/unix/sysv/linux/tst-linux-mremap1.c b/sysdeps/unix/sysv/linux/tst-linux-mremap1.c -new file mode 100644 -index 0000000000..408e8af2ab ---- /dev/null -+++ b/sysdeps/unix/sysv/linux/tst-linux-mremap1.c -@@ -0,0 +1,63 @@ -+/* Test mremap with MREMAP_DONTUNMAP. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int -+do_test (void) -+{ -+ size_t old_size = getpagesize (); -+ size_t new_size = old_size; -+ char *old_addr = xmmap (NULL, old_size, PROT_READ | PROT_WRITE, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1); -+ old_addr[0] = 1; -+ old_addr[old_size - 1] = 2; -+ -+ /* Create an available 64-page mmap region. */ -+ size_t fixed_size = old_size * 64; -+ char *fixed_addr = xmmap (NULL, fixed_size, PROT_READ | PROT_WRITE, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1); -+ xmunmap (fixed_addr, fixed_size); -+ -+ /* Add 3 * pagesize. */ -+ fixed_size += 3 * old_size; -+ -+ /* Test MREMAP_DONTUNMAP. It should return FIXED_ADDR created above. */ -+ char *new_addr = mremap (old_addr, old_size, new_size, -+ MREMAP_DONTUNMAP | MREMAP_MAYMOVE, -+ fixed_addr); -+ if (new_addr == MAP_FAILED) -+ return mremap_failure_exit (errno); -+ TEST_VERIFY_EXIT (fixed_addr == new_addr); -+ old_addr[0] = 3; -+ old_addr[old_size - 1] = 4; -+ new_addr[0] = 1; -+ new_addr[new_size - 1] = 2; -+ xmunmap (new_addr, new_size); -+ xmunmap (old_addr, old_size); -+ -+ return 0; -+} -+ -+#include - -commit 928769737c8f0cbb51dfa2a02de0594c2395d802 -Author: Florian Weimer -Date: Thu Aug 1 10:46:10 2024 +0200 - - resolv: Fix tst-resolv-short-response for older GCC (bug 32042) - - Previous GCC versions do not support the C23 change that - allows labels on declarations. - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit ec119972cb2598c04ec7d4219e20506006836f64) - -diff --git a/resolv/tst-resolv-short-response.c b/resolv/tst-resolv-short-response.c -index be354ae1c7..9b06b0c176 100644 ---- a/resolv/tst-resolv-short-response.c -+++ b/resolv/tst-resolv-short-response.c -@@ -33,8 +33,10 @@ response (const struct resolv_response_context *ctx, - { - case 0: - /* First server times out. */ -- struct resolv_response_flags flags = {.rcode = rcode}; -- resolv_response_init (b, flags); -+ { -+ struct resolv_response_flags flags = {.rcode = rcode}; -+ resolv_response_init (b, flags); -+ } - break; - case 1: - /* Second server sends reply. */ - -commit aa533d58ff12e27771d9c960a727d74992a3f2a3 -Author: Florian Weimer -Date: Fri Aug 2 15:22:14 2024 +0200 - - x86: Tunables may incorrectly set Prefer_PMINUB_for_stringop (bug 32047) - - Fixes commit 5bcf6265f215326d14dfacdce8532792c2c7f8f8 ("x86: - Disable non-temporal memset on Skylake Server"). - - Reviewed-by: Noah Goldstein - (cherry picked from commit 7a630f7d3392ca391a399486ce2846f9e4b4ee63) - -diff --git a/sysdeps/x86/cpu-tunables.c b/sysdeps/x86/cpu-tunables.c -index ae9dcd6180..ccc6b64dc2 100644 ---- a/sysdeps/x86/cpu-tunables.c -+++ b/sysdeps/x86/cpu-tunables.c -@@ -248,6 +248,7 @@ TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *valp) - CHECK_GLIBC_IFUNC_PREFERRED_BOTH (n, cpu_features, - Avoid_Non_Temporal_Memset, 25); - } -+ break; - case 26: - { - CHECK_GLIBC_IFUNC_PREFERRED_NEED_BOTH - -commit 6a97e2ba144a554809161d488f25e4bae07c9405 -Author: Andreas Schwab -Date: Mon Aug 5 10:55:51 2024 +0200 - - Fix name space violation in fortify wrappers (bug 32052) - - Rename the identifier sz to __sz everywhere. - - Fixes: a643f60c53 ("Make sure that the fortified function conditionals are constant") - (cherry picked from commit 39ca997ab378990d5ac1aadbaa52aaf1db6d526f) - -diff --git a/NEWS b/NEWS -index 8da0408ad9..b9eb4a558b 100644 ---- a/NEWS -+++ b/NEWS -@@ -13,6 +13,7 @@ The following bugs are resolved with this release: - [31968] mremap implementation in C does not handle arguments correctly - [31890] resolv: Allow short error responses to match any DNS query - [31968] mremap implementation in C does not handle arguments correctly -+ [32052] Name space violation in fortify wrappers - - Version 2.40 - -diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h -index 91a80dd7c6..4b8bc35bdf 100644 ---- a/libio/bits/stdio2.h -+++ b/libio/bits/stdio2.h -@@ -308,14 +308,14 @@ fgets (__fortify_clang_overload_arg (char *, __restrict, __s), int __n, - "fgets called with bigger size than length of " - "destination buffer") - { -- size_t sz = __glibc_objsize (__s); -- if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz)) -+ size_t __sz = __glibc_objsize (__s); -+ if (__glibc_safe_or_unknown_len (__n, sizeof (char), __sz)) - return __fgets_alias (__s, __n, __stream); - #if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, sizeof (char), sz)) -- return __fgets_chk_warn (__s, sz, __n, __stream); -+ if (__glibc_unsafe_len (__n, sizeof (char), __sz)) -+ return __fgets_chk_warn (__s, __sz, __n, __stream); - #endif -- return __fgets_chk (__s, sz, __n, __stream); -+ return __fgets_chk (__s, __sz, __n, __stream); - } - - __fortify_function __wur __nonnull ((4)) __attribute_overloadable__ size_t -@@ -326,14 +326,14 @@ fread (__fortify_clang_overload_arg (void *, __restrict, __ptr), - "fread called with bigger size * n than length " - "of destination buffer") - { -- size_t sz = __glibc_objsize0 (__ptr); -- if (__glibc_safe_or_unknown_len (__n, __size, sz)) -+ size_t __sz = __glibc_objsize0 (__ptr); -+ if (__glibc_safe_or_unknown_len (__n, __size, __sz)) - return __fread_alias (__ptr, __size, __n, __stream); - #if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, __size, sz)) -- return __fread_chk_warn (__ptr, sz, __size, __n, __stream); -+ if (__glibc_unsafe_len (__n, __size, __sz)) -+ return __fread_chk_warn (__ptr, __sz, __size, __n, __stream); - #endif -- return __fread_chk (__ptr, sz, __size, __n, __stream); -+ return __fread_chk (__ptr, __sz, __size, __n, __stream); - } - - #ifdef __USE_GNU -@@ -345,14 +345,14 @@ fgets_unlocked (__fortify_clang_overload_arg (char *, __restrict, __s), - "fgets called with bigger size than length of " - "destination buffer") - { -- size_t sz = __glibc_objsize (__s); -- if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz)) -+ size_t __sz = __glibc_objsize (__s); -+ if (__glibc_safe_or_unknown_len (__n, sizeof (char), __sz)) - return __fgets_unlocked_alias (__s, __n, __stream); - #if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, sizeof (char), sz)) -- return __fgets_unlocked_chk_warn (__s, sz, __n, __stream); -+ if (__glibc_unsafe_len (__n, sizeof (char), __sz)) -+ return __fgets_unlocked_chk_warn (__s, __sz, __n, __stream); - #endif -- return __fgets_unlocked_chk (__s, sz, __n, __stream); -+ return __fgets_unlocked_chk (__s, __sz, __n, __stream); - } - #endif - -@@ -366,8 +366,8 @@ fread_unlocked (__fortify_clang_overload_arg0 (void *, __restrict, __ptr), - "fread_unlocked called with bigger size * n than " - "length of destination buffer") - { -- size_t sz = __glibc_objsize0 (__ptr); -- if (__glibc_safe_or_unknown_len (__n, __size, sz)) -+ size_t __sz = __glibc_objsize0 (__ptr); -+ if (__glibc_safe_or_unknown_len (__n, __size, __sz)) - { - # ifdef __USE_EXTERN_INLINES - if (__builtin_constant_p (__size) -@@ -393,10 +393,10 @@ fread_unlocked (__fortify_clang_overload_arg0 (void *, __restrict, __ptr), - return __fread_unlocked_alias (__ptr, __size, __n, __stream); - } - # if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, __size, sz)) -- return __fread_unlocked_chk_warn (__ptr, sz, __size, __n, __stream); -+ if (__glibc_unsafe_len (__n, __size, __sz)) -+ return __fread_unlocked_chk_warn (__ptr, __sz, __size, __n, __stream); - # endif -- return __fread_unlocked_chk (__ptr, sz, __size, __n, __stream); -+ return __fread_unlocked_chk (__ptr, __sz, __size, __n, __stream); - - } - #endif -diff --git a/socket/bits/socket2.h b/socket/bits/socket2.h -index 04780f320e..bd91647f37 100644 ---- a/socket/bits/socket2.h -+++ b/socket/bits/socket2.h -@@ -37,14 +37,14 @@ recv (int __fd, __fortify_clang_overload_arg0 (void *, ,__buf), size_t __n, - "recv called with bigger length than " - "size of destination buffer") - { -- size_t sz = __glibc_objsize0 (__buf); -- if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz)) -+ size_t __sz = __glibc_objsize0 (__buf); -+ if (__glibc_safe_or_unknown_len (__n, sizeof (char), __sz)) - return __recv_alias (__fd, __buf, __n, __flags); - #if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, sizeof (char), sz)) -- return __recv_chk_warn (__fd, __buf, __n, sz, __flags); -+ if (__glibc_unsafe_len (__n, sizeof (char), __sz)) -+ return __recv_chk_warn (__fd, __buf, __n, __sz, __flags); - #endif -- return __recv_chk (__fd, __buf, __n, sz, __flags); -+ return __recv_chk (__fd, __buf, __n, __sz, __flags); - } - - extern ssize_t __recvfrom_chk (int __fd, void *__restrict __buf, size_t __n, -@@ -71,13 +71,13 @@ recvfrom (int __fd, __fortify_clang_overload_arg0 (void *, __restrict, __buf), - "recvfrom called with bigger length " - "than size of destination buffer") - { -- size_t sz = __glibc_objsize0 (__buf); -- if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz)) -+ size_t __sz = __glibc_objsize0 (__buf); -+ if (__glibc_safe_or_unknown_len (__n, sizeof (char), __sz)) - return __recvfrom_alias (__fd, __buf, __n, __flags, __addr, __addr_len); - #if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, sizeof (char), sz)) -- return __recvfrom_chk_warn (__fd, __buf, __n, sz, __flags, __addr, -+ if (__glibc_unsafe_len (__n, sizeof (char), __sz)) -+ return __recvfrom_chk_warn (__fd, __buf, __n, __sz, __flags, __addr, - __addr_len); - #endif -- return __recvfrom_chk (__fd, __buf, __n, sz, __flags, __addr, __addr_len); -+ return __recvfrom_chk (__fd, __buf, __n, __sz, __flags, __addr, __addr_len); - } -diff --git a/stdlib/bits/stdlib.h b/stdlib/bits/stdlib.h -index 1557b862b1..9c78ecf458 100644 ---- a/stdlib/bits/stdlib.h -+++ b/stdlib/bits/stdlib.h -@@ -43,16 +43,16 @@ __NTH (realpath (const char *__restrict __name, - "bytes long buffer") - #endif - { -- size_t sz = __glibc_objsize (__resolved); -+ size_t __sz = __glibc_objsize (__resolved); - -- if (sz == (size_t) -1) -+ if (__sz == (size_t) -1) - return __realpath_alias (__name, __resolved); - - #if !__fortify_use_clang && defined _LIBC_LIMITS_H_ && defined PATH_MAX -- if (__glibc_unsafe_len (PATH_MAX, sizeof (char), sz)) -- return __realpath_chk_warn (__name, __resolved, sz); -+ if (__glibc_unsafe_len (PATH_MAX, sizeof (char), __sz)) -+ return __realpath_chk_warn (__name, __resolved, __sz); - #endif -- return __realpath_chk (__name, __resolved, sz); -+ return __realpath_chk (__name, __resolved, __sz); - } - - -diff --git a/wcsmbs/bits/wchar2.h b/wcsmbs/bits/wchar2.h -index 9fdff47ee2..43c6b63027 100644 ---- a/wcsmbs/bits/wchar2.h -+++ b/wcsmbs/bits/wchar2.h -@@ -74,9 +74,9 @@ __fortify_function __attribute_overloadable__ wchar_t * - __NTH (wcscpy (__fortify_clang_overload_arg (wchar_t *, __restrict, __dest), - const wchar_t *__restrict __src)) - { -- size_t sz = __glibc_objsize (__dest); -- if (sz != (size_t) -1) -- return __wcscpy_chk (__dest, __src, sz / sizeof (wchar_t)); -+ size_t __sz = __glibc_objsize (__dest); -+ if (__sz != (size_t) -1) -+ return __wcscpy_chk (__dest, __src, __sz / sizeof (wchar_t)); - return __wcscpy_alias (__dest, __src); - } - -@@ -84,9 +84,9 @@ __fortify_function __attribute_overloadable__ wchar_t * - __NTH (wcpcpy (__fortify_clang_overload_arg (wchar_t *, __restrict, __dest), - const wchar_t *__restrict __src)) - { -- size_t sz = __glibc_objsize (__dest); -- if (sz != (size_t) -1) -- return __wcpcpy_chk (__dest, __src, sz / sizeof (wchar_t)); -+ size_t __sz = __glibc_objsize (__dest); -+ if (__sz != (size_t) -1) -+ return __wcpcpy_chk (__dest, __src, __sz / sizeof (wchar_t)); - return __wcpcpy_alias (__dest, __src); - } - -@@ -118,9 +118,9 @@ __fortify_function __attribute_overloadable__ wchar_t * - __NTH (wcscat (__fortify_clang_overload_arg (wchar_t *, __restrict, __dest), - const wchar_t *__restrict __src)) - { -- size_t sz = __glibc_objsize (__dest); -- if (sz != (size_t) -1) -- return __wcscat_chk (__dest, __src, sz / sizeof (wchar_t)); -+ size_t __sz = __glibc_objsize (__dest); -+ if (__sz != (size_t) -1) -+ return __wcscat_chk (__dest, __src, __sz / sizeof (wchar_t)); - return __wcscat_alias (__dest, __src); - } - -@@ -128,9 +128,9 @@ __fortify_function __attribute_overloadable__ wchar_t * - __NTH (wcsncat (__fortify_clang_overload_arg (wchar_t *, __restrict, __dest), - const wchar_t *__restrict __src, size_t __n)) - { -- size_t sz = __glibc_objsize (__dest); -- if (sz != (size_t) -1) -- return __wcsncat_chk (__dest, __src, __n, sz / sizeof (wchar_t)); -+ size_t __sz = __glibc_objsize (__dest); -+ if (__sz != (size_t) -1) -+ return __wcsncat_chk (__dest, __src, __n, __sz / sizeof (wchar_t)); - return __wcsncat_alias (__dest, __src, __n); - } - -@@ -170,10 +170,10 @@ __fortify_function int - __NTH (swprintf (wchar_t *__restrict __s, size_t __n, - const wchar_t *__restrict __fmt, ...)) - { -- size_t sz = __glibc_objsize (__s); -- if (sz != (size_t) -1 || __USE_FORTIFY_LEVEL > 1) -+ size_t __sz = __glibc_objsize (__s); -+ if (__sz != (size_t) -1 || __USE_FORTIFY_LEVEL > 1) - return __swprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, -- sz / sizeof (wchar_t), __fmt, __va_arg_pack ()); -+ __sz / sizeof (wchar_t), __fmt, __va_arg_pack ()); - return __swprintf_alias (__s, __n, __fmt, __va_arg_pack ()); - } - #elif __fortify_use_clang -@@ -206,10 +206,10 @@ __fortify_function int - __NTH (vswprintf (wchar_t *__restrict __s, size_t __n, - const wchar_t *__restrict __fmt, __gnuc_va_list __ap)) - { -- size_t sz = __glibc_objsize (__s); -- if (sz != (size_t) -1 || __USE_FORTIFY_LEVEL > 1) -+ size_t __sz = __glibc_objsize (__s); -+ if (__sz != (size_t) -1 || __USE_FORTIFY_LEVEL > 1) - return __vswprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, -- sz / sizeof (wchar_t), __fmt, __ap); -+ __sz / sizeof (wchar_t), __fmt, __ap); - return __vswprintf_alias (__s, __n, __fmt, __ap); - } - -@@ -257,14 +257,14 @@ fgetws (__fortify_clang_overload_arg (wchar_t *, __restrict, __s), int __n, - "fgetws called with length bigger " - "than size of destination buffer") - { -- size_t sz = __glibc_objsize (__s); -- if (__glibc_safe_or_unknown_len (__n, sizeof (wchar_t), sz)) -+ size_t __sz = __glibc_objsize (__s); -+ if (__glibc_safe_or_unknown_len (__n, sizeof (wchar_t), __sz)) - return __fgetws_alias (__s, __n, __stream); - #if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, sizeof (wchar_t), sz)) -- return __fgetws_chk_warn (__s, sz / sizeof (wchar_t), __n, __stream); -+ if (__glibc_unsafe_len (__n, sizeof (wchar_t), __sz)) -+ return __fgetws_chk_warn (__s, __sz / sizeof (wchar_t), __n, __stream); - #endif -- return __fgetws_chk (__s, sz / sizeof (wchar_t), __n, __stream); -+ return __fgetws_chk (__s, __sz / sizeof (wchar_t), __n, __stream); - } - - #ifdef __USE_GNU -@@ -275,15 +275,15 @@ fgetws_unlocked (__fortify_clang_overload_arg (wchar_t *, __restrict, __s), - "fgetws_unlocked called with length bigger " - "than size of destination buffer") - { -- size_t sz = __glibc_objsize (__s); -- if (__glibc_safe_or_unknown_len (__n, sizeof (wchar_t), sz)) -+ size_t __sz = __glibc_objsize (__s); -+ if (__glibc_safe_or_unknown_len (__n, sizeof (wchar_t), __sz)) - return __fgetws_unlocked_alias (__s, __n, __stream); - # if !__fortify_use_clang -- if (__glibc_unsafe_len (__n, sizeof (wchar_t), sz)) -- return __fgetws_unlocked_chk_warn (__s, sz / sizeof (wchar_t), __n, -+ if (__glibc_unsafe_len (__n, sizeof (wchar_t), __sz)) -+ return __fgetws_unlocked_chk_warn (__s, __sz / sizeof (wchar_t), __n, - __stream); - # endif -- return __fgetws_unlocked_chk (__s, sz / sizeof (wchar_t), __n, __stream); -+ return __fgetws_unlocked_chk (__s, __sz / sizeof (wchar_t), __n, __stream); - } - #endif - - -commit 5641780762723156b0d20a0b9f7df1d76831bab0 -Author: Arjun Shankar -Date: Tue Jul 30 11:37:57 2024 +0200 - - manual/stdio: Further clarify putc, putwc, getc, and getwc - - This is a follow-up to 10de4a47ef3f481592e3c62eb07bcda23e9fde4d that - reworded the manual entries for putc and putwc and removed any - performance claims. - - This commit further clarifies these entries and brings getc and getwc in - line with the descriptions of putc and putwc, removing any performance - claims from them as well. - Reviewed-by: Florian Weimer - - (cherry picked from commit 942670c81dc8071dd75d6213e771daa5d2084cb6) - -diff --git a/manual/stdio.texi b/manual/stdio.texi -index f9529a098d..8517653507 100644 ---- a/manual/stdio.texi -+++ b/manual/stdio.texi -@@ -904,20 +904,16 @@ This function is a GNU extension. - @standards{ISO, stdio.h} - @safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} - This is just like @code{fputc}, except that it may be implemented as --a macro, making it faster. One consequence is that it may evaluate the --@var{stream} argument more than once, which is an exception to the --general rule for macros. Therefore, @var{stream} should never be an --expression with side-effects. -+a macro and may evaluate the @var{stream} argument more than once. -+Therefore, @var{stream} should never be an expression with side-effects. - @end deftypefun - - @deftypefun wint_t putwc (wchar_t @var{wc}, FILE *@var{stream}) - @standards{ISO, wchar.h} - @safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{} @aculock{}}} - This is just like @code{fputwc}, except that it may be implemented as --a macro, making it faster. One consequence is that it may evaluate the --@var{stream} argument more than once, which is an exception to the --general rule for macros. Therefore, @var{stream} should never be an --expression with side-effects. -+a macro and may evaluate the @var{stream} argument more than once. -+Therefore, @var{stream} should never be an expression with side-effects. - @end deftypefun - - @deftypefun int putc_unlocked (int @var{c}, FILE *@var{stream}) -@@ -1110,20 +1106,17 @@ This function is a GNU extension. - @deftypefun int getc (FILE *@var{stream}) - @standards{ISO, stdio.h} - @safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} --This is just like @code{fgetc}, except that it is permissible (and --typical) for it to be implemented as a macro that evaluates the --@var{stream} argument more than once. @code{getc} is often highly --optimized, so it is usually the best function to use to read a single --character. -+This is just like @code{fgetc}, except that it may be implemented as -+a macro and may evaluate the @var{stream} argument more than once. -+Therefore, @var{stream} should never be an expression with side-effects. - @end deftypefun - - @deftypefun wint_t getwc (FILE *@var{stream}) - @standards{ISO, wchar.h} - @safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@aculock{} @acucorrupt{}}} --This is just like @code{fgetwc}, except that it is permissible for it to --be implemented as a macro that evaluates the @var{stream} argument more --than once. @code{getwc} can be highly optimized, so it is usually the --best function to use to read a single wide character. -+This is just like @code{fgetwc}, except that it may be implemented as -+a macro and may evaluate the @var{stream} argument more than once. -+Therefore, @var{stream} should never be an expression with side-effects. - @end deftypefun - - @deftypefun int getc_unlocked (FILE *@var{stream}) - -commit 39ee60a719eb6ffde76ccc232d79273c473d7a93 -Author: Florian Weimer -Date: Fri Aug 9 17:01:17 2024 +0200 - - support: Add options list terminator to the test driver - - This avoids crashes if a test is passed unknown options. - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit c2a474f4617ede7a8bf56b7257acb37dc757b2d1) - -diff --git a/support/test-driver.c b/support/test-driver.c -index f4c3e4d666..04ceebc08f 100644 ---- a/support/test-driver.c -+++ b/support/test-driver.c -@@ -155,6 +155,7 @@ main (int argc, char **argv) - { - CMDLINE_OPTIONS - TEST_DEFAULT_OPTIONS -+ { 0, } - }; - test_config.options = &options; - #endif - -commit e3556937c2402b8acf2e586bf53168e9f482ba91 -Author: H.J. Lu -Date: Mon Jul 22 17:47:21 2024 -0700 - - x86-64: Remove sysdeps/x86_64/x32/dl-machine.h - - Remove sysdeps/x86_64/x32/dl-machine.h by folding x32 ARCH_LA_PLTENTER, - ARCH_LA_PLTEXIT and RTLD_START into sysdeps/x86_64/dl-machine.h. There - are no regressions on x86-64 nor x32. There are no changes in x86-64 - _dl_start_user. On x32, _dl_start_user changes are - - <_dl_start_user>: - mov %eax,%r12d - + mov %esp,%r13d - mov (%rsp),%edx - mov %edx,%esi - - mov %esp,%r13d - and $0xfffffff0,%esp - mov 0x0(%rip),%edi # <_dl_start_user+0x14> - lea 0x8(%r13,%rdx,4),%ecx - - Signed-off-by: H.J. Lu - Reviewed-by: Noah Goldstein - (cherry picked from commit 652c6cf26927352fc0e37e4e60c6fc98ddf6d3b4) - -diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h -index a6de3793e4..4f12955875 100644 ---- a/sysdeps/x86_64/dl-machine.h -+++ b/sysdeps/x86_64/dl-machine.h -@@ -139,37 +139,37 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], - .globl _start\n\ - .globl _dl_start_user\n\ - _start:\n\ -- movq %rsp, %rdi\n\ -+ mov %" RSP_LP ", %" RDI_LP "\n\ - call _dl_start\n\ - _dl_start_user:\n\ - # Save the user entry point address in %r12.\n\ -- movq %rax, %r12\n\ -+ mov %" RAX_LP ", %" R12_LP "\n\ - # Save %rsp value in %r13.\n\ -- movq %rsp, %r13\n\ -+ mov %" RSP_LP ", % " R13_LP "\n\ - "\ - RTLD_START_ENABLE_X86_FEATURES \ - "\ - # Read the original argument count.\n\ -- movq (%rsp), %rdx\n\ -+ mov (%rsp), %" RDX_LP "\n\ - # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ - # argc -> rsi\n\ -- movq %rdx, %rsi\n\ -+ mov %" RDX_LP ", %" RSI_LP "\n\ - # And align stack for the _dl_init call. \n\ -- andq $-16, %rsp\n\ -+ and $-16, %" RSP_LP "\n\ - # _dl_loaded -> rdi\n\ -- movq _rtld_local(%rip), %rdi\n\ -+ mov _rtld_local(%rip), %" RDI_LP "\n\ - # env -> rcx\n\ -- leaq 16(%r13,%rdx,8), %rcx\n\ -+ lea 2*" LP_SIZE "(%r13,%rdx," LP_SIZE "), %" RCX_LP "\n\ - # argv -> rdx\n\ -- leaq 8(%r13), %rdx\n\ -+ lea " LP_SIZE "(%r13), %" RDX_LP "\n\ - # Clear %rbp to mark outermost frame obviously even for constructors.\n\ - xorl %ebp, %ebp\n\ - # Call the function to run the initializers.\n\ - call _dl_init\n\ - # Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\ -- leaq _dl_fini(%rip), %rdx\n\ -+ lea _dl_fini(%rip), %" RDX_LP "\n\ - # And make sure %rsp points to argc stored on the stack.\n\ -- movq %r13, %rsp\n\ -+ mov %" R13_LP ", %" RSP_LP "\n\ - # Jump to the user's entry point.\n\ - jmp *%r12\n\ - .previous\n\ -@@ -234,8 +234,13 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rela) *reloc, - - - /* Names of the architecture-specific auditing callback functions. */ -+#ifdef __LP64__ - #define ARCH_LA_PLTENTER x86_64_gnu_pltenter - #define ARCH_LA_PLTEXIT x86_64_gnu_pltexit -+#else -+#define ARCH_LA_PLTENTER x32_gnu_pltenter -+#define ARCH_LA_PLTEXIT x32_gnu_pltexit -+#endif - - #endif /* !dl_machine_h */ - -diff --git a/sysdeps/x86_64/x32/dl-machine.h b/sysdeps/x86_64/x32/dl-machine.h -deleted file mode 100644 -index c35cee9261..0000000000 ---- a/sysdeps/x86_64/x32/dl-machine.h -+++ /dev/null -@@ -1,76 +0,0 @@ --/* Machine-dependent ELF dynamic relocation inline functions. x32 version. -- Copyright (C) 2012-2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --/* Must allow to be included more than once. -- See #ifdef RESOLVE_MAP in sysdeps/x86_64/dl-machine.h. */ --#include -- --#ifndef _X32_DL_MACHINE_H --#define _X32_DL_MACHINE_H -- --#undef ARCH_LA_PLTENTER --#undef ARCH_LA_PLTEXIT --#undef RTLD_START -- --/* Names of the architecture-specific auditing callback functions. */ --#define ARCH_LA_PLTENTER x32_gnu_pltenter --#define ARCH_LA_PLTEXIT x32_gnu_pltexit -- --/* Initial entry point code for the dynamic linker. -- The C function `_dl_start' is the real entry point; -- its return value is the user program's entry point. */ --#define RTLD_START asm ("\n\ --.text\n\ -- .p2align 4\n\ --.globl _start\n\ --.globl _dl_start_user\n\ --_start:\n\ -- movl %esp, %edi\n\ -- call _dl_start\n\ --_dl_start_user:\n\ -- # Save the user entry point address in %r12.\n\ -- movl %eax, %r12d\n\ -- # Read the original argument count.\n\ -- movl (%rsp), %edx\n\ -- # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ -- # argc -> rsi\n\ -- movl %edx, %esi\n\ -- # Save %rsp value in %r13.\n\ -- movl %esp, %r13d\n\ -- # And align stack for the _dl_init call.\n\ -- and $-16, %esp\n\ -- # _dl_loaded -> rdi\n\ -- movl _rtld_local(%rip), %edi\n\ -- # env -> rcx\n\ -- lea 8(%r13,%rdx,4), %ecx\n\ -- # argv -> rdx\n\ -- lea 4(%r13), %edx\n\ -- # Clear %rbp to mark outermost frame obviously even for constructors.\n\ -- xorl %ebp, %ebp\n\ -- # Call the function to run the initializers.\n\ -- call _dl_init\n\ -- # Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\ -- lea _dl_fini(%rip), %edx\n\ -- # And make sure %rsp points to argc stored on the stack.\n\ -- movl %r13d, %esp\n\ -- # Jump to the user's entry point.\n\ -- jmp *%r12\n\ --.previous\n\ --"); -- --#endif /* !_X32_DL_MACHINE_H */ - -commit 898f25e0b1026be5701d05715600be646e9d0714 -Author: H.J. Lu -Date: Mon Jul 22 17:47:22 2024 -0700 - - x32/cet: Support shadow stack during startup for Linux 6.10 - - Use RXX_LP in RTLD_START_ENABLE_X86_FEATURES. Support shadow stack during - startup for Linux 6.10: - - commit 2883f01ec37dd8668e7222dfdb5980c86fdfe277 - Author: H.J. Lu - Date: Fri Mar 15 07:04:33 2024 -0700 - - x86/shstk: Enable shadow stacks for x32 - - 1. Add shadow stack support to x32 signal. - 2. Use the 64-bit map_shadow_stack syscall for x32. - 3. Set up shadow stack for x32. - - Add the map_shadow_stack system call to and regenerate - arch-syscall.h. Tested on Intel Tiger Lake with CET enabled x32. There - are no regressions with CET enabled x86-64. There are no changes in CET - enabled x86-64 _dl_start_user. - - Signed-off-by: H.J. Lu - Reviewed-by: Noah Goldstein - (cherry picked from commit 8344c1f5514b1b5b1c8c6e48f4b802653bd23b71) - -diff --git a/sysdeps/unix/sysv/linux/x86_64/dl-cet.h b/sysdeps/unix/sysv/linux/x86_64/dl-cet.h -index 1fe3133406..b4f7e6c9cd 100644 ---- a/sysdeps/unix/sysv/linux/x86_64/dl-cet.h -+++ b/sysdeps/unix/sysv/linux/x86_64/dl-cet.h -@@ -92,9 +92,9 @@ dl_cet_ibt_enabled (void) - # Pass GL(dl_x86_feature_1) to _dl_cet_setup_features.\n\ - movl %edx, %edi\n\ - # Align stack for the _dl_cet_setup_features call.\n\ -- andq $-16, %rsp\n\ -+ and $-16, %" RSP_LP "\n\ - call _dl_cet_setup_features\n\ - # Restore %rax and %rsp from %r12 and %r13.\n\ -- movq %r12, %rax\n\ -- movq %r13, %rsp\n\ -+ mov %" R12_LP ", %" RAX_LP "\n\ -+ mov %" R13_LP ", %" RSP_LP "\n\ - " -diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/arch-syscall.h b/sysdeps/unix/sysv/linux/x86_64/x32/arch-syscall.h -index 3040a47d72..df3e22236d 100644 ---- a/sysdeps/unix/sysv/linux/x86_64/x32/arch-syscall.h -+++ b/sysdeps/unix/sysv/linux/x86_64/x32/arch-syscall.h -@@ -155,6 +155,7 @@ - #define __NR_lsm_set_self_attr 1073742284 - #define __NR_lstat 1073741830 - #define __NR_madvise 1073741852 -+#define __NR_map_shadow_stack 1073742277 - #define __NR_mbind 1073742061 - #define __NR_membarrier 1073742148 - #define __NR_memfd_create 1073742143 -diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/fixup-asm-unistd.h b/sysdeps/unix/sysv/linux/x86_64/x32/fixup-asm-unistd.h -index 98124169e6..47fa8af4ce 100644 ---- a/sysdeps/unix/sysv/linux/x86_64/x32/fixup-asm-unistd.h -+++ b/sysdeps/unix/sysv/linux/x86_64/x32/fixup-asm-unistd.h -@@ -15,6 +15,10 @@ - License along with the GNU C Library; if not, see - . */ - -+#ifndef __NR_map_shadow_stack -+# define __NR_map_shadow_stack 1073742277 -+#endif -+ - /* X32 uses the same 64-bit syscall interface for set_thread_area. */ - #ifndef __NR_set_thread_area - # define __NR_set_thread_area 1073742029 - -commit c0af0c2ba016030c778bc22c55f5f9498f96b8b9 -Author: Noah Goldstein -Date: Tue Aug 13 23:29:14 2024 +0800 - - x86: Fix bug in strchrnul-evex512 [BZ #32078] - - Issue was we were expecting not matches with CHAR before the start of - the string in the page cross case. - - The check code in the page cross case: - ``` - and $0xffffffffffffffc0,%rax - vmovdqa64 (%rax),%zmm17 - vpcmpneqb %zmm17,%zmm16,%k1 - vptestmb %zmm17,%zmm17,%k0{%k1} - kmovq %k0,%rax - inc %rax - shr %cl,%rax - je L(continue) - ``` - - expects that all characters that neither match null nor CHAR will be - 1s in `rax` prior to the `inc`. Then the `inc` will overflow all of - the 1s where no relevant match was found. - - This is incorrect in the page-cross case, as the - `vmovdqa64 (%rax),%zmm17` loads from before the start of the input - string. - - If there are matches with CHAR before the start of the string, `rax` - won't properly overflow. - - The fix is quite simple. Just replace: - - ``` - inc %rax - shr %cl,%rax - ``` - With: - ``` - sar %cl,%rax - inc %rax - ``` - - The arithmetic shift will clear any matches prior to the start of the - string while maintaining the signbit so the 1s can properly overflow - to zero in the case of no matches. - Reviewed-by: H.J. Lu - - (cherry picked from commit 7da08862471dfec6fdae731c2a5f351ad485c71f) - -diff --git a/string/test-strchr.c b/string/test-strchr.c -index c795eac6fa..72b17af687 100644 ---- a/string/test-strchr.c -+++ b/string/test-strchr.c -@@ -255,6 +255,69 @@ check1 (void) - check_result (impl, s, c, exp_result); - } - -+static void -+check2 (void) -+{ -+ CHAR *s = (CHAR *) (buf1 + getpagesize () - 4 * sizeof (CHAR)); -+ CHAR *s_begin = (CHAR *) (buf1 + getpagesize () - 64); -+#ifndef USE_FOR_STRCHRNUL -+ CHAR *exp_result = NULL; -+#else -+ CHAR *exp_result = s + 1; -+#endif -+ CHAR val = 0x12; -+ for (; s_begin != s; ++s_begin) -+ *s_begin = val; -+ -+ s[0] = val + 1; -+ s[1] = 0; -+ s[2] = val + 1; -+ s[3] = val + 1; -+ -+ { -+ FOR_EACH_IMPL (impl, 0) -+ check_result (impl, s, val, exp_result); -+ } -+ s[3] = val; -+ { -+ FOR_EACH_IMPL (impl, 0) -+ check_result (impl, s, val, exp_result); -+ } -+ exp_result = s; -+ s[0] = val; -+ { -+ FOR_EACH_IMPL (impl, 0) -+ check_result (impl, s, val, exp_result); -+ } -+ -+ s[3] = val + 1; -+ { -+ FOR_EACH_IMPL (impl, 0) -+ check_result (impl, s, val, exp_result); -+ } -+ -+ s[0] = val + 1; -+ s[1] = val + 1; -+ s[2] = val + 1; -+ s[3] = val + 1; -+ s[4] = val; -+ exp_result = s + 4; -+ { -+ FOR_EACH_IMPL (impl, 0) -+ check_result (impl, s, val, exp_result); -+ } -+ s[4] = 0; -+#ifndef USE_FOR_STRCHRNUL -+ exp_result = NULL; -+#else -+ exp_result = s + 4; -+#endif -+ { -+ FOR_EACH_IMPL (impl, 0) -+ check_result (impl, s, val, exp_result); -+ } -+} -+ - int - test_main (void) - { -@@ -263,7 +326,7 @@ test_main (void) - test_init (); - - check1 (); -- -+ check2 (); - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); -diff --git a/sysdeps/x86_64/multiarch/strchr-evex-base.S b/sysdeps/x86_64/multiarch/strchr-evex-base.S -index 04e2c0e79e..3a0b7c9d64 100644 ---- a/sysdeps/x86_64/multiarch/strchr-evex-base.S -+++ b/sysdeps/x86_64/multiarch/strchr-evex-base.S -@@ -124,13 +124,13 @@ L(page_cross): - VPCMPNE %VMM(1), %VMM(0), %k1 - VPTEST %VMM(1), %VMM(1), %k0{%k1} - KMOV %k0, %VRAX --# ifdef USE_AS_WCSCHR -+ sar %cl, %VRAX -+#ifdef USE_AS_WCSCHR - sub $VEC_MATCH_MASK, %VRAX --# else -+#else - inc %VRAX --# endif -+#endif - /* Ignore number of character for alignment adjustment. */ -- shr %cl, %VRAX - jz L(align_more) - - bsf %VRAX, %VRAX - -commit 586e4cd8c67df95ebb0bfecea3d007bff618d6d9 -Author: Florian Weimer -Date: Fri Aug 9 16:17:14 2024 +0200 - - Define __libc_initial for the static libc - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit eb0e50e9a1cf80a2ba6f33f990a08ef37a3267fb) - -diff --git a/include/libc-internal.h b/include/libc-internal.h -index 87ac591835..1ef43ffe67 100644 ---- a/include/libc-internal.h -+++ b/include/libc-internal.h -@@ -53,6 +53,9 @@ extern __typeof (__profile_frequency) __profile_frequency attribute_hidden; - is not for an audit module, not loaded via dlmopen, and not loaded - via static dlopen either). */ - extern _Bool __libc_initial attribute_hidden; -+#else -+/* The static libc is always the initial namespace. */ -+# define __libc_initial ((_Bool) 1) - #endif - - #endif /* _LIBC_INTERNAL */ - -commit 709319f9de6f976f9feceb623cb2c96769e9d78b -Author: Florian Weimer -Date: Mon Aug 19 15:48:03 2024 +0200 - - string: strerror, strsignal cannot use buffer after dlmopen (bug 32026) - - Secondary namespaces have a different malloc. Allocating the - buffer in one namespace and freeing it another results in - heap corruption. Fix this by using a static string (potentially - translated) in secondary namespaces. It would also be possible - to use the malloc from the initial namespace to manage the - buffer, but these functions would still not be safe to use in - auditors etc. because a call to strerror could still free a - buffer while it is used by the application. Another approach - could use proper initial-exec TLS, duplicated in secondary - namespaces, but that would need a callback interface for freeing - libc resources in namespaces on thread exit, which does not exist - today. - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit 25a5eb4010df94b412c67db9e346029de316d06b) - -diff --git a/NEWS b/NEWS -index b9eb4a558b..10a125bc66 100644 ---- a/NEWS -+++ b/NEWS -@@ -13,6 +13,7 @@ The following bugs are resolved with this release: - [31968] mremap implementation in C does not handle arguments correctly - [31890] resolv: Allow short error responses to match any DNS query - [31968] mremap implementation in C does not handle arguments correctly -+ [32026] strerror/strsignal TLS not handled correctly for secondary namespaces - [32052] Name space violation in fortify wrappers - - Version 2.40 -diff --git a/string/strerror_l.c b/string/strerror_l.c -index 15cce261e6..70456e5bb4 100644 ---- a/string/strerror_l.c -+++ b/string/strerror_l.c -@@ -20,7 +20,7 @@ - #include - #include - #include -- -+#include - - static const char * - translate (const char *str, locale_t loc) -@@ -31,6 +31,12 @@ translate (const char *str, locale_t loc) - return res; - } - -+static char * -+unknown_error (locale_t loc) -+{ -+ return (char *) translate ("Unknown error", loc); -+} -+ - - /* Return a string describing the errno code in ERRNUM. */ - char * -@@ -40,18 +46,25 @@ __strerror_l (int errnum, locale_t loc) - char *err = (char *) __get_errlist (errnum); - if (__glibc_unlikely (err == NULL)) - { -- struct tls_internal_t *tls_internal = __glibc_tls_internal (); -- free (tls_internal->strerror_l_buf); -- if (__asprintf (&tls_internal->strerror_l_buf, "%s%d", -- translate ("Unknown error ", loc), errnum) > 0) -- err = tls_internal->strerror_l_buf; -- else -+ if (__libc_initial) - { -- /* The memory was freed above. */ -- tls_internal->strerror_l_buf = NULL; -- /* Provide a fallback translation. */ -- err = (char *) translate ("Unknown error", loc); -+ struct tls_internal_t *tls_internal = __glibc_tls_internal (); -+ free (tls_internal->strerror_l_buf); -+ if (__asprintf (&tls_internal->strerror_l_buf, "%s%d", -+ translate ("Unknown error ", loc), errnum) > 0) -+ err = tls_internal->strerror_l_buf; -+ else -+ { -+ /* The memory was freed above. */ -+ tls_internal->strerror_l_buf = NULL; -+ /* Provide a fallback translation. */ -+ err = unknown_error (loc); -+ } - } -+ else -+ /* Secondary namespaces use a different malloc, so cannot -+ participate in the buffer management. */ -+ err = unknown_error (loc); - } - else - err = (char *) translate (err, loc); -diff --git a/string/strsignal.c b/string/strsignal.c -index 3114601564..d9b0365468 100644 ---- a/string/strsignal.c -+++ b/string/strsignal.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - - /* Return a string describing the meaning of the signal number SIGNUM. */ - char * -@@ -30,21 +31,28 @@ strsignal (int signum) - if (desc != NULL) - return _(desc); - -- struct tls_internal_t *tls_internal = __glibc_tls_internal (); -- free (tls_internal->strsignal_buf); -+ if (__libc_initial) -+ { -+ struct tls_internal_t *tls_internal = __glibc_tls_internal (); -+ free (tls_internal->strsignal_buf); - -- int r; -+ int r; - #ifdef SIGRTMIN -- if (signum >= SIGRTMIN && signum <= SIGRTMAX) -- r = __asprintf (&tls_internal->strsignal_buf, _("Real-time signal %d"), -- signum - SIGRTMIN); -- else -+ if (signum >= SIGRTMIN && signum <= SIGRTMAX) -+ r = __asprintf (&tls_internal->strsignal_buf, _("Real-time signal %d"), -+ signum - SIGRTMIN); -+ else - #endif -- r = __asprintf (&tls_internal->strsignal_buf, _("Unknown signal %d"), -- signum); -- -- if (r == -1) -- tls_internal->strsignal_buf = NULL; -- -- return tls_internal->strsignal_buf; -+ r = __asprintf (&tls_internal->strsignal_buf, _("Unknown signal %d"), -+ signum); -+ -+ if (r >= 0) -+ return tls_internal->strsignal_buf; -+ else -+ tls_internal->strsignal_buf = NULL; -+ } -+ /* Fall through on asprintf error, and for !__libc_initial: -+ secondary namespaces use a different malloc and cannot -+ participate in the buffer management. */ -+ return _("Unknown signal"); - } - -commit bc240ba7c86a74bc64d4234feadb49bb8e36e1c9 -Author: Maciej W. Rozycki -Date: Fri Jul 26 13:21:34 2024 +0100 - - support: Add FAIL test failure helper - - Add a FAIL test failure helper analogous to FAIL_RET, that does not - cause the current function to return, providing a standardized way to - report a test failure with a message supplied while permitting the - caller to continue executing, for further reporting, cleaning up, etc. - - Update existing test cases that provide a conflicting definition of FAIL - by removing the local FAIL definition and then as follows: - - - tst-fortify-syslog: provide a meaningful message in addition to the - file name already added by ; 'support_record_failure' - is already called by 'support_print_failure_impl' invoked by the new - FAIL test failure helper. - - - tst-ctype: no update to FAIL calls required, with the name of the file - and the line number within of the failure site additionally included - by the new FAIL test failure helper, and error counting plus count - reporting upon test program termination also already provided by - 'support_record_failure' and 'support_report_failure' respectively, - called by 'support_print_failure_impl' and 'adjust_exit_status' also - respectively. However in a number of places 'printf' is called and - the error count adjusted by hand, so update these places to make use - of FAIL instead. And last but not least adjust the final summary just - to report completion, with any error count following as reported by - the test driver. - - - test-tgmath2: no update to FAIL calls required, with the name of the - file of the failure site additionally included by the new FAIL test - failure helper. Also there is no need to track the return status by - hand as any call to FAIL will eventually cause the test case to return - an unsuccesful exit status regardless of the return status from the - test function, via a call to 'adjust_exit_status' made by the test - driver. - - Reviewed-by: DJ Delorie - (cherry picked from commit 1b97a9f23bf605ca608162089c94187573fb2a9e) - -diff --git a/debug/tst-fortify-syslog.c b/debug/tst-fortify-syslog.c -index a7ddbf7c6b..2712acf689 100644 ---- a/debug/tst-fortify-syslog.c -+++ b/debug/tst-fortify-syslog.c -@@ -22,7 +22,6 @@ - #include - #include - #include --#include - - #include - #include -@@ -46,18 +45,13 @@ handler (int sig) - _exit (127); - } - --#define FAIL() \ -- do { \ -- printf ("Failure on line %d\n", __LINE__); \ -- support_record_failure (); \ -- } while (0) - #define CHK_FAIL_START \ - chk_fail_ok = 1; \ - if (! setjmp (chk_fail_buf)) \ - { - #define CHK_FAIL_END \ - chk_fail_ok = 0; \ -- FAIL (); \ -+ FAIL ("not supposed to reach here"); \ - } - - static void -diff --git a/localedata/tst-ctype.c b/localedata/tst-ctype.c -index 9de979a2d7..a23689719c 100644 ---- a/localedata/tst-ctype.c -+++ b/localedata/tst-ctype.c -@@ -21,6 +21,8 @@ - #include - #include - -+#include -+ - - static const char lower[] = "abcdefghijklmnopqrstuvwxyz"; - static const char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -@@ -53,19 +55,11 @@ static struct classes - #define nclasses (sizeof (classes) / sizeof (classes[0])) - - --#define FAIL(str, args...) \ -- { \ -- printf (" " str "\n", ##args); \ -- ++errors; \ -- } -- -- - static int - do_test (void) - { - const char *cp; - const char *cp2; -- int errors = 0; - char *inpline = NULL; - size_t inplinelen = 0; - char *resline = NULL; -@@ -394,11 +388,8 @@ punct = %04x alnum = %04x\n", - { - if (((__ctype_b[(unsigned int) *inp] & classes[n].mask) != 0) - != (*resp != '0')) -- { -- printf (" is%s('%c' = '\\x%02x') %s true\n", inpline, -- *inp, *inp, *resp == '1' ? "not" : "is"); -- ++errors; -- } -+ FAIL (" is%s('%c' = '\\x%02x') %s true\n", inpline, -+ *inp, *inp, *resp == '1' ? "not" : "is"); - ++inp; - ++resp; - } -@@ -408,11 +399,8 @@ punct = %04x alnum = %04x\n", - while (*inp != '\0') - { - if (tolower (*inp) != *resp) -- { -- printf (" tolower('%c' = '\\x%02x') != '%c'\n", -- *inp, *inp, *resp); -- ++errors; -- } -+ FAIL (" tolower('%c' = '\\x%02x') != '%c'\n", -+ *inp, *inp, *resp); - ++inp; - ++resp; - } -@@ -422,11 +410,8 @@ punct = %04x alnum = %04x\n", - while (*inp != '\0') - { - if (toupper (*inp) != *resp) -- { -- printf (" toupper('%c' = '\\x%02x') != '%c'\n", -- *inp, *inp, *resp); -- ++errors; -- } -+ FAIL (" toupper('%c' = '\\x%02x') != '%c'\n", -+ *inp, *inp, *resp); - ++inp; - ++resp; - } -@@ -436,14 +421,7 @@ punct = %04x alnum = %04x\n", - } - - -- if (errors != 0) -- { -- printf (" %d error%s for `%s' locale\n\n\n", errors, -- errors == 1 ? "" : "s", setlocale (LC_ALL, NULL)); -- return 1; -- } -- -- printf (" No errors for `%s' locale\n\n\n", setlocale (LC_ALL, NULL)); -+ printf ("Completed testing for `%s' locale\n\n\n", setlocale (LC_ALL, NULL)); - return 0; - } - -diff --git a/math/test-tgmath2.c b/math/test-tgmath2.c -index 37afa8a08a..4aeb877b8e 100644 ---- a/math/test-tgmath2.c -+++ b/math/test-tgmath2.c -@@ -24,6 +24,8 @@ - #include - #include - -+#include -+ - //#define DEBUG - - typedef complex float cfloat; -@@ -87,13 +89,6 @@ enum - int count; - int counts[Tlast][C_last]; - --#define FAIL(str) \ -- do \ -- { \ -- printf ("%s failure on line %d\n", (str), __LINE__); \ -- result = 1; \ -- } \ -- while (0) - #define TEST_TYPE_ONLY(expr, rettype) \ - do \ - { \ -@@ -133,8 +128,6 @@ int counts[Tlast][C_last]; - int - test_cos (const int Vint4, const long long int Vllong4) - { -- int result = 0; -- - TEST (cos (vfloat1), float, cos); - TEST (cos (vdouble1), double, cos); - TEST (cos (vldouble1), ldouble, cos); -@@ -152,7 +145,7 @@ test_cos (const int Vint4, const long long int Vllong4) - TEST (cos (Vcdouble1), cdouble, cos); - TEST (cos (Vcldouble1), cldouble, cos); - -- return result; -+ return 0; - } - - int -diff --git a/support/check.h b/support/check.h -index 711f34b83b..7ea22c7a2c 100644 ---- a/support/check.h -+++ b/support/check.h -@@ -24,6 +24,11 @@ - - __BEGIN_DECLS - -+/* Record a test failure, print the failure message to standard output -+ and pass the result of 1 through. */ -+#define FAIL(...) \ -+ support_print_failure_impl (__FILE__, __LINE__, __VA_ARGS__) -+ - /* Record a test failure, print the failure message to standard output - and return 1. */ - #define FAIL_RET(...) \ - -commit 27fb563bfee521239316142fa4968282bffa86a6 -Author: Maciej W. Rozycki -Date: Fri Jul 26 13:21:34 2024 +0100 - - stdio-common: Add test for vfscanf with matches longer than INT_MAX [BZ #27650] - - Complement commit b03e4d7bd25b ("stdio: fix vfscanf with matches longer - than INT_MAX (bug 27650)") and add a test case for the issue, inspired - by the reproducer provided with the bug report. - - This has been verified to succeed as from the commit referred and fail - beforehand. - - As the test requires 2GiB of data to be passed around its performance - has been evaluated using a choice of systems and the execution time - determined to be respectively in the range of 9s for POWER9@2.166GHz, - 24s for FU740@1.2GHz, and 40s for 74Kf@950MHz. As this is on the verge - of and beyond the default timeout it has been increased by the factor of - 8. Regardless, following recent practice the test has been added to the - standard rather than extended set. - - Reviewed-by: DJ Delorie - (cherry picked from commit 89cddc8a7096f3d9225868304d2bc0a1aaf07d63) - -diff --git a/stdio-common/Makefile b/stdio-common/Makefile -index a63c05a120..e4f0146d2c 100644 ---- a/stdio-common/Makefile -+++ b/stdio-common/Makefile -@@ -240,6 +240,7 @@ tests := \ - tst-scanf-binary-c23 \ - tst-scanf-binary-gnu11 \ - tst-scanf-binary-gnu89 \ -+ tst-scanf-bz27650 \ - tst-scanf-intn \ - tst-scanf-round \ - tst-scanf-to_inpunct \ -@@ -328,6 +329,7 @@ generated += \ - tst-printf-fp-free.mtrace \ - tst-printf-fp-leak-mem.out \ - tst-printf-fp-leak.mtrace \ -+ tst-scanf-bz27650.mtrace \ - tst-vfprintf-width-prec-mem.out \ - tst-vfprintf-width-prec.mtrace \ - # generated -@@ -419,6 +421,9 @@ tst-printf-fp-free-ENV = \ - tst-printf-fp-leak-ENV = \ - MALLOC_TRACE=$(objpfx)tst-printf-fp-leak.mtrace \ - LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so -+tst-scanf-bz27650-ENV = \ -+ MALLOC_TRACE=$(objpfx)tst-scanf-bz27650.mtrace \ -+ LD_PRELOAD=$(common-objpfx)malloc/libc_malloc_debug.so - - $(objpfx)tst-unbputc.out: tst-unbputc.sh $(objpfx)tst-unbputc - $(SHELL) $< $(common-objpfx) '$(test-program-prefix)'; \ -diff --git a/stdio-common/tst-scanf-bz27650.c b/stdio-common/tst-scanf-bz27650.c -new file mode 100644 -index 0000000000..3a742bc865 ---- /dev/null -+++ b/stdio-common/tst-scanf-bz27650.c -@@ -0,0 +1,108 @@ -+/* Test for BZ #27650, formatted input matching beyond INT_MAX. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+#include -+ -+/* Produce a stream of more than INT_MAX characters via buffer BUF of -+ size SIZE according to bookkeeping in COOKIE and then return EOF. */ -+ -+static ssize_t -+io_read (void *cookie, char *buf, size_t size) -+{ -+ unsigned int *written = cookie; -+ unsigned int w = *written; -+ -+ if (w > INT_MAX) -+ return 0; -+ -+ memset (buf, 'a', size); -+ *written = w + size; -+ return size; -+} -+ -+/* Consume a stream of more than INT_MAX characters from an artificial -+ input stream of which none is the new line character. The call to -+ fscanf is supposed to complete upon the EOF condition of input, -+ however in the presence of BZ #27650 it will terminate prematurely -+ with characters still outstanding in input. Diagnose the condition -+ and return status accordingly. */ -+ -+int -+do_test (void) -+{ -+ static cookie_io_functions_t io_funcs = { .read = io_read }; -+ unsigned int written = 0; -+ FILE *in; -+ int v; -+ -+ mtrace (); -+ -+ in = fopencookie (&written, "r", io_funcs); -+ if (in == NULL) -+ { -+ FAIL ("fopencookie: %m"); -+ goto out; -+ } -+ -+ v = fscanf (in, "%*[^\n]"); -+ if (ferror (in)) -+ { -+ FAIL ("fscanf: input failure, at %u: %m", written); -+ goto out_close; -+ } -+ else if (v == EOF) -+ { -+ FAIL ("fscanf: unexpected end of file, at %u", written); -+ goto out_close; -+ } -+ -+ if (!feof (in)) -+ { -+ v = fgetc (in); -+ if (ferror (in)) -+ FAIL ("fgetc: input failure: %m"); -+ else if (v == EOF) -+ FAIL ("fgetc: unexpected end of file after missing end of file"); -+ else if (v == '\n') -+ FAIL ("unexpected new line character received"); -+ else -+ FAIL ("character received after end of file expected: \\x%02x", v); -+ } -+ -+out_close: -+ if (fclose (in) != 0) -+ FAIL ("fclose: %m"); -+ -+out: -+ return EXIT_SUCCESS; -+} -+ -+#define TIMEOUT (DEFAULT_TIMEOUT * 8) -+#include - -commit 2f749d2b15cbc82268d7f8735f21ae1e3b68754f -Author: Siddhesh Poyarekar -Date: Wed Aug 14 19:20:04 2024 -0400 - - Make tst-ungetc use libsupport - - Signed-off-by: Siddhesh Poyarekar - Reviewed-by: Carlos O'Donell - (cherry picked from commit 3f7df7e757f4efec38e45d4068e5492efcac4856) - -diff --git a/stdio-common/tst-ungetc.c b/stdio-common/tst-ungetc.c -index 1344b2b591..5c808f0734 100644 ---- a/stdio-common/tst-ungetc.c -+++ b/stdio-common/tst-ungetc.c -@@ -1,70 +1,72 @@ --/* Test for ungetc bugs. */ -+/* Test for ungetc bugs. -+ Copyright (C) 1996-2024 Free Software Foundation, Inc. -+ Copyright The GNU Toolchain Authors. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ - - #include - #include --#include -- --#undef assert --#define assert(x) \ -- if (!(x)) \ -- { \ -- fputs ("test failed: " #x "\n", stderr); \ -- retval = 1; \ -- goto the_end; \ -- } -+#include -+#include -+#include -+#include -+#include - --int --main (int argc, char *argv[]) -+static int -+do_test (void) - { -- char name[] = "/tmp/tst-ungetc.XXXXXX"; -+ char *name = NULL; - FILE *fp = NULL; -- int retval = 0; - int c; - char buffer[64]; - -- int fd = mkstemp (name); -+ int fd = create_temp_file ("tst-ungetc.", &name); - if (fd == -1) -- { -- printf ("mkstemp failed: %m\n"); -- return 1; -- } -- close (fd); -- fp = fopen (name, "w"); -- assert (fp != NULL) -- fputs ("bla", fp); -- fclose (fp); -- fp = NULL; -+ FAIL_EXIT1 ("cannot create temporary file: %m"); -+ xclose (fd); - -- fp = fopen (name, "r"); -- assert (fp != NULL); -- assert (ungetc ('z', fp) == 'z'); -- assert (getc (fp) == 'z'); -- assert (getc (fp) == 'b'); -- assert (getc (fp) == 'l'); -- assert (ungetc ('m', fp) == 'm'); -- assert (getc (fp) == 'm'); -- assert ((c = getc (fp)) == 'a'); -- assert (getc (fp) == EOF); -- assert (ungetc (c, fp) == c); -- assert (feof (fp) == 0); -- assert (getc (fp) == c); -- assert (getc (fp) == EOF); -- fclose (fp); -- fp = NULL; -+ fp = xfopen (name, "w"); -+ fputs ("bla", fp); -+ xfclose (fp); - -- fp = fopen (name, "r"); -- assert (fp != NULL); -- assert (getc (fp) == 'b'); -- assert (getc (fp) == 'l'); -- assert (ungetc ('b', fp) == 'b'); -- assert (fread (buffer, 1, 64, fp) == 2); -- assert (buffer[0] == 'b'); -- assert (buffer[1] == 'a'); -+ fp = xfopen (name, "r"); -+ TEST_VERIFY_EXIT (ungetc ('z', fp) == 'z'); -+ TEST_VERIFY_EXIT (getc (fp) == 'z'); -+ TEST_VERIFY_EXIT (getc (fp) == 'b'); -+ TEST_VERIFY_EXIT (getc (fp) == 'l'); -+ TEST_VERIFY_EXIT (ungetc ('m', fp) == 'm'); -+ TEST_VERIFY_EXIT (getc (fp) == 'm'); -+ TEST_VERIFY_EXIT ((c = getc (fp)) == 'a'); -+ TEST_VERIFY_EXIT (getc (fp) == EOF); -+ TEST_VERIFY_EXIT (ungetc (c, fp) == c); -+ TEST_VERIFY_EXIT (feof (fp) == 0); -+ TEST_VERIFY_EXIT (getc (fp) == c); -+ TEST_VERIFY_EXIT (getc (fp) == EOF); -+ xfclose (fp); - --the_end: -- if (fp != NULL) -- fclose (fp); -- unlink (name); -+ fp = xfopen (name, "r"); -+ TEST_VERIFY_EXIT (getc (fp) == 'b'); -+ TEST_VERIFY_EXIT (getc (fp) == 'l'); -+ TEST_VERIFY_EXIT (ungetc ('b', fp) == 'b'); -+ TEST_VERIFY_EXIT (fread (buffer, 1, 64, fp) == 2); -+ TEST_VERIFY_EXIT (buffer[0] == 'b'); -+ TEST_VERIFY_EXIT (buffer[1] == 'a'); -+ xfclose (fp); - -- return retval; -+ return 0; - } -+ -+#include - -commit dac7a0694b5e853f08be518cd5a133ac5804666d -Author: Siddhesh Poyarekar -Date: Tue Aug 13 21:00:06 2024 -0400 - - ungetc: Fix uninitialized read when putting into unused streams [BZ #27821] - - When ungetc is called on an unused stream, the backup buffer is - allocated without the main get area being present. This results in - every subsequent ungetc (as the stream remains in the backup area) - checking uninitialized memory in the backup buffer when trying to put a - character back into the stream. - - Avoid comparing the input character with buffer contents when in backup - to avoid this uninitialized read. The uninitialized read is harmless in - this context since the location is promptly overwritten with the input - character, thus fulfilling ungetc functionality. - - Also adjust wording in the manual to drop the paragraph that says glibc - cannot do multiple ungetc back to back since with this change, ungetc - can actually do this. - - Signed-off-by: Siddhesh Poyarekar - Reviewed-by: Carlos O'Donell - (cherry picked from commit cdf0f88f97b0aaceb894cc02b21159d148d7065c) - -diff --git a/libio/genops.c b/libio/genops.c -index 99f5e80f20..b012fa33d2 100644 ---- a/libio/genops.c -+++ b/libio/genops.c -@@ -662,7 +662,7 @@ _IO_sputbackc (FILE *fp, int c) - { - int result; - -- if (fp->_IO_read_ptr > fp->_IO_read_base -+ if (fp->_IO_read_ptr > fp->_IO_read_base && !_IO_in_backup (fp) - && (unsigned char)fp->_IO_read_ptr[-1] == (unsigned char)c) - { - fp->_IO_read_ptr--; -diff --git a/manual/stdio.texi b/manual/stdio.texi -index 8517653507..92614775fa 100644 ---- a/manual/stdio.texi -+++ b/manual/stdio.texi -@@ -1467,11 +1467,9 @@ program; usually @code{ungetc} is used only to unread a character that - was just read from the same stream. @Theglibc{} supports this - even on files opened in binary mode, but other systems might not. - --@Theglibc{} only supports one character of pushback---in other --words, it does not work to call @code{ungetc} twice without doing input --in between. Other systems might let you push back multiple characters; --then reading from the stream retrieves the characters in the reverse --order that they were pushed. -+@Theglibc{} supports pushing back multiple characters; subsequently -+reading from the stream retrieves the characters in the reverse order -+that they were pushed. - - Pushing back characters doesn't alter the file; only the internal - buffering for the stream is affected. If a file positioning function -diff --git a/stdio-common/tst-ungetc.c b/stdio-common/tst-ungetc.c -index 5c808f0734..388b202493 100644 ---- a/stdio-common/tst-ungetc.c -+++ b/stdio-common/tst-ungetc.c -@@ -48,6 +48,8 @@ do_test (void) - TEST_VERIFY_EXIT (getc (fp) == 'b'); - TEST_VERIFY_EXIT (getc (fp) == 'l'); - TEST_VERIFY_EXIT (ungetc ('m', fp) == 'm'); -+ TEST_VERIFY_EXIT (ungetc ('n', fp) == 'n'); -+ TEST_VERIFY_EXIT (getc (fp) == 'n'); - TEST_VERIFY_EXIT (getc (fp) == 'm'); - TEST_VERIFY_EXIT ((c = getc (fp)) == 'a'); - TEST_VERIFY_EXIT (getc (fp) == EOF); - -commit e24902f409994f226dbc6fde2476009df452a18f -Author: Siddhesh Poyarekar -Date: Tue Aug 13 21:08:49 2024 -0400 - - ungetc: Fix backup buffer leak on program exit [BZ #27821] - - If a file descriptor is left unclosed and is cleaned up by _IO_cleanup - on exit, its backup buffer remains unfreed, registering as a leak in - valgrind. This is not strictly an issue since (1) the program should - ideally be closing the stream once it's not in use and (2) the program - is about to exit anyway, so keeping the backup buffer around a wee bit - longer isn't a real problem. Free it anyway to keep valgrind happy - when the streams in question are the standard ones, i.e. stdout, stdin - or stderr. - - Also, the _IO_have_backup macro checks for _IO_save_base, - which is a roundabout way to check for a backup buffer instead of - directly looking for _IO_backup_base. The roundabout check breaks when - the main get area has not been used and user pushes a char into the - backup buffer with ungetc. Fix this to use the _IO_backup_base - directly. - - Signed-off-by: Siddhesh Poyarekar - Reviewed-by: Carlos O'Donell - (cherry picked from commit 3e1d8d1d1dca24ae90df2ea826a8916896fc7e77) - -diff --git a/libio/genops.c b/libio/genops.c -index b012fa33d2..35d8b30710 100644 ---- a/libio/genops.c -+++ b/libio/genops.c -@@ -816,6 +816,12 @@ _IO_unbuffer_all (void) - legacy = 1; - #endif - -+ /* Free up the backup area if it was ever allocated. */ -+ if (_IO_have_backup (fp)) -+ _IO_free_backup_area (fp); -+ if (fp->_mode > 0 && _IO_have_wbackup (fp)) -+ _IO_free_wbackup_area (fp); -+ - if (! (fp->_flags & _IO_UNBUFFERED) - /* Iff stream is un-orientated, it wasn't used. */ - && (legacy || fp->_mode != 0)) -diff --git a/libio/libioP.h b/libio/libioP.h -index 1af287b19f..616253fcd0 100644 ---- a/libio/libioP.h -+++ b/libio/libioP.h -@@ -577,8 +577,8 @@ extern void _IO_old_init (FILE *fp, int flags) __THROW; - ((__fp)->_wide_data->_IO_write_base \ - = (__fp)->_wide_data->_IO_write_ptr = __p, \ - (__fp)->_wide_data->_IO_write_end = (__ep)) --#define _IO_have_backup(fp) ((fp)->_IO_save_base != NULL) --#define _IO_have_wbackup(fp) ((fp)->_wide_data->_IO_save_base != NULL) -+#define _IO_have_backup(fp) ((fp)->_IO_backup_base != NULL) -+#define _IO_have_wbackup(fp) ((fp)->_wide_data->_IO_backup_base != NULL) - #define _IO_in_backup(fp) ((fp)->_flags & _IO_IN_BACKUP) - #define _IO_have_markers(fp) ((fp)->_markers != NULL) - #define _IO_blen(fp) ((fp)->_IO_buf_end - (fp)->_IO_buf_base) -diff --git a/stdio-common/Makefile b/stdio-common/Makefile -index e4f0146d2c..a91754f52d 100644 ---- a/stdio-common/Makefile -+++ b/stdio-common/Makefile -@@ -254,6 +254,7 @@ tests := \ - tst-swscanf \ - tst-tmpnam \ - tst-ungetc \ -+ tst-ungetc-leak \ - tst-unlockedio \ - tst-vfprintf-mbs-prec \ - tst-vfprintf-user-type \ -@@ -316,6 +317,7 @@ tests-special += \ - $(objpfx)tst-printf-bz25691-mem.out \ - $(objpfx)tst-printf-fp-free-mem.out \ - $(objpfx)tst-printf-fp-leak-mem.out \ -+ $(objpfx)tst-ungetc-leak-mem.out \ - $(objpfx)tst-vfprintf-width-prec-mem.out \ - # tests-special - -@@ -330,6 +332,8 @@ generated += \ - tst-printf-fp-leak-mem.out \ - tst-printf-fp-leak.mtrace \ - tst-scanf-bz27650.mtrace \ -+ tst-ungetc-leak-mem.out \ -+ tst-ungetc-leak.mtrace \ - tst-vfprintf-width-prec-mem.out \ - tst-vfprintf-width-prec.mtrace \ - # generated -@@ -424,6 +428,9 @@ tst-printf-fp-leak-ENV = \ - tst-scanf-bz27650-ENV = \ - MALLOC_TRACE=$(objpfx)tst-scanf-bz27650.mtrace \ - LD_PRELOAD=$(common-objpfx)malloc/libc_malloc_debug.so -+tst-ungetc-leak-ENV = \ -+ MALLOC_TRACE=$(objpfx)tst-ungetc-leak.mtrace \ -+ LD_PRELOAD=$(common-objpfx)malloc/libc_malloc_debug.so - - $(objpfx)tst-unbputc.out: tst-unbputc.sh $(objpfx)tst-unbputc - $(SHELL) $< $(common-objpfx) '$(test-program-prefix)'; \ -diff --git a/stdio-common/tst-ungetc-leak.c b/stdio-common/tst-ungetc-leak.c -new file mode 100644 -index 0000000000..6c5152b43f ---- /dev/null -+++ b/stdio-common/tst-ungetc-leak.c -@@ -0,0 +1,32 @@ -+/* Test for memory leak with ungetc when stream is unused. -+ Copyright The GNU Toolchain Authors. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+static int -+do_test (void) -+{ -+ mtrace (); -+ TEST_COMPARE (ungetc('y', stdin), 'y'); -+ return 0; -+} -+ -+#include - -commit 3b3350d7baa8de70b71c02e964d5b8343749ebf8 -Author: Maciej W. Rozycki -Date: Fri Jul 26 13:21:34 2024 +0100 - - posix: Use facilities in tst-truncate and tst-truncate64 - - Remove local FAIL macro in favor to FAIL_RET from , - which provides equivalent reporting, with the name of the file of the - failure site additionally included, for the tst-truncate-common core - shared between the tst-truncate and tst-truncate64 tests. - - Reviewed-by: DJ Delorie - (cherry picked from commit fe47595504a55e7bb992f8928533df154b510383) - -diff --git a/posix/tst-truncate-common.c b/posix/tst-truncate-common.c -index b774fa46b8..b8c561ffdb 100644 ---- a/posix/tst-truncate-common.c -+++ b/posix/tst-truncate-common.c -@@ -21,6 +21,8 @@ - #include - #include - -+#include -+ - static void do_prepare (void); - #define PREPARE(argc, argv) do_prepare () - static int do_test (void); -@@ -42,9 +44,6 @@ do_prepare (void) - } - } - --#define FAIL(str) \ -- do { printf ("error: %s (line %d)\n", str, __LINE__); return 1; } while (0) -- - static int - do_test_with_offset (off_t offset) - { -@@ -54,35 +53,35 @@ do_test_with_offset (off_t offset) - memset (buf, 0xcf, sizeof (buf)); - - if (pwrite (temp_fd, buf, sizeof (buf), offset) != sizeof (buf)) -- FAIL ("write failed"); -+ FAIL_RET ("write failed"); - if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + sizeof (buf))) -- FAIL ("initial size wrong"); -+ FAIL_RET ("initial size wrong"); - - if (ftruncate (temp_fd, offset + 800) < 0) -- FAIL ("size reduction with ftruncate failed"); -+ FAIL_RET ("size reduction with ftruncate failed"); - if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 800)) -- FAIL ("size after reduction with ftruncate is incorrect"); -+ FAIL_RET ("size after reduction with ftruncate is incorrect"); - - /* The following test covers more than POSIX. POSIX does not require - that ftruncate() can increase the file size. But we are testing - Unix systems. */ - if (ftruncate (temp_fd, offset + 1200) < 0) -- FAIL ("size increate with ftruncate failed"); -+ FAIL_RET ("size increate with ftruncate failed"); - if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 1200)) -- FAIL ("size after increase is incorrect"); -+ FAIL_RET ("size after increase is incorrect"); - - if (truncate (temp_filename, offset + 800) < 0) -- FAIL ("size reduction with truncate failed"); -+ FAIL_RET ("size reduction with truncate failed"); - if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 800)) -- FAIL ("size after reduction with truncate incorrect"); -+ FAIL_RET ("size after reduction with truncate incorrect"); - - /* The following test covers more than POSIX. POSIX does not require - that truncate() can increase the file size. But we are testing - Unix systems. */ - if (truncate (temp_filename, (offset + 1200)) < 0) -- FAIL ("size increase with truncate failed"); -+ FAIL_RET ("size increase with truncate failed"); - if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 1200)) -- FAIL ("size increase with truncate is incorrect"); -+ FAIL_RET ("size increase with truncate is incorrect"); - - return 0; - } - -commit 3414b17e9db16c3bc0de5b49555c4f94f155ffc8 -Author: Maciej W. Rozycki -Date: Fri Jul 26 13:21:34 2024 +0100 - - nptl: Use facilities in tst-setuid3 - - Remove local FAIL macro in favor to FAIL_EXIT1 from , - which provides equivalent reporting, with the name of the file and the - line number within of the failure site additionally included. Remove - FAIL_ERR altogether and include ": %m" explicitly with the format string - supplied to FAIL_EXIT1 as there seems little value to have a separate - macro just for this. - - Reviewed-by: DJ Delorie - (cherry picked from commit 8c98195af6e6f1ce21743fc26c723e0f7e45bcf2) - -diff --git a/sysdeps/pthread/tst-setuid3.c b/sysdeps/pthread/tst-setuid3.c -index 83f42a0ae5..3845ab03d3 100644 ---- a/sysdeps/pthread/tst-setuid3.c -+++ b/sysdeps/pthread/tst-setuid3.c -@@ -15,24 +15,19 @@ - License along with the GNU C Library; if not, see - . */ - --#include - #include - #include - #include - #include - -+#include -+ - /* The test must run under a non-privileged user ID. */ - static const uid_t test_uid = 1; - - static pthread_barrier_t barrier1; - static pthread_barrier_t barrier2; - --#define FAIL(fmt, ...) \ -- do { printf ("FAIL: " fmt "\n", __VA_ARGS__); _exit (1); } while (0) -- --#define FAIL_ERR(fmt, ...) \ -- do { printf ("FAIL: " fmt ": %m\n", __VA_ARGS__); _exit (1); } while (0) -- - /* True if x is not a successful return code from pthread_barrier_wait. */ - static inline bool - is_invalid_barrier_ret (int x) -@@ -45,10 +40,10 @@ thread_func (void *ctx __attribute__ ((unused))) - { - int ret = pthread_barrier_wait (&barrier1); - if (is_invalid_barrier_ret (ret)) -- FAIL ("pthread_barrier_wait (barrier1) (on thread): %d", ret); -+ FAIL_EXIT1 ("pthread_barrier_wait (barrier1) (on thread): %d", ret); - ret = pthread_barrier_wait (&barrier2); - if (is_invalid_barrier_ret (ret)) -- FAIL ("pthread_barrier_wait (barrier2) (on thread): %d", ret); -+ FAIL_EXIT1 ("pthread_barrier_wait (barrier2) (on thread): %d", ret); - return NULL; - } - -@@ -59,13 +54,13 @@ setuid_failure (int phase) - switch (ret) - { - case 0: -- FAIL ("setuid succeeded unexpectedly in phase %d", phase); -+ FAIL_EXIT1 ("setuid succeeded unexpectedly in phase %d", phase); - case -1: - if (errno != EPERM) -- FAIL_ERR ("setuid phase %d", phase); -+ FAIL_EXIT1 ("setuid phase %d: %m", phase); - break; - default: -- FAIL ("invalid setuid return value in phase %d: %d", phase, ret); -+ FAIL_EXIT1 ("invalid setuid return value in phase %d: %d", phase, ret); - } - } - -@@ -74,42 +69,42 @@ do_test (void) - { - if (getuid () == 0) - if (setuid (test_uid) != 0) -- FAIL_ERR ("setuid (%u)", (unsigned) test_uid); -+ FAIL_EXIT1 ("setuid (%u): %m", (unsigned) test_uid); - if (setuid (getuid ())) -- FAIL_ERR ("setuid (%s)", "getuid ()"); -+ FAIL_EXIT1 ("setuid (%s): %m", "getuid ()"); - setuid_failure (1); - - int ret = pthread_barrier_init (&barrier1, NULL, 2); - if (ret != 0) -- FAIL ("pthread_barrier_init (barrier1): %d", ret); -+ FAIL_EXIT1 ("pthread_barrier_init (barrier1): %d", ret); - ret = pthread_barrier_init (&barrier2, NULL, 2); - if (ret != 0) -- FAIL ("pthread_barrier_init (barrier2): %d", ret); -+ FAIL_EXIT1 ("pthread_barrier_init (barrier2): %d", ret); - - pthread_t thread; - ret = pthread_create (&thread, NULL, thread_func, NULL); - if (ret != 0) -- FAIL ("pthread_create: %d", ret); -+ FAIL_EXIT1 ("pthread_create: %d", ret); - - /* Ensure that the thread is running properly. */ - ret = pthread_barrier_wait (&barrier1); - if (is_invalid_barrier_ret (ret)) -- FAIL ("pthread_barrier_wait (barrier1): %d", ret); -+ FAIL_EXIT1 ("pthread_barrier_wait (barrier1): %d", ret); - - setuid_failure (2); - - /* Check success case. */ - if (setuid (getuid ()) != 0) -- FAIL_ERR ("setuid (%s)", "getuid ()"); -+ FAIL_EXIT1 ("setuid (%s): %m", "getuid ()"); - - /* Shutdown. */ - ret = pthread_barrier_wait (&barrier2); - if (is_invalid_barrier_ret (ret)) -- FAIL ("pthread_barrier_wait (barrier2): %d", ret); -+ FAIL_EXIT1 ("pthread_barrier_wait (barrier2): %d", ret); - - ret = pthread_join (thread, NULL); - if (ret != 0) -- FAIL ("pthread_join: %d", ret); -+ FAIL_EXIT1 ("pthread_join: %d", ret); - - return 0; - } - -commit b7edcfa0f41ccfaeb665a661d3a6a594c8d95848 -Author: Florian Weimer -Date: Thu Aug 1 23:31:23 2024 +0200 - - elf: Clarify and invert second argument of _dl_allocate_tls_init - - Also remove an outdated comment: _dl_allocate_tls_init is - called as part of pthread_create. - - Reviewed-by: Carlos O'Donell - (cherry picked from commit fe06fb313bddf7e4530056897d4a706606e49377) - -diff --git a/elf/dl-tls.c b/elf/dl-tls.c -index 3d221273f1..ecb966d282 100644 ---- a/elf/dl-tls.c -+++ b/elf/dl-tls.c -@@ -552,9 +552,14 @@ _dl_resize_dtv (dtv_t *dtv, size_t max_modid) - /* Allocate initial TLS. RESULT should be a non-NULL pointer to storage - for the TLS space. The DTV may be resized, and so this function may - call malloc to allocate that space. The loader's GL(dl_load_tls_lock) -- is taken when manipulating global TLS-related data in the loader. */ -+ is taken when manipulating global TLS-related data in the loader. -+ -+ If MAIN_THREAD, this is the first call during process -+ initialization. In this case, TLS initialization for secondary -+ (audit) namespaces is skipped because that has already been handled -+ by dlopen. */ - void * --_dl_allocate_tls_init (void *result, bool init_tls) -+_dl_allocate_tls_init (void *result, bool main_thread) - { - if (result == NULL) - /* The memory allocation failed. */ -@@ -633,7 +638,7 @@ _dl_allocate_tls_init (void *result, bool init_tls) - because it would already be set by the audit setup. However, - subsequent thread creation would need to follow the default - behaviour. */ -- if (map->l_ns != LM_ID_BASE && !init_tls) -+ if (map->l_ns != LM_ID_BASE && main_thread) - continue; - memset (__mempcpy (dest, map->l_tls_initimage, - map->l_tls_initimage_size), '\0', -@@ -661,7 +666,7 @@ _dl_allocate_tls (void *mem) - { - return _dl_allocate_tls_init (mem == NULL - ? _dl_allocate_tls_storage () -- : allocate_dtv (mem), true); -+ : allocate_dtv (mem), false); - } - rtld_hidden_def (_dl_allocate_tls) - -diff --git a/elf/rtld.c b/elf/rtld.c -index bfdf632e77..09b9c9993b 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -2338,7 +2338,7 @@ dl_main (const ElfW(Phdr) *phdr, - into the main thread's TLS area, which we allocated above. - Note: thread-local variables must only be accessed after completing - the next step. */ -- _dl_allocate_tls_init (tcbp, false); -+ _dl_allocate_tls_init (tcbp, true); - - /* And finally install it for the main thread. */ - if (! __rtld_tls_init_tp_called) -diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c -index f35a8369bd..2cb562f8ea 100644 ---- a/nptl/allocatestack.c -+++ b/nptl/allocatestack.c -@@ -139,7 +139,7 @@ get_cached_stack (size_t *sizep, void **memp) - memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t)); - - /* Re-initialize the TLS. */ -- _dl_allocate_tls_init (TLS_TPADJ (result), true); -+ _dl_allocate_tls_init (TLS_TPADJ (result), false); - - return result; - } -diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h -index 656e8a3fa0..154efb0e19 100644 ---- a/sysdeps/generic/ldsodefs.h -+++ b/sysdeps/generic/ldsodefs.h -@@ -1200,10 +1200,8 @@ extern void _dl_get_tls_static_info (size_t *sizep, size_t *alignp); - - extern void _dl_allocate_static_tls (struct link_map *map) attribute_hidden; - --/* These are internal entry points to the two halves of _dl_allocate_tls, -- only used within rtld.c itself at startup time. */ - extern void *_dl_allocate_tls_storage (void) attribute_hidden; --extern void *_dl_allocate_tls_init (void *, bool); -+extern void *_dl_allocate_tls_init (void *result, bool main_thread); - rtld_hidden_proto (_dl_allocate_tls_init) - - /* True if the TCB has been set up. */ - -commit f496b750f135e57da921e975835c44bd199246dd -Author: Florian Weimer -Date: Thu Aug 1 23:31:30 2024 +0200 - - elf: Avoid re-initializing already allocated TLS in dlopen (bug 31717) - - The old code used l_init_called as an indicator for whether TLS - initialization was complete. However, it is possible that - TLS for an object is initialized, written to, and then dlopen - for this object is called again, and l_init_called is not true at - this point. Previously, this resulted in TLS being initialized - twice, discarding any interim writes (technically introducing a - use-after-free bug even). - - This commit introduces an explicit per-object flag, l_tls_in_slotinfo. - It indicates whether _dl_add_to_slotinfo has been called for this - object. This flag is used to avoid double-initialization of TLS. - In update_tls_slotinfo, the first_static_tls micro-optimization - is removed because preserving the initalization flag for subsequent - use by the second loop for static TLS is a bit complicated, and - another per-object flag does not seem to be worth it. Furthermore, - the l_init_called flag is dropped from the second loop (for static - TLS initialization) because l_need_tls_init on its own prevents - double-initialization. - - The remaining l_init_called usage in resize_scopes and update_scopes - is just an optimization due to the use of scope_has_map, so it is - not changed in this commit. - - The isupper check ensures that libc.so.6 is TLS is not reverted. - Such a revert happens if l_need_tls_init is not cleared in - _dl_allocate_tls_init for the main_thread case, now that - l_init_called is not checked anymore in update_tls_slotinfo - in elf/dl-open.c. - - Reported-by: Jonathon Anderson - Reviewed-by: Carlos O'Donell - (cherry picked from commit 5097cd344fd243fb8deb6dec96e8073753f962f9) - -diff --git a/NEWS b/NEWS -index 10a125bc66..5b20efbf6c 100644 ---- a/NEWS -+++ b/NEWS -@@ -10,7 +10,7 @@ Version 2.40.1 - The following bugs are resolved with this release: - - [30081] resolv: Do not wait for non-existing second DNS response after error -- [31968] mremap implementation in C does not handle arguments correctly -+ [31717] elf: Avoid re-initializing already allocated TLS in dlopen - [31890] resolv: Allow short error responses to match any DNS query - [31968] mremap implementation in C does not handle arguments correctly - [32026] strerror/strsignal TLS not handled correctly for secondary namespaces -diff --git a/elf/Makefile b/elf/Makefile -index a3475f3fb5..a03c6520d8 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -416,6 +416,10 @@ tests += \ - tst-dlmopen4 \ - tst-dlopen-self \ - tst-dlopen-tlsmodid \ -+ tst-dlopen-tlsreinit1 \ -+ tst-dlopen-tlsreinit2 \ -+ tst-dlopen-tlsreinit3 \ -+ tst-dlopen-tlsreinit4 \ - tst-dlopenfail \ - tst-dlopenfail-2 \ - tst-dlopenrpath \ -@@ -853,6 +857,9 @@ modules-names += \ - tst-dlmopen-twice-mod1 \ - tst-dlmopen-twice-mod2 \ - tst-dlmopen1mod \ -+ tst-dlopen-tlsreinitmod1 \ -+ tst-dlopen-tlsreinitmod2 \ -+ tst-dlopen-tlsreinitmod3 \ - tst-dlopenfaillinkmod \ - tst-dlopenfailmod1 \ - tst-dlopenfailmod2 \ -@@ -3118,3 +3125,26 @@ $(objpfx)tst-recursive-tls.out: \ - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) - $(objpfx)tst-recursive-tlsmod%.os: tst-recursive-tlsmodN.c - $(compile-command.c) -DVAR=thread_$* -DFUNC=get_threadvar_$* -+ -+# Order matters here. The test needs the constructor for -+# tst-dlopen-tlsreinitmod2.so to be called first. -+LDFLAGS-tst-dlopen-tlsreinitmod1.so = -Wl,--no-as-needed -+$(objpfx)tst-dlopen-tlsreinitmod1.so: \ -+ $(objpfx)tst-dlopen-tlsreinitmod3.so $(objpfx)tst-dlopen-tlsreinitmod2.so -+LDFLAGS-tst-dlopen-tlsreinit2 = -Wl,--no-as-needed -+$(objpfx)tst-dlopen-tlsreinit2: \ -+ $(objpfx)tst-dlopen-tlsreinitmod3.so $(objpfx)tst-dlopen-tlsreinitmod2.so -+LDFLAGS-tst-dlopen-tlsreinit4 = -Wl,--no-as-needed -+$(objpfx)tst-dlopen-tlsreinit4: \ -+ $(objpfx)tst-dlopen-tlsreinitmod3.so $(objpfx)tst-dlopen-tlsreinitmod2.so -+# tst-dlopen-tlsreinitmod2.so is underlinked and refers to -+# tst-dlopen-tlsreinitmod3.so. The dependency is provided via -+# $(objpfx)tst-dlopen-tlsreinitmod1.so. -+tst-dlopen-tlsreinitmod2.so-no-z-defs = yes -+$(objpfx)tst-dlopen-tlsreinit.out: $(objpfx)tst-dlopen-tlsreinitmod1.so \ -+ $(objpfx)tst-dlopen-tlsreinitmod2.so $(objpfx)tst-dlopen-tlsreinitmod3.so -+# Reuse an audit module which provides ample debug logging. -+$(objpfx)tst-dlopen-tlsreinit3.out: $(objpfx)tst-auditmod1.so -+tst-dlopen-tlsreinit3-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so -+$(objpfx)tst-dlopen-tlsreinit4.out: $(objpfx)tst-auditmod1.so -+tst-dlopen-tlsreinit4-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so -diff --git a/elf/dl-open.c b/elf/dl-open.c -index c378da16c0..8556e7bd2f 100644 ---- a/elf/dl-open.c -+++ b/elf/dl-open.c -@@ -363,17 +363,8 @@ resize_tls_slotinfo (struct link_map *new) - { - bool any_tls = false; - for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i) -- { -- struct link_map *imap = new->l_searchlist.r_list[i]; -- -- /* Only add TLS memory if this object is loaded now and -- therefore is not yet initialized. */ -- if (! imap->l_init_called && imap->l_tls_blocksize > 0) -- { -- _dl_add_to_slotinfo (imap, false); -- any_tls = true; -- } -- } -+ if (_dl_add_to_slotinfo (new->l_searchlist.r_list[i], false)) -+ any_tls = true; - return any_tls; - } - -@@ -383,22 +374,8 @@ resize_tls_slotinfo (struct link_map *new) - static void - update_tls_slotinfo (struct link_map *new) - { -- unsigned int first_static_tls = new->l_searchlist.r_nlist; - for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i) -- { -- struct link_map *imap = new->l_searchlist.r_list[i]; -- -- /* Only add TLS memory if this object is loaded now and -- therefore is not yet initialized. */ -- if (! imap->l_init_called && imap->l_tls_blocksize > 0) -- { -- _dl_add_to_slotinfo (imap, true); -- -- if (imap->l_need_tls_init -- && first_static_tls == new->l_searchlist.r_nlist) -- first_static_tls = i; -- } -- } -+ _dl_add_to_slotinfo (new->l_searchlist.r_list[i], true); - - size_t newgen = GL(dl_tls_generation) + 1; - if (__glibc_unlikely (newgen == 0)) -@@ -410,13 +387,11 @@ TLS generation counter wrapped! Please report this.")); - /* We need a second pass for static tls data, because - _dl_update_slotinfo must not be run while calls to - _dl_add_to_slotinfo are still pending. */ -- for (unsigned int i = first_static_tls; i < new->l_searchlist.r_nlist; ++i) -+ for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i) - { - struct link_map *imap = new->l_searchlist.r_list[i]; - -- if (imap->l_need_tls_init -- && ! imap->l_init_called -- && imap->l_tls_blocksize > 0) -+ if (imap->l_need_tls_init && imap->l_tls_blocksize > 0) - { - /* For static TLS we have to allocate the memory here and - now, but we can delay updating the DTV. */ -diff --git a/elf/dl-tls.c b/elf/dl-tls.c -index ecb966d282..3d529b722c 100644 ---- a/elf/dl-tls.c -+++ b/elf/dl-tls.c -@@ -632,17 +632,21 @@ _dl_allocate_tls_init (void *result, bool main_thread) - some platforms use in static programs requires it. */ - dtv[map->l_tls_modid].pointer.val = dest; - -- /* Copy the initialization image and clear the BSS part. For -- audit modules or dependencies with initial-exec TLS, we can not -- set the initial TLS image on default loader initialization -- because it would already be set by the audit setup. However, -- subsequent thread creation would need to follow the default -- behaviour. */ -+ /* Copy the initialization image and clear the BSS part. -+ For audit modules or dependencies with initial-exec TLS, -+ we can not set the initial TLS image on default loader -+ initialization because it would already be set by the -+ audit setup, which uses the dlopen code and already -+ clears l_need_tls_init. Calls with !main_thread from -+ pthread_create need to initialze TLS for the current -+ thread regardless of namespace. */ - if (map->l_ns != LM_ID_BASE && main_thread) - continue; - memset (__mempcpy (dest, map->l_tls_initimage, - map->l_tls_initimage_size), '\0', - map->l_tls_blocksize - map->l_tls_initimage_size); -+ if (main_thread) -+ map->l_need_tls_init = 0; - } - - total += cnt; -@@ -1099,9 +1103,32 @@ _dl_tls_initial_modid_limit_setup (void) - } - - --void -+/* Add module to slot information data. If DO_ADD is false, only the -+ required memory is allocated. Must be called with -+ GL (dl_load_tls_lock) acquired. If the function has already been -+ called for the link map L with !DO_ADD, then this function will not -+ raise an exception, otherwise it is possible that it encounters a -+ memory allocation failure. -+ -+ Return false if L has already been added to the slotinfo data, or -+ if L has no TLS data. If the returned value is true, L has been -+ added with this call (DO_ADD), or has been added in a previous call -+ (!DO_ADD). -+ -+ The expected usage is as follows: Call _dl_add_to_slotinfo for -+ several link maps with DO_ADD set to false, and record if any calls -+ result in a true result. If there was a true result, call -+ _dl_add_to_slotinfo again, this time with DO_ADD set to true. (For -+ simplicity, it's possible to call the function for link maps where -+ the previous result was false.) The return value from the second -+ round of calls can be ignored. If there was true result initially, -+ call _dl_update_slotinfo to update the TLS generation counter. */ -+bool - _dl_add_to_slotinfo (struct link_map *l, bool do_add) - { -+ if (l->l_tls_blocksize == 0 || l->l_tls_in_slotinfo) -+ return false; -+ - /* Now that we know the object is loaded successfully add - modules containing TLS data to the dtv info table. We - might have to increase its size. */ -@@ -1157,7 +1184,10 @@ cannot create TLS data structures")); - atomic_store_relaxed (&listp->slotinfo[idx].map, l); - atomic_store_relaxed (&listp->slotinfo[idx].gen, - GL(dl_tls_generation) + 1); -+ l->l_tls_in_slotinfo = true; - } -+ -+ return true; - } - - #if PTHREAD_IN_LIBC -diff --git a/elf/tst-dlopen-tlsreinit1.c b/elf/tst-dlopen-tlsreinit1.c -new file mode 100644 -index 0000000000..2016b9b0c6 ---- /dev/null -+++ b/elf/tst-dlopen-tlsreinit1.c -@@ -0,0 +1,40 @@ -+/* Test that dlopen preserves already accessed TLS (bug 31717). -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+static int -+do_test (void) -+{ -+ void *handle = xdlopen ("tst-dlopen-tlsreinitmod1.so", RTLD_NOW); -+ -+ bool *tlsreinitmod3_tested = xdlsym (handle, "tlsreinitmod3_tested"); -+ TEST_VERIFY (*tlsreinitmod3_tested); -+ -+ xdlclose (handle); -+ -+ /* This crashes if the libc.so.6 TLS image has been reverted. */ -+ TEST_VERIFY (!isupper ('@')); -+ -+ return 0; -+} -+ -+#include -diff --git a/elf/tst-dlopen-tlsreinit2.c b/elf/tst-dlopen-tlsreinit2.c -new file mode 100644 -index 0000000000..90ad2c7713 ---- /dev/null -+++ b/elf/tst-dlopen-tlsreinit2.c -@@ -0,0 +1,39 @@ -+/* Test that dlopen preserves already accessed TLS (bug 31717). -+ Variant with initially-linked modules. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+ -+static int -+do_test (void) -+{ -+ /* Defined in tst-dlopen-tlsreinitmod3.so. */ -+ extern bool tlsreinitmod3_tested; -+ TEST_VERIFY (tlsreinitmod3_tested); -+ -+ /* This crashes if the libc.so.6 TLS image has been reverted. */ -+ TEST_VERIFY (!isupper ('@')); -+ -+ return 0; -+} -+ -+#include -diff --git a/elf/tst-dlopen-tlsreinit3.c b/elf/tst-dlopen-tlsreinit3.c -new file mode 100644 -index 0000000000..79bd585aff ---- /dev/null -+++ b/elf/tst-dlopen-tlsreinit3.c -@@ -0,0 +1,2 @@ -+/* Same code, but run with LD_AUDIT=tst-auditmod1.so. */ -+#include "tst-dlopen-tlsreinit1.c" -diff --git a/elf/tst-dlopen-tlsreinit4.c b/elf/tst-dlopen-tlsreinit4.c -new file mode 100644 -index 0000000000..344c9211ab ---- /dev/null -+++ b/elf/tst-dlopen-tlsreinit4.c -@@ -0,0 +1,2 @@ -+/* Same code, but run with LD_AUDIT=tst-auditmod1.so. */ -+#include "tst-dlopen-tlsreinit2.c" -diff --git a/elf/tst-dlopen-tlsreinitmod1.c b/elf/tst-dlopen-tlsreinitmod1.c -new file mode 100644 -index 0000000000..354cc3de51 ---- /dev/null -+++ b/elf/tst-dlopen-tlsreinitmod1.c -@@ -0,0 +1,20 @@ -+/* Test that dlopen preserves already accessed TLS (bug 31717), module 1. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* This module triggers loading of tst-dlopen-tlsreinitmod2.so and -+ tst-dlopen-tlsreinitmod3.so. */ -diff --git a/elf/tst-dlopen-tlsreinitmod2.c b/elf/tst-dlopen-tlsreinitmod2.c -new file mode 100644 -index 0000000000..677e69bd35 ---- /dev/null -+++ b/elf/tst-dlopen-tlsreinitmod2.c -@@ -0,0 +1,30 @@ -+/* Test that dlopen preserves already accessed TLS (bug 31717), module 2. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+ -+/* Defined in tst-dlopen-tlsreinitmod3.so. This an underlinked symbol -+ dependency. */ -+extern void call_tlsreinitmod3 (void); -+ -+static void __attribute__ ((constructor)) -+tlsreinitmod2_init (void) -+{ -+ puts ("info: constructor of tst-dlopen-tlsreinitmod2.so invoked"); -+ call_tlsreinitmod3 (); -+} -diff --git a/elf/tst-dlopen-tlsreinitmod3.c b/elf/tst-dlopen-tlsreinitmod3.c -new file mode 100644 -index 0000000000..ef769c5131 ---- /dev/null -+++ b/elf/tst-dlopen-tlsreinitmod3.c -@@ -0,0 +1,102 @@ -+/* Test that dlopen preserves already accessed TLS (bug 31717), module 3. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+ -+/* Used to verify from the main program that the test ran. */ -+bool tlsreinitmod3_tested; -+ -+/* This TLS variable must not revert back to the initial state after -+ dlopen. */ -+static __thread int tlsreinitmod3_state = 1; -+ -+/* Set from the ELF constructor during dlopen. */ -+static bool tlsreinitmod3_constructed; -+ -+/* Second half of test, behind a compiler barrier. The compiler -+ barrier is necessary to prevent carrying over TLS address -+ information from call_tlsreinitmod3 to call_tlsreinitmod3_tail. */ -+void call_tlsreinitmod3_tail (void *self) __attribute__ ((weak)); -+ -+/* Called from tst-dlopen-tlsreinitmod2.so. */ -+void -+call_tlsreinitmod3 (void) -+{ -+ printf ("info: call_tlsreinitmod3 invoked (state=%d)\n", -+ tlsreinitmod3_state); -+ -+ if (tlsreinitmod3_constructed) -+ { -+ puts ("error: call_tlsreinitmod3 called after ELF constructor"); -+ fflush (stdout); -+ /* Cannot rely on test harness due to dynamic linking. */ -+ _exit (1); -+ } -+ -+ tlsreinitmod3_state = 2; -+ -+ /* Self-dlopen. This will run the ELF constructor. */ -+ void *self = dlopen ("tst-dlopen-tlsreinitmod3.so", RTLD_NOW); -+ if (self == NULL) -+ { -+ printf ("error: dlopen: %s\n", dlerror ()); -+ fflush (stdout); -+ /* Cannot rely on test harness due to dynamic linking. */ -+ _exit (1); -+ } -+ -+ call_tlsreinitmod3_tail (self); -+} -+ -+void -+call_tlsreinitmod3_tail (void *self) -+{ -+ printf ("info: dlopen returned in tlsreinitmod3 (state=%d)\n", -+ tlsreinitmod3_state); -+ -+ if (!tlsreinitmod3_constructed) -+ { -+ puts ("error: dlopen did not call tlsreinitmod3 ELF constructor"); -+ fflush (stdout); -+ /* Cannot rely on test harness due to dynamic linking. */ -+ _exit (1); -+ } -+ -+ if (tlsreinitmod3_state != 2) -+ { -+ puts ("error: TLS state reverted in tlsreinitmod3"); -+ fflush (stdout); -+ /* Cannot rely on test harness due to dynamic linking. */ -+ _exit (1); -+ } -+ -+ dlclose (self); -+ -+ /* Signal test completion to the main program. */ -+ tlsreinitmod3_tested = true; -+} -+ -+static void __attribute__ ((constructor)) -+tlsreinitmod3_init (void) -+{ -+ puts ("info: constructor of tst-dlopen-tlsreinitmod3.so invoked"); -+ tlsreinitmod3_constructed = true; -+} -diff --git a/include/link.h b/include/link.h -index cb0d7d8e2f..5ed445d5a6 100644 ---- a/include/link.h -+++ b/include/link.h -@@ -212,6 +212,7 @@ struct link_map - unsigned int l_find_object_processed:1; /* Zero if _dl_find_object_update - needs to process this - lt_library map. */ -+ unsigned int l_tls_in_slotinfo:1; /* TLS slotinfo updated in dlopen. */ - - /* NODELETE status of the map. Only valid for maps of type - lt_loaded. Lazy binding sets l_nodelete_active directly, -diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h -index 154efb0e19..259ce2e7d6 100644 ---- a/sysdeps/generic/ldsodefs.h -+++ b/sysdeps/generic/ldsodefs.h -@@ -1239,13 +1239,7 @@ extern void *_dl_open (const char *name, int mode, const void *caller, - extern int _dl_scope_free (void *) attribute_hidden; - - --/* Add module to slot information data. If DO_ADD is false, only the -- required memory is allocated. Must be called with GL -- (dl_load_tls_lock) acquired. If the function has already been called -- for the link map L with !do_add, then this function will not raise -- an exception, otherwise it is possible that it encounters a memory -- allocation failure. */ --extern void _dl_add_to_slotinfo (struct link_map *l, bool do_add) -+extern bool _dl_add_to_slotinfo (struct link_map *l, bool do_add) - attribute_hidden; - - /* Update slot information data for at least the generation of the - -commit f4a9b6e97bf05cf5a41907e55901f7e9afaafd4d -Author: Florian Weimer -Date: Mon Sep 9 21:10:23 2024 +0200 - - elf: Fix tst-dlopen-tlsreinit1.out test dependency - - Fixes commit 5097cd344fd243fb8deb6dec96e8073753f962f9 - ("elf: Avoid re-initializing already allocated TLS in dlopen - (bug 31717)"). - - Reported-by: Patsy Griffin - Reviewed-by: Patsy Griffin - (cherry picked from commit e82a7cb1622bff08d8e3a144d7c5516a088f1cbc) - -diff --git a/elf/Makefile b/elf/Makefile -index a03c6520d8..dc686c3bff 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -3141,7 +3141,7 @@ $(objpfx)tst-dlopen-tlsreinit4: \ - # tst-dlopen-tlsreinitmod3.so. The dependency is provided via - # $(objpfx)tst-dlopen-tlsreinitmod1.so. - tst-dlopen-tlsreinitmod2.so-no-z-defs = yes --$(objpfx)tst-dlopen-tlsreinit.out: $(objpfx)tst-dlopen-tlsreinitmod1.so \ -+$(objpfx)tst-dlopen-tlsreinit1.out: $(objpfx)tst-dlopen-tlsreinitmod1.so \ - $(objpfx)tst-dlopen-tlsreinitmod2.so $(objpfx)tst-dlopen-tlsreinitmod3.so - # Reuse an audit module which provides ample debug logging. - $(objpfx)tst-dlopen-tlsreinit3.out: $(objpfx)tst-auditmod1.so - -commit adfb14e71f240a6bc2a4cbd6e6c50cc3fa1bcc3b -Author: Florian Weimer -Date: Tue Sep 10 12:40:27 2024 +0200 - - debug: Fix read error handling in pcprofiledump - - The reading loops did not check for read failures. Addresses - a static analysis report. - - Manually tested by compiling a program with the GCC's - -finstrument-functions option, running it with - “LD_PRELOAD=debug/libpcprofile.so PCPROFILE_OUTPUT=output-file”, - and reviewing the output of “debug/pcprofiledump output-file”. - - (cherry picked from commit 89b088bf70c651c231bf27e644270d093b8f144a) - -diff --git a/debug/pcprofiledump.c b/debug/pcprofiledump.c -index 049a9c2744..94530f0cf9 100644 ---- a/debug/pcprofiledump.c -+++ b/debug/pcprofiledump.c -@@ -75,6 +75,44 @@ static struct argp argp = - options, parse_opt, args_doc, doc, NULL, more_help - }; - -+/* Try to read SIZE bytes from FD and store them on BUF. Terminate -+ the process upon read error. Also terminate the process if less -+ than SIZE bytes are remaining in the file. If !IN_HEADER, do not -+ terminate the process if the end of the file is encountered -+ immediately, before any bytes are read. -+ -+ Returns true if SIZE bytes have been read, and false if no bytes -+ have been read due to an end-of-file condition. */ -+static bool -+read_exactly (int fd, void *buffer, size_t size, bool in_header) -+{ -+ char *p = buffer; -+ char *end = p + size; -+ while (p < end) -+ { -+ ssize_t ret = TEMP_FAILURE_RETRY (read (fd, p, end - p)); -+ if (ret < 0) -+ { -+ if (in_header) -+ error (EXIT_FAILURE, errno, _("cannot read header")); -+ else -+ error (EXIT_FAILURE, errno, _("cannot read pointer pair")); -+ } -+ if (ret == 0) -+ { -+ if (p == buffer && !in_header) -+ /* Nothing has been read. */ -+ return false; -+ if (in_header) -+ error (EXIT_FAILURE, 0, _("unexpected end of file in header")); -+ else -+ error (EXIT_FAILURE, 0, -+ _("unexpected end of file in pointer pair")); -+ } -+ p += ret; -+ } -+ return true; -+} - - int - main (int argc, char *argv[]) -@@ -110,8 +148,7 @@ main (int argc, char *argv[]) - /* Read the first 4-byte word. It contains the information about - the word size and the endianness. */ - uint32_t word; -- if (TEMP_FAILURE_RETRY (read (fd, &word, 4)) != 4) -- error (EXIT_FAILURE, errno, _("cannot read header")); -+ read_exactly (fd, &word, sizeof (word), true); - - /* Check whether we have to swap the byte order. */ - int must_swap = (word & 0x0fffffff) == bswap_32 (0xdeb00000); -@@ -121,56 +158,30 @@ main (int argc, char *argv[]) - /* We have two loops, one for 32 bit pointers, one for 64 bit pointers. */ - if (word == 0xdeb00004) - { -- union -- { -- uint32_t ptrs[2]; -- char bytes[8]; -- } pair; -+ uint32_t ptrs[2]; - - while (1) - { -- size_t len = sizeof (pair); -- size_t n; -- -- while (len > 0 -- && (n = TEMP_FAILURE_RETRY (read (fd, &pair.bytes[8 - len], -- len))) != 0) -- len -= n; -- -- if (len != 0) -- /* Nothing to read. */ -+ if (!read_exactly (fd, ptrs, sizeof (ptrs), false)) - break; - - printf ("this = %#010" PRIx32 ", caller = %#010" PRIx32 "\n", -- must_swap ? bswap_32 (pair.ptrs[0]) : pair.ptrs[0], -- must_swap ? bswap_32 (pair.ptrs[1]) : pair.ptrs[1]); -+ must_swap ? bswap_32 (ptrs[0]) : ptrs[0], -+ must_swap ? bswap_32 (ptrs[1]) : ptrs[1]); - } - } - else if (word == 0xdeb00008) - { -- union -- { -- uint64_t ptrs[2]; -- char bytes[16]; -- } pair; -+ uint64_t ptrs[2]; - - while (1) - { -- size_t len = sizeof (pair); -- size_t n; -- -- while (len > 0 -- && (n = TEMP_FAILURE_RETRY (read (fd, &pair.bytes[8 - len], -- len))) != 0) -- len -= n; -- -- if (len != 0) -- /* Nothing to read. */ -+ if (!read_exactly (fd, ptrs, sizeof (ptrs), false)) - break; - - printf ("this = %#018" PRIx64 ", caller = %#018" PRIx64 "\n", -- must_swap ? bswap_64 (pair.ptrs[0]) : pair.ptrs[0], -- must_swap ? bswap_64 (pair.ptrs[1]) : pair.ptrs[1]); -+ must_swap ? bswap_64 (ptrs[0]) : ptrs[0], -+ must_swap ? bswap_64 (ptrs[1]) : ptrs[1]); - } - } - else - -commit 7073164add3b874cf0c19ca0fb84236f6bb0985d -Author: Siddhesh Poyarekar -Date: Tue Sep 3 14:58:33 2024 -0400 - - libio: Attempt wide backup free only for non-legacy code - - _wide_data and _mode are not available in legacy code, so do not attempt - to free the wide backup buffer in legacy code. - - Resolves: BZ #32137 and BZ #27821 - - Signed-off-by: Siddhesh Poyarekar - Reviewed-by: Florian Weimer - (cherry picked from commit ae4d44b1d501421ad9a3af95279b8f4d1546f1ce) - -diff --git a/NEWS b/NEWS -index 5b20efbf6c..9033335db1 100644 ---- a/NEWS -+++ b/NEWS -@@ -9,12 +9,14 @@ Version 2.40.1 - - The following bugs are resolved with this release: - -+ [27821] ungetc: Fix backup buffer leak on program exit - [30081] resolv: Do not wait for non-existing second DNS response after error - [31717] elf: Avoid re-initializing already allocated TLS in dlopen - [31890] resolv: Allow short error responses to match any DNS query - [31968] mremap implementation in C does not handle arguments correctly - [32026] strerror/strsignal TLS not handled correctly for secondary namespaces - [32052] Name space violation in fortify wrappers -+ [32137] libio: Attempt wide backup free only for non-legacy code - - Version 2.40 - -diff --git a/libio/genops.c b/libio/genops.c -index 35d8b30710..6f20d49669 100644 ---- a/libio/genops.c -+++ b/libio/genops.c -@@ -819,7 +819,7 @@ _IO_unbuffer_all (void) - /* Free up the backup area if it was ever allocated. */ - if (_IO_have_backup (fp)) - _IO_free_backup_area (fp); -- if (fp->_mode > 0 && _IO_have_wbackup (fp)) -+ if (!legacy && fp->_mode > 0 && _IO_have_wbackup (fp)) - _IO_free_wbackup_area (fp); - - if (! (fp->_flags & _IO_UNBUFFERED) - -commit 77018fd9f99f86a354387219fdf099915857a527 -Author: Sergey Kolosov -Date: Wed Sep 25 15:51:23 2024 +0200 - - stdio-common: Add new test for fdopen - - This commit adds fdopen test with all modes. - Reviewed-by: DJ Delorie - - (cherry picked from commit 1d72fa3cfa046f7293421a7e58f2a272474ea901) - -diff --git a/stdio-common/Makefile b/stdio-common/Makefile -index a91754f52d..5af53d61fd 100644 ---- a/stdio-common/Makefile -+++ b/stdio-common/Makefile -@@ -207,6 +207,7 @@ tests := \ - tst-cookie \ - tst-dprintf-length \ - tst-fdopen \ -+ tst-fdopen2 \ - tst-ferror \ - tst-fgets \ - tst-fileno \ -diff --git a/stdio-common/tst-fdopen2.c b/stdio-common/tst-fdopen2.c -new file mode 100644 -index 0000000000..0c6625f258 ---- /dev/null -+++ b/stdio-common/tst-fdopen2.c -@@ -0,0 +1,246 @@ -+/* Test the fdopen function. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+char *tmp_dir; -+char *path_to_file; -+ -+void -+prepare_tmp_dir (void) -+{ -+ tmp_dir = support_create_temp_directory ("tst-fdopen2"); -+ path_to_file = xasprintf ("%s/tst-fdopen2.txt", tmp_dir); -+} -+ -+/* open temp file descriptor with mode. */ -+int -+open_tmp_fd (int mode) -+{ -+ int fd = xopen (path_to_file, mode, 0644); -+ return fd; -+} -+ -+ -+/* close and remove temp file with close. */ -+void -+close_tmp_fd (int fd) -+{ -+ xclose (fd); -+ xunlink (path_to_file); -+} -+ -+/* close and remove temp file with fclose. */ -+void -+close_tmp_fp (FILE *fp) -+{ -+ fclose (fp); -+ xunlink (path_to_file); -+} -+ -+/* test "w" fdopen mode. */ -+void -+do_test_fdopen_w (void) -+{ -+ int fd, ret; -+ FILE *fp; -+ fd = open_tmp_fd (O_WRONLY | O_CREAT | O_TRUNC); -+ -+ /* test mode mismatch. */ -+ fp = fdopen (fd, "r"); -+ if (fp != NULL || errno != EINVAL) -+ { -+ close_tmp_fd (fd); -+ FAIL_EXIT1 ("fdopen (%d, r) should fail with EINVAL: %m", fd); -+ } -+ -+ fp = fdopen (fd, "w"); -+ if (fp == NULL) -+ { -+ close_tmp_fd (fd); -+ FAIL_EXIT1 ("fdopen (%d, w): %m", fd); -+ } -+ -+ const void *buf = "AAAA"; -+ ret = fwrite (buf, 1, 4, fp); -+ if (ret != 4) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fwrite (): %m"); -+ } -+ -+ unsigned char buf2[4]; -+ rewind (fp); -+ clearerr (fp); -+ /* fread should fail in "w" mode */ -+ ret = fread (buf2, 1, 4, fp); -+ if (ret != 0 || ferror (fp) == 0) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fread should fail in \"w\" mode"); -+ } -+ -+ fclose (fp); -+} -+ -+/* test "r" fdopen mode. */ -+void -+do_test_fdopen_r (void) -+{ -+ int fd, ret; -+ FILE *fp; -+ fd = open_tmp_fd (O_RDONLY); -+ -+ /* test mode mismatch. */ -+ fp = fdopen (fd, "w"); -+ if (fp != NULL || errno != EINVAL) -+ { -+ close_tmp_fd (fd); -+ FAIL_EXIT1 ("fdopen (%d, w) should fail with EINVAL: %m", fd); -+ } -+ -+ fp = fdopen (fd, "r"); -+ if (fp == NULL) -+ { -+ close_tmp_fd (fd); -+ FAIL_EXIT1 ("fdopen (%d, w): %m", fd); -+ } -+ -+ const void *buf = "BBBB"; -+ /* fwrite should fail in "r" mode. */ -+ ret = fwrite (buf, 1, 4, fp); -+ if (ret != 0 || ferror (fp) == 0) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fwrite should fail in \"r\" mode"); -+ } -+ -+ unsigned char buf2[4]; -+ ret = fread (buf2, 1, 4, fp); -+ if (ret != 4) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fread (): %m"); -+ } -+ -+ fclose (fp); -+} -+ -+/* test "a" fdopen mode. */ -+void -+do_test_fdopen_a (void) -+{ -+ int fd, ret; -+ FILE *fp; -+ fd = open_tmp_fd (O_WRONLY | O_CREAT | O_APPEND); -+ -+ /* test mode mismatch. */ -+ fp = fdopen (fd, "r+"); -+ if (fp != NULL || errno != EINVAL) -+ { -+ close_tmp_fd (fd); -+ FAIL_EXIT1 ("fdopen (%d, \"r+\") should fail with EINVAL: %m", fd); -+ } -+ -+ fp = fdopen (fd, "a"); -+ if (fp == NULL) -+ { -+ close_tmp_fd (fd); -+ FAIL_EXIT1 ("fdopen (%d, w): %m", fd); -+ } -+ -+ const void *buf = "CCCC"; -+ ret = fwrite (buf, 1, 4, fp); -+ if (ret != 4) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fwrite (): %m"); -+ } -+ -+ /* fread should fail in "a" mode. */ -+ unsigned char buf2[4]; -+ clearerr (fp); -+ ret = fread (buf2, 1, 4, fp); -+ if (ret != 0 || ferror (fp) == 0) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fread should fail \"a\" mode"); -+ } -+ -+ fclose (fp); -+} -+ -+void -+do_test_fdopen_mode (int mode, const char *fmode) -+{ -+ int fd, ret; -+ FILE *fp; -+ fd = open_tmp_fd (mode); -+ -+ fp = fdopen (fd, fmode); -+ if (fp == NULL) -+ { -+ close_tmp_fd (fd); -+ FAIL_EXIT1 ("fdopen (%d, %s): %m", fd, fmode); -+ } -+ -+ const void *buf = "EEEE"; -+ ret = fwrite (buf, 1, 4, fp); -+ if (ret != 4) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fwrite () in mode:%s returns %d: %m", fmode, ret); -+ } -+ -+ rewind (fp); -+ unsigned char buf2[4]; -+ ret = fread (buf2, 1, 4, fp); -+ if (ret != 4) -+ { -+ close_tmp_fp (fp); -+ FAIL_EXIT1 ("fread () in mode:%s returns %d: %m", fmode, ret); -+ } -+ -+ fclose (fp); -+} -+ -+static int -+do_test (void) -+{ -+ -+ prepare_tmp_dir (); -+ -+ do_test_fdopen_w (); -+ do_test_fdopen_r (); -+ do_test_fdopen_a (); -+ -+ /* test r+ w+ a+ fdopen modes. */ -+ do_test_fdopen_mode (O_RDWR, "r+"); -+ do_test_fdopen_mode (O_RDWR | O_CREAT | O_TRUNC, "w+"); -+ do_test_fdopen_mode (O_RDWR | O_CREAT | O_APPEND, "a+"); -+ xunlink (path_to_file); -+ return 0; -+} -+ -+#include - -commit 61b6464f8d72aef520ee769a2ae317b4f68d5e1d -Author: Joseph Myers -Date: Tue Sep 24 14:06:22 2024 +0000 - - Add tests of fread - - There seem to be no glibc tests specifically for the fread function. - Add basic tests of that function. - - Tested for x86_64. - - (cherry picked from commit d14c977c65aac7db35bb59380ef99d6582c4f930) - -diff --git a/stdio-common/Makefile b/stdio-common/Makefile -index 5af53d61fd..3396090be1 100644 ---- a/stdio-common/Makefile -+++ b/stdio-common/Makefile -@@ -217,6 +217,7 @@ tests := \ - tst-fmemopen4 \ - tst-fphex \ - tst-fphex-wide \ -+ tst-fread \ - tst-fseek \ - tst-fwrite \ - tst-gets \ -diff --git a/stdio-common/tst-fread.c b/stdio-common/tst-fread.c -new file mode 100644 -index 0000000000..4d9a7895f6 ---- /dev/null -+++ b/stdio-common/tst-fread.c -@@ -0,0 +1,134 @@ -+/* Test fread. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+int -+do_test (void) -+{ -+ char *temp_dir = support_create_temp_directory ("tst-fread"); -+ char *file1 = xasprintf ("%s/file1", temp_dir); -+ support_write_file_string (file1, "file1"); -+ add_temp_file (file1); -+ FILE *fp; -+ size_t ret; -+ char buf[1024]; -+ -+ verbose_printf ("test single-byte reads\n"); -+ fp = xfopen (file1, "r"); -+ memset (buf, 0, sizeof buf); -+ ret = fread (buf, 1, 2, fp); -+ TEST_COMPARE (ret, 2); -+ TEST_COMPARE (buf[0], 'f'); -+ TEST_COMPARE (buf[1], 'i'); -+ TEST_COMPARE (feof (fp), 0); -+ TEST_COMPARE (ftell (fp), 2); -+ memset (buf, 0, sizeof buf); -+ ret = fread (buf, 1, 3, fp); -+ TEST_COMPARE (ret, 3); -+ TEST_COMPARE (buf[0], 'l'); -+ TEST_COMPARE (buf[1], 'e'); -+ TEST_COMPARE (buf[2], '1'); -+ TEST_COMPARE (ftell (fp), 5); -+ TEST_COMPARE (feof (fp), 0); -+ memset (buf, 0, sizeof buf); -+ ret = fread (buf, 1, 1, fp); -+ TEST_COMPARE (ret, 0); -+ TEST_COMPARE (!!feof (fp), 1); -+ TEST_COMPARE (ferror (fp), 0); -+ TEST_COMPARE (ftell (fp), 5); -+ xfclose (fp); -+ -+ verbose_printf ("test single-byte reads, EOF part way through\n"); -+ fp = xfopen (file1, "r"); -+ memset (buf, 0, sizeof buf); -+ ret = fread (buf, 1, sizeof buf, fp); -+ TEST_COMPARE (ret, 5); -+ TEST_COMPARE (buf[0], 'f'); -+ TEST_COMPARE (buf[1], 'i'); -+ TEST_COMPARE (buf[2], 'l'); -+ TEST_COMPARE (buf[3], 'e'); -+ TEST_COMPARE (buf[4], '1'); -+ TEST_COMPARE (!!feof (fp), 1); -+ TEST_COMPARE (ferror (fp), 0); -+ TEST_COMPARE (ftell (fp), 5); -+ xfclose (fp); -+ -+ verbose_printf ("test multi-byte reads\n"); -+ fp = xfopen (file1, "r"); -+ memset (buf, 0, sizeof buf); -+ ret = fread (buf, 2, 2, fp); -+ TEST_COMPARE (ret, 2); -+ TEST_COMPARE (buf[0], 'f'); -+ TEST_COMPARE (buf[1], 'i'); -+ TEST_COMPARE (buf[2], 'l'); -+ TEST_COMPARE (buf[3], 'e'); -+ TEST_COMPARE (feof (fp), 0); -+ TEST_COMPARE (ftell (fp), 4); -+ memset (buf, 0, sizeof buf); -+ ret = fread (buf, 3, 3, fp); -+ TEST_COMPARE (ret, 0); -+ /* The bytes written for a partial element read are unspecified. */ -+ TEST_COMPARE (!!feof (fp), 1); -+ TEST_COMPARE (ferror (fp), 0); -+ TEST_COMPARE (ftell (fp), 5); -+ xfclose (fp); -+ -+ verbose_printf ("test read error\n"); -+ fp = xfopen (file1, "r"); -+ xclose (fileno (fp)); -+ memset (buf, 0, sizeof buf); -+ ret = fread (buf, 1, sizeof buf, fp); -+ TEST_COMPARE (ret, 0); -+ TEST_COMPARE (feof (fp), 0); -+ TEST_COMPARE (!!ferror (fp), 1); -+ fclose (fp); -+ -+ verbose_printf ("test zero size\n"); -+ fp = xfopen (file1, "r"); -+ ret = fread (buf, 0, SIZE_MAX, fp); -+ TEST_COMPARE (ret, 0); -+ TEST_COMPARE (feof (fp), 0); -+ TEST_COMPARE (ferror (fp), 0); -+ TEST_COMPARE (ftell (fp), 0); -+ xfclose (fp); -+ -+ verbose_printf ("test zero items\n"); -+ fp = xfopen (file1, "r"); -+ ret = fread (buf, SIZE_MAX, 0, fp); -+ TEST_COMPARE (ret, 0); -+ TEST_COMPARE (feof (fp), 0); -+ TEST_COMPARE (ferror (fp), 0); -+ TEST_COMPARE (ftell (fp), 0); -+ xfclose (fp); -+ -+ free (temp_dir); -+ free (file1); -+ return 0; -+} -+ -+#include - -commit 9bc76c7ca4d6022fd588c274d139813f99e04f35 -Author: Joseph Myers -Date: Wed Aug 14 17:15:46 2024 +0000 - - Test errno setting on strtod overflow in tst-strtod-round - - We have no tests that errno is set to ERANGE on overflow of - strtod-family functions (we do have some tests for underflow, in - tst-strtod-underflow). Add such tests to tst-strtod-round. - - Tested for x86_64. - - (cherry picked from commit 207d64feb26279e152c50744e3c37e68491aca99) - -diff --git a/stdlib/tst-strtod-round-skeleton.c b/stdlib/tst-strtod-round-skeleton.c -index 6fba4b5228..c3cc0201d4 100644 ---- a/stdlib/tst-strtod-round-skeleton.c -+++ b/stdlib/tst-strtod-round-skeleton.c -@@ -21,6 +21,7 @@ - declared in the headers. */ - #define _LIBC_TEST 1 - #define __STDC_WANT_IEC_60559_TYPES_EXT__ -+#include - #include - #include - #include -@@ -205,7 +206,9 @@ struct test { - #define GEN_ONE_TEST(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ - { \ - feclearexcept (FE_ALL_EXCEPT); \ -+ errno = 0; \ - FTYPE f = STRTO (FSUF) (s, NULL); \ -+ int new_errno = errno; \ - if (f != expected->FSUF \ - || (copysign ## CSUF) (1.0 ## LSUF, f) \ - != (copysign ## CSUF) (1.0 ## LSUF, expected->FSUF)) \ -@@ -254,6 +257,14 @@ struct test { - printf ("ignoring this exception error\n"); \ - } \ - } \ -+ if (overflow->FSUF && new_errno != ERANGE) \ -+ { \ -+ printf (FNPFXS "to" #FSUF \ -+ " (" STRM ") left errno == %d," \ -+ " not %d (ERANGE)\n", \ -+ s, new_errno, ERANGE); \ -+ result = 1; \ -+ } \ - } \ - } - - -commit e06153665fa931e4c7d2a3ecc14e5197e96143a7 -Author: Joseph Myers -Date: Tue Aug 27 12:38:01 2024 +0000 - - More thoroughly test underflow / errno in tst-strtod-round - - Add tests of underflow in tst-strtod-round, and thus also test for - errno being unchanged when there is neither overflow nor underflow. - The errno setting before the function call to test for being unchanged - is adjusted to set errno to 12345 instead of 0, so that any bugs where - strtod sets errno to 0 would be detected. - - This doesn't add any new test inputs for tst-strtod-round, and in - particular doesn't cover the edge cases of underflow the way - tst-strtod-underflow does (none of the existing test inputs for - tst-strtod-round actually exercise cases that have underflow with - before-rounding tininess detection but not with after-rounding - tininess detection), but at least it provides some coverage (as per - the recent discussions) that ordinary non-overflowing non-underflowing - inputs to these functions do not set errno. - - Tested for x86_64. - - (cherry picked from commit d73ed2601b7c3c93c3529149a3d7f7b6177900a8) - -diff --git a/stdlib/gen-tst-strtod-round.c b/stdlib/gen-tst-strtod-round.c -index e48bf4d6ea..7ce735f81d 100644 ---- a/stdlib/gen-tst-strtod-round.c -+++ b/stdlib/gen-tst-strtod-round.c -@@ -46,6 +46,7 @@ static int - string_to_fp (mpfr_t f, const char *s, mpfr_rnd_t rnd) - { - mpfr_clear_overflow (); -+ mpfr_clear_underflow (); - #ifdef WORKAROUND - mpfr_t f2; - mpfr_init2 (f2, 100000); -@@ -53,12 +54,16 @@ string_to_fp (mpfr_t f, const char *s, mpfr_rnd_t rnd) - int r = mpfr_set (f, f2, rnd); - r |= mpfr_subnormalize (f, r, rnd); - mpfr_clear (f2); -- return r0 | r; -+ r |= r0; - #else - int r = mpfr_strtofr (f, s, NULL, 0, rnd); - r |= mpfr_subnormalize (f, r, rnd); -- return r; - #endif -+ if (r == 0) -+ /* The MPFR underflow flag is set for exact subnormal results, -+ which is not wanted here. */ -+ mpfr_clear_underflow (); -+ return r; - } - - void -@@ -70,6 +75,21 @@ print_fp (FILE *fout, mpfr_t f, const char *suffix) - mpfr_fprintf (fout, "\t%Ra%s", f, suffix); - } - -+static const char * -+suffix_to_print (bool overflow, bool underflow, bool underflow_before_rounding, -+ bool with_comma) -+{ -+ if (overflow) -+ return with_comma ? ", true, false,\n" : ", true, false"; -+ if (underflow) -+ return with_comma ? ", false, true,\n" : ", false, true"; -+ if (underflow_before_rounding) -+ return (with_comma -+ ? ", false, !TININESS_AFTER_ROUNDING,\n" -+ : ", false, !TININESS_AFTER_ROUNDING"); -+ return with_comma ? ", false, false,\n" : ", false, false"; -+} -+ - static void - round_str (FILE *fout, const char *s, int prec, int emin, int emax, - bool ibm_ld) -@@ -80,8 +100,11 @@ round_str (FILE *fout, const char *s, int prec, int emin, int emax, - mpfr_set_emin (emin); - mpfr_set_emax (emax); - mpfr_init (f); -+ string_to_fp (f, s, MPFR_RNDZ); -+ bool underflow_before_rounding = mpfr_underflow_p () != 0; - int r = string_to_fp (f, s, MPFR_RNDD); - bool overflow = mpfr_overflow_p () != 0; -+ bool underflow = mpfr_underflow_p () != 0; - if (ibm_ld) - { - assert (prec == 106 && emin == -1073 && emax == 1024); -@@ -97,19 +120,27 @@ round_str (FILE *fout, const char *s, int prec, int emin, int emax, - } - } - mpfr_fprintf (fout, "\t%s,\n", r ? "false" : "true"); -- print_fp (fout, f, overflow ? ", true,\n" : ", false,\n"); -+ print_fp (fout, f, -+ suffix_to_print (overflow, underflow, underflow_before_rounding, -+ true)); - string_to_fp (f, s, MPFR_RNDN); - overflow = (mpfr_overflow_p () != 0 - || (ibm_ld && mpfr_cmpabs (f, max_value) > 0)); -- print_fp (fout, f, overflow ? ", true,\n" : ", false,\n"); -+ print_fp (fout, f, -+ suffix_to_print (overflow, underflow, underflow_before_rounding, -+ true)); - string_to_fp (f, s, MPFR_RNDZ); - overflow = (mpfr_overflow_p () != 0 - || (ibm_ld && mpfr_cmpabs (f, max_value) > 0)); -- print_fp (fout, f, overflow ? ", true,\n" : ", false,\n"); -+ print_fp (fout, f, -+ suffix_to_print (overflow, underflow, underflow_before_rounding, -+ true)); - string_to_fp (f, s, MPFR_RNDU); - overflow = (mpfr_overflow_p () != 0 - || (ibm_ld && mpfr_cmpabs (f, max_value) > 0)); -- print_fp (fout, f, overflow ? ", true" : ", false"); -+ print_fp (fout, f, -+ suffix_to_print (overflow, underflow, underflow_before_rounding, -+ false)); - mpfr_clear (f); - if (ibm_ld) - mpfr_clear (max_value); -diff --git a/stdlib/tst-strtod-round-data.h b/stdlib/tst-strtod-round-data.h -index 8899d15f9b..13e62dd2b0 100644 ---- a/stdlib/tst-strtod-round-data.h -+++ b/stdlib/tst-strtod-round-data.h -@@ -2,1852 +2,1852 @@ - static const struct test tests[] = { - TEST ("3.518437208883201171875E+013", - false, -- 0x2p+44, false, -- 0x2p+44, false, -- 0x2p+44, false, -- 0x2.000004p+44, false, -- false, -- 0x2.0000000000002p+44, false, -- 0x2.0000000000004p+44, false, -- 0x2.0000000000002p+44, false, -- 0x2.0000000000004p+44, false, -- true, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- true, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- true, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- true, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false, -- 0x2.0000000000003p+44, false), -+ 0x2p+44, false, false, -+ 0x2p+44, false, false, -+ 0x2p+44, false, false, -+ 0x2.000004p+44, false, false, -+ false, -+ 0x2.0000000000002p+44, false, false, -+ 0x2.0000000000004p+44, false, false, -+ 0x2.0000000000002p+44, false, false, -+ 0x2.0000000000004p+44, false, false, -+ true, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ true, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ true, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ true, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false, -+ 0x2.0000000000003p+44, false, false), - TEST ("1.00000005960464477550", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000001p+0, false, -- false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000004p+0, false, -- false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000004p+0, false, -- false, -- 0x1.0000010000000002048242f2ffp+0, false, -- 0x1.0000010000000002048242f2ff8p+0, false, -- 0x1.0000010000000002048242f2ffp+0, false, -- 0x1.0000010000000002048242f2ff8p+0, false, -- false, -- 0x1.0000010000000002048242f2ff66p+0, false, -- 0x1.0000010000000002048242f2ff67p+0, false, -- 0x1.0000010000000002048242f2ff66p+0, false, -- 0x1.0000010000000002048242f2ff67p+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000004p+0, false, false, -+ false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000004p+0, false, false, -+ false, -+ 0x1.0000010000000002048242f2ffp+0, false, false, -+ 0x1.0000010000000002048242f2ff8p+0, false, false, -+ 0x1.0000010000000002048242f2ffp+0, false, false, -+ 0x1.0000010000000002048242f2ff8p+0, false, false, -+ false, -+ 0x1.0000010000000002048242f2ff66p+0, false, false, -+ 0x1.0000010000000002048242f2ff67p+0, false, false, -+ 0x1.0000010000000002048242f2ff66p+0, false, false, -+ 0x1.0000010000000002048242f2ff67p+0, false, false), - TEST ("1.0000000596046447755", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000001p+0, false, -- false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000004p+0, false, -- false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000002p+0, false, -- 0x1.0000010000000004p+0, false, -- false, -- 0x1.0000010000000002048242f2ffp+0, false, -- 0x1.0000010000000002048242f2ff8p+0, false, -- 0x1.0000010000000002048242f2ffp+0, false, -- 0x1.0000010000000002048242f2ff8p+0, false, -- false, -- 0x1.0000010000000002048242f2ff66p+0, false, -- 0x1.0000010000000002048242f2ff67p+0, false, -- 0x1.0000010000000002048242f2ff66p+0, false, -- 0x1.0000010000000002048242f2ff67p+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000004p+0, false, false, -+ false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ 0x1.0000010000000004p+0, false, false, -+ false, -+ 0x1.0000010000000002048242f2ffp+0, false, false, -+ 0x1.0000010000000002048242f2ff8p+0, false, false, -+ 0x1.0000010000000002048242f2ffp+0, false, false, -+ 0x1.0000010000000002048242f2ff8p+0, false, false, -+ false, -+ 0x1.0000010000000002048242f2ff66p+0, false, false, -+ 0x1.0000010000000002048242f2ff67p+0, false, false, -+ 0x1.0000010000000002048242f2ff66p+0, false, false, -+ 0x1.0000010000000002048242f2ff67p+0, false, false), - TEST ("1.000000059604644776", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000001p+0, false, -- false, -- 0x1.000001000000000ap+0, false, -- 0x1.000001000000000cp+0, false, -- 0x1.000001000000000ap+0, false, -- 0x1.000001000000000cp+0, false, -- false, -- 0x1.000001000000000ap+0, false, -- 0x1.000001000000000cp+0, false, -- 0x1.000001000000000ap+0, false, -- 0x1.000001000000000cp+0, false, -- false, -- 0x1.000001000000000b3db12bdc21p+0, false, -- 0x1.000001000000000b3db12bdc21p+0, false, -- 0x1.000001000000000b3db12bdc21p+0, false, -- 0x1.000001000000000b3db12bdc218p+0, false, -- false, -- 0x1.000001000000000b3db12bdc213cp+0, false, -- 0x1.000001000000000b3db12bdc213dp+0, false, -- 0x1.000001000000000b3db12bdc213cp+0, false, -- 0x1.000001000000000b3db12bdc213dp+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ false, -+ 0x1.000001000000000ap+0, false, false, -+ 0x1.000001000000000cp+0, false, false, -+ 0x1.000001000000000ap+0, false, false, -+ 0x1.000001000000000cp+0, false, false, -+ false, -+ 0x1.000001000000000ap+0, false, false, -+ 0x1.000001000000000cp+0, false, false, -+ 0x1.000001000000000ap+0, false, false, -+ 0x1.000001000000000cp+0, false, false, -+ false, -+ 0x1.000001000000000b3db12bdc21p+0, false, false, -+ 0x1.000001000000000b3db12bdc21p+0, false, false, -+ 0x1.000001000000000b3db12bdc21p+0, false, false, -+ 0x1.000001000000000b3db12bdc218p+0, false, false, -+ false, -+ 0x1.000001000000000b3db12bdc213cp+0, false, false, -+ 0x1.000001000000000b3db12bdc213dp+0, false, false, -+ 0x1.000001000000000b3db12bdc213cp+0, false, false, -+ 0x1.000001000000000b3db12bdc213dp+0, false, false), - TEST ("1.000000059604644775", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000000fffffffp+0, false, -- 0x1.000001p+0, false, -- 0x1.000000fffffffp+0, false, -- 0x1.000001p+0, false, -- false, -- 0x1.000000fffffffff8p+0, false, -- 0x1.000000fffffffff8p+0, false, -- 0x1.000000fffffffff8p+0, false, -- 0x1.000000fffffffffap+0, false, -- false, -- 0x1.000000fffffffff8p+0, false, -- 0x1.000000fffffffff8p+0, false, -- 0x1.000000fffffffff8p+0, false, -- 0x1.000000fffffffffap+0, false, -- false, -- 0x1.000000fffffffff8cb535a09dd8p+0, false, -- 0x1.000000fffffffff8cb535a09dd8p+0, false, -- 0x1.000000fffffffff8cb535a09dd8p+0, false, -- 0x1.000000fffffffff8cb535a09dep+0, false, -- false, -- 0x1.000000fffffffff8cb535a09dd9p+0, false, -- 0x1.000000fffffffff8cb535a09dd91p+0, false, -- 0x1.000000fffffffff8cb535a09dd9p+0, false, -- 0x1.000000fffffffff8cb535a09dd91p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000000fffffffp+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000000fffffffp+0, false, false, -+ 0x1.000001p+0, false, false, -+ false, -+ 0x1.000000fffffffff8p+0, false, false, -+ 0x1.000000fffffffff8p+0, false, false, -+ 0x1.000000fffffffff8p+0, false, false, -+ 0x1.000000fffffffffap+0, false, false, -+ false, -+ 0x1.000000fffffffff8p+0, false, false, -+ 0x1.000000fffffffff8p+0, false, false, -+ 0x1.000000fffffffff8p+0, false, false, -+ 0x1.000000fffffffffap+0, false, false, -+ false, -+ 0x1.000000fffffffff8cb535a09dd8p+0, false, false, -+ 0x1.000000fffffffff8cb535a09dd8p+0, false, false, -+ 0x1.000000fffffffff8cb535a09dd8p+0, false, false, -+ 0x1.000000fffffffff8cb535a09dep+0, false, false, -+ false, -+ 0x1.000000fffffffff8cb535a09dd9p+0, false, false, -+ 0x1.000000fffffffff8cb535a09dd91p+0, false, false, -+ 0x1.000000fffffffff8cb535a09dd9p+0, false, false, -+ 0x1.000000fffffffff8cb535a09dd91p+0, false, false), - TEST ("1.00000005960464478", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000001p+0, false, -- false, -- 0x1.0000010000000054p+0, false, -- 0x1.0000010000000056p+0, false, -- 0x1.0000010000000054p+0, false, -- 0x1.0000010000000056p+0, false, -- false, -- 0x1.0000010000000054p+0, false, -- 0x1.0000010000000056p+0, false, -- 0x1.0000010000000054p+0, false, -- 0x1.0000010000000056p+0, false, -- false, -- 0x1.0000010000000055072873252f8p+0, false, -- 0x1.0000010000000055072873253p+0, false, -- 0x1.0000010000000055072873252f8p+0, false, -- 0x1.0000010000000055072873253p+0, false, -- false, -- 0x1.0000010000000055072873252febp+0, false, -- 0x1.0000010000000055072873252febp+0, false, -- 0x1.0000010000000055072873252febp+0, false, -- 0x1.0000010000000055072873252fecp+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ false, -+ 0x1.0000010000000054p+0, false, false, -+ 0x1.0000010000000056p+0, false, false, -+ 0x1.0000010000000054p+0, false, false, -+ 0x1.0000010000000056p+0, false, false, -+ false, -+ 0x1.0000010000000054p+0, false, false, -+ 0x1.0000010000000056p+0, false, false, -+ 0x1.0000010000000054p+0, false, false, -+ 0x1.0000010000000056p+0, false, false, -+ false, -+ 0x1.0000010000000055072873252f8p+0, false, false, -+ 0x1.0000010000000055072873253p+0, false, false, -+ 0x1.0000010000000055072873252f8p+0, false, false, -+ 0x1.0000010000000055072873253p+0, false, false, -+ false, -+ 0x1.0000010000000055072873252febp+0, false, false, -+ 0x1.0000010000000055072873252febp+0, false, false, -+ 0x1.0000010000000055072873252febp+0, false, false, -+ 0x1.0000010000000055072873252fecp+0, false, false), - TEST ("1.0000000596046448", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000001p+0, false, -- false, -- 0x1.00000100000001c4p+0, false, -- 0x1.00000100000001c6p+0, false, -- 0x1.00000100000001c4p+0, false, -- 0x1.00000100000001c6p+0, false, -- false, -- 0x1.00000100000001c4p+0, false, -- 0x1.00000100000001c6p+0, false, -- 0x1.00000100000001c4p+0, false, -- 0x1.00000100000001c6p+0, false, -- false, -- 0x1.00000100000001c5f67cd79279p+0, false, -- 0x1.00000100000001c5f67cd792798p+0, false, -- 0x1.00000100000001c5f67cd79279p+0, false, -- 0x1.00000100000001c5f67cd792798p+0, false, -- false, -- 0x1.00000100000001c5f67cd7927953p+0, false, -- 0x1.00000100000001c5f67cd7927954p+0, false, -- 0x1.00000100000001c5f67cd7927953p+0, false, -- 0x1.00000100000001c5f67cd7927954p+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ false, -+ 0x1.00000100000001c4p+0, false, false, -+ 0x1.00000100000001c6p+0, false, false, -+ 0x1.00000100000001c4p+0, false, false, -+ 0x1.00000100000001c6p+0, false, false, -+ false, -+ 0x1.00000100000001c4p+0, false, false, -+ 0x1.00000100000001c6p+0, false, false, -+ 0x1.00000100000001c4p+0, false, false, -+ 0x1.00000100000001c6p+0, false, false, -+ false, -+ 0x1.00000100000001c5f67cd79279p+0, false, false, -+ 0x1.00000100000001c5f67cd792798p+0, false, false, -+ 0x1.00000100000001c5f67cd79279p+0, false, false, -+ 0x1.00000100000001c5f67cd792798p+0, false, false, -+ false, -+ 0x1.00000100000001c5f67cd7927953p+0, false, false, -+ 0x1.00000100000001c5f67cd7927954p+0, false, false, -+ 0x1.00000100000001c5f67cd7927953p+0, false, false, -+ 0x1.00000100000001c5f67cd7927954p+0, false, false), - TEST ("1.000000059604645", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.0000010000001p+0, false, -- 0x1.0000010000001p+0, false, -- 0x1.0000010000001p+0, false, -- 0x1.0000010000002p+0, false, -- false, -- 0x1.000001000000102ep+0, false, -- 0x1.000001000000103p+0, false, -- 0x1.000001000000102ep+0, false, -- 0x1.000001000000103p+0, false, -- false, -- 0x1.000001000000102ep+0, false, -- 0x1.000001000000103p+0, false, -- 0x1.000001000000102ep+0, false, -- 0x1.000001000000103p+0, false, -- false, -- 0x1.000001000000102f4fc8c3d757p+0, false, -- 0x1.000001000000102f4fc8c3d7578p+0, false, -- 0x1.000001000000102f4fc8c3d757p+0, false, -- 0x1.000001000000102f4fc8c3d7578p+0, false, -- false, -- 0x1.000001000000102f4fc8c3d75769p+0, false, -- 0x1.000001000000102f4fc8c3d75769p+0, false, -- 0x1.000001000000102f4fc8c3d75769p+0, false, -- 0x1.000001000000102f4fc8c3d7576ap+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.0000010000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ 0x1.0000010000002p+0, false, false, -+ false, -+ 0x1.000001000000102ep+0, false, false, -+ 0x1.000001000000103p+0, false, false, -+ 0x1.000001000000102ep+0, false, false, -+ 0x1.000001000000103p+0, false, false, -+ false, -+ 0x1.000001000000102ep+0, false, false, -+ 0x1.000001000000103p+0, false, false, -+ 0x1.000001000000102ep+0, false, false, -+ 0x1.000001000000103p+0, false, false, -+ false, -+ 0x1.000001000000102f4fc8c3d757p+0, false, false, -+ 0x1.000001000000102f4fc8c3d7578p+0, false, false, -+ 0x1.000001000000102f4fc8c3d757p+0, false, false, -+ 0x1.000001000000102f4fc8c3d7578p+0, false, false, -+ false, -+ 0x1.000001000000102f4fc8c3d75769p+0, false, false, -+ 0x1.000001000000102f4fc8c3d75769p+0, false, false, -+ 0x1.000001000000102f4fc8c3d75769p+0, false, false, -+ 0x1.000001000000102f4fc8c3d7576ap+0, false, false), - TEST ("1.00000005960464", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000000fffffeap+0, false, -- 0x1.000000fffffeap+0, false, -- 0x1.000000fffffeap+0, false, -- 0x1.000000fffffebp+0, false, -- false, -- 0x1.000000fffffea7e4p+0, false, -- 0x1.000000fffffea7e6p+0, false, -- 0x1.000000fffffea7e4p+0, false, -- 0x1.000000fffffea7e6p+0, false, -- false, -- 0x1.000000fffffea7e4p+0, false, -- 0x1.000000fffffea7e6p+0, false, -- 0x1.000000fffffea7e4p+0, false, -- 0x1.000000fffffea7e6p+0, false, -- false, -- 0x1.000000fffffea7e5975eb11da7p+0, false, -- 0x1.000000fffffea7e5975eb11da78p+0, false, -- 0x1.000000fffffea7e5975eb11da7p+0, false, -- 0x1.000000fffffea7e5975eb11da78p+0, false, -- false, -- 0x1.000000fffffea7e5975eb11da74ap+0, false, -- 0x1.000000fffffea7e5975eb11da74bp+0, false, -- 0x1.000000fffffea7e5975eb11da74ap+0, false, -- 0x1.000000fffffea7e5975eb11da74bp+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000000fffffeap+0, false, false, -+ 0x1.000000fffffeap+0, false, false, -+ 0x1.000000fffffeap+0, false, false, -+ 0x1.000000fffffebp+0, false, false, -+ false, -+ 0x1.000000fffffea7e4p+0, false, false, -+ 0x1.000000fffffea7e6p+0, false, false, -+ 0x1.000000fffffea7e4p+0, false, false, -+ 0x1.000000fffffea7e6p+0, false, false, -+ false, -+ 0x1.000000fffffea7e4p+0, false, false, -+ 0x1.000000fffffea7e6p+0, false, false, -+ 0x1.000000fffffea7e4p+0, false, false, -+ 0x1.000000fffffea7e6p+0, false, false, -+ false, -+ 0x1.000000fffffea7e5975eb11da7p+0, false, false, -+ 0x1.000000fffffea7e5975eb11da78p+0, false, false, -+ 0x1.000000fffffea7e5975eb11da7p+0, false, false, -+ 0x1.000000fffffea7e5975eb11da78p+0, false, false, -+ false, -+ 0x1.000000fffffea7e5975eb11da74ap+0, false, false, -+ 0x1.000000fffffea7e5975eb11da74bp+0, false, false, -+ 0x1.000000fffffea7e5975eb11da74ap+0, false, false, -+ 0x1.000000fffffea7e5975eb11da74bp+0, false, false), - TEST ("1.0000000596046", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000000fffff36p+0, false, -- 0x1.000000fffff36p+0, false, -- 0x1.000000fffff36p+0, false, -- 0x1.000000fffff37p+0, false, -- false, -- 0x1.000000fffff36596p+0, false, -- 0x1.000000fffff36598p+0, false, -- 0x1.000000fffff36596p+0, false, -- 0x1.000000fffff36598p+0, false, -- false, -- 0x1.000000fffff36596p+0, false, -- 0x1.000000fffff36598p+0, false, -- 0x1.000000fffff36596p+0, false, -- 0x1.000000fffff36598p+0, false, -- false, -- 0x1.000000fffff36597d40e1b5026p+0, false, -- 0x1.000000fffff36597d40e1b50268p+0, false, -- 0x1.000000fffff36597d40e1b5026p+0, false, -- 0x1.000000fffff36597d40e1b50268p+0, false, -- false, -- 0x1.000000fffff36597d40e1b502655p+0, false, -- 0x1.000000fffff36597d40e1b502656p+0, false, -- 0x1.000000fffff36597d40e1b502655p+0, false, -- 0x1.000000fffff36597d40e1b502656p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000000fffff36p+0, false, false, -+ 0x1.000000fffff36p+0, false, false, -+ 0x1.000000fffff36p+0, false, false, -+ 0x1.000000fffff37p+0, false, false, -+ false, -+ 0x1.000000fffff36596p+0, false, false, -+ 0x1.000000fffff36598p+0, false, false, -+ 0x1.000000fffff36596p+0, false, false, -+ 0x1.000000fffff36598p+0, false, false, -+ false, -+ 0x1.000000fffff36596p+0, false, false, -+ 0x1.000000fffff36598p+0, false, false, -+ 0x1.000000fffff36596p+0, false, false, -+ 0x1.000000fffff36598p+0, false, false, -+ false, -+ 0x1.000000fffff36597d40e1b5026p+0, false, false, -+ 0x1.000000fffff36597d40e1b50268p+0, false, false, -+ 0x1.000000fffff36597d40e1b5026p+0, false, false, -+ 0x1.000000fffff36597d40e1b50268p+0, false, false, -+ false, -+ 0x1.000000fffff36597d40e1b502655p+0, false, false, -+ 0x1.000000fffff36597d40e1b502656p+0, false, false, -+ 0x1.000000fffff36597d40e1b502655p+0, false, false, -+ 0x1.000000fffff36597d40e1b502656p+0, false, false), - TEST ("1.000000059605", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001000063fp+0, false, -- 0x1.000001000064p+0, false, -- 0x1.000001000063fp+0, false, -- 0x1.000001000064p+0, false, -- false, -- 0x1.000001000063fcap+0, false, -- 0x1.000001000063fca2p+0, false, -- 0x1.000001000063fcap+0, false, -- 0x1.000001000063fca2p+0, false, -- false, -- 0x1.000001000063fcap+0, false, -- 0x1.000001000063fca2p+0, false, -- 0x1.000001000063fcap+0, false, -- 0x1.000001000063fca2p+0, false, -- false, -- 0x1.000001000063fca17533f5572f8p+0, false, -- 0x1.000001000063fca17533f5573p+0, false, -- 0x1.000001000063fca17533f5572f8p+0, false, -- 0x1.000001000063fca17533f5573p+0, false, -- false, -- 0x1.000001000063fca17533f5572fe9p+0, false, -- 0x1.000001000063fca17533f5572feap+0, false, -- 0x1.000001000063fca17533f5572fe9p+0, false, -- 0x1.000001000063fca17533f5572feap+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001000063fp+0, false, false, -+ 0x1.000001000064p+0, false, false, -+ 0x1.000001000063fp+0, false, false, -+ 0x1.000001000064p+0, false, false, -+ false, -+ 0x1.000001000063fcap+0, false, false, -+ 0x1.000001000063fca2p+0, false, false, -+ 0x1.000001000063fcap+0, false, false, -+ 0x1.000001000063fca2p+0, false, false, -+ false, -+ 0x1.000001000063fcap+0, false, false, -+ 0x1.000001000063fca2p+0, false, false, -+ 0x1.000001000063fcap+0, false, false, -+ 0x1.000001000063fca2p+0, false, false, -+ false, -+ 0x1.000001000063fca17533f5572f8p+0, false, false, -+ 0x1.000001000063fca17533f5573p+0, false, false, -+ 0x1.000001000063fca17533f5572f8p+0, false, false, -+ 0x1.000001000063fca17533f5573p+0, false, false, -+ false, -+ 0x1.000001000063fca17533f5572fe9p+0, false, false, -+ 0x1.000001000063fca17533f5572feap+0, false, false, -+ 0x1.000001000063fca17533f5572fe9p+0, false, false, -+ 0x1.000001000063fca17533f5572feap+0, false, false), - TEST ("1.00000005960", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000000fffae49p+0, false, -- 0x1.000000fffae4ap+0, false, -- 0x1.000000fffae49p+0, false, -- 0x1.000000fffae4ap+0, false, -- false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- false, -- 0x1.000000fffae49ca916dacfff38p+0, false, -- 0x1.000000fffae49ca916dacfff38p+0, false, -- 0x1.000000fffae49ca916dacfff38p+0, false, -- 0x1.000000fffae49ca916dacfff388p+0, false, -- false, -- 0x1.000000fffae49ca916dacfff382dp+0, false, -- 0x1.000000fffae49ca916dacfff382dp+0, false, -- 0x1.000000fffae49ca916dacfff382dp+0, false, -- 0x1.000000fffae49ca916dacfff382ep+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000000fffae49p+0, false, false, -+ 0x1.000000fffae4ap+0, false, false, -+ 0x1.000000fffae49p+0, false, false, -+ 0x1.000000fffae4ap+0, false, false, -+ false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ false, -+ 0x1.000000fffae49ca916dacfff38p+0, false, false, -+ 0x1.000000fffae49ca916dacfff38p+0, false, false, -+ 0x1.000000fffae49ca916dacfff38p+0, false, false, -+ 0x1.000000fffae49ca916dacfff388p+0, false, false, -+ false, -+ 0x1.000000fffae49ca916dacfff382dp+0, false, false, -+ 0x1.000000fffae49ca916dacfff382dp+0, false, false, -+ 0x1.000000fffae49ca916dacfff382dp+0, false, false, -+ 0x1.000000fffae49ca916dacfff382ep+0, false, false), - TEST ("1.0000000596", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000000fffae49p+0, false, -- 0x1.000000fffae4ap+0, false, -- 0x1.000000fffae49p+0, false, -- 0x1.000000fffae4ap+0, false, -- false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- 0x1.000000fffae49ca8p+0, false, -- 0x1.000000fffae49caap+0, false, -- false, -- 0x1.000000fffae49ca916dacfff38p+0, false, -- 0x1.000000fffae49ca916dacfff38p+0, false, -- 0x1.000000fffae49ca916dacfff38p+0, false, -- 0x1.000000fffae49ca916dacfff388p+0, false, -- false, -- 0x1.000000fffae49ca916dacfff382dp+0, false, -- 0x1.000000fffae49ca916dacfff382dp+0, false, -- 0x1.000000fffae49ca916dacfff382dp+0, false, -- 0x1.000000fffae49ca916dacfff382ep+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000000fffae49p+0, false, false, -+ 0x1.000000fffae4ap+0, false, false, -+ 0x1.000000fffae49p+0, false, false, -+ 0x1.000000fffae4ap+0, false, false, -+ false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ 0x1.000000fffae49ca8p+0, false, false, -+ 0x1.000000fffae49caap+0, false, false, -+ false, -+ 0x1.000000fffae49ca916dacfff38p+0, false, false, -+ 0x1.000000fffae49ca916dacfff38p+0, false, false, -+ 0x1.000000fffae49ca916dacfff38p+0, false, false, -+ 0x1.000000fffae49ca916dacfff388p+0, false, false, -+ false, -+ 0x1.000000fffae49ca916dacfff382dp+0, false, false, -+ 0x1.000000fffae49ca916dacfff382dp+0, false, false, -+ 0x1.000000fffae49ca916dacfff382dp+0, false, false, -+ 0x1.000000fffae49ca916dacfff382ep+0, false, false), - TEST ("1.000000060", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.00000101b2b29p+0, false, -- 0x1.00000101b2b2ap+0, false, -- 0x1.00000101b2b29p+0, false, -- 0x1.00000101b2b2ap+0, false, -- false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a48p+0, false, -- false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a48p+0, false, -- false, -- 0x1.00000101b2b29a4692b67b7ca3p+0, false, -- 0x1.00000101b2b29a4692b67b7ca3p+0, false, -- 0x1.00000101b2b29a4692b67b7ca3p+0, false, -- 0x1.00000101b2b29a4692b67b7ca38p+0, false, -- false, -- 0x1.00000101b2b29a4692b67b7ca313p+0, false, -- 0x1.00000101b2b29a4692b67b7ca314p+0, false, -- 0x1.00000101b2b29a4692b67b7ca313p+0, false, -- 0x1.00000101b2b29a4692b67b7ca314p+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.00000101b2b29p+0, false, false, -+ 0x1.00000101b2b2ap+0, false, false, -+ 0x1.00000101b2b29p+0, false, false, -+ 0x1.00000101b2b2ap+0, false, false, -+ false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a48p+0, false, false, -+ false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a48p+0, false, false, -+ false, -+ 0x1.00000101b2b29a4692b67b7ca3p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca3p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca3p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca38p+0, false, false, -+ false, -+ 0x1.00000101b2b29a4692b67b7ca313p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca314p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca313p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca314p+0, false, false), - TEST ("1.00000006", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.00000101b2b29p+0, false, -- 0x1.00000101b2b2ap+0, false, -- 0x1.00000101b2b29p+0, false, -- 0x1.00000101b2b2ap+0, false, -- false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a48p+0, false, -- false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a46p+0, false, -- 0x1.00000101b2b29a48p+0, false, -- false, -- 0x1.00000101b2b29a4692b67b7ca3p+0, false, -- 0x1.00000101b2b29a4692b67b7ca3p+0, false, -- 0x1.00000101b2b29a4692b67b7ca3p+0, false, -- 0x1.00000101b2b29a4692b67b7ca38p+0, false, -- false, -- 0x1.00000101b2b29a4692b67b7ca313p+0, false, -- 0x1.00000101b2b29a4692b67b7ca314p+0, false, -- 0x1.00000101b2b29a4692b67b7ca313p+0, false, -- 0x1.00000101b2b29a4692b67b7ca314p+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.00000101b2b29p+0, false, false, -+ 0x1.00000101b2b2ap+0, false, false, -+ 0x1.00000101b2b29p+0, false, false, -+ 0x1.00000101b2b2ap+0, false, false, -+ false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a48p+0, false, false, -+ false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a46p+0, false, false, -+ 0x1.00000101b2b29a48p+0, false, false, -+ false, -+ 0x1.00000101b2b29a4692b67b7ca3p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca3p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca3p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca38p+0, false, false, -+ false, -+ 0x1.00000101b2b29a4692b67b7ca313p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca314p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca313p+0, false, false, -+ 0x1.00000101b2b29a4692b67b7ca314p+0, false, false), - TEST ("1.0000001", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001ad7f29ap+0, false, -- 0x1.000001ad7f29bp+0, false, -- 0x1.000001ad7f29ap+0, false, -- 0x1.000001ad7f29bp+0, false, -- false, -- 0x1.000001ad7f29abcap+0, false, -- 0x1.000001ad7f29abcap+0, false, -- 0x1.000001ad7f29abcap+0, false, -- 0x1.000001ad7f29abccp+0, false, -- false, -- 0x1.000001ad7f29abcap+0, false, -- 0x1.000001ad7f29abcap+0, false, -- 0x1.000001ad7f29abcap+0, false, -- 0x1.000001ad7f29abccp+0, false, -- false, -- 0x1.000001ad7f29abcaf485787a65p+0, false, -- 0x1.000001ad7f29abcaf485787a65p+0, false, -- 0x1.000001ad7f29abcaf485787a65p+0, false, -- 0x1.000001ad7f29abcaf485787a658p+0, false, -- false, -- 0x1.000001ad7f29abcaf485787a652p+0, false, -- 0x1.000001ad7f29abcaf485787a6521p+0, false, -- 0x1.000001ad7f29abcaf485787a652p+0, false, -- 0x1.000001ad7f29abcaf485787a6521p+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001ad7f29ap+0, false, false, -+ 0x1.000001ad7f29bp+0, false, false, -+ 0x1.000001ad7f29ap+0, false, false, -+ 0x1.000001ad7f29bp+0, false, false, -+ false, -+ 0x1.000001ad7f29abcap+0, false, false, -+ 0x1.000001ad7f29abcap+0, false, false, -+ 0x1.000001ad7f29abcap+0, false, false, -+ 0x1.000001ad7f29abccp+0, false, false, -+ false, -+ 0x1.000001ad7f29abcap+0, false, false, -+ 0x1.000001ad7f29abcap+0, false, false, -+ 0x1.000001ad7f29abcap+0, false, false, -+ 0x1.000001ad7f29abccp+0, false, false, -+ false, -+ 0x1.000001ad7f29abcaf485787a65p+0, false, false, -+ 0x1.000001ad7f29abcaf485787a65p+0, false, false, -+ 0x1.000001ad7f29abcaf485787a65p+0, false, false, -+ 0x1.000001ad7f29abcaf485787a658p+0, false, false, -+ false, -+ 0x1.000001ad7f29abcaf485787a652p+0, false, false, -+ 0x1.000001ad7f29abcaf485787a6521p+0, false, false, -+ 0x1.000001ad7f29abcaf485787a652p+0, false, false, -+ 0x1.000001ad7f29abcaf485787a6521p+0, false, false), - TEST ("1.000000", - true, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- true, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- true, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- true, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- true, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- true, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ true, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ true, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ true, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ true, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ true, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false), - TEST ("1.00000000000000011113", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- false, -- 0x1.0000000000000801fc96557232p+0, false, -- 0x1.0000000000000801fc96557232p+0, false, -- 0x1.0000000000000801fc96557232p+0, false, -- 0x1.0000000000000801fc965572328p+0, false, -- false, -- 0x1.0000000000000801fc9655723222p+0, false, -- 0x1.0000000000000801fc9655723222p+0, false, -- 0x1.0000000000000801fc9655723222p+0, false, -- 0x1.0000000000000801fc9655723223p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ false, -+ 0x1.0000000000000801fc96557232p+0, false, false, -+ 0x1.0000000000000801fc96557232p+0, false, false, -+ 0x1.0000000000000801fc96557232p+0, false, false, -+ 0x1.0000000000000801fc965572328p+0, false, false, -+ false, -+ 0x1.0000000000000801fc9655723222p+0, false, false, -+ 0x1.0000000000000801fc9655723222p+0, false, false, -+ 0x1.0000000000000801fc9655723222p+0, false, false, -+ 0x1.0000000000000801fc9655723223p+0, false, false), - TEST ("1.00000000000000011103", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- false, -- 0x1.00000000000008002459c076c48p+0, false, -- 0x1.00000000000008002459c076c5p+0, false, -- 0x1.00000000000008002459c076c48p+0, false, -- 0x1.00000000000008002459c076c5p+0, false, -- false, -- 0x1.00000000000008002459c076c4f7p+0, false, -- 0x1.00000000000008002459c076c4f8p+0, false, -- 0x1.00000000000008002459c076c4f7p+0, false, -- 0x1.00000000000008002459c076c4f8p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ false, -+ 0x1.00000000000008002459c076c48p+0, false, false, -+ 0x1.00000000000008002459c076c5p+0, false, false, -+ 0x1.00000000000008002459c076c48p+0, false, false, -+ 0x1.00000000000008002459c076c5p+0, false, false, -+ false, -+ 0x1.00000000000008002459c076c4f7p+0, false, false, -+ 0x1.00000000000008002459c076c4f8p+0, false, false, -+ 0x1.00000000000008002459c076c4f7p+0, false, false, -+ 0x1.00000000000008002459c076c4f8p+0, false, false), - TEST ("1.00000000000000011102", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- false, -- 0x1.00000000000007fff5207e5dap+0, false, -- 0x1.00000000000007fff5207e5da08p+0, false, -- 0x1.00000000000007fff5207e5dap+0, false, -- 0x1.00000000000007fff5207e5da08p+0, false, -- false, -- 0x1.00000000000007fff5207e5da073p+0, false, -- 0x1.00000000000007fff5207e5da073p+0, false, -- 0x1.00000000000007fff5207e5da073p+0, false, -- 0x1.00000000000007fff5207e5da074p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ false, -+ 0x1.00000000000007fff5207e5dap+0, false, false, -+ 0x1.00000000000007fff5207e5da08p+0, false, false, -+ 0x1.00000000000007fff5207e5dap+0, false, false, -+ 0x1.00000000000007fff5207e5da08p+0, false, false, -+ false, -+ 0x1.00000000000007fff5207e5da073p+0, false, false, -+ 0x1.00000000000007fff5207e5da073p+0, false, false, -+ 0x1.00000000000007fff5207e5da073p+0, false, false, -+ 0x1.00000000000007fff5207e5da074p+0, false, false), - TEST ("1.00000000000000011101", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- false, -- 0x1.00000000000007ffc5e73c447b8p+0, false, -- 0x1.00000000000007ffc5e73c447cp+0, false, -- 0x1.00000000000007ffc5e73c447b8p+0, false, -- 0x1.00000000000007ffc5e73c447cp+0, false, -- false, -- 0x1.00000000000007ffc5e73c447befp+0, false, -- 0x1.00000000000007ffc5e73c447befp+0, false, -- 0x1.00000000000007ffc5e73c447befp+0, false, -- 0x1.00000000000007ffc5e73c447bfp+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ false, -+ 0x1.00000000000007ffc5e73c447b8p+0, false, false, -+ 0x1.00000000000007ffc5e73c447cp+0, false, false, -+ 0x1.00000000000007ffc5e73c447b8p+0, false, false, -+ 0x1.00000000000007ffc5e73c447cp+0, false, false, -+ false, -+ 0x1.00000000000007ffc5e73c447befp+0, false, false, -+ 0x1.00000000000007ffc5e73c447befp+0, false, false, -+ 0x1.00000000000007ffc5e73c447befp+0, false, false, -+ 0x1.00000000000007ffc5e73c447bfp+0, false, false), - TEST ("1.0000000000000001111", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.0000000000000802p+0, false, -- false, -- 0x1.00000000000008016eea8f26c48p+0, false, -- 0x1.00000000000008016eea8f26c48p+0, false, -- 0x1.00000000000008016eea8f26c48p+0, false, -- 0x1.00000000000008016eea8f26c5p+0, false, -- false, -- 0x1.00000000000008016eea8f26c495p+0, false, -- 0x1.00000000000008016eea8f26c496p+0, false, -- 0x1.00000000000008016eea8f26c495p+0, false, -- 0x1.00000000000008016eea8f26c496p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.0000000000000802p+0, false, false, -+ false, -+ 0x1.00000000000008016eea8f26c48p+0, false, false, -+ 0x1.00000000000008016eea8f26c48p+0, false, false, -+ 0x1.00000000000008016eea8f26c48p+0, false, false, -+ 0x1.00000000000008016eea8f26c5p+0, false, false, -+ false, -+ 0x1.00000000000008016eea8f26c495p+0, false, false, -+ 0x1.00000000000008016eea8f26c496p+0, false, false, -+ 0x1.00000000000008016eea8f26c495p+0, false, false, -+ 0x1.00000000000008016eea8f26c496p+0, false, false), - TEST ("1.000000000000000111", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000007fep+0, false, -- 0x1.00000000000008p+0, false, -- false, -- 0x1.00000000000007ff96adfa2b57p+0, false, -- 0x1.00000000000007ff96adfa2b578p+0, false, -- 0x1.00000000000007ff96adfa2b57p+0, false, -- 0x1.00000000000007ff96adfa2b578p+0, false, -- false, -- 0x1.00000000000007ff96adfa2b576ap+0, false, -- 0x1.00000000000007ff96adfa2b576bp+0, false, -- 0x1.00000000000007ff96adfa2b576ap+0, false, -- 0x1.00000000000007ff96adfa2b576bp+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000007fep+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ false, -+ 0x1.00000000000007ff96adfa2b57p+0, false, false, -+ 0x1.00000000000007ff96adfa2b578p+0, false, false, -+ 0x1.00000000000007ff96adfa2b57p+0, false, false, -+ 0x1.00000000000007ff96adfa2b578p+0, false, false, -+ false, -+ 0x1.00000000000007ff96adfa2b576ap+0, false, false, -+ 0x1.00000000000007ff96adfa2b576bp+0, false, false, -+ 0x1.00000000000007ff96adfa2b576ap+0, false, false, -+ 0x1.00000000000007ff96adfa2b576bp+0, false, false), - TEST ("1.00000000000000011", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.00000000000007ecp+0, false, -- 0x1.00000000000007eep+0, false, -- 0x1.00000000000007ecp+0, false, -- 0x1.00000000000007eep+0, false, -- false, -- 0x1.00000000000007ecp+0, false, -- 0x1.00000000000007eep+0, false, -- 0x1.00000000000007ecp+0, false, -- 0x1.00000000000007eep+0, false, -- false, -- 0x1.00000000000007ed24502859138p+0, false, -- 0x1.00000000000007ed24502859138p+0, false, -- 0x1.00000000000007ed24502859138p+0, false, -- 0x1.00000000000007ed2450285914p+0, false, -- false, -- 0x1.00000000000007ed2450285913bfp+0, false, -- 0x1.00000000000007ed2450285913bfp+0, false, -- 0x1.00000000000007ed2450285913bfp+0, false, -- 0x1.00000000000007ed2450285913cp+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.00000000000007ecp+0, false, false, -+ 0x1.00000000000007eep+0, false, false, -+ 0x1.00000000000007ecp+0, false, false, -+ 0x1.00000000000007eep+0, false, false, -+ false, -+ 0x1.00000000000007ecp+0, false, false, -+ 0x1.00000000000007eep+0, false, false, -+ 0x1.00000000000007ecp+0, false, false, -+ 0x1.00000000000007eep+0, false, false, -+ false, -+ 0x1.00000000000007ed24502859138p+0, false, false, -+ 0x1.00000000000007ed24502859138p+0, false, false, -+ 0x1.00000000000007ed24502859138p+0, false, false, -+ 0x1.00000000000007ed2450285914p+0, false, false, -+ false, -+ 0x1.00000000000007ed2450285913bfp+0, false, false, -+ 0x1.00000000000007ed2450285913bfp+0, false, false, -+ 0x1.00000000000007ed2450285913bfp+0, false, false, -+ 0x1.00000000000007ed2450285913cp+0, false, false), - TEST ("1.0000000000000001", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1.0000000000000734p+0, false, -- 0x1.0000000000000734p+0, false, -- 0x1.0000000000000734p+0, false, -- 0x1.0000000000000736p+0, false, -- false, -- 0x1.0000000000000734p+0, false, -- 0x1.0000000000000734p+0, false, -- 0x1.0000000000000734p+0, false, -- 0x1.0000000000000736p+0, false, -- false, -- 0x1.0000000000000734aca5f6226fp+0, false, -- 0x1.0000000000000734aca5f6226fp+0, false, -- 0x1.0000000000000734aca5f6226fp+0, false, -- 0x1.0000000000000734aca5f6226f8p+0, false, -- false, -- 0x1.0000000000000734aca5f6226f0ap+0, false, -- 0x1.0000000000000734aca5f6226f0bp+0, false, -- 0x1.0000000000000734aca5f6226f0ap+0, false, -- 0x1.0000000000000734aca5f6226f0bp+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1.0000000000000734p+0, false, false, -+ 0x1.0000000000000734p+0, false, false, -+ 0x1.0000000000000734p+0, false, false, -+ 0x1.0000000000000736p+0, false, false, -+ false, -+ 0x1.0000000000000734p+0, false, false, -+ 0x1.0000000000000734p+0, false, false, -+ 0x1.0000000000000734p+0, false, false, -+ 0x1.0000000000000736p+0, false, false, -+ false, -+ 0x1.0000000000000734aca5f6226fp+0, false, false, -+ 0x1.0000000000000734aca5f6226fp+0, false, false, -+ 0x1.0000000000000734aca5f6226fp+0, false, false, -+ 0x1.0000000000000734aca5f6226f8p+0, false, false, -+ false, -+ 0x1.0000000000000734aca5f6226f0ap+0, false, false, -+ 0x1.0000000000000734aca5f6226f0bp+0, false, false, -+ 0x1.0000000000000734aca5f6226f0ap+0, false, false, -+ 0x1.0000000000000734aca5f6226f0bp+0, false, false), - TEST ("3929201589819414e-25", - false, -- 0x1.b0053p-32, false, -- 0x1.b00532p-32, false, -- 0x1.b0053p-32, false, -- 0x1.b00532p-32, false, -- false, -- 0x1.b005314e2421ep-32, false, -- 0x1.b005314e2421ep-32, false, -- 0x1.b005314e2421ep-32, false, -- 0x1.b005314e2421fp-32, false, -- false, -- 0x1.b005314e2421e7fep-32, false, -- 0x1.b005314e2421e8p-32, false, -- 0x1.b005314e2421e7fep-32, false, -- 0x1.b005314e2421e8p-32, false, -- false, -- 0x1.b005314e2421e7fep-32, false, -- 0x1.b005314e2421e8p-32, false, -- 0x1.b005314e2421e7fep-32, false, -- 0x1.b005314e2421e8p-32, false, -- false, -- 0x1.b005314e2421e7ffb472840c5ap-32, false, -- 0x1.b005314e2421e7ffb472840c5a8p-32, false, -- 0x1.b005314e2421e7ffb472840c5ap-32, false, -- 0x1.b005314e2421e7ffb472840c5a8p-32, false, -- false, -- 0x1.b005314e2421e7ffb472840c5a6ep-32, false, -- 0x1.b005314e2421e7ffb472840c5a6fp-32, false, -- 0x1.b005314e2421e7ffb472840c5a6ep-32, false, -- 0x1.b005314e2421e7ffb472840c5a6fp-32, false), -+ 0x1.b0053p-32, false, false, -+ 0x1.b00532p-32, false, false, -+ 0x1.b0053p-32, false, false, -+ 0x1.b00532p-32, false, false, -+ false, -+ 0x1.b005314e2421ep-32, false, false, -+ 0x1.b005314e2421ep-32, false, false, -+ 0x1.b005314e2421ep-32, false, false, -+ 0x1.b005314e2421fp-32, false, false, -+ false, -+ 0x1.b005314e2421e7fep-32, false, false, -+ 0x1.b005314e2421e8p-32, false, false, -+ 0x1.b005314e2421e7fep-32, false, false, -+ 0x1.b005314e2421e8p-32, false, false, -+ false, -+ 0x1.b005314e2421e7fep-32, false, false, -+ 0x1.b005314e2421e8p-32, false, false, -+ 0x1.b005314e2421e7fep-32, false, false, -+ 0x1.b005314e2421e8p-32, false, false, -+ false, -+ 0x1.b005314e2421e7ffb472840c5ap-32, false, false, -+ 0x1.b005314e2421e7ffb472840c5a8p-32, false, false, -+ 0x1.b005314e2421e7ffb472840c5ap-32, false, false, -+ 0x1.b005314e2421e7ffb472840c5a8p-32, false, false, -+ false, -+ 0x1.b005314e2421e7ffb472840c5a6ep-32, false, false, -+ 0x1.b005314e2421e7ffb472840c5a6fp-32, false, false, -+ 0x1.b005314e2421e7ffb472840c5a6ep-32, false, false, -+ 0x1.b005314e2421e7ffb472840c5a6fp-32, false, false), - TEST ("0.0000000000000000000000000000000000000000000021019476964872" - "256063855943749348741969203929128147736576356024258346866240" - "28790902229957282543182373046875", - false, -- 0x8p-152, false, -- 0x1p-148, false, -- 0x8p-152, false, -- 0x1p-148, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false), -+ 0x8p-152, false, true, -+ 0x1p-148, false, true, -+ 0x8p-152, false, true, -+ 0x1p-148, false, true, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false), - TEST ("1.00000005960464477539062499", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000000fffffffp+0, false, -- 0x1.000001p+0, false, -- 0x1.000000fffffffp+0, false, -- 0x1.000001p+0, false, -- false, -- 0x1.000000fffffffffep+0, false, -- 0x1.000001p+0, false, -- 0x1.000000fffffffffep+0, false, -- 0x1.000001p+0, false, -- false, -- 0x1.000000fffffffffep+0, false, -- 0x1.000001p+0, false, -- 0x1.000000fffffffffep+0, false, -- 0x1.000001p+0, false, -- false, -- 0x1.000000fffffffffffffffce7b78p+0, false, -- 0x1.000000fffffffffffffffce7b8p+0, false, -- 0x1.000000fffffffffffffffce7b78p+0, false, -- 0x1.000000fffffffffffffffce7b8p+0, false, -- false, -- 0x1.000000fffffffffffffffce7b7e7p+0, false, -- 0x1.000000fffffffffffffffce7b7e7p+0, false, -- 0x1.000000fffffffffffffffce7b7e7p+0, false, -- 0x1.000000fffffffffffffffce7b7e8p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000000fffffffp+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000000fffffffp+0, false, false, -+ 0x1.000001p+0, false, false, -+ false, -+ 0x1.000000fffffffffep+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000000fffffffffep+0, false, false, -+ 0x1.000001p+0, false, false, -+ false, -+ 0x1.000000fffffffffep+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000000fffffffffep+0, false, false, -+ 0x1.000001p+0, false, false, -+ false, -+ 0x1.000000fffffffffffffffce7b78p+0, false, false, -+ 0x1.000000fffffffffffffffce7b8p+0, false, false, -+ 0x1.000000fffffffffffffffce7b78p+0, false, false, -+ 0x1.000000fffffffffffffffce7b8p+0, false, false, -+ false, -+ 0x1.000000fffffffffffffffce7b7e7p+0, false, false, -+ 0x1.000000fffffffffffffffce7b7e7p+0, false, false, -+ 0x1.000000fffffffffffffffce7b7e7p+0, false, false, -+ 0x1.000000fffffffffffffffce7b7e8p+0, false, false), - TEST ("1.000000059604644775390625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- true, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- true, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- true, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- true, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ true, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ true, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ true, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ true, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false), - TEST ("1.00000005960464477539062501", - false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000001p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000000002p+0, false, -- false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.000001p+0, false, -- 0x1.0000010000000002p+0, false, -- false, -- 0x1.00000100000000000000031848p+0, false, -- 0x1.00000100000000000000031848p+0, false, -- 0x1.00000100000000000000031848p+0, false, -- 0x1.000001000000000000000318488p+0, false, -- false, -- 0x1.0000010000000000000003184818p+0, false, -- 0x1.0000010000000000000003184819p+0, false, -- 0x1.0000010000000000000003184818p+0, false, -- 0x1.0000010000000000000003184819p+0, false), -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000001p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.000001p+0, false, false, -+ 0x1.0000010000000002p+0, false, false, -+ false, -+ 0x1.00000100000000000000031848p+0, false, false, -+ 0x1.00000100000000000000031848p+0, false, false, -+ 0x1.00000100000000000000031848p+0, false, false, -+ 0x1.000001000000000000000318488p+0, false, false, -+ false, -+ 0x1.0000010000000000000003184818p+0, false, false, -+ 0x1.0000010000000000000003184819p+0, false, false, -+ 0x1.0000010000000000000003184818p+0, false, false, -+ 0x1.0000010000000000000003184819p+0, false, false), - TEST ("1.00000011920928955078125", - true, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false), -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false), - TEST ("1.00000017881393432617187499", - false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000002p+0, false, -- 0x1.000004p+0, false, -- false, -- 0x1.000002fffffffp+0, false, -- 0x1.000003p+0, false, -- 0x1.000002fffffffp+0, false, -- 0x1.000003p+0, false, -- false, -- 0x1.000002fffffffffep+0, false, -- 0x1.000003p+0, false, -- 0x1.000002fffffffffep+0, false, -- 0x1.000003p+0, false, -- false, -- 0x1.000002fffffffffep+0, false, -- 0x1.000003p+0, false, -- 0x1.000002fffffffffep+0, false, -- 0x1.000003p+0, false, -- false, -- 0x1.000002fffffffffffffffce7b78p+0, false, -- 0x1.000002fffffffffffffffce7b8p+0, false, -- 0x1.000002fffffffffffffffce7b78p+0, false, -- 0x1.000002fffffffffffffffce7b8p+0, false, -- false, -- 0x1.000002fffffffffffffffce7b7e7p+0, false, -- 0x1.000002fffffffffffffffce7b7e7p+0, false, -- 0x1.000002fffffffffffffffce7b7e7p+0, false, -- 0x1.000002fffffffffffffffce7b7e8p+0, false), -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000004p+0, false, false, -+ false, -+ 0x1.000002fffffffp+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000002fffffffp+0, false, false, -+ 0x1.000003p+0, false, false, -+ false, -+ 0x1.000002fffffffffep+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000002fffffffffep+0, false, false, -+ 0x1.000003p+0, false, false, -+ false, -+ 0x1.000002fffffffffep+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000002fffffffffep+0, false, false, -+ 0x1.000003p+0, false, false, -+ false, -+ 0x1.000002fffffffffffffffce7b78p+0, false, false, -+ 0x1.000002fffffffffffffffce7b8p+0, false, false, -+ 0x1.000002fffffffffffffffce7b78p+0, false, false, -+ 0x1.000002fffffffffffffffce7b8p+0, false, false, -+ false, -+ 0x1.000002fffffffffffffffce7b7e7p+0, false, false, -+ 0x1.000002fffffffffffffffce7b7e7p+0, false, false, -+ 0x1.000002fffffffffffffffce7b7e7p+0, false, false, -+ 0x1.000002fffffffffffffffce7b7e8p+0, false, false), - TEST ("1.000000178813934326171875", - false, -- 0x1.000002p+0, false, -- 0x1.000004p+0, false, -- 0x1.000002p+0, false, -- 0x1.000004p+0, false, -- true, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- true, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- true, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- true, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- true, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false), -+ 0x1.000002p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000004p+0, false, false, -+ true, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ true, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ true, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ true, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ true, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false), - TEST ("1.00000017881393432617187501", - false, -- 0x1.000002p+0, false, -- 0x1.000004p+0, false, -- 0x1.000002p+0, false, -- 0x1.000004p+0, false, -- false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.0000030000001p+0, false, -- false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.0000030000000002p+0, false, -- false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.000003p+0, false, -- 0x1.0000030000000002p+0, false, -- false, -- 0x1.00000300000000000000031848p+0, false, -- 0x1.00000300000000000000031848p+0, false, -- 0x1.00000300000000000000031848p+0, false, -- 0x1.000003000000000000000318488p+0, false, -- false, -- 0x1.0000030000000000000003184818p+0, false, -- 0x1.0000030000000000000003184819p+0, false, -- 0x1.0000030000000000000003184818p+0, false, -- 0x1.0000030000000000000003184819p+0, false), -+ 0x1.000002p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000002p+0, false, false, -+ 0x1.000004p+0, false, false, -+ false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.0000030000001p+0, false, false, -+ false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.0000030000000002p+0, false, false, -+ false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.000003p+0, false, false, -+ 0x1.0000030000000002p+0, false, false, -+ false, -+ 0x1.00000300000000000000031848p+0, false, false, -+ 0x1.00000300000000000000031848p+0, false, false, -+ 0x1.00000300000000000000031848p+0, false, false, -+ 0x1.000003000000000000000318488p+0, false, false, -+ false, -+ 0x1.0000030000000000000003184818p+0, false, false, -+ 0x1.0000030000000000000003184819p+0, false, false, -+ 0x1.0000030000000000000003184818p+0, false, false, -+ 0x1.0000030000000000000003184819p+0, false, false), - TEST ("1.0000002384185791015625", - true, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- true, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- true, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- true, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- true, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- true, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false, -- 0x1.000004p+0, false), -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ true, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ true, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ true, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ true, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ true, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false, -+ 0x1.000004p+0, false, false), - TEST ("1.08420217248550443400745280086994171142578125e-19", - true, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- true, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- true, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- true, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- true, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- true, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false), -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ true, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ true, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ true, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ true, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ true, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false), - TEST ("1.0842022371089897897127399001987457793916291848290711641311" - "645507812499e-19", - false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2.000004p-64, false, -- false, -- 0x2.000001ffffffep-64, false, -- 0x2.000002p-64, false, -- 0x2.000001ffffffep-64, false, -- 0x2.000002p-64, false, -- false, -- 0x2.000001fffffffffcp-64, false, -- 0x2.000002p-64, false, -- 0x2.000001fffffffffcp-64, false, -- 0x2.000002p-64, false, -- false, -- 0x2.000001fffffffffcp-64, false, -- 0x2.000002p-64, false, -- 0x2.000001fffffffffcp-64, false, -- 0x2.000002p-64, false, -- false, -- 0x2.000001ffffffffffffffffffffp-64, false, -- 0x2.000002p-64, false, -- 0x2.000001ffffffffffffffffffffp-64, false, -- 0x2.000002p-64, false, -- false, -- 0x2.000001fffffffffffffffffffffep-64, false, -- 0x2.000002p-64, false, -- 0x2.000001fffffffffffffffffffffep-64, false, -- 0x2.000002p-64, false), -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2.000004p-64, false, false, -+ false, -+ 0x2.000001ffffffep-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000001ffffffep-64, false, false, -+ 0x2.000002p-64, false, false, -+ false, -+ 0x2.000001fffffffffcp-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000001fffffffffcp-64, false, false, -+ 0x2.000002p-64, false, false, -+ false, -+ 0x2.000001fffffffffcp-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000001fffffffffcp-64, false, false, -+ 0x2.000002p-64, false, false, -+ false, -+ 0x2.000001ffffffffffffffffffffp-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000001ffffffffffffffffffffp-64, false, false, -+ 0x2.000002p-64, false, false, -+ false, -+ 0x2.000001fffffffffffffffffffffep-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000001fffffffffffffffffffffep-64, false, false, -+ 0x2.000002p-64, false, false), - TEST ("1.0842022371089897897127399001987457793916291848290711641311" - "6455078125e-19", - false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2p-64, false, -- 0x2.000004p-64, false, -- true, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- true, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- true, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- true, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- true, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false), -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2.000004p-64, false, false, -+ true, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ true, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ true, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ true, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ true, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false), - TEST ("1.0842022371089897897127399001987457793916291848290711641311" - "645507812501e-19", - false, -- 0x2p-64, false, -- 0x2.000004p-64, false, -- 0x2p-64, false, -- 0x2.000004p-64, false, -- false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.0000020000002p-64, false, -- false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.0000020000000004p-64, false, -- false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.0000020000000004p-64, false, -- false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.00000200000000000000000001p-64, false, -- false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.000002p-64, false, -- 0x2.0000020000000000000000000002p-64, false), -+ 0x2p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2p-64, false, false, -+ 0x2.000004p-64, false, false, -+ false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.0000020000002p-64, false, false, -+ false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.0000020000000004p-64, false, false, -+ false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.0000020000000004p-64, false, false, -+ false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.00000200000000000000000001p-64, false, false, -+ false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.000002p-64, false, false, -+ 0x2.0000020000000000000000000002p-64, false, false), - TEST ("1.0842023017324751454180269995275498473574771196581423282623" - "291015625e-19", - true, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- true, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- true, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- true, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- true, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- true, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false), -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ true, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ true, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ true, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ true, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ true, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false), - TEST ("1.0842023663559605011233140988563539153233250544872134923934" - "936523437499e-19", - false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000004p-64, false, -- 0x2.000008p-64, false, -- false, -- 0x2.000005ffffffep-64, false, -- 0x2.000006p-64, false, -- 0x2.000005ffffffep-64, false, -- 0x2.000006p-64, false, -- false, -- 0x2.000005fffffffffcp-64, false, -- 0x2.000006p-64, false, -- 0x2.000005fffffffffcp-64, false, -- 0x2.000006p-64, false, -- false, -- 0x2.000005fffffffffcp-64, false, -- 0x2.000006p-64, false, -- 0x2.000005fffffffffcp-64, false, -- 0x2.000006p-64, false, -- false, -- 0x2.000005ffffffffffffffffffffp-64, false, -- 0x2.000006p-64, false, -- 0x2.000005ffffffffffffffffffffp-64, false, -- 0x2.000006p-64, false, -- false, -- 0x2.000005fffffffffffffffffffffep-64, false, -- 0x2.000006p-64, false, -- 0x2.000005fffffffffffffffffffffep-64, false, -- 0x2.000006p-64, false), -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000008p-64, false, false, -+ false, -+ 0x2.000005ffffffep-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000005ffffffep-64, false, false, -+ 0x2.000006p-64, false, false, -+ false, -+ 0x2.000005fffffffffcp-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000005fffffffffcp-64, false, false, -+ 0x2.000006p-64, false, false, -+ false, -+ 0x2.000005fffffffffcp-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000005fffffffffcp-64, false, false, -+ 0x2.000006p-64, false, false, -+ false, -+ 0x2.000005ffffffffffffffffffffp-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000005ffffffffffffffffffffp-64, false, false, -+ 0x2.000006p-64, false, false, -+ false, -+ 0x2.000005fffffffffffffffffffffep-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000005fffffffffffffffffffffep-64, false, false, -+ 0x2.000006p-64, false, false), - TEST ("1.0842023663559605011233140988563539153233250544872134923934" - "9365234375e-19", - false, -- 0x2.000004p-64, false, -- 0x2.000008p-64, false, -- 0x2.000004p-64, false, -- 0x2.000008p-64, false, -- true, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- true, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- true, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- true, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- true, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false), -+ 0x2.000004p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000008p-64, false, false, -+ true, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ true, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ true, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ true, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ true, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false), - TEST ("1.0842023663559605011233140988563539153233250544872134923934" - "936523437501e-19", - false, -- 0x2.000004p-64, false, -- 0x2.000008p-64, false, -- 0x2.000004p-64, false, -- 0x2.000008p-64, false, -- false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.0000060000002p-64, false, -- false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.0000060000000004p-64, false, -- false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.0000060000000004p-64, false, -- false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.00000600000000000000000001p-64, false, -- false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.000006p-64, false, -- 0x2.0000060000000000000000000002p-64, false), -+ 0x2.000004p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000004p-64, false, false, -+ 0x2.000008p-64, false, false, -+ false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.0000060000002p-64, false, false, -+ false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.0000060000000004p-64, false, false, -+ false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.0000060000000004p-64, false, false, -+ false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.00000600000000000000000001p-64, false, false, -+ false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.000006p-64, false, false, -+ 0x2.0000060000000000000000000002p-64, false, false), - TEST ("1.0842024309794458568286011981851579832891729893162846565246" - "58203125e-19", - true, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- true, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- true, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- true, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- true, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- true, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false, -- 0x2.000008p-64, false), -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ true, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ true, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ true, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ true, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ true, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false, -+ 0x2.000008p-64, false, false), - TEST ("7.5231638452626400509999138382223723380394595633413601376560" - "1092018187046051025390625e-37", - true, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- true, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- true, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- true, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- true, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- true, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false), -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ true, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ true, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ true, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ true, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ true, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false), - TEST ("7.5231642936781486349413765338158389908126215730251815381410" - "578824437213052434003657253924757242202758789062499e-37", - false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1.000002p-120, false, -- false, -- 0x1.000000fffffffp-120, false, -- 0x1.000001p-120, false, -- 0x1.000000fffffffp-120, false, -- 0x1.000001p-120, false, -- false, -- 0x1.000000fffffffffep-120, false, -- 0x1.000001p-120, false, -- 0x1.000000fffffffffep-120, false, -- 0x1.000001p-120, false, -- false, -- 0x1.000000fffffffffep-120, false, -- 0x1.000001p-120, false, -- 0x1.000000fffffffffep-120, false, -- 0x1.000001p-120, false, -- false, -- 0x1.000000ffffffffffffffffffff8p-120, false, -- 0x1.000001p-120, false, -- 0x1.000000ffffffffffffffffffff8p-120, false, -- 0x1.000001p-120, false, -- false, -- 0x1.000000ffffffffffffffffffffffp-120, false, -- 0x1.000001p-120, false, -- 0x1.000000ffffffffffffffffffffffp-120, false, -- 0x1.000001p-120, false), -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1.000002p-120, false, false, -+ false, -+ 0x1.000000fffffffp-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000000fffffffp-120, false, false, -+ 0x1.000001p-120, false, false, -+ false, -+ 0x1.000000fffffffffep-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000000fffffffffep-120, false, false, -+ 0x1.000001p-120, false, false, -+ false, -+ 0x1.000000fffffffffep-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000000fffffffffep-120, false, false, -+ 0x1.000001p-120, false, false, -+ false, -+ 0x1.000000ffffffffffffffffffff8p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000000ffffffffffffffffffff8p-120, false, false, -+ 0x1.000001p-120, false, false, -+ false, -+ 0x1.000000ffffffffffffffffffffffp-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000000ffffffffffffffffffffffp-120, false, false, -+ 0x1.000001p-120, false, false), - TEST ("7.5231642936781486349413765338158389908126215730251815381410" - "5788244372130524340036572539247572422027587890625e-37", - false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1p-120, false, -- 0x1.000002p-120, false, -- true, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- true, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- true, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- true, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- true, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false), -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1.000002p-120, false, false, -+ true, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ true, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ true, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ true, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ true, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false), - TEST ("7.5231642936781486349413765338158389908126215730251815381410" - "578824437213052434003657253924757242202758789062501e-37", - false, -- 0x1p-120, false, -- 0x1.000002p-120, false, -- 0x1p-120, false, -- 0x1.000002p-120, false, -- false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.0000010000001p-120, false, -- false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.0000010000000002p-120, false, -- false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.0000010000000002p-120, false, -- false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001000000000000000000008p-120, false, -- false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.000001p-120, false, -- 0x1.0000010000000000000000000001p-120, false), -+ 0x1p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1p-120, false, false, -+ 0x1.000002p-120, false, false, -+ false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.0000010000001p-120, false, false, -+ false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.0000010000000002p-120, false, false, -+ false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.0000010000000002p-120, false, false, -+ false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001000000000000000000008p-120, false, false, -+ false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.000001p-120, false, false, -+ 0x1.0000010000000000000000000001p-120, false, false), - TEST ("7.5231647420936572188828392294093056435857835827090029386261" - "048447055721499765468252007849514484405517578125e-37", - true, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- true, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- true, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- true, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- true, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- true, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false), -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ true, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ true, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ true, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ true, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ true, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false), - TEST ("7.5231651905091658028243019250027722963589455923928243391111" - "518069674229947096932846761774271726608276367187499e-37", - false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000002p-120, false, -- 0x1.000004p-120, false, -- false, -- 0x1.000002fffffffp-120, false, -- 0x1.000003p-120, false, -- 0x1.000002fffffffp-120, false, -- 0x1.000003p-120, false, -- false, -- 0x1.000002fffffffffep-120, false, -- 0x1.000003p-120, false, -- 0x1.000002fffffffffep-120, false, -- 0x1.000003p-120, false, -- false, -- 0x1.000002fffffffffep-120, false, -- 0x1.000003p-120, false, -- 0x1.000002fffffffffep-120, false, -- 0x1.000003p-120, false, -- false, -- 0x1.000002ffffffffffffffffffff8p-120, false, -- 0x1.000003p-120, false, -- 0x1.000002ffffffffffffffffffff8p-120, false, -- 0x1.000003p-120, false, -- false, -- 0x1.000002ffffffffffffffffffffffp-120, false, -- 0x1.000003p-120, false, -- 0x1.000002ffffffffffffffffffffffp-120, false, -- 0x1.000003p-120, false), -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000004p-120, false, false, -+ false, -+ 0x1.000002fffffffp-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000002fffffffp-120, false, false, -+ 0x1.000003p-120, false, false, -+ false, -+ 0x1.000002fffffffffep-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000002fffffffffep-120, false, false, -+ 0x1.000003p-120, false, false, -+ false, -+ 0x1.000002fffffffffep-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000002fffffffffep-120, false, false, -+ 0x1.000003p-120, false, false, -+ false, -+ 0x1.000002ffffffffffffffffffff8p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000002ffffffffffffffffffff8p-120, false, false, -+ 0x1.000003p-120, false, false, -+ false, -+ 0x1.000002ffffffffffffffffffffffp-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000002ffffffffffffffffffffffp-120, false, false, -+ 0x1.000003p-120, false, false), - TEST ("7.5231651905091658028243019250027722963589455923928243391111" - "5180696742299470969328467617742717266082763671875e-37", - false, -- 0x1.000002p-120, false, -- 0x1.000004p-120, false, -- 0x1.000002p-120, false, -- 0x1.000004p-120, false, -- true, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- true, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- true, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- true, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- true, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false), -+ 0x1.000002p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000004p-120, false, false, -+ true, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ true, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ true, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ true, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ true, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false), - TEST ("7.5231651905091658028243019250027722963589455923928243391111" - "518069674229947096932846761774271726608276367187501e-37", - false, -- 0x1.000002p-120, false, -- 0x1.000004p-120, false, -- 0x1.000002p-120, false, -- 0x1.000004p-120, false, -- false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.0000030000001p-120, false, -- false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.0000030000000002p-120, false, -- false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.0000030000000002p-120, false, -- false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003000000000000000000008p-120, false, -- false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.000003p-120, false, -- 0x1.0000030000000000000000000001p-120, false), -+ 0x1.000002p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000002p-120, false, false, -+ 0x1.000004p-120, false, false, -+ false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.0000030000001p-120, false, false, -+ false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.0000030000000002p-120, false, false, -+ false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.0000030000000002p-120, false, false, -+ false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003000000000000000000008p-120, false, false, -+ false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.000003p-120, false, false, -+ 0x1.0000030000000000000000000001p-120, false, false), - TEST ("7.5231656389246743867657646205962389491321076020766457395961" - "98769229273839442839744151569902896881103515625e-37", - true, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- true, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- true, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- true, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- true, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- true, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false, -- 0x1.000004p-120, false), -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ true, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ true, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ true, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ true, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ true, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false, -+ 0x1.000004p-120, false, false), - TEST ("340282356779733661637539395458142568447.999", - false, -- 0xf.fffffp+124, false, -- 0xf.fffffp+124, false, -- 0xf.fffffp+124, false, -- INF, true, -- false, -- 0xf.fffff7ffffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff7ffffff8p+124, false, -- 0xf.fffff8p+124, false, -- false, -- 0xf.fffff7fffffffffp+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff7fffffffffp+124, false, -- 0xf.fffff8p+124, false, -- false, -- 0xf.fffff7fffffffffp+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff7fffffffffp+124, false, -- 0xf.fffff8p+124, false, -- false, -- 0xf.fffff7fffffffffffffffffffcp+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff7fffffffffffffffffffcp+124, false, -- 0xf.fffff8p+124, false, -- false, -- 0xf.fffff7fffffffffffffffffffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff7fffffffffffffffffffff8p+124, false, -- 0xf.fffff8p+124, false), -+ 0xf.fffffp+124, false, false, -+ 0xf.fffffp+124, false, false, -+ 0xf.fffffp+124, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffff7ffffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff7ffffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ false, -+ 0xf.fffff7fffffffffp+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff7fffffffffp+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ false, -+ 0xf.fffff7fffffffffp+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff7fffffffffp+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ false, -+ 0xf.fffff7fffffffffffffffffffcp+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff7fffffffffffffffffffcp+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ false, -+ 0xf.fffff7fffffffffffffffffffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff7fffffffffffffffffffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false), - TEST ("340282356779733661637539395458142568448", - false, -- 0xf.fffffp+124, false, -- INF, true, -- 0xf.fffffp+124, false, -- INF, true, -- true, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- true, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- true, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- true, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- true, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false), -+ 0xf.fffffp+124, false, false, -+ INF, true, false, -+ 0xf.fffffp+124, false, false, -+ INF, true, false, -+ true, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ true, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ true, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ true, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ true, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false), - TEST ("340282356779733661637539395458142568448.001", - false, -- 0xf.fffffp+124, false, -- INF, true, -- 0xf.fffffp+124, false, -- INF, true, -- false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff80000008p+124, false, -- false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8000000001p+124, false, -- false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8000000001p+124, false, -- false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff800000000000000000004p+124, false, -- false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff8p+124, false, -- 0xf.fffff80000000000000000000008p+124, false), -+ 0xf.fffffp+124, false, false, -+ INF, true, false, -+ 0xf.fffffp+124, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff80000008p+124, false, false, -+ false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8000000001p+124, false, false, -+ false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8000000001p+124, false, false, -+ false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff800000000000000000004p+124, false, false, -+ false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff8p+124, false, false, -+ 0xf.fffff80000000000000000000008p+124, false, false), - TEST ("-340282356779733661637539395458142568447.999", - false, -- -INF, true, -- -0xf.fffffp+124, false, -- -0xf.fffffp+124, false, -- -0xf.fffffp+124, false, -- false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff7ffffff8p+124, false, -- -0xf.fffff7ffffff8p+124, false, -- false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff7fffffffffp+124, false, -- -0xf.fffff7fffffffffp+124, false, -- false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff7fffffffffp+124, false, -- -0xf.fffff7fffffffffp+124, false, -- false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff7fffffffffffffffffffcp+124, false, -- -0xf.fffff7fffffffffffffffffffcp+124, false, -- false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff7fffffffffffffffffffff8p+124, false, -- -0xf.fffff7fffffffffffffffffffff8p+124, false), -+ -INF, true, false, -+ -0xf.fffffp+124, false, false, -+ -0xf.fffffp+124, false, false, -+ -0xf.fffffp+124, false, false, -+ false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff7ffffff8p+124, false, false, -+ -0xf.fffff7ffffff8p+124, false, false, -+ false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff7fffffffffp+124, false, false, -+ -0xf.fffff7fffffffffp+124, false, false, -+ false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff7fffffffffp+124, false, false, -+ -0xf.fffff7fffffffffp+124, false, false, -+ false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff7fffffffffffffffffffcp+124, false, false, -+ -0xf.fffff7fffffffffffffffffffcp+124, false, false, -+ false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff7fffffffffffffffffffff8p+124, false, false, -+ -0xf.fffff7fffffffffffffffffffff8p+124, false, false), - TEST ("-340282356779733661637539395458142568448", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, false, -- -0xf.fffffp+124, false, -- true, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- true, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- true, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- true, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- true, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, false, false, -+ -0xf.fffffp+124, false, false, -+ true, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ true, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ true, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ true, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ true, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false), - TEST ("-340282356779733661637539395458142568448.001", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, false, -- -0xf.fffffp+124, false, -- false, -- -0xf.fffff80000008p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- false, -- -0xf.fffff8000000001p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- false, -- -0xf.fffff8000000001p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- false, -- -0xf.fffff800000000000000000004p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- false, -- -0xf.fffff80000000000000000000008p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false, -- -0xf.fffff8p+124, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, false, false, -+ -0xf.fffffp+124, false, false, -+ false, -+ -0xf.fffff80000008p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ false, -+ -0xf.fffff8000000001p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ false, -+ -0xf.fffff8000000001p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ false, -+ -0xf.fffff800000000000000000004p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ false, -+ -0xf.fffff80000000000000000000008p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false, -+ -0xf.fffff8p+124, false, false), - TEST ("179769313486231580793728971405303415079934132710037826936173" - "778980444968292764750946649017977587207096330286416692887910" - "946555547851940402630657488671505820681908902000708383676273" -@@ -1855,35 +1855,35 @@ static const struct test tests[] = { - "936475292719074168444365510704342711559699508093042880177904" - "174497791.999", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, false, -- 0xf.ffffffffffff8p+1020, false, -- 0xf.ffffffffffff8p+1020, false, -- INF, true, -- false, -- 0xf.ffffffffffffbffp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffbffp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- false, -- 0xf.ffffffffffffbffp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffbffp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- false, -- 0xf.ffffffffffffbffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, true, -- 0xf.ffffffffffffbffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, true, -- false, -- 0xf.ffffffffffffbffffffffffffff8p+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffbffffffffffffff8p+1020, false, -- 0xf.ffffffffffffcp+1020, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffffbffp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffbffp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ false, -+ 0xf.ffffffffffffbffp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffbffp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ false, -+ 0xf.ffffffffffffbffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ 0xf.ffffffffffffbffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ false, -+ 0xf.ffffffffffffbffffffffffffff8p+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffbffffffffffffff8p+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false), - TEST ("179769313486231580793728971405303415079934132710037826936173" - "778980444968292764750946649017977587207096330286416692887910" - "946555547851940402630657488671505820681908902000708383676273" -@@ -1891,35 +1891,35 @@ static const struct test tests[] = { - "936475292719074168444365510704342711559699508093042880177904" - "174497792", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, false, -- INF, true, -- 0xf.ffffffffffff8p+1020, false, -- INF, true, -- true, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- true, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- false, -- 0xf.ffffffffffffcp+1020, true, -- 0xf.ffffffffffffcp+1020, true, -- 0xf.ffffffffffffcp+1020, true, -- 0xf.ffffffffffffcp+1020, true, -- true, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ INF, true, false, -+ true, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ true, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ true, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false), - TEST ("179769313486231580793728971405303415079934132710037826936173" - "778980444968292764750946649017977587207096330286416692887910" - "946555547851940402630657488671505820681908902000708383676273" -@@ -1927,35 +1927,35 @@ static const struct test tests[] = { - "936475292719074168444365510704342711559699508093042880177904" - "174497792.001", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, false, -- INF, true, -- 0xf.ffffffffffff8p+1020, false, -- INF, true, -- false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffc01p+1020, false, -- false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffc01p+1020, false, -- false, -- 0xf.ffffffffffffcp+1020, true, -- 0xf.ffffffffffffcp+1020, true, -- 0xf.ffffffffffffcp+1020, true, -- 0xf.ffffffffffffc0000000000004p+1020, true, -- false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffcp+1020, false, -- 0xf.ffffffffffffc000000000000008p+1020, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffc01p+1020, false, false, -+ false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffc01p+1020, false, false, -+ false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ 0xf.ffffffffffffcp+1020, true, false, -+ 0xf.ffffffffffffc0000000000004p+1020, true, false, -+ false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffcp+1020, false, false, -+ 0xf.ffffffffffffc000000000000008p+1020, false, false), - TEST ("-17976931348623158079372897140530341507993413271003782693617" - "377898044496829276475094664901797758720709633028641669288791" - "094655554785194040263065748867150582068190890200070838367627" -@@ -1963,35 +1963,35 @@ static const struct test tests[] = { - "493647529271907416844436551070434271155969950809304288017790" - "4174497791.999", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -0xf.ffffffffffff8p+1020, false, -- -0xf.ffffffffffff8p+1020, false, -- -0xf.ffffffffffff8p+1020, false, -- false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffbffp+1020, false, -- -0xf.ffffffffffffbffp+1020, false, -- false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffbffp+1020, false, -- -0xf.ffffffffffffbffp+1020, false, -- false, -- -0xf.ffffffffffffcp+1020, true, -- -0xf.ffffffffffffcp+1020, true, -- -0xf.ffffffffffffbffffffffffffcp+1020, false, -- -0xf.ffffffffffffbffffffffffffcp+1020, false, -- false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffbffffffffffffff8p+1020, false, -- -0xf.ffffffffffffbffffffffffffff8p+1020, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffbffp+1020, false, false, -+ -0xf.ffffffffffffbffp+1020, false, false, -+ false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffbffp+1020, false, false, -+ -0xf.ffffffffffffbffp+1020, false, false, -+ false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ -0xf.ffffffffffffbffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffbffffffffffffcp+1020, false, false, -+ false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffbffffffffffffff8p+1020, false, false, -+ -0xf.ffffffffffffbffffffffffffff8p+1020, false, false), - TEST ("-17976931348623158079372897140530341507993413271003782693617" - "377898044496829276475094664901797758720709633028641669288791" - "094655554785194040263065748867150582068190890200070838367627" -@@ -1999,35 +1999,35 @@ static const struct test tests[] = { - "493647529271907416844436551070434271155969950809304288017790" - "4174497792", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, false, -- -0xf.ffffffffffff8p+1020, false, -- true, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- true, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- false, -- -0xf.ffffffffffffcp+1020, true, -- -0xf.ffffffffffffcp+1020, true, -- -0xf.ffffffffffffcp+1020, true, -- -0xf.ffffffffffffcp+1020, true, -- true, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ true, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ true, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ true, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false), - TEST ("-17976931348623158079372897140530341507993413271003782693617" - "377898044496829276475094664901797758720709633028641669288791" - "094655554785194040263065748867150582068190890200070838367627" -@@ -2035,35 +2035,35 @@ static const struct test tests[] = { - "493647529271907416844436551070434271155969950809304288017790" - "4174497792.001", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, false, -- -0xf.ffffffffffff8p+1020, false, -- false, -- -0xf.ffffffffffffc01p+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- false, -- -0xf.ffffffffffffc01p+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- false, -- -0xf.ffffffffffffc0000000000004p+1020, true, -- -0xf.ffffffffffffcp+1020, true, -- -0xf.ffffffffffffcp+1020, true, -- -0xf.ffffffffffffcp+1020, true, -- false, -- -0xf.ffffffffffffc000000000000008p+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false, -- -0xf.ffffffffffffcp+1020, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ false, -+ -0xf.ffffffffffffc01p+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ false, -+ -0xf.ffffffffffffc01p+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ false, -+ -0xf.ffffffffffffc0000000000004p+1020, true, false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ -0xf.ffffffffffffcp+1020, true, false, -+ false, -+ -0xf.ffffffffffffc000000000000008p+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false, -+ -0xf.ffffffffffffcp+1020, false, false), - TEST ("118973149535723176505351158982948866796625400469556721895649" - "927756249918185172720476044944290457046138433056764616744328" - "666255526748948793023632513609765434237723241753648908036202" -@@ -2148,35 +2148,35 @@ static const struct test tests[] = { - "578031503869424406179027994752890226443351619365453243328968" - "8740976918527.999", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- 0xf.fffffffffffffffp+16380, false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- 0xf.fffffffffffffffp+16380, false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffff7fffffffffff8p+16380, false, -- 0xf.fffffffffffffff8p+16380, false, -- 0xf.fffffffffffffff7fffffffffff8p+16380, false, -- 0xf.fffffffffffffff8p+16380, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffff7fffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff7fffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8p+16380, false, false), - TEST ("118973149535723176505351158982948866796625400469556721895649" - "927756249918185172720476044944290457046138433056764616744328" - "666255526748948793023632513609765434237723241753648908036202" -@@ -2261,35 +2261,35 @@ static const struct test tests[] = { - "578031503869424406179027994752890226443351619365453243328968" - "8740976918528", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- true, -- 0xf.fffffffffffffff8p+16380, false, -- 0xf.fffffffffffffff8p+16380, false, -- 0xf.fffffffffffffff8p+16380, false, -- 0xf.fffffffffffffff8p+16380, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ true, -+ 0xf.fffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8p+16380, false, false), - TEST ("118973149535723176505351158982948866796625400469556721895649" - "927756249918185172720476044944290457046138433056764616744328" - "666255526748948793023632513609765434237723241753648908036202" -@@ -2374,35 +2374,35 @@ static const struct test tests[] = { - "578031503869424406179027994752890226443351619365453243328968" - "8740976918528.001", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffff8p+16380, false, -- 0xf.fffffffffffffff8p+16380, false, -- 0xf.fffffffffffffff8p+16380, false, -- 0xf.fffffffffffffff8000000000008p+16380, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffff8000000000008p+16380, false, false), - TEST ("-11897314953572317650535115898294886679662540046955672189564" - "992775624991818517272047604494429045704613843305676461674432" - "866625552674894879302363251360976543423772324175364890803620" -@@ -2487,35 +2487,35 @@ static const struct test tests[] = { - "557803150386942440617902799475289022644335161936545324332896" - "88740976918527.999", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, true, -- -0xf.ffffffffffff8p+1020, true, -- false, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- false, -- -0xf.fffffffffffffff8p+16380, false, -- -0xf.fffffffffffffff8p+16380, false, -- -0xf.fffffffffffffff7fffffffffff8p+16380, false, -- -0xf.fffffffffffffff7fffffffffff8p+16380, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ false, -+ -0xf.fffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff7fffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff7fffffffffff8p+16380, false, false), - TEST ("-11897314953572317650535115898294886679662540046955672189564" - "992775624991818517272047604494429045704613843305676461674432" - "866625552674894879302363251360976543423772324175364890803620" -@@ -2600,35 +2600,35 @@ static const struct test tests[] = { - "557803150386942440617902799475289022644335161936545324332896" - "88740976918528", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, true, -- -0xf.ffffffffffff8p+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- true, -- -0xf.fffffffffffffff8p+16380, false, -- -0xf.fffffffffffffff8p+16380, false, -- -0xf.fffffffffffffff8p+16380, false, -- -0xf.fffffffffffffff8p+16380, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ true, -+ -0xf.fffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff8p+16380, false, false), - TEST ("-11897314953572317650535115898294886679662540046955672189564" - "992775624991818517272047604494429045704613843305676461674432" - "866625552674894879302363251360976543423772324175364890803620" -@@ -2713,35 +2713,35 @@ static const struct test tests[] = { - "557803150386942440617902799475289022644335161936545324332896" - "88740976918528.001", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, true, -- -0xf.ffffffffffff8p+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- false, -- -0xf.fffffffffffffff8000000000008p+16380, false, -- -0xf.fffffffffffffff8p+16380, false, -- -0xf.fffffffffffffff8p+16380, false, -- -0xf.fffffffffffffff8p+16380, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ false, -+ -0xf.fffffffffffffff8000000000008p+16380, false, false, -+ -0xf.fffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffff8p+16380, false, false), - TEST ("118973149535723176508575932662800707347995686986910214150118" - "685272271246896789803961473130416053705672050873552479421805" - "932646640744124594447361172514341324846716679654551308018400" -@@ -2826,35 +2826,35 @@ static const struct test tests[] = { - "972233447491583165728635513802591543441145939539353470970452" - "5536550715391.999", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- INF, true), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ INF, true, false), - TEST ("118973149535723176508575932662800707347995686986910214150118" - "685272271246896789803961473130416053705672050873552479421805" - "932646640744124594447361172514341324846716679654551308018400" -@@ -2939,35 +2939,35 @@ static const struct test tests[] = { - "972233447491583165728635513802591543441145939539353470970452" - "5536550715392", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- INF, true, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- INF, true), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ INF, true, false), - TEST ("118973149535723176508575932662800707347995686986910214150118" - "685272271246896789803961473130416053705672050873552479421805" - "932646640744124594447361172514341324846716679654551308018400" -@@ -3052,35 +3052,35 @@ static const struct test tests[] = { - "972233447491583165728635513802591543441145939539353470970452" - "5536550715392.001", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- INF, true, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- INF, true), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ INF, true, false), - TEST ("-11897314953572317650857593266280070734799568698691021415011" - "868527227124689678980396147313041605370567205087355247942180" - "593264664074412459444736117251434132484671667965455130801840" -@@ -3165,35 +3165,35 @@ static const struct test tests[] = { - "097223344749158316572863551380259154344114593953935347097045" - "25536550715391.999", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, true, -- -0xf.ffffffffffff8p+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- false, -- -INF, true, -- -0xf.fffffffffffffffffffffffffff8p+16380, false, -- -0xf.fffffffffffffffffffffffffff8p+16380, false, -- -0xf.fffffffffffffffffffffffffff8p+16380, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false), - TEST ("-11897314953572317650857593266280070734799568698691021415011" - "868527227124689678980396147313041605370567205087355247942180" - "593264664074412459444736117251434132484671667965455130801840" -@@ -3278,35 +3278,35 @@ static const struct test tests[] = { - "097223344749158316572863551380259154344114593953935347097045" - "25536550715392", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, true, -- -0xf.ffffffffffff8p+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffff8p+16380, false, -- -0xf.fffffffffffffffffffffffffff8p+16380, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false), - TEST ("-11897314953572317650857593266280070734799568698691021415011" - "868527227124689678980396147313041605370567205087355247942180" - "593264664074412459444736117251434132484671667965455130801840" -@@ -3391,419 +3391,419 @@ static const struct test tests[] = { - "097223344749158316572863551380259154344114593953935347097045" - "25536550715392.001", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, true, -- -0xf.ffffffffffff8p+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffff8p+16380, false, -- -0xf.fffffffffffffffffffffffffff8p+16380, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false), - TEST ("2.1019476964872256063855943749348741969203929128147736576356" - "0242583468662402879090222995728254318237304687499e-45", - false, -- 0x8p-152, false, -- 0x8p-152, false, -- 0x8p-152, false, -- 0x1p-148, false, -- false, -- 0xb.ffffffffffff8p-152, false, -- 0xcp-152, false, -- 0xb.ffffffffffff8p-152, false, -- 0xcp-152, false, -- false, -- 0xb.fffffffffffffffp-152, false, -- 0xcp-152, false, -- 0xb.fffffffffffffffp-152, false, -- 0xcp-152, false, -- false, -- 0xb.fffffffffffffffp-152, false, -- 0xcp-152, false, -- 0xb.fffffffffffffffp-152, false, -- 0xcp-152, false, -- false, -- 0xb.fffffffffffffffffffffffffcp-152, false, -- 0xcp-152, false, -- 0xb.fffffffffffffffffffffffffcp-152, false, -- 0xcp-152, false, -- false, -- 0xb.fffffffffffffffffffffffffff8p-152, false, -- 0xcp-152, false, -- 0xb.fffffffffffffffffffffffffff8p-152, false, -- 0xcp-152, false), -+ 0x8p-152, false, true, -+ 0x8p-152, false, true, -+ 0x8p-152, false, true, -+ 0x1p-148, false, true, -+ false, -+ 0xb.ffffffffffff8p-152, false, false, -+ 0xcp-152, false, false, -+ 0xb.ffffffffffff8p-152, false, false, -+ 0xcp-152, false, false, -+ false, -+ 0xb.fffffffffffffffp-152, false, false, -+ 0xcp-152, false, false, -+ 0xb.fffffffffffffffp-152, false, false, -+ 0xcp-152, false, false, -+ false, -+ 0xb.fffffffffffffffp-152, false, false, -+ 0xcp-152, false, false, -+ 0xb.fffffffffffffffp-152, false, false, -+ 0xcp-152, false, false, -+ false, -+ 0xb.fffffffffffffffffffffffffcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xb.fffffffffffffffffffffffffcp-152, false, false, -+ 0xcp-152, false, false, -+ false, -+ 0xb.fffffffffffffffffffffffffff8p-152, false, false, -+ 0xcp-152, false, false, -+ 0xb.fffffffffffffffffffffffffff8p-152, false, false, -+ 0xcp-152, false, false), - TEST ("2.1019476964872256063855943749348741969203929128147736576356" - "02425834686624028790902229957282543182373046875e-45", - false, -- 0x8p-152, false, -- 0x1p-148, false, -- 0x8p-152, false, -- 0x1p-148, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- true, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false), -+ 0x8p-152, false, true, -+ 0x1p-148, false, true, -+ 0x8p-152, false, true, -+ 0x1p-148, false, true, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ true, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false), - TEST ("2.1019476964872256063855943749348741969203929128147736576356" - "0242583468662402879090222995728254318237304687501e-45", - false, -- 0x8p-152, false, -- 0x1p-148, false, -- 0x8p-152, false, -- 0x1p-148, false, -- false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xc.0000000000008p-152, false, -- false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xc.000000000000001p-152, false, -- false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xc.000000000000001p-152, false, -- false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xc.00000000000000000000000004p-152, false, -- false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xcp-152, false, -- 0xc.0000000000000000000000000008p-152, false), -+ 0x8p-152, false, true, -+ 0x1p-148, false, true, -+ 0x8p-152, false, true, -+ 0x1p-148, false, true, -+ false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xc.0000000000008p-152, false, false, -+ false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xc.000000000000001p-152, false, false, -+ false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xc.000000000000001p-152, false, false, -+ false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xc.00000000000000000000000004p-152, false, false, -+ false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xcp-152, false, false, -+ 0xc.0000000000000000000000000008p-152, false, false), - TEST ("-2.101947696487225606385594374934874196920392912814773657635" - "60242583468662402879090222995728254318237304687499e-45", - false, -- -0x1p-148, false, -- -0x8p-152, false, -- -0x8p-152, false, -- -0x8p-152, false, -- false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xb.ffffffffffff8p-152, false, -- -0xb.ffffffffffff8p-152, false, -- false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xb.fffffffffffffffp-152, false, -- -0xb.fffffffffffffffp-152, false, -- false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xb.fffffffffffffffp-152, false, -- -0xb.fffffffffffffffp-152, false, -- false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xb.fffffffffffffffffffffffffcp-152, false, -- -0xb.fffffffffffffffffffffffffcp-152, false, -- false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xb.fffffffffffffffffffffffffff8p-152, false, -- -0xb.fffffffffffffffffffffffffff8p-152, false), -+ -0x1p-148, false, true, -+ -0x8p-152, false, true, -+ -0x8p-152, false, true, -+ -0x8p-152, false, true, -+ false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xb.ffffffffffff8p-152, false, false, -+ -0xb.ffffffffffff8p-152, false, false, -+ false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xb.fffffffffffffffp-152, false, false, -+ -0xb.fffffffffffffffp-152, false, false, -+ false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xb.fffffffffffffffp-152, false, false, -+ -0xb.fffffffffffffffp-152, false, false, -+ false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xb.fffffffffffffffffffffffffcp-152, false, false, -+ -0xb.fffffffffffffffffffffffffcp-152, false, false, -+ false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xb.fffffffffffffffffffffffffff8p-152, false, false, -+ -0xb.fffffffffffffffffffffffffff8p-152, false, false), - TEST ("-2.101947696487225606385594374934874196920392912814773657635" - "602425834686624028790902229957282543182373046875e-45", - false, -- -0x1p-148, false, -- -0x1p-148, false, -- -0x8p-152, false, -- -0x8p-152, false, -- true, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- true, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- true, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- true, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- true, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false), -+ -0x1p-148, false, true, -+ -0x1p-148, false, true, -+ -0x8p-152, false, true, -+ -0x8p-152, false, true, -+ true, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ true, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ true, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ true, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ true, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false), - TEST ("-2.101947696487225606385594374934874196920392912814773657635" - "60242583468662402879090222995728254318237304687501e-45", - false, -- -0x1p-148, false, -- -0x1p-148, false, -- -0x8p-152, false, -- -0x8p-152, false, -- false, -- -0xc.0000000000008p-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- false, -- -0xc.000000000000001p-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- false, -- -0xc.000000000000001p-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- false, -- -0xc.00000000000000000000000004p-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- false, -- -0xc.0000000000000000000000000008p-152, false, -- -0xcp-152, false, -- -0xcp-152, false, -- -0xcp-152, false), -+ -0x1p-148, false, true, -+ -0x1p-148, false, true, -+ -0x8p-152, false, true, -+ -0x8p-152, false, true, -+ false, -+ -0xc.0000000000008p-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ false, -+ -0xc.000000000000001p-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ false, -+ -0xc.000000000000001p-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ false, -+ -0xc.00000000000000000000000004p-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ false, -+ -0xc.0000000000000000000000000008p-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false, -+ -0xcp-152, false, false), - TEST ("3.5032461608120426773093239582247903282006548546912894293926" - "7070972447770671465150371659547090530395507812499e-45", - false, -- 0x1p-148, false, -- 0x1p-148, false, -- 0x1p-148, false, -- 0x1.8p-148, false, -- false, -- 0x1.3ffffffffffffp-148, false, -- 0x1.4p-148, false, -- 0x1.3ffffffffffffp-148, false, -- 0x1.4p-148, false, -- false, -- 0x1.3ffffffffffffffep-148, false, -- 0x1.4p-148, false, -- 0x1.3ffffffffffffffep-148, false, -- 0x1.4p-148, false, -- false, -- 0x1.3ffffffffffffffep-148, false, -- 0x1.4p-148, false, -- 0x1.3ffffffffffffffep-148, false, -- 0x1.4p-148, false, -- false, -- 0x1.3fffffffffffffffffffffffff8p-148, false, -- 0x1.4p-148, false, -- 0x1.3fffffffffffffffffffffffff8p-148, false, -- 0x1.4p-148, false, -- false, -- 0x1.3fffffffffffffffffffffffffffp-148, false, -- 0x1.4p-148, false, -- 0x1.3fffffffffffffffffffffffffffp-148, false, -- 0x1.4p-148, false), -+ 0x1p-148, false, true, -+ 0x1p-148, false, true, -+ 0x1p-148, false, true, -+ 0x1.8p-148, false, true, -+ false, -+ 0x1.3ffffffffffffp-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.3ffffffffffffp-148, false, false, -+ 0x1.4p-148, false, false, -+ false, -+ 0x1.3ffffffffffffffep-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.3ffffffffffffffep-148, false, false, -+ 0x1.4p-148, false, false, -+ false, -+ 0x1.3ffffffffffffffep-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.3ffffffffffffffep-148, false, false, -+ 0x1.4p-148, false, false, -+ false, -+ 0x1.3fffffffffffffffffffffffff8p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.3fffffffffffffffffffffffff8p-148, false, false, -+ 0x1.4p-148, false, false, -+ false, -+ 0x1.3fffffffffffffffffffffffffffp-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.3fffffffffffffffffffffffffffp-148, false, false, -+ 0x1.4p-148, false, false), - TEST ("3.5032461608120426773093239582247903282006548546912894293926" - "70709724477706714651503716595470905303955078125e-45", - false, -- 0x1p-148, false, -- 0x1p-148, false, -- 0x1p-148, false, -- 0x1.8p-148, false, -- true, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- true, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- true, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- true, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- true, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false), -+ 0x1p-148, false, true, -+ 0x1p-148, false, true, -+ 0x1p-148, false, true, -+ 0x1.8p-148, false, true, -+ true, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ true, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ true, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ true, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ true, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false), - TEST ("3.5032461608120426773093239582247903282006548546912894293926" - "7070972447770671465150371659547090530395507812501e-45", - false, -- 0x1p-148, false, -- 0x1.8p-148, false, -- 0x1p-148, false, -- 0x1.8p-148, false, -- false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4000000000001p-148, false, -- false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4000000000000002p-148, false, -- false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4000000000000002p-148, false, -- false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.400000000000000000000000008p-148, false, -- false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4p-148, false, -- 0x1.4000000000000000000000000001p-148, false), -+ 0x1p-148, false, true, -+ 0x1.8p-148, false, true, -+ 0x1p-148, false, true, -+ 0x1.8p-148, false, true, -+ false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4000000000001p-148, false, false, -+ false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4000000000000002p-148, false, false, -+ false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4000000000000002p-148, false, false, -+ false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.400000000000000000000000008p-148, false, false, -+ false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4p-148, false, false, -+ 0x1.4000000000000000000000000001p-148, false, false), - TEST ("-3.503246160812042677309323958224790328200654854691289429392" - "67070972447770671465150371659547090530395507812499e-45", - false, -- -0x1.8p-148, false, -- -0x1p-148, false, -- -0x1p-148, false, -- -0x1p-148, false, -- false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.3ffffffffffffp-148, false, -- -0x1.3ffffffffffffp-148, false, -- false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.3ffffffffffffffep-148, false, -- -0x1.3ffffffffffffffep-148, false, -- false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.3ffffffffffffffep-148, false, -- -0x1.3ffffffffffffffep-148, false, -- false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.3fffffffffffffffffffffffff8p-148, false, -- -0x1.3fffffffffffffffffffffffff8p-148, false, -- false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.3fffffffffffffffffffffffffffp-148, false, -- -0x1.3fffffffffffffffffffffffffffp-148, false), -+ -0x1.8p-148, false, true, -+ -0x1p-148, false, true, -+ -0x1p-148, false, true, -+ -0x1p-148, false, true, -+ false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.3ffffffffffffp-148, false, false, -+ -0x1.3ffffffffffffp-148, false, false, -+ false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.3ffffffffffffffep-148, false, false, -+ -0x1.3ffffffffffffffep-148, false, false, -+ false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.3ffffffffffffffep-148, false, false, -+ -0x1.3ffffffffffffffep-148, false, false, -+ false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.3fffffffffffffffffffffffff8p-148, false, false, -+ -0x1.3fffffffffffffffffffffffff8p-148, false, false, -+ false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.3fffffffffffffffffffffffffffp-148, false, false, -+ -0x1.3fffffffffffffffffffffffffffp-148, false, false), - TEST ("-3.503246160812042677309323958224790328200654854691289429392" - "670709724477706714651503716595470905303955078125e-45", - false, -- -0x1.8p-148, false, -- -0x1p-148, false, -- -0x1p-148, false, -- -0x1p-148, false, -- true, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- true, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- true, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- true, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- true, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false), -+ -0x1.8p-148, false, true, -+ -0x1p-148, false, true, -+ -0x1p-148, false, true, -+ -0x1p-148, false, true, -+ true, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ true, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ true, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ true, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ true, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false), - TEST ("-3.503246160812042677309323958224790328200654854691289429392" - "67070972447770671465150371659547090530395507812501e-45", - false, -- -0x1.8p-148, false, -- -0x1.8p-148, false, -- -0x1p-148, false, -- -0x1p-148, false, -- false, -- -0x1.4000000000001p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- false, -- -0x1.4000000000000002p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- false, -- -0x1.4000000000000002p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- false, -- -0x1.400000000000000000000000008p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- false, -- -0x1.4000000000000000000000000001p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false, -- -0x1.4p-148, false), -+ -0x1.8p-148, false, true, -+ -0x1.8p-148, false, true, -+ -0x1p-148, false, true, -+ -0x1p-148, false, true, -+ false, -+ -0x1.4000000000001p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ false, -+ -0x1.4000000000000002p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ false, -+ -0x1.4000000000000002p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ false, -+ -0x1.400000000000000000000000008p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ false, -+ -0x1.4000000000000000000000000001p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false, -+ -0x1.4p-148, false, false), - TEST ("7.4109846876186981626485318930233205854758970392148714663837" - "852375101326090531312779794975454245398856969484704316857659" - "638998506553390969459816219401617281718945106978546710679176" -@@ -3818,35 +3818,35 @@ static const struct test tests[] = { - "337560846003984904972149117463085539556354188641513168478436" - "31308023759629577398300170898437499e-324", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x4p-1076, false, -- 0x4p-1076, false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- false, -- 0x5.fffffffffffffff8p-1076, false, -- 0x6p-1076, false, -- 0x5.fffffffffffffff8p-1076, false, -- 0x6p-1076, false, -- false, -- 0x5.fffffffffffffff8p-1076, false, -- 0x6p-1076, false, -- 0x5.fffffffffffffff8p-1076, false, -- 0x6p-1076, false, -- false, -- 0x4p-1076, false, -- 0x4p-1076, false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- false, -- 0x5.fffffffffffffffffffffffffffcp-1076, false, -- 0x6p-1076, false, -- 0x5.fffffffffffffffffffffffffffcp-1076, false, -- 0x6p-1076, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x4p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ false, -+ 0x5.fffffffffffffff8p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x5.fffffffffffffff8p-1076, false, false, -+ 0x6p-1076, false, false, -+ false, -+ 0x5.fffffffffffffff8p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x5.fffffffffffffff8p-1076, false, false, -+ 0x6p-1076, false, false, -+ false, -+ 0x4p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ false, -+ 0x5.fffffffffffffffffffffffffffcp-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x5.fffffffffffffffffffffffffffcp-1076, false, false, -+ 0x6p-1076, false, false), - TEST ("7.4109846876186981626485318930233205854758970392148714663837" - "852375101326090531312779794975454245398856969484704316857659" - "638998506553390969459816219401617281718945106978546710679176" -@@ -3861,35 +3861,35 @@ static const struct test tests[] = { - "337560846003984904972149117463085539556354188641513168478436" - "313080237596295773983001708984375e-324", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- true, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- true, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- true, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ true, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ true, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ false, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ true, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false), - TEST ("7.4109846876186981626485318930233205854758970392148714663837" - "852375101326090531312779794975454245398856969484704316857659" - "638998506553390969459816219401617281718945106978546710679176" -@@ -3904,35 +3904,35 @@ static const struct test tests[] = { - "337560846003984904972149117463085539556354188641513168478436" - "31308023759629577398300170898437501e-324", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6.0000000000000008p-1076, false, -- false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6.0000000000000008p-1076, false, -- false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- 0x4p-1076, false, -- 0x8p-1076, false, -- false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6p-1076, false, -- 0x6.0000000000000000000000000004p-1076, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6.0000000000000008p-1076, false, false, -+ false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6.0000000000000008p-1076, false, false, -+ false, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ 0x4p-1076, false, true, -+ 0x8p-1076, false, true, -+ false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6p-1076, false, false, -+ 0x6.0000000000000000000000000004p-1076, false, false), - TEST ("-7.410984687618698162648531893023320585475897039214871466383" - "785237510132609053131277979497545424539885696948470431685765" - "963899850655339096945981621940161728171894510697854671067917" -@@ -3947,35 +3947,35 @@ static const struct test tests[] = { - "433756084600398490497214911746308553955635418864151316847843" - "631308023759629577398300170898437499e-324", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x5.fffffffffffffff8p-1076, false, -- -0x5.fffffffffffffff8p-1076, false, -- false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x5.fffffffffffffff8p-1076, false, -- -0x5.fffffffffffffff8p-1076, false, -- false, -- -0x8p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x5.fffffffffffffffffffffffffffcp-1076, false, -- -0x5.fffffffffffffffffffffffffffcp-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x5.fffffffffffffff8p-1076, false, false, -+ -0x5.fffffffffffffff8p-1076, false, false, -+ false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x5.fffffffffffffff8p-1076, false, false, -+ -0x5.fffffffffffffff8p-1076, false, false, -+ false, -+ -0x8p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x5.fffffffffffffffffffffffffffcp-1076, false, false, -+ -0x5.fffffffffffffffffffffffffffcp-1076, false, false), - TEST ("-7.410984687618698162648531893023320585475897039214871466383" - "785237510132609053131277979497545424539885696948470431685765" - "963899850655339096945981621940161728171894510697854671067917" -@@ -3990,35 +3990,35 @@ static const struct test tests[] = { - "433756084600398490497214911746308553955635418864151316847843" - "6313080237596295773983001708984375e-324", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-1076, false, -- -0x8p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- true, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- true, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- false, -- -0x8p-1076, false, -- -0x8p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- true, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-1076, false, true, -+ -0x8p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ true, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ true, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ false, -+ -0x8p-1076, false, true, -+ -0x8p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ true, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false), - TEST ("-7.410984687618698162648531893023320585475897039214871466383" - "785237510132609053131277979497545424539885696948470431685765" - "963899850655339096945981621940161728171894510697854671067917" -@@ -4033,35 +4033,35 @@ static const struct test tests[] = { - "433756084600398490497214911746308553955635418864151316847843" - "631308023759629577398300170898437501e-324", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-1076, false, -- -0x8p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- false, -- -0x6.0000000000000008p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- false, -- -0x6.0000000000000008p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- false, -- -0x8p-1076, false, -- -0x8p-1076, false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- false, -- -0x6.0000000000000000000000000004p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false, -- -0x6p-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-1076, false, true, -+ -0x8p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ false, -+ -0x6.0000000000000008p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ false, -+ -0x6.0000000000000008p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ false, -+ -0x8p-1076, false, true, -+ -0x8p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ false, -+ -0x6.0000000000000000000000000004p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false, -+ -0x6p-1076, false, false), - TEST ("5.4677992978237119037926089004291297245985762235403450155814" - "707305425575329500966052143410629387408077958710210208052966" - "529504784489330482549602621133847135082257338717668975178538" -@@ -4255,35 +4255,35 @@ static const struct test tests[] = { - "866268925981702690270202829595794350800918257913991744455922" - "683343374046671669930219650268554687499e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x8p-16448, false, -- 0x8p-16448, false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- false, -- 0x8p-16448, false, -- 0xcp-16448, false, -- 0x8p-16448, false, -- 0xcp-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0xb.fffffffffffcp-16448, false, -- 0xcp-16448, false, -- 0xb.fffffffffffcp-16448, false, -- 0xcp-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0x8p-16448, false, true, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0xcp-16448, false, true, -+ 0x8p-16448, false, true, -+ 0xcp-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0xb.fffffffffffcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xb.fffffffffffcp-16448, false, true, -+ 0xcp-16448, false, true), - TEST ("5.4677992978237119037926089004291297245985762235403450155814" - "707305425575329500966052143410629387408077958710210208052966" - "529504784489330482549602621133847135082257338717668975178538" -@@ -4477,35 +4477,35 @@ static const struct test tests[] = { - "866268925981702690270202829595794350800918257913991744455922" - "6833433740466716699302196502685546875e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- true, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ true, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false), - TEST ("5.4677992978237119037926089004291297245985762235403450155814" - "707305425575329500966052143410629387408077958710210208052966" - "529504784489330482549602621133847135082257338717668975178538" -@@ -4699,35 +4699,35 @@ static const struct test tests[] = { - "866268925981702690270202829595794350800918257913991744455922" - "683343374046671669930219650268554687501e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0x1p-16444, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xc.000000000004p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ false, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0x1p-16444, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xc.000000000004p-16448, false, true), - TEST ("-5.467799297823711903792608900429129724598576223540345015581" - "470730542557532950096605214341062938740807795871021020805296" - "652950478448933048254960262113384713508225733871766897517853" -@@ -4921,35 +4921,35 @@ static const struct test tests[] = { - "386626892598170269027020282959579435080091825791399174445592" - "2683343374046671669930219650268554687499e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x1p-16444, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xb.fffffffffffcp-16448, false, -- -0xb.fffffffffffcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ false, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xb.fffffffffffcp-16448, false, true, -+ -0xb.fffffffffffcp-16448, false, true), - TEST ("-5.467799297823711903792608900429129724598576223540345015581" - "470730542557532950096605214341062938740807795871021020805296" - "652950478448933048254960262113384713508225733871766897517853" -@@ -5143,35 +5143,35 @@ static const struct test tests[] = { - "386626892598170269027020282959579435080091825791399174445592" - "26833433740466716699302196502685546875e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x1p-16444, false, -- -0x1p-16444, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- true, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0x1p-16444, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ true, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false), - TEST ("-5.467799297823711903792608900429129724598576223540345015581" - "470730542557532950096605214341062938740807795871021020805296" - "652950478448933048254960262113384713508225733871766897517853" -@@ -5365,35 +5365,35 @@ static const struct test tests[] = { - "386626892598170269027020282959579435080091825791399174445592" - "2683343374046671669930219650268554687501e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x1p-16444, false, -- -0x1p-16444, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- false, -- -0x1p-16444, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0xc.000000000004p-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0x1p-16444, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0xc.000000000004p-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true), - TEST ("5.4677992978237119037926089004291297245985762235403450155814" - "707305425575329500966052143410629387408077958710210208052966" - "529504784489330482549602621133847135082257338717668975178538" -@@ -5587,35 +5587,35 @@ static const struct test tests[] = { - "866268925981702690270202829595794350800918257913991744455922" - "683343374046671669930219650268554687499e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x8p-16448, false, -- 0x8p-16448, false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- false, -- 0x8p-16448, false, -- 0xcp-16448, false, -- 0x8p-16448, false, -- 0xcp-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0xb.fffffffffffcp-16448, false, -- 0xcp-16448, false, -- 0xb.fffffffffffcp-16448, false, -- 0xcp-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0x8p-16448, false, true, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0xcp-16448, false, true, -+ 0x8p-16448, false, true, -+ 0xcp-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0xb.fffffffffffcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xb.fffffffffffcp-16448, false, true, -+ 0xcp-16448, false, true), - TEST ("5.4677992978237119037926089004291297245985762235403450155814" - "707305425575329500966052143410629387408077958710210208052966" - "529504784489330482549602621133847135082257338717668975178538" -@@ -5809,35 +5809,35 @@ static const struct test tests[] = { - "866268925981702690270202829595794350800918257913991744455922" - "6833433740466716699302196502685546875e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- true, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ true, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false, -+ 0xcp-16448, false, false), - TEST ("5.4677992978237119037926089004291297245985762235403450155814" - "707305425575329500966052143410629387408077958710210208052966" - "529504784489330482549602621133847135082257338717668975178538" -@@ -6031,35 +6031,35 @@ static const struct test tests[] = { - "866268925981702690270202829595794350800918257913991744455922" - "683343374046671669930219650268554687501e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- 0x8p-16448, false, -- 0x1p-16444, false, -- false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0x1p-16444, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xcp-16448, false, -- 0xc.000000000004p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ 0x8p-16448, false, true, -+ 0x1p-16444, false, true, -+ false, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0x1p-16444, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xcp-16448, false, true, -+ 0xc.000000000004p-16448, false, true), - TEST ("-5.467799297823711903792608900429129724598576223540345015581" - "470730542557532950096605214341062938740807795871021020805296" - "652950478448933048254960262113384713508225733871766897517853" -@@ -6253,35 +6253,35 @@ static const struct test tests[] = { - "386626892598170269027020282959579435080091825791399174445592" - "2683343374046671669930219650268554687499e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x1p-16444, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xb.fffffffffffcp-16448, false, -- -0xb.fffffffffffcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ false, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xb.fffffffffffcp-16448, false, true, -+ -0xb.fffffffffffcp-16448, false, true), - TEST ("-5.467799297823711903792608900429129724598576223540345015581" - "470730542557532950096605214341062938740807795871021020805296" - "652950478448933048254960262113384713508225733871766897517853" -@@ -6475,35 +6475,35 @@ static const struct test tests[] = { - "386626892598170269027020282959579435080091825791399174445592" - "26833433740466716699302196502685546875e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x1p-16444, false, -- -0x1p-16444, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- true, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0x1p-16444, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ true, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false, -+ -0xcp-16448, false, false), - TEST ("-5.467799297823711903792608900429129724598576223540345015581" - "470730542557532950096605214341062938740807795871021020805296" - "652950478448933048254960262113384713508225733871766897517853" -@@ -6697,630 +6697,630 @@ static const struct test tests[] = { - "386626892598170269027020282959579435080091825791399174445592" - "2683343374046671669930219650268554687501e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x1p-16444, false, -- -0x1p-16444, false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- false, -- -0x1p-16444, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0xc.000000000004p-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false, -- -0xcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0x1p-16444, false, true, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ false, -+ -0x1p-16444, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0xc.000000000004p-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true, -+ -0xcp-16448, false, true), - TEST ("-0x0.7p-149", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- true, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- true, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- true, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- true, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false, -- -0x3.8p-152, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ true, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ true, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ true, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ true, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false, -+ -0x3.8p-152, false, false), - TEST ("-0x0.7p-1074", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- true, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false, -- -0x1.cp-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ true, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false, -+ -0x1.cp-1076, false, false), - TEST ("-0x0.7p-16445", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x3.8p-16448, false, -- -0x3.8p-16448, false, -- -0x3.8p-16448, false, -- -0x3.8p-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x3.8p-16448, false, false, -+ -0x3.8p-16448, false, false, -+ -0x3.8p-16448, false, false, -+ -0x3.8p-16448, false, false), - TEST ("-0x0.7p-16494", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16496, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16496, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true), - TEST ("0x1p-150", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false), - TEST ("0x1p-1075", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- true, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ true, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false), - TEST ("0x1p-16446", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- true, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ true, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false), - TEST ("0x1p-16495", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16496, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16496, false, true), - TEST ("-0x1p-150", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false), - TEST ("-0x1p-1075", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- true, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ true, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false), - TEST ("-0x1p-16446", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false), - TEST ("-0x1p-16495", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16496, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16496, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true), - TEST (".70064923216240853546186479164495807e-45", - false, -- 0x0p+0, false, -- 0x8p-152, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000004p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000000008p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000000008p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.00000000000000000000000002p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000000000000000000004p-152, false), -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000004p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000000008p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000000008p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.00000000000000000000000002p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000000000000000000004p-152, false, false), - TEST ("7.0064923216240853546186479164495806564013097093825788587853" - "4141944895541342930300743319094181060791015624e-46", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x3.ffffffffffffep-152, false, -- 0x4p-152, false, -- 0x3.ffffffffffffep-152, false, -- 0x4p-152, false, -- false, -- 0x3.fffffffffffffffcp-152, false, -- 0x4p-152, false, -- 0x3.fffffffffffffffcp-152, false, -- 0x4p-152, false, -- false, -- 0x3.fffffffffffffffcp-152, false, -- 0x4p-152, false, -- 0x3.fffffffffffffffcp-152, false, -- 0x4p-152, false, -- false, -- 0x3.ffffffffffffffffffffffffffp-152, false, -- 0x4p-152, false, -- 0x3.ffffffffffffffffffffffffffp-152, false, -- 0x4p-152, false, -- false, -- 0x3.fffffffffffffffffffffffffffep-152, false, -- 0x4p-152, false, -- 0x3.fffffffffffffffffffffffffffep-152, false, -- 0x4p-152, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x3.ffffffffffffep-152, false, false, -+ 0x4p-152, false, false, -+ 0x3.ffffffffffffep-152, false, false, -+ 0x4p-152, false, false, -+ false, -+ 0x3.fffffffffffffffcp-152, false, false, -+ 0x4p-152, false, false, -+ 0x3.fffffffffffffffcp-152, false, false, -+ 0x4p-152, false, false, -+ false, -+ 0x3.fffffffffffffffcp-152, false, false, -+ 0x4p-152, false, false, -+ 0x3.fffffffffffffffcp-152, false, false, -+ 0x4p-152, false, false, -+ false, -+ 0x3.ffffffffffffffffffffffffffp-152, false, false, -+ 0x4p-152, false, false, -+ 0x3.ffffffffffffffffffffffffffp-152, false, false, -+ 0x4p-152, false, false, -+ false, -+ 0x3.fffffffffffffffffffffffffffep-152, false, false, -+ 0x4p-152, false, false, -+ 0x3.fffffffffffffffffffffffffffep-152, false, false, -+ 0x4p-152, false, false), - TEST ("7.0064923216240853546186479164495806564013097093825788587853" - "4141944895541342930300743319094181060791015625e-46", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- true, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ true, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false), - TEST ("7.0064923216240853546186479164495806564013097093825788587853" - "4141944895541342930300743319094181060791015626e-46", - false, -- 0x0p+0, false, -- 0x8p-152, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000004p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000000008p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000000008p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.00000000000000000000000002p-152, false, -- false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4p-152, false, -- 0x4.0000000000000000000000000004p-152, false), -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000004p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000000008p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000000008p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.00000000000000000000000002p-152, false, false, -+ false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4p-152, false, false, -+ 0x4.0000000000000000000000000004p-152, false, false), - TEST ("-7.006492321624085354618647916449580656401309709382578858785" - "34141944895541342930300743319094181060791015624e-46", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x3.ffffffffffffep-152, false, -- -0x3.ffffffffffffep-152, false, -- false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x3.fffffffffffffffcp-152, false, -- -0x3.fffffffffffffffcp-152, false, -- false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x3.fffffffffffffffcp-152, false, -- -0x3.fffffffffffffffcp-152, false, -- false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x3.ffffffffffffffffffffffffffp-152, false, -- -0x3.ffffffffffffffffffffffffffp-152, false, -- false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x3.fffffffffffffffffffffffffffep-152, false, -- -0x3.fffffffffffffffffffffffffffep-152, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x3.ffffffffffffep-152, false, false, -+ -0x3.ffffffffffffep-152, false, false, -+ false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x3.fffffffffffffffcp-152, false, false, -+ -0x3.fffffffffffffffcp-152, false, false, -+ false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x3.fffffffffffffffcp-152, false, false, -+ -0x3.fffffffffffffffcp-152, false, false, -+ false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x3.ffffffffffffffffffffffffffp-152, false, false, -+ -0x3.ffffffffffffffffffffffffffp-152, false, false, -+ false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x3.fffffffffffffffffffffffffffep-152, false, false, -+ -0x3.fffffffffffffffffffffffffffep-152, false, false), - TEST ("-7.006492321624085354618647916449580656401309709382578858785" - "34141944895541342930300743319094181060791015625e-46", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- true, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ true, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false), - TEST ("-7.006492321624085354618647916449580656401309709382578858785" - "34141944895541342930300743319094181060791015626e-46", - false, -- -0x8p-152, false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4.0000000000004p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- false, -- -0x4.0000000000000008p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- false, -- -0x4.0000000000000008p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- false, -- -0x4.00000000000000000000000002p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- false, -- -0x4.0000000000000000000000000004p-152, false, -- -0x4p-152, false, -- -0x4p-152, false, -- -0x4p-152, false), -+ -0x8p-152, false, true, -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4.0000000000004p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ false, -+ -0x4.0000000000000008p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ false, -+ -0x4.0000000000000008p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ false, -+ -0x4.00000000000000000000000002p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ false, -+ -0x4.0000000000000000000000000004p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false, -+ -0x4p-152, false, false), - TEST ("2.4703282292062327208828439643411068618252990130716238221279" - "284125033775363510437593264991818081799618989828234772285886" - "546332835517796989819938739800539093906315035659515570226392" -@@ -7335,35 +7335,35 @@ static const struct test tests[] = { - "779186948667994968324049705821028513185451396213837722826145" - "437693412532098591327667236328124e-324", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x1.fffffffffffffffep-1076, false, -- 0x2p-1076, false, -- 0x1.fffffffffffffffep-1076, false, -- 0x2p-1076, false, -- false, -- 0x1.fffffffffffffffep-1076, false, -- 0x2p-1076, false, -- 0x1.fffffffffffffffep-1076, false, -- 0x2p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x1.ffffffffffffffffffffffffffffp-1076, false, -- 0x2p-1076, false, -- 0x1.ffffffffffffffffffffffffffffp-1076, false, -- 0x2p-1076, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.fffffffffffffffep-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x1.fffffffffffffffep-1076, false, false, -+ 0x2p-1076, false, false, -+ false, -+ 0x1.fffffffffffffffep-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x1.fffffffffffffffep-1076, false, false, -+ 0x2p-1076, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.ffffffffffffffffffffffffffffp-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x1.ffffffffffffffffffffffffffffp-1076, false, false, -+ 0x2p-1076, false, false), - TEST ("2.4703282292062327208828439643411068618252990130716238221279" - "284125033775363510437593264991818081799618989828234772285886" - "546332835517796989819938739800539093906315035659515570226392" -@@ -7378,35 +7378,35 @@ static const struct test tests[] = { - "779186948667994968324049705821028513185451396213837722826145" - "437693412532098591327667236328125e-324", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- true, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ true, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false), - TEST ("2.4703282292062327208828439643411068618252990130716238221279" - "284125033775363510437593264991818081799618989828234772285886" - "546332835517796989819938739800539093906315035659515570226392" -@@ -7421,35 +7421,35 @@ static const struct test tests[] = { - "779186948667994968324049705821028513185451396213837722826145" - "437693412532098591327667236328126e-324", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x4p-1076, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2.0000000000000004p-1076, false, -- false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2.0000000000000004p-1076, false, -- false, -- 0x0p+0, false, -- 0x4p-1076, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2p-1076, false, -- 0x2.0000000000000000000000000002p-1076, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2.0000000000000004p-1076, false, false, -+ false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2.0000000000000004p-1076, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2p-1076, false, false, -+ 0x2.0000000000000000000000000002p-1076, false, false), - TEST ("-2.470328229206232720882843964341106861825299013071623822127" - "928412503377536351043759326499181808179961898982823477228588" - "654633283551779698981993873980053909390631503565951557022639" -@@ -7464,35 +7464,35 @@ static const struct test tests[] = { - "477918694866799496832404970582102851318545139621383772282614" - "5437693412532098591327667236328124e-324", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x1.fffffffffffffffep-1076, false, -- -0x1.fffffffffffffffep-1076, false, -- false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x1.fffffffffffffffep-1076, false, -- -0x1.fffffffffffffffep-1076, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x1.ffffffffffffffffffffffffffffp-1076, false, -- -0x1.ffffffffffffffffffffffffffffp-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x1.fffffffffffffffep-1076, false, false, -+ -0x1.fffffffffffffffep-1076, false, false, -+ false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x1.fffffffffffffffep-1076, false, false, -+ -0x1.fffffffffffffffep-1076, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x1.ffffffffffffffffffffffffffffp-1076, false, false, -+ -0x1.ffffffffffffffffffffffffffffp-1076, false, false), - TEST ("-2.470328229206232720882843964341106861825299013071623822127" - "928412503377536351043759326499181808179961898982823477228588" - "654633283551779698981993873980053909390631503565951557022639" -@@ -7507,35 +7507,35 @@ static const struct test tests[] = { - "477918694866799496832404970582102851318545139621383772282614" - "5437693412532098591327667236328125e-324", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- true, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ true, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false), - TEST ("-2.470328229206232720882843964341106861825299013071623822127" - "928412503377536351043759326499181808179961898982823477228588" - "654633283551779698981993873980053909390631503565951557022639" -@@ -7550,35 +7550,35 @@ static const struct test tests[] = { - "477918694866799496832404970582102851318545139621383772282614" - "5437693412532098591327667236328126e-324", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x2.0000000000000004p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- false, -- -0x2.0000000000000004p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- false, -- -0x4p-1076, false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x2.0000000000000000000000000002p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false, -- -0x2p-1076, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x2.0000000000000004p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ false, -+ -0x2.0000000000000004p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x2.0000000000000000000000000002p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false, -+ -0x2p-1076, false, false), - TEST ("1.8225997659412373012642029668097099081995254078467816718604" - "902435141858443166988684047803543129136025986236736736017655" - "509834928163110160849867540377949045027419112905889658392846" -@@ -7772,35 +7772,35 @@ static const struct test tests[] = { - "622089641993900896756734276531931450266972752637997248151974" - "2277811246822238899767398834228515624e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x4p-16448, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x3.fffffffffffcp-16448, false, -- 0x4p-16448, false, -- 0x3.fffffffffffcp-16448, false, -- 0x4p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x3.fffffffffffcp-16448, false, true, -+ 0x4p-16448, false, true, -+ 0x3.fffffffffffcp-16448, false, true, -+ 0x4p-16448, false, true), - TEST ("1.8225997659412373012642029668097099081995254078467816718604" - "902435141858443166988684047803543129136025986236736736017655" - "509834928163110160849867540377949045027419112905889658392846" -@@ -7994,35 +7994,35 @@ static const struct test tests[] = { - "622089641993900896756734276531931450266972752637997248151974" - "2277811246822238899767398834228515625e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- true, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ true, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false, -+ 0x4p-16448, false, false), - TEST ("1.8225997659412373012642029668097099081995254078467816718604" - "902435141858443166988684047803543129136025986236736736017655" - "509834928163110160849867540377949045027419112905889658392846" -@@ -8216,35 +8216,35 @@ static const struct test tests[] = { - "622089641993900896756734276531931450266972752637997248151974" - "2277811246822238899767398834228515626e-4951", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x8p-16448, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4p-16448, false, -- 0x4.000000000004p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x4p-16448, false, true, -+ 0x4p-16448, false, true, -+ 0x4p-16448, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x4p-16448, false, true, -+ 0x4p-16448, false, true, -+ 0x4p-16448, false, true, -+ 0x4.000000000004p-16448, false, true), - TEST ("-1.822599765941237301264202966809709908199525407846781671860" - "490243514185844316698868404780354312913602598623673673601765" - "550983492816311016084986754037794904502741911290588965839284" -@@ -8438,35 +8438,35 @@ static const struct test tests[] = { - "462208964199390089675673427653193145026697275263799724815197" - "42277811246822238899767398834228515624e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x3.fffffffffffcp-16448, false, -- -0x3.fffffffffffcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x3.fffffffffffcp-16448, false, true, -+ -0x3.fffffffffffcp-16448, false, true), - TEST ("-1.822599765941237301264202966809709908199525407846781671860" - "490243514185844316698868404780354312913602598623673673601765" - "550983492816311016084986754037794904502741911290588965839284" -@@ -8660,35 +8660,35 @@ static const struct test tests[] = { - "462208964199390089675673427653193145026697275263799724815197" - "42277811246822238899767398834228515625e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false, -+ -0x4p-16448, false, false), - TEST ("-1.822599765941237301264202966809709908199525407846781671860" - "490243514185844316698868404780354312913602598623673673601765" - "550983492816311016084986754037794904502741911290588965839284" -@@ -8882,35 +8882,35 @@ static const struct test tests[] = { - "462208964199390089675673427653193145026697275263799724815197" - "42277811246822238899767398834228515626e-4951", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4.000000000004p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x4p-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4.000000000004p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true), - TEST ("9.1129988297061865063210148340485495409976270392339083593024" - "512175709292215834943420239017715645680129931183683680088277" - "549174640815550804249337701889745225137095564529448291964230" -@@ -9104,35 +9104,35 @@ static const struct test tests[] = { - "110448209969504483783671382659657251334863763189986240759871" - "1389056234111194498836994171142578124e-4952", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x1.fffffffffffcp-16448, false, -- 0x2p-16448, false, -- 0x1.fffffffffffcp-16448, false, -- 0x2p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.fffffffffffcp-16448, false, true, -+ 0x2p-16448, false, true, -+ 0x1.fffffffffffcp-16448, false, true, -+ 0x2p-16448, false, true), - TEST ("9.1129988297061865063210148340485495409976270392339083593024" - "512175709292215834943420239017715645680129931183683680088277" - "549174640815550804249337701889745225137095564529448291964230" -@@ -9326,35 +9326,35 @@ static const struct test tests[] = { - "110448209969504483783671382659657251334863763189986240759871" - "1389056234111194498836994171142578125e-4952", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- true, -- 0x2p-16448, false, -- 0x2p-16448, false, -- 0x2p-16448, false, -- 0x2p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x2p-16448, false, false, -+ 0x2p-16448, false, false, -+ 0x2p-16448, false, false, -+ 0x2p-16448, false, false), - TEST ("9.1129988297061865063210148340485495409976270392339083593024" - "512175709292215834943420239017715645680129931183683680088277" - "549174640815550804249337701889745225137095564529448291964230" -@@ -9548,35 +9548,35 @@ static const struct test tests[] = { - "110448209969504483783671382659657251334863763189986240759871" - "1389056234111194498836994171142578126e-4952", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x4p-16448, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x2p-16448, false, -- 0x2p-16448, false, -- 0x2p-16448, false, -- 0x2.000000000004p-16448, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x2p-16448, false, true, -+ 0x2p-16448, false, true, -+ 0x2p-16448, false, true, -+ 0x2.000000000004p-16448, false, true), - TEST ("-9.112998829706186506321014834048549540997627039233908359302" - "451217570929221583494342023901771564568012993118368368008827" - "754917464081555080424933770188974522513709556452944829196423" -@@ -9770,35 +9770,35 @@ static const struct test tests[] = { - "311044820996950448378367138265965725133486376318998624075987" - "11389056234111194498836994171142578124e-4952", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x2p-16448, false, -- -0x2p-16448, false, -- -0x1.fffffffffffcp-16448, false, -- -0x1.fffffffffffcp-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x2p-16448, false, true, -+ -0x2p-16448, false, true, -+ -0x1.fffffffffffcp-16448, false, true, -+ -0x1.fffffffffffcp-16448, false, true), - TEST ("-9.112998829706186506321014834048549540997627039233908359302" - "451217570929221583494342023901771564568012993118368368008827" - "754917464081555080424933770188974522513709556452944829196423" -@@ -9992,35 +9992,35 @@ static const struct test tests[] = { - "311044820996950448378367138265965725133486376318998624075987" - "11389056234111194498836994171142578125e-4952", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- true, -- -0x2p-16448, false, -- -0x2p-16448, false, -- -0x2p-16448, false, -- -0x2p-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ true, -+ -0x2p-16448, false, false, -+ -0x2p-16448, false, false, -+ -0x2p-16448, false, false, -+ -0x2p-16448, false, false), - TEST ("-9.112998829706186506321014834048549540997627039233908359302" - "451217570929221583494342023901771564568012993118368368008827" - "754917464081555080424933770188974522513709556452944829196423" -@@ -10214,35 +10214,35 @@ static const struct test tests[] = { - "311044820996950448378367138265965725133486376318998624075987" - "11389056234111194498836994171142578126e-4952", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x2.000000000004p-16448, false, -- -0x2p-16448, false, -- -0x2p-16448, false, -- -0x2p-16448, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x2.000000000004p-16448, false, true, -+ -0x2p-16448, false, true, -+ -0x2p-16448, false, true, -+ -0x2p-16448, false, true), - TEST ("3.2375875597190125554622194791138232762497846690173405048449" - "421945985197700620596855088357456383249701279390707384240598" - "382936099431912710233425550359863089915213963553756674672083" -@@ -10437,35 +10437,35 @@ static const struct test tests[] = { - "182358152808745703724362178773168996492870519432472065091133" - "11767578124e-4966", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16496, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16496, false, true), - TEST ("3.2375875597190125554622194791138232762497846690173405048449" - "421945985197700620596855088357456383249701279390707384240598" - "382936099431912710233425550359863089915213963553756674672083" -@@ -10660,35 +10660,35 @@ static const struct test tests[] = { - "182358152808745703724362178773168996492870519432472065091133" - "11767578125e-4966", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16496, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16496, false, true), - TEST ("3.2375875597190125554622194791138232762497846690173405048449" - "421945985197700620596855088357456383249701279390707384240598" - "382936099431912710233425550359863089915213963553756674672083" -@@ -10883,35 +10883,35 @@ static const struct test tests[] = { - "182358152808745703724362178773168996492870519432472065091133" - "11767578126e-4966", - false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-152, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x8p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-16448, false, -- false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x0p+0, false, -- 0x4p-1076, false, -- false, -- 0x0p+0, false, -- 0x4p-16496, false, -- 0x0p+0, false, -- 0x4p-16496, false), -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16448, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x4p-16496, false, true, -+ 0x0p+0, false, true, -+ 0x4p-16496, false, true), - TEST ("-3.237587559719012555462219479113823276249784669017340504844" - "942194598519770062059685508835745638324970127939070738424059" - "838293609943191271023342555035986308991521396355375667467208" -@@ -11106,35 +11106,35 @@ static const struct test tests[] = { - "218235815280874570372436217877316899649287051943247206509113" - "311767578124e-4966", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16496, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16496, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true), - TEST ("-3.237587559719012555462219479113823276249784669017340504844" - "942194598519770062059685508835745638324970127939070738424059" - "838293609943191271023342555035986308991521396355375667467208" -@@ -11329,35 +11329,35 @@ static const struct test tests[] = { - "218235815280874570372436217877316899649287051943247206509113" - "311767578125e-4966", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16496, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16496, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true), - TEST ("-3.237587559719012555462219479113823276249784669017340504844" - "942194598519770062059685508835745638324970127939070738424059" - "838293609943191271023342555035986308991521396355375667467208" -@@ -11552,66 +11552,66 @@ static const struct test tests[] = { - "218235815280874570372436217877316899649287051943247206509113" - "311767578126e-4966", - false, -- -0x8p-152, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x8p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16448, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-1076, false, -- -0x0p+0, false, -- -0x0p+0, false, -- -0x0p+0, false, -- false, -- -0x4p-16496, false, -- -0x4p-16496, false, -- -0x0p+0, false, -- -0x0p+0, false), -+ -0x8p-152, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x8p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16448, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-1076, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true, -+ false, -+ -0x4p-16496, false, true, -+ -0x4p-16496, false, true, -+ -0x0p+0, false, true, -+ -0x0p+0, false, true), - TEST ("340282366920938463463374607431768211455", - false, -- 0xf.fffffp+124, false, -- INF, true, -- 0xf.fffffp+124, false, -- INF, true, -- false, -- 0xf.ffffffffffff8p+124, false, -- 0x1p+128, false, -- 0xf.ffffffffffff8p+124, false, -- 0x1p+128, false, -- false, -- 0xf.fffffffffffffffp+124, false, -- 0x1p+128, false, -- 0xf.fffffffffffffffp+124, false, -- 0x1p+128, false, -- false, -- 0xf.fffffffffffffffp+124, false, -- 0x1p+128, false, -- 0xf.fffffffffffffffp+124, false, -- 0x1p+128, false, -- false, -- 0xf.fffffffffffffffffffffffffcp+124, false, -- 0x1p+128, false, -- 0xf.fffffffffffffffffffffffffcp+124, false, -- 0x1p+128, false, -- false, -- 0xf.fffffffffffffffffffffffffff8p+124, false, -- 0x1p+128, false, -- 0xf.fffffffffffffffffffffffffff8p+124, false, -- 0x1p+128, false), -+ 0xf.fffffp+124, false, false, -+ INF, true, false, -+ 0xf.fffffp+124, false, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+124, false, false, -+ 0x1p+128, false, false, -+ 0xf.ffffffffffff8p+124, false, false, -+ 0x1p+128, false, false, -+ false, -+ 0xf.fffffffffffffffp+124, false, false, -+ 0x1p+128, false, false, -+ 0xf.fffffffffffffffp+124, false, false, -+ 0x1p+128, false, false, -+ false, -+ 0xf.fffffffffffffffp+124, false, false, -+ 0x1p+128, false, false, -+ 0xf.fffffffffffffffp+124, false, false, -+ 0x1p+128, false, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+124, false, false, -+ 0x1p+128, false, false, -+ 0xf.fffffffffffffffffffffffffcp+124, false, false, -+ 0x1p+128, false, false, -+ false, -+ 0xf.fffffffffffffffffffffffffff8p+124, false, false, -+ 0x1p+128, false, false, -+ 0xf.fffffffffffffffffffffffffff8p+124, false, false, -+ 0x1p+128, false, false), - TEST ("179769313486231590772930519078902473361797697894230657273430" - "081157732675805500963132708477322407536021120113879871393357" - "658789768814416622492847430639474124377767893424865485276302" -@@ -11619,35 +11619,35 @@ static const struct test tests[] = { - "540827237163350510684586298239947245938479716304835356329624" - "224137215", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, false, -- INF, true, -- 0xf.ffffffffffff8p+1020, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+1020, false, -- 0x1p+1024, false, -- 0xf.fffffffffffffffp+1020, false, -- 0x1p+1024, false, -- false, -- 0xf.fffffffffffffffp+1020, false, -- 0x1p+1024, false, -- 0xf.fffffffffffffffp+1020, false, -- 0x1p+1024, false, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffff8p+1020, false, -- 0x1p+1024, false, -- 0xf.fffffffffffffffffffffffffff8p+1020, false, -- 0x1p+1024, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+1020, false, false, -+ 0x1p+1024, false, false, -+ 0xf.fffffffffffffffp+1020, false, false, -+ 0x1p+1024, false, false, -+ false, -+ 0xf.fffffffffffffffp+1020, false, false, -+ 0x1p+1024, false, false, -+ 0xf.fffffffffffffffp+1020, false, false, -+ 0x1p+1024, false, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffff8p+1020, false, false, -+ 0x1p+1024, false, false, -+ 0xf.fffffffffffffffffffffffffff8p+1020, false, false, -+ 0x1p+1024, false, false), - TEST ("118973149535723176508575932662800713076344468709651023747267" - "482123326135818048368690448859547261203991511543748483930925" - "889766738130868742627452469834156500608087163436600489752214" -@@ -11732,66 +11732,66 @@ static const struct test tests[] = { - "047398248889922809181821393428829567971736994315246044702729" - "0669964066815", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- 0xf.fffffffffffffffp+16380, false, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- INF, true, -- 0xf.fffffffffffffffffffffffffff8p+16380, false, -- INF, true), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffp+16380, false, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ INF, true, false), - TEST ("-340282366920938463463374607431768211455", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, false, -- -0xf.fffffp+124, false, -- false, -- -0x1p+128, false, -- -0x1p+128, false, -- -0xf.ffffffffffff8p+124, false, -- -0xf.ffffffffffff8p+124, false, -- false, -- -0x1p+128, false, -- -0x1p+128, false, -- -0xf.fffffffffffffffp+124, false, -- -0xf.fffffffffffffffp+124, false, -- false, -- -0x1p+128, false, -- -0x1p+128, false, -- -0xf.fffffffffffffffp+124, false, -- -0xf.fffffffffffffffp+124, false, -- false, -- -0x1p+128, false, -- -0x1p+128, false, -- -0xf.fffffffffffffffffffffffffcp+124, false, -- -0xf.fffffffffffffffffffffffffcp+124, false, -- false, -- -0x1p+128, false, -- -0x1p+128, false, -- -0xf.fffffffffffffffffffffffffff8p+124, false, -- -0xf.fffffffffffffffffffffffffff8p+124, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, false, false, -+ -0xf.fffffp+124, false, false, -+ false, -+ -0x1p+128, false, false, -+ -0x1p+128, false, false, -+ -0xf.ffffffffffff8p+124, false, false, -+ -0xf.ffffffffffff8p+124, false, false, -+ false, -+ -0x1p+128, false, false, -+ -0x1p+128, false, false, -+ -0xf.fffffffffffffffp+124, false, false, -+ -0xf.fffffffffffffffp+124, false, false, -+ false, -+ -0x1p+128, false, false, -+ -0x1p+128, false, false, -+ -0xf.fffffffffffffffp+124, false, false, -+ -0xf.fffffffffffffffp+124, false, false, -+ false, -+ -0x1p+128, false, false, -+ -0x1p+128, false, false, -+ -0xf.fffffffffffffffffffffffffcp+124, false, false, -+ -0xf.fffffffffffffffffffffffffcp+124, false, false, -+ false, -+ -0x1p+128, false, false, -+ -0x1p+128, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+124, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+124, false, false), - TEST ("-17976931348623159077293051907890247336179769789423065727343" - "008115773267580550096313270847732240753602112011387987139335" - "765878976881441662249284743063947412437776789342486548527630" -@@ -11799,35 +11799,35 @@ static const struct test tests[] = { - "054082723716335051068458629823994724593847971630483535632962" - "4224137215", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, false, -- -0xf.ffffffffffff8p+1020, false, -- false, -- -0x1p+1024, false, -- -0x1p+1024, false, -- -0xf.fffffffffffffffp+1020, false, -- -0xf.fffffffffffffffp+1020, false, -- false, -- -0x1p+1024, false, -- -0x1p+1024, false, -- -0xf.fffffffffffffffp+1020, false, -- -0xf.fffffffffffffffp+1020, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- false, -- -0x1p+1024, false, -- -0x1p+1024, false, -- -0xf.fffffffffffffffffffffffffff8p+1020, false, -- -0xf.fffffffffffffffffffffffffff8p+1020, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ -0xf.ffffffffffff8p+1020, false, false, -+ false, -+ -0x1p+1024, false, false, -+ -0x1p+1024, false, false, -+ -0xf.fffffffffffffffp+1020, false, false, -+ -0xf.fffffffffffffffp+1020, false, false, -+ false, -+ -0x1p+1024, false, false, -+ -0x1p+1024, false, false, -+ -0xf.fffffffffffffffp+1020, false, false, -+ -0xf.fffffffffffffffp+1020, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ false, -+ -0x1p+1024, false, false, -+ -0x1p+1024, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+1020, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+1020, false, false), - TEST ("-11897314953572317650857593266280071307634446870965102374726" - "748212332613581804836869044885954726120399151154374848393092" - "588976673813086874262745246983415650060808716343660048975221" -@@ -11912,3529 +11912,3529 @@ static const struct test tests[] = { - "904739824888992280918182139342882956797173699431524604470272" - "90669964066815", - false, -- -INF, true, -- -INF, true, -- -0xf.fffffp+124, true, -- -0xf.fffffp+124, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.ffffffffffff8p+1020, true, -- -0xf.ffffffffffff8p+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffp+16380, false, -- -0xf.fffffffffffffffp+16380, false, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- -0xf.fffffffffffffffffffffffffcp+1020, true, -- false, -- -INF, true, -- -INF, true, -- -0xf.fffffffffffffffffffffffffff8p+16380, false, -- -0xf.fffffffffffffffffffffffffff8p+16380, false), -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffp+124, true, false, -+ -0xf.fffffp+124, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ -0xf.ffffffffffff8p+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ -0xf.fffffffffffffffp+16380, false, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ -0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ false, -+ -INF, true, false, -+ -INF, true, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false, -+ -0xf.fffffffffffffffffffffffffff8p+16380, false, false), - TEST ("+0x.80000000000000000000000000000001p1025", - false, -- 0xf.fffffp+124, true, -- INF, true, -- 0xf.fffffp+124, true, -- INF, true, -- false, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- 0xf.ffffffffffff8p+1020, true, -- INF, true, -- false, -- 0x1p+1024, false, -- 0x1p+1024, false, -- 0x1p+1024, false, -- 0x1.0000000000000002p+1024, false, -- false, -- 0x1p+1024, false, -- 0x1p+1024, false, -- 0x1p+1024, false, -- 0x1.0000000000000002p+1024, false, -- false, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- 0xf.fffffffffffffffffffffffffcp+1020, true, -- INF, true, -- false, -- 0x1p+1024, false, -- 0x1p+1024, false, -- 0x1p+1024, false, -- 0x1.0000000000000000000000000001p+1024, false), -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ 0xf.fffffp+124, true, false, -+ INF, true, false, -+ false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ 0xf.ffffffffffff8p+1020, true, false, -+ INF, true, false, -+ false, -+ 0x1p+1024, false, false, -+ 0x1p+1024, false, false, -+ 0x1p+1024, false, false, -+ 0x1.0000000000000002p+1024, false, false, -+ false, -+ 0x1p+1024, false, false, -+ 0x1p+1024, false, false, -+ 0x1p+1024, false, false, -+ 0x1.0000000000000002p+1024, false, false, -+ false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ 0xf.fffffffffffffffffffffffffcp+1020, true, false, -+ INF, true, false, -+ false, -+ 0x1p+1024, false, false, -+ 0x1p+1024, false, false, -+ 0x1p+1024, false, false, -+ 0x1.0000000000000000000000000001p+1024, false, false), - TEST ("1.5", - true, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- true, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- true, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- true, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- true, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- true, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false, -- 0x1.8p+0, false), -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ true, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ true, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ true, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ true, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ true, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false, -+ 0x1.8p+0, false, false), - TEST ("1.25", - true, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- true, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- true, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- true, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- true, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- true, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false, -- 0x1.4p+0, false), -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ true, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ true, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ true, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ true, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ true, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false, -+ 0x1.4p+0, false, false), - TEST ("1.125", - true, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- true, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- true, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- true, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- true, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- true, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false, -- 0x1.2p+0, false), -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ true, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ true, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ true, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ true, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ true, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false, -+ 0x1.2p+0, false, false), - TEST ("1.0625", - true, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- true, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- true, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- true, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- true, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- true, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false, -- 0x1.1p+0, false), -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ true, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ true, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ true, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ true, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ true, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false, -+ 0x1.1p+0, false, false), - TEST ("1.03125", - true, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- true, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- true, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- true, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- true, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- true, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false, -- 0x1.08p+0, false), -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ true, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ true, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ true, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ true, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ true, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false, -+ 0x1.08p+0, false, false), - TEST ("1.015625", - true, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- true, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- true, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- true, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- true, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- true, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false, -- 0x1.04p+0, false), -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ true, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ true, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ true, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ true, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ true, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false, -+ 0x1.04p+0, false, false), - TEST ("1.0078125", - true, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- true, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- true, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- true, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- true, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- true, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false, -- 0x1.02p+0, false), -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ true, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ true, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ true, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ true, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ true, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false, -+ 0x1.02p+0, false, false), - TEST ("1.00390625", - true, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- true, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- true, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- true, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- true, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- true, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false, -- 0x1.01p+0, false), -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ true, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ true, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ true, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ true, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ true, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false, -+ 0x1.01p+0, false, false), - TEST ("1.001953125", - true, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- true, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- true, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- true, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- true, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- true, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false, -- 0x1.008p+0, false), -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ true, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ true, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ true, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ true, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ true, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false, -+ 0x1.008p+0, false, false), - TEST ("1.0009765625", - true, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- true, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- true, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- true, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- true, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- true, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false, -- 0x1.004p+0, false), -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ true, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ true, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ true, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ true, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ true, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false, -+ 0x1.004p+0, false, false), - TEST ("1.00048828125", - true, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- true, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- true, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- true, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- true, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- true, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false, -- 0x1.002p+0, false), -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ true, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ true, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ true, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ true, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ true, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false, -+ 0x1.002p+0, false, false), - TEST ("1.000244140625", - true, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- true, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- true, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- true, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- true, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- true, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false, -- 0x1.001p+0, false), -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ true, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ true, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ true, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ true, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ true, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false, -+ 0x1.001p+0, false, false), - TEST ("1.0001220703125", - true, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- true, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- true, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- true, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- true, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- true, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false, -- 0x1.0008p+0, false), -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ true, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ true, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ true, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ true, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ true, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false, -+ 0x1.0008p+0, false, false), - TEST ("1.00006103515625", - true, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- true, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- true, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- true, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- true, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- true, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false, -- 0x1.0004p+0, false), -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ true, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ true, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ true, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ true, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ true, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false, -+ 0x1.0004p+0, false, false), - TEST ("1.000030517578125", - true, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- true, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- true, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- true, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- true, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- true, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false, -- 0x1.0002p+0, false), -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ true, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ true, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ true, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ true, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ true, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false, -+ 0x1.0002p+0, false, false), - TEST ("1.0000152587890625", - true, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- true, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- true, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- true, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- true, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- true, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false, -- 0x1.0001p+0, false), -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ true, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ true, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ true, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ true, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ true, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false, -+ 0x1.0001p+0, false, false), - TEST ("1.00000762939453125", - true, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- true, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- true, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- true, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- true, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- true, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false, -- 0x1.00008p+0, false), -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ true, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ true, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ true, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ true, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ true, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false, -+ 0x1.00008p+0, false, false), - TEST ("1.000003814697265625", - true, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- true, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- true, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- true, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- true, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- true, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false, -- 0x1.00004p+0, false), -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ true, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ true, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ true, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ true, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ true, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false, -+ 0x1.00004p+0, false, false), - TEST ("1.0000019073486328125", - true, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- true, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- true, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- true, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- true, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- true, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false, -- 0x1.00002p+0, false), -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ true, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ true, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ true, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ true, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ true, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false, -+ 0x1.00002p+0, false, false), - TEST ("1.00000095367431640625", - true, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- true, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- true, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- true, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- true, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- true, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false, -- 0x1.00001p+0, false), -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ true, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ true, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ true, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ true, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ true, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false, -+ 0x1.00001p+0, false, false), - TEST ("1.000000476837158203125", - true, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- true, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- true, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- true, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- true, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- true, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false, -- 0x1.000008p+0, false), -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ true, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ true, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ true, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ true, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ true, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false, -+ 0x1.000008p+0, false, false), - TEST ("1.0000000298023223876953125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- true, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- true, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- true, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- true, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false, -- 0x1.0000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ true, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ true, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ true, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ true, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false, -+ 0x1.0000008p+0, false, false), - TEST ("1.00000001490116119384765625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- true, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- true, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- true, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- true, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false, -- 0x1.0000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ true, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ true, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ true, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ true, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false, -+ 0x1.0000004p+0, false, false), - TEST ("1.000000007450580596923828125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- true, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- true, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- true, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- true, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false, -- 0x1.0000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ true, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ true, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ true, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ true, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false, -+ 0x1.0000002p+0, false, false), - TEST ("1.0000000037252902984619140625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- true, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- true, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- true, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- true, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false, -- 0x1.0000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ true, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ true, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ true, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ true, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false, -+ 0x1.0000001p+0, false, false), - TEST ("1.00000000186264514923095703125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- true, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- true, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- true, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- true, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false, -- 0x1.00000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ true, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ true, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ true, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ true, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false, -+ 0x1.00000008p+0, false, false), - TEST ("1.000000000931322574615478515625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- true, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- true, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- true, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- true, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false, -- 0x1.00000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ true, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ true, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ true, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ true, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false, -+ 0x1.00000004p+0, false, false), - TEST ("1.0000000004656612873077392578125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- true, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- true, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- true, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- true, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false, -- 0x1.00000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ true, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ true, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ true, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ true, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false, -+ 0x1.00000002p+0, false, false), - TEST ("1.00000000023283064365386962890625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- true, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- true, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- true, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- true, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false, -- 0x1.00000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ true, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ true, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ true, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ true, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false, -+ 0x1.00000001p+0, false, false), - TEST ("1.000000000116415321826934814453125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- true, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- true, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- true, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- true, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false, -- 0x1.000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ true, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ true, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ true, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ true, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false, -+ 0x1.000000008p+0, false, false), - TEST ("1.0000000000582076609134674072265625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- true, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- true, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- true, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- true, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false, -- 0x1.000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ true, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ true, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ true, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ true, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false, -+ 0x1.000000004p+0, false, false), - TEST ("1.00000000002910383045673370361328125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- true, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- true, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- true, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- true, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false, -- 0x1.000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ true, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ true, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ true, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ true, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false, -+ 0x1.000000002p+0, false, false), - TEST ("1.000000000014551915228366851806640625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- true, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- true, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- true, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- true, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false, -- 0x1.000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ true, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ true, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ true, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ true, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false, -+ 0x1.000000001p+0, false, false), - TEST ("1.0000000000072759576141834259033203125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- true, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- true, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- true, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- true, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false, -- 0x1.0000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ true, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ true, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ true, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ true, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false, -+ 0x1.0000000008p+0, false, false), - TEST ("1.00000000000363797880709171295166015625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- true, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- true, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- true, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- true, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false, -- 0x1.0000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ true, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ true, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ true, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ true, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false, -+ 0x1.0000000004p+0, false, false), - TEST ("1.000000000001818989403545856475830078125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- true, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- true, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- true, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- true, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false, -- 0x1.0000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ true, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ true, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ true, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ true, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false, -+ 0x1.0000000002p+0, false, false), - TEST ("1.0000000000009094947017729282379150390625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- true, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- true, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- true, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- true, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false, -- 0x1.0000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ true, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ true, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ true, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ true, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false, -+ 0x1.0000000001p+0, false, false), - TEST ("1.00000000000045474735088646411895751953125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- true, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- true, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- true, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- true, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false, -- 0x1.00000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ true, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ true, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ true, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ true, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false, -+ 0x1.00000000008p+0, false, false), - TEST ("1.000000000000227373675443232059478759765625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- true, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- true, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- true, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- true, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false, -- 0x1.00000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ true, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ true, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ true, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ true, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false, -+ 0x1.00000000004p+0, false, false), - TEST ("1.0000000000001136868377216160297393798828125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- true, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- true, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- true, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- true, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false, -- 0x1.00000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ true, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ true, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ true, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ true, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false, -+ 0x1.00000000002p+0, false, false), - TEST ("1.00000000000005684341886080801486968994140625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- true, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- true, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- true, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- true, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false, -- 0x1.00000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ true, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ true, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ true, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ true, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false, -+ 0x1.00000000001p+0, false, false), - TEST ("1.000000000000028421709430404007434844970703125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- true, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- true, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- true, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- true, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false, -- 0x1.000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ true, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ true, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ true, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ true, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false, -+ 0x1.000000000008p+0, false, false), - TEST ("1.0000000000000142108547152020037174224853515625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- true, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- true, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- true, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- true, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false, -- 0x1.000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ true, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ true, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ true, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ true, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false, -+ 0x1.000000000004p+0, false, false), - TEST ("1.00000000000000710542735760100185871124267578125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- true, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- true, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- true, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- true, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false, -- 0x1.000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ true, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ true, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ true, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ true, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false, -+ 0x1.000000000002p+0, false, false), - TEST ("1.000000000000003552713678800500929355621337890625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- true, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- true, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- true, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- true, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false, -- 0x1.000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ true, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ true, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ true, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ true, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false, -+ 0x1.000000000001p+0, false, false), - TEST ("1.0000000000000017763568394002504646778106689453125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- true, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- true, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- true, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- true, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false, -- 0x1.0000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ true, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ true, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ true, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ true, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false, -+ 0x1.0000000000008p+0, false, false), - TEST ("1.00000000000000088817841970012523233890533447265625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- true, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- true, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- true, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- true, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false, -- 0x1.0000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ true, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ true, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ true, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ true, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false, -+ 0x1.0000000000004p+0, false, false), - TEST ("1.000000000000000444089209850062616169452667236328125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- true, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- true, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- true, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- true, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false, -- 0x1.0000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ true, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ true, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ true, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ true, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false, -+ 0x1.0000000000002p+0, false, false), - TEST ("1.0000000000000002220446049250313080847263336181640625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- true, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false, -- 0x1.0000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ true, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ 0x1.0000000000001p+0, false, false), - TEST ("1.00000000000000011102230246251565404236316680908203125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- true, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- true, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- true, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false, -- 0x1.00000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ true, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ true, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ true, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false, -+ 0x1.00000000000008p+0, false, false), - TEST ("1.000000000000000055511151231257827021181583404541015625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- true, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- true, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- true, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false, -- 0x1.00000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ true, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ true, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ true, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false, -+ 0x1.00000000000004p+0, false, false), - TEST ("1.0000000000000000277555756156289135105907917022705078125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- true, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- true, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- true, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false, -- 0x1.00000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ true, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ true, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ true, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false, -+ 0x1.00000000000002p+0, false, false), - TEST ("1.00000000000000001387778780781445675529539585113525390625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- true, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- true, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- true, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false, -- 0x1.00000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ true, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ true, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ true, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false, -+ 0x1.00000000000001p+0, false, false), - TEST ("1.000000000000000006938893903907228377647697925567626953125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- true, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- true, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- true, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false, -- 0x1.000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false, -+ 0x1.000000000000008p+0, false, false), - TEST ("1.0000000000000000034694469519536141888238489627838134765625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- true, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- true, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- true, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false, -- 0x1.000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ true, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ true, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ true, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false, -+ 0x1.000000000000004p+0, false, false), - TEST ("1.0000000000000000017347234759768070944119244813919067382812" - "5", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- true, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- true, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- true, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false, -- 0x1.000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false, -+ 0x1.000000000000002p+0, false, false), - TEST ("1.0000000000000000008673617379884035472059622406959533691406" - "25", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- true, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- true, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- true, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false, -- 0x1.000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ true, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ true, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ true, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false, -+ 0x1.000000000000001p+0, false, false), - TEST ("1.0000000000000000004336808689942017736029811203479766845703" - "125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- true, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- true, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- true, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false, -- 0x1.0000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false, -+ 0x1.0000000000000008p+0, false, false), - TEST ("1.0000000000000000002168404344971008868014905601739883422851" - "5625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- true, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- true, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- true, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false, -- 0x1.0000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ true, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ true, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ true, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false, -+ 0x1.0000000000000004p+0, false, false), - TEST ("1.0000000000000000001084202172485504434007452800869941711425" - "78125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- true, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false, -- 0x1.0000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ true, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ 0x1.0000000000000002p+0, false, false), - TEST ("1.0000000000000000000542101086242752217003726400434970855712" - "890625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000001p+0, false, -- 0x1.0000000000000001p+0, false, -- 0x1.0000000000000001p+0, false, -- 0x1.0000000000000001p+0, false, -- true, -- 0x1.0000000000000001p+0, false, -- 0x1.0000000000000001p+0, false, -- 0x1.0000000000000001p+0, false, -- 0x1.0000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000001p+0, false, false, -+ 0x1.0000000000000001p+0, false, false, -+ 0x1.0000000000000001p+0, false, false, -+ 0x1.0000000000000001p+0, false, false, -+ true, -+ 0x1.0000000000000001p+0, false, false, -+ 0x1.0000000000000001p+0, false, false, -+ 0x1.0000000000000001p+0, false, false, -+ 0x1.0000000000000001p+0, false, false), - TEST ("1.0000000000000000000271050543121376108501863200217485427856" - "4453125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000008p+0, false, -- 0x1.00000000000000008p+0, false, -- 0x1.00000000000000008p+0, false, -- 0x1.00000000000000008p+0, false, -- true, -- 0x1.00000000000000008p+0, false, -- 0x1.00000000000000008p+0, false, -- 0x1.00000000000000008p+0, false, -- 0x1.00000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000008p+0, false, false, -+ 0x1.00000000000000008p+0, false, false, -+ 0x1.00000000000000008p+0, false, false, -+ 0x1.00000000000000008p+0, false, false, -+ true, -+ 0x1.00000000000000008p+0, false, false, -+ 0x1.00000000000000008p+0, false, false, -+ 0x1.00000000000000008p+0, false, false, -+ 0x1.00000000000000008p+0, false, false), - TEST ("1.0000000000000000000135525271560688054250931600108742713928" - "22265625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000004p+0, false, -- 0x1.00000000000000004p+0, false, -- 0x1.00000000000000004p+0, false, -- 0x1.00000000000000004p+0, false, -- true, -- 0x1.00000000000000004p+0, false, -- 0x1.00000000000000004p+0, false, -- 0x1.00000000000000004p+0, false, -- 0x1.00000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000004p+0, false, false, -+ 0x1.00000000000000004p+0, false, false, -+ 0x1.00000000000000004p+0, false, false, -+ 0x1.00000000000000004p+0, false, false, -+ true, -+ 0x1.00000000000000004p+0, false, false, -+ 0x1.00000000000000004p+0, false, false, -+ 0x1.00000000000000004p+0, false, false, -+ 0x1.00000000000000004p+0, false, false), - TEST ("1.0000000000000000000067762635780344027125465800054371356964" - "111328125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000002p+0, false, -- 0x1.00000000000000002p+0, false, -- 0x1.00000000000000002p+0, false, -- 0x1.00000000000000002p+0, false, -- true, -- 0x1.00000000000000002p+0, false, -- 0x1.00000000000000002p+0, false, -- 0x1.00000000000000002p+0, false, -- 0x1.00000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000002p+0, false, false, -+ 0x1.00000000000000002p+0, false, false, -+ 0x1.00000000000000002p+0, false, false, -+ 0x1.00000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000002p+0, false, false, -+ 0x1.00000000000000002p+0, false, false, -+ 0x1.00000000000000002p+0, false, false, -+ 0x1.00000000000000002p+0, false, false), - TEST ("1.0000000000000000000033881317890172013562732900027185678482" - "0556640625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000001p+0, false, -- 0x1.00000000000000001p+0, false, -- 0x1.00000000000000001p+0, false, -- 0x1.00000000000000001p+0, false, -- true, -- 0x1.00000000000000001p+0, false, -- 0x1.00000000000000001p+0, false, -- 0x1.00000000000000001p+0, false, -- 0x1.00000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000001p+0, false, false, -+ 0x1.00000000000000001p+0, false, false, -+ 0x1.00000000000000001p+0, false, false, -+ 0x1.00000000000000001p+0, false, false, -+ true, -+ 0x1.00000000000000001p+0, false, false, -+ 0x1.00000000000000001p+0, false, false, -+ 0x1.00000000000000001p+0, false, false, -+ 0x1.00000000000000001p+0, false, false), - TEST ("1.0000000000000000000016940658945086006781366450013592839241" - "02783203125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000008p+0, false, -- 0x1.000000000000000008p+0, false, -- 0x1.000000000000000008p+0, false, -- 0x1.000000000000000008p+0, false, -- true, -- 0x1.000000000000000008p+0, false, -- 0x1.000000000000000008p+0, false, -- 0x1.000000000000000008p+0, false, -- 0x1.000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000008p+0, false, false, -+ 0x1.000000000000000008p+0, false, false, -+ 0x1.000000000000000008p+0, false, false, -+ 0x1.000000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000000008p+0, false, false, -+ 0x1.000000000000000008p+0, false, false, -+ 0x1.000000000000000008p+0, false, false, -+ 0x1.000000000000000008p+0, false, false), - TEST ("1.0000000000000000000008470329472543003390683225006796419620" - "513916015625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000004p+0, false, -- 0x1.000000000000000004p+0, false, -- 0x1.000000000000000004p+0, false, -- 0x1.000000000000000004p+0, false, -- true, -- 0x1.000000000000000004p+0, false, -- 0x1.000000000000000004p+0, false, -- 0x1.000000000000000004p+0, false, -- 0x1.000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000004p+0, false, false, -+ 0x1.000000000000000004p+0, false, false, -+ 0x1.000000000000000004p+0, false, false, -+ 0x1.000000000000000004p+0, false, false, -+ true, -+ 0x1.000000000000000004p+0, false, false, -+ 0x1.000000000000000004p+0, false, false, -+ 0x1.000000000000000004p+0, false, false, -+ 0x1.000000000000000004p+0, false, false), - TEST ("1.0000000000000000000004235164736271501695341612503398209810" - "2569580078125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000002p+0, false, -- 0x1.000000000000000002p+0, false, -- 0x1.000000000000000002p+0, false, -- 0x1.000000000000000002p+0, false, -- true, -- 0x1.000000000000000002p+0, false, -- 0x1.000000000000000002p+0, false, -- 0x1.000000000000000002p+0, false, -- 0x1.000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000002p+0, false, false, -+ 0x1.000000000000000002p+0, false, false, -+ 0x1.000000000000000002p+0, false, false, -+ 0x1.000000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000002p+0, false, false, -+ 0x1.000000000000000002p+0, false, false, -+ 0x1.000000000000000002p+0, false, false, -+ 0x1.000000000000000002p+0, false, false), - TEST ("1.0000000000000000000002117582368135750847670806251699104905" - "12847900390625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000001p+0, false, -- 0x1.000000000000000001p+0, false, -- 0x1.000000000000000001p+0, false, -- 0x1.000000000000000001p+0, false, -- true, -- 0x1.000000000000000001p+0, false, -- 0x1.000000000000000001p+0, false, -- 0x1.000000000000000001p+0, false, -- 0x1.000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000001p+0, false, false, -+ 0x1.000000000000000001p+0, false, false, -+ 0x1.000000000000000001p+0, false, false, -+ 0x1.000000000000000001p+0, false, false, -+ true, -+ 0x1.000000000000000001p+0, false, false, -+ 0x1.000000000000000001p+0, false, false, -+ 0x1.000000000000000001p+0, false, false, -+ 0x1.000000000000000001p+0, false, false), - TEST ("1.0000000000000000000001058791184067875423835403125849552452" - "564239501953125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000008p+0, false, -- 0x1.0000000000000000008p+0, false, -- 0x1.0000000000000000008p+0, false, -- 0x1.0000000000000000008p+0, false, -- true, -- 0x1.0000000000000000008p+0, false, -- 0x1.0000000000000000008p+0, false, -- 0x1.0000000000000000008p+0, false, -- 0x1.0000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000008p+0, false, false, -+ 0x1.0000000000000000008p+0, false, false, -+ 0x1.0000000000000000008p+0, false, false, -+ 0x1.0000000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000000008p+0, false, false, -+ 0x1.0000000000000000008p+0, false, false, -+ 0x1.0000000000000000008p+0, false, false, -+ 0x1.0000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000529395592033937711917701562924776226" - "2821197509765625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000004p+0, false, -- 0x1.0000000000000000004p+0, false, -- 0x1.0000000000000000004p+0, false, -- 0x1.0000000000000000004p+0, false, -- true, -- 0x1.0000000000000000004p+0, false, -- 0x1.0000000000000000004p+0, false, -- 0x1.0000000000000000004p+0, false, -- 0x1.0000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000004p+0, false, false, -+ 0x1.0000000000000000004p+0, false, false, -+ 0x1.0000000000000000004p+0, false, false, -+ 0x1.0000000000000000004p+0, false, false, -+ true, -+ 0x1.0000000000000000004p+0, false, false, -+ 0x1.0000000000000000004p+0, false, false, -+ 0x1.0000000000000000004p+0, false, false, -+ 0x1.0000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000264697796016968855958850781462388113" - "14105987548828125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000002p+0, false, -- 0x1.0000000000000000002p+0, false, -- 0x1.0000000000000000002p+0, false, -- 0x1.0000000000000000002p+0, false, -- true, -- 0x1.0000000000000000002p+0, false, -- 0x1.0000000000000000002p+0, false, -- 0x1.0000000000000000002p+0, false, -- 0x1.0000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000002p+0, false, false, -+ 0x1.0000000000000000002p+0, false, false, -+ 0x1.0000000000000000002p+0, false, false, -+ 0x1.0000000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000002p+0, false, false, -+ 0x1.0000000000000000002p+0, false, false, -+ 0x1.0000000000000000002p+0, false, false, -+ 0x1.0000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000132348898008484427979425390731194056" - "570529937744140625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000001p+0, false, -- 0x1.0000000000000000001p+0, false, -- 0x1.0000000000000000001p+0, false, -- 0x1.0000000000000000001p+0, false, -- true, -- 0x1.0000000000000000001p+0, false, -- 0x1.0000000000000000001p+0, false, -- 0x1.0000000000000000001p+0, false, -- 0x1.0000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000001p+0, false, false, -+ 0x1.0000000000000000001p+0, false, false, -+ 0x1.0000000000000000001p+0, false, false, -+ 0x1.0000000000000000001p+0, false, false, -+ true, -+ 0x1.0000000000000000001p+0, false, false, -+ 0x1.0000000000000000001p+0, false, false, -+ 0x1.0000000000000000001p+0, false, false, -+ 0x1.0000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000066174449004242213989712695365597028" - "2852649688720703125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000008p+0, false, -- 0x1.00000000000000000008p+0, false, -- 0x1.00000000000000000008p+0, false, -- 0x1.00000000000000000008p+0, false, -- true, -- 0x1.00000000000000000008p+0, false, -- 0x1.00000000000000000008p+0, false, -- 0x1.00000000000000000008p+0, false, -- 0x1.00000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000008p+0, false, false, -+ 0x1.00000000000000000008p+0, false, false, -+ 0x1.00000000000000000008p+0, false, false, -+ 0x1.00000000000000000008p+0, false, false, -+ true, -+ 0x1.00000000000000000008p+0, false, false, -+ 0x1.00000000000000000008p+0, false, false, -+ 0x1.00000000000000000008p+0, false, false, -+ 0x1.00000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000033087224502121106994856347682798514" - "14263248443603515625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000004p+0, false, -- 0x1.00000000000000000004p+0, false, -- 0x1.00000000000000000004p+0, false, -- 0x1.00000000000000000004p+0, false, -- true, -- 0x1.00000000000000000004p+0, false, -- 0x1.00000000000000000004p+0, false, -- 0x1.00000000000000000004p+0, false, -- 0x1.00000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000004p+0, false, false, -+ 0x1.00000000000000000004p+0, false, false, -+ 0x1.00000000000000000004p+0, false, false, -+ 0x1.00000000000000000004p+0, false, false, -+ true, -+ 0x1.00000000000000000004p+0, false, false, -+ 0x1.00000000000000000004p+0, false, false, -+ 0x1.00000000000000000004p+0, false, false, -+ 0x1.00000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000016543612251060553497428173841399257" - "071316242218017578125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000002p+0, false, -- 0x1.00000000000000000002p+0, false, -- 0x1.00000000000000000002p+0, false, -- 0x1.00000000000000000002p+0, false, -- true, -- 0x1.00000000000000000002p+0, false, -- 0x1.00000000000000000002p+0, false, -- 0x1.00000000000000000002p+0, false, -- 0x1.00000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000002p+0, false, false, -+ 0x1.00000000000000000002p+0, false, false, -+ 0x1.00000000000000000002p+0, false, false, -+ 0x1.00000000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000002p+0, false, false, -+ 0x1.00000000000000000002p+0, false, false, -+ 0x1.00000000000000000002p+0, false, false, -+ 0x1.00000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000008271806125530276748714086920699628" - "5356581211090087890625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000001p+0, false, -- 0x1.00000000000000000001p+0, false, -- 0x1.00000000000000000001p+0, false, -- 0x1.00000000000000000001p+0, false, -- true, -- 0x1.00000000000000000001p+0, false, -- 0x1.00000000000000000001p+0, false, -- 0x1.00000000000000000001p+0, false, -- 0x1.00000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000001p+0, false, false, -+ 0x1.00000000000000000001p+0, false, false, -+ 0x1.00000000000000000001p+0, false, false, -+ 0x1.00000000000000000001p+0, false, false, -+ true, -+ 0x1.00000000000000000001p+0, false, false, -+ 0x1.00000000000000000001p+0, false, false, -+ 0x1.00000000000000000001p+0, false, false, -+ 0x1.00000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000004135903062765138374357043460349814" - "26782906055450439453125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000008p+0, false, -- 0x1.000000000000000000008p+0, false, -- 0x1.000000000000000000008p+0, false, -- 0x1.000000000000000000008p+0, false, -- true, -- 0x1.000000000000000000008p+0, false, -- 0x1.000000000000000000008p+0, false, -- 0x1.000000000000000000008p+0, false, -- 0x1.000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000008p+0, false, false, -+ 0x1.000000000000000000008p+0, false, false, -+ 0x1.000000000000000000008p+0, false, false, -+ 0x1.000000000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000000000008p+0, false, false, -+ 0x1.000000000000000000008p+0, false, false, -+ 0x1.000000000000000000008p+0, false, false, -+ 0x1.000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000002067951531382569187178521730174907" - "133914530277252197265625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000004p+0, false, -- 0x1.000000000000000000004p+0, false, -- 0x1.000000000000000000004p+0, false, -- 0x1.000000000000000000004p+0, false, -- true, -- 0x1.000000000000000000004p+0, false, -- 0x1.000000000000000000004p+0, false, -- 0x1.000000000000000000004p+0, false, -- 0x1.000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000004p+0, false, false, -+ 0x1.000000000000000000004p+0, false, false, -+ 0x1.000000000000000000004p+0, false, false, -+ 0x1.000000000000000000004p+0, false, false, -+ true, -+ 0x1.000000000000000000004p+0, false, false, -+ 0x1.000000000000000000004p+0, false, false, -+ 0x1.000000000000000000004p+0, false, false, -+ 0x1.000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000001033975765691284593589260865087453" - "5669572651386260986328125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000002p+0, false, -- 0x1.000000000000000000002p+0, false, -- 0x1.000000000000000000002p+0, false, -- 0x1.000000000000000000002p+0, false, -- true, -- 0x1.000000000000000000002p+0, false, -- 0x1.000000000000000000002p+0, false, -- 0x1.000000000000000000002p+0, false, -- 0x1.000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000002p+0, false, false, -+ 0x1.000000000000000000002p+0, false, false, -+ 0x1.000000000000000000002p+0, false, false, -+ 0x1.000000000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000002p+0, false, false, -+ 0x1.000000000000000000002p+0, false, false, -+ 0x1.000000000000000000002p+0, false, false, -+ 0x1.000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000516987882845642296794630432543726" - "78347863256931304931640625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000001p+0, false, -- 0x1.000000000000000000001p+0, false, -- 0x1.000000000000000000001p+0, false, -- 0x1.000000000000000000001p+0, false, -- true, -- 0x1.000000000000000000001p+0, false, -- 0x1.000000000000000000001p+0, false, -- 0x1.000000000000000000001p+0, false, -- 0x1.000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000001p+0, false, false, -+ 0x1.000000000000000000001p+0, false, false, -+ 0x1.000000000000000000001p+0, false, false, -+ 0x1.000000000000000000001p+0, false, false, -+ true, -+ 0x1.000000000000000000001p+0, false, false, -+ 0x1.000000000000000000001p+0, false, false, -+ 0x1.000000000000000000001p+0, false, false, -+ 0x1.000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000258493941422821148397315216271863" - "391739316284656524658203125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000008p+0, false, -- 0x1.0000000000000000000008p+0, false, -- 0x1.0000000000000000000008p+0, false, -- 0x1.0000000000000000000008p+0, false, -- true, -- 0x1.0000000000000000000008p+0, false, -- 0x1.0000000000000000000008p+0, false, -- 0x1.0000000000000000000008p+0, false, -- 0x1.0000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000000129246970711410574198657608135931" - "6958696581423282623291015625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000004p+0, false, -- 0x1.0000000000000000000004p+0, false, -- 0x1.0000000000000000000004p+0, false, -- 0x1.0000000000000000000004p+0, false, -- true, -- 0x1.0000000000000000000004p+0, false, -- 0x1.0000000000000000000004p+0, false, -- 0x1.0000000000000000000004p+0, false, -- 0x1.0000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000004p+0, false, false, -+ true, -+ 0x1.0000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000000064623485355705287099328804067965" - "84793482907116413116455078125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000002p+0, false, -- 0x1.0000000000000000000002p+0, false, -- 0x1.0000000000000000000002p+0, false, -- 0x1.0000000000000000000002p+0, false, -- true, -- 0x1.0000000000000000000002p+0, false, -- 0x1.0000000000000000000002p+0, false, -- 0x1.0000000000000000000002p+0, false, -- 0x1.0000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000032311742677852643549664402033982" - "923967414535582065582275390625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000001p+0, false, -- 0x1.0000000000000000000001p+0, false, -- 0x1.0000000000000000000001p+0, false, -- 0x1.0000000000000000000001p+0, false, -- true, -- 0x1.0000000000000000000001p+0, false, -- 0x1.0000000000000000000001p+0, false, -- 0x1.0000000000000000000001p+0, false, -- 0x1.0000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000001p+0, false, false, -+ true, -+ 0x1.0000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000016155871338926321774832201016991" - "4619837072677910327911376953125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000008p+0, false, -- 0x1.00000000000000000000008p+0, false, -- 0x1.00000000000000000000008p+0, false, -- 0x1.00000000000000000000008p+0, false, -- true, -- 0x1.00000000000000000000008p+0, false, -- 0x1.00000000000000000000008p+0, false, -- 0x1.00000000000000000000008p+0, false, -- 0x1.00000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000008p+0, false, false, -+ true, -+ 0x1.00000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000000008077935669463160887416100508495" - "73099185363389551639556884765625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000004p+0, false, -- 0x1.00000000000000000000004p+0, false, -- 0x1.00000000000000000000004p+0, false, -- 0x1.00000000000000000000004p+0, false, -- true, -- 0x1.00000000000000000000004p+0, false, -- 0x1.00000000000000000000004p+0, false, -- 0x1.00000000000000000000004p+0, false, -- 0x1.00000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000004p+0, false, false, -+ true, -+ 0x1.00000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000000004038967834731580443708050254247" - "865495926816947758197784423828125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000002p+0, false, -- 0x1.00000000000000000000002p+0, false, -- 0x1.00000000000000000000002p+0, false, -- 0x1.00000000000000000000002p+0, false, -- true, -- 0x1.00000000000000000000002p+0, false, -- 0x1.00000000000000000000002p+0, false, -- 0x1.00000000000000000000002p+0, false, -- 0x1.00000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000002019483917365790221854025127123" - "9327479634084738790988922119140625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000001p+0, false, -- 0x1.00000000000000000000001p+0, false, -- 0x1.00000000000000000000001p+0, false, -- 0x1.00000000000000000000001p+0, false, -- true, -- 0x1.00000000000000000000001p+0, false, -- 0x1.00000000000000000000001p+0, false, -- 0x1.00000000000000000000001p+0, false, -- 0x1.00000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000001p+0, false, false, -+ true, -+ 0x1.00000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000001009741958682895110927012563561" - "96637398170423693954944610595703125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000000008p+0, false, -- 0x1.000000000000000000000008p+0, false, -- 0x1.000000000000000000000008p+0, false, -- 0x1.000000000000000000000008p+0, false, -- true, -- 0x1.000000000000000000000008p+0, false, -- 0x1.000000000000000000000008p+0, false, -- 0x1.000000000000000000000008p+0, false, -- 0x1.000000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000000000504870979341447555463506281780" - "983186990852118469774723052978515625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000000004p+0, false, -- 0x1.000000000000000000000004p+0, false, -- 0x1.000000000000000000000004p+0, false, -- 0x1.000000000000000000000004p+0, false, -- true, -- 0x1.000000000000000000000004p+0, false, -- 0x1.000000000000000000000004p+0, false, -- 0x1.000000000000000000000004p+0, false, -- 0x1.000000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000004p+0, false, false, -+ true, -+ 0x1.000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000000000252435489670723777731753140890" - "4915934954260592348873615264892578125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000000002p+0, false, -- 0x1.000000000000000000000002p+0, false, -- 0x1.000000000000000000000002p+0, false, -- 0x1.000000000000000000000002p+0, false, -- true, -- 0x1.000000000000000000000002p+0, false, -- 0x1.000000000000000000000002p+0, false, -- 0x1.000000000000000000000002p+0, false, -- 0x1.000000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000000126217744835361888865876570445" - "24579674771302961744368076324462890625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000000001p+0, false, -- 0x1.000000000000000000000001p+0, false, -- 0x1.000000000000000000000001p+0, false, -- 0x1.000000000000000000000001p+0, false, -- true, -- 0x1.000000000000000000000001p+0, false, -- 0x1.000000000000000000000001p+0, false, -- 0x1.000000000000000000000001p+0, false, -- 0x1.000000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000001p+0, false, false, -+ true, -+ 0x1.000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000000063108872417680944432938285222" - "622898373856514808721840381622314453125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000000008p+0, false, -- 0x1.0000000000000000000000008p+0, false, -- 0x1.0000000000000000000000008p+0, false, -- 0x1.0000000000000000000000008p+0, false, -- true, -- 0x1.0000000000000000000000008p+0, false, -- 0x1.0000000000000000000000008p+0, false, -- 0x1.0000000000000000000000008p+0, false, -- 0x1.0000000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000000000031554436208840472216469142611" - "3114491869282574043609201908111572265625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000000004p+0, false, -- 0x1.0000000000000000000000004p+0, false, -- 0x1.0000000000000000000000004p+0, false, -- 0x1.0000000000000000000000004p+0, false, -- true, -- 0x1.0000000000000000000000004p+0, false, -- 0x1.0000000000000000000000004p+0, false, -- 0x1.0000000000000000000000004p+0, false, -- 0x1.0000000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000004p+0, false, false, -+ true, -+ 0x1.0000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000000000015777218104420236108234571305" - "65572459346412870218046009540557861328125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000000002p+0, false, -- 0x1.0000000000000000000000002p+0, false, -- 0x1.0000000000000000000000002p+0, false, -- 0x1.0000000000000000000000002p+0, false, -- true, -- 0x1.0000000000000000000000002p+0, false, -- 0x1.0000000000000000000000002p+0, false, -- 0x1.0000000000000000000000002p+0, false, -- 0x1.0000000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000000007888609052210118054117285652" - "827862296732064351090230047702789306640625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.0000000000000000000000001p+0, false, -- 0x1.0000000000000000000000001p+0, false, -- 0x1.0000000000000000000000001p+0, false, -- 0x1.0000000000000000000000001p+0, false, -- true, -- 0x1.0000000000000000000000001p+0, false, -- 0x1.0000000000000000000000001p+0, false, -- 0x1.0000000000000000000000001p+0, false, -- 0x1.0000000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.0000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000001p+0, false, false, -+ true, -+ 0x1.0000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000000003944304526105059027058642826" - "4139311483660321755451150238513946533203125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000000008p+0, false, -- 0x1.00000000000000000000000008p+0, false, -- 0x1.00000000000000000000000008p+0, false, -- 0x1.00000000000000000000000008p+0, false, -- true, -- 0x1.00000000000000000000000008p+0, false, -- 0x1.00000000000000000000000008p+0, false, -- 0x1.00000000000000000000000008p+0, false, -- 0x1.00000000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000000008p+0, false, false, -+ true, -+ 0x1.00000000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000000008p+0, false, false, -+ 0x1.00000000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000000000001972152263052529513529321413" - "20696557418301608777255751192569732666015625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000000004p+0, false, -- 0x1.00000000000000000000000004p+0, false, -- 0x1.00000000000000000000000004p+0, false, -- 0x1.00000000000000000000000004p+0, false, -- true, -- 0x1.00000000000000000000000004p+0, false, -- 0x1.00000000000000000000000004p+0, false, -- 0x1.00000000000000000000000004p+0, false, -- 0x1.00000000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000000004p+0, false, false, -+ true, -+ 0x1.00000000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000000004p+0, false, false, -+ 0x1.00000000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000000000000986076131526264756764660706" - "603482787091508043886278755962848663330078125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000000002p+0, false, -- 0x1.00000000000000000000000002p+0, false, -- 0x1.00000000000000000000000002p+0, false, -- 0x1.00000000000000000000000002p+0, false, -- true, -- 0x1.00000000000000000000000002p+0, false, -- 0x1.00000000000000000000000002p+0, false, -- 0x1.00000000000000000000000002p+0, false, -- 0x1.00000000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000000002p+0, false, false, -+ 0x1.00000000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000000000493038065763132378382330353" - "3017413935457540219431393779814243316650390625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.00000000000000000000000001p+0, false, -- 0x1.00000000000000000000000001p+0, false, -- 0x1.00000000000000000000000001p+0, false, -- 0x1.00000000000000000000000001p+0, false, -- true, -- 0x1.00000000000000000000000001p+0, false, -- 0x1.00000000000000000000000001p+0, false, -- 0x1.00000000000000000000000001p+0, false, -- 0x1.00000000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.00000000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000000001p+0, false, false, -+ true, -+ 0x1.00000000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000000001p+0, false, false, -+ 0x1.00000000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000000000246519032881566189191165176" - "65087069677287701097156968899071216583251953125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- true, -- 0x1.000000000000000000000000008p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.000000000000000000000000008p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- 0x1.000000000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ true, -+ 0x1.000000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000000000000123259516440783094595582588" - "325435348386438505485784844495356082916259765625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.000000000000000000000000004p+0, false, -- 0x1.000000000000000000000000004p+0, false, -- 0x1.000000000000000000000000004p+0, false, -- 0x1.000000000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000000004p+0, false, false, -+ 0x1.000000000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000000000000061629758220391547297791294" - "1627176741932192527428924222476780414581298828125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.000000000000000000000000002p+0, false, -- 0x1.000000000000000000000000002p+0, false, -- 0x1.000000000000000000000000002p+0, false, -- 0x1.000000000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000000002p+0, false, false, -+ 0x1.000000000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000000000030814879110195773648895647" - "08135883709660962637144621112383902072906494140625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.000000000000000000000000001p+0, false, -- 0x1.000000000000000000000000001p+0, false, -- 0x1.000000000000000000000000001p+0, false, -- 0x1.000000000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.000000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000000001p+0, false, false, -+ 0x1.000000000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000000000015407439555097886824447823" - "540679418548304813185723105561919510364532470703125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.0000000000000000000000000008p+0, false, -- 0x1.0000000000000000000000000008p+0, false, -- 0x1.0000000000000000000000000008p+0, false, -- 0x1.0000000000000000000000000008p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000000008p+0, false, false, -+ 0x1.0000000000000000000000000008p+0, false, false), - TEST ("1.0000000000000000000000000000000007703719777548943412223911" - "7703397092741524065928615527809597551822662353515625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.0000000000000000000000000004p+0, false, -- 0x1.0000000000000000000000000004p+0, false, -- 0x1.0000000000000000000000000004p+0, false, -- 0x1.0000000000000000000000000004p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000000004p+0, false, false, -+ 0x1.0000000000000000000000000004p+0, false, false), - TEST ("1.0000000000000000000000000000000003851859888774471706111955" - "88516985463707620329643077639047987759113311767578125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.0000000000000000000000000002p+0, false, -- 0x1.0000000000000000000000000002p+0, false, -- 0x1.0000000000000000000000000002p+0, false, -- 0x1.0000000000000000000000000002p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000000002p+0, false, false, -+ 0x1.0000000000000000000000000002p+0, false, false), - TEST ("1.0000000000000000000000000000000001925929944387235853055977" - "942584927318538101648215388195239938795566558837890625", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- true, -- 0x1.0000000000000000000000000001p+0, false, -- 0x1.0000000000000000000000000001p+0, false, -- 0x1.0000000000000000000000000001p+0, false, -- 0x1.0000000000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ true, -+ 0x1.0000000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000000001p+0, false, false, -+ 0x1.0000000000000000000000000001p+0, false, false), - TEST ("1.0000000000000000000000000000000000962964972193617926527988" - "9712924636592690508241076940976199693977832794189453125", - false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000001p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000002p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.000000000000000000000000008p+0, false, -- false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1p+0, false, -- 0x1.0000000000000000000000000001p+0, false), -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000001p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000002p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.000000000000000000000000008p+0, false, false, -+ false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1p+0, false, false, -+ 0x1.0000000000000000000000000001p+0, false, false), - }; -diff --git a/stdlib/tst-strtod-round-skeleton.c b/stdlib/tst-strtod-round-skeleton.c -index c3cc0201d4..be081ba416 100644 ---- a/stdlib/tst-strtod-round-skeleton.c -+++ b/stdlib/tst-strtod-round-skeleton.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - - #include "tst-strtod.h" - -@@ -139,16 +140,26 @@ - gen-tst-strtod-round utility to select the appropriately - rounded long double value for a given format. */ - #define TEST(s, \ -- fx, fd, fdo, fn, fno, fz, fzo, fu, fuo, \ -- dx, dd, ddo, dn, dno, dz, dzo, du, duo, \ -- ld64ix, ld64id, ld64ido, ld64in, ld64ino, \ -- ld64iz, ld64izo, ld64iu, ld64iuo, \ -- ld64mx, ld64md, ld64mdo, ld64mn, ld64mno, \ -- ld64mz, ld64mzo, ld64mu, ld64muo, \ -- ld106x, ld106d, ld106do, ld106n, ld106no, \ -- ld106z, ld106zo, ld106u, ld106uo, \ -- ld113x, ld113d, ld113do, ld113n, ld113no, \ -- ld113z, ld113zo, ld113u, ld113uo) \ -+ fx, fd, fdo, fdu, fn, fno, fnu, \ -+ fz, fzo, fzu, fu, fuo, fuu, \ -+ dx, dd, ddo, ddu, dn, dno, dnu, \ -+ dz, dzo, dzu, du, duo, duu, \ -+ ld64ix, ld64id, ld64ido, ld64idu, \ -+ ld64in, ld64ino, ld64inu, \ -+ ld64iz, ld64izo, ld64izu, \ -+ ld64iu, ld64iuo, ld64iuu, \ -+ ld64mx, ld64md, ld64mdo, ld64mdu, \ -+ ld64mn, ld64mno, ld64mnu, \ -+ ld64mz, ld64mzo, ld64mzu, \ -+ ld64mu, ld64muo, ld64muu, \ -+ ld106x, ld106d, ld106do, ld106du, \ -+ ld106n, ld106no, ld106nu, \ -+ ld106z, ld106zo, ld106zu, \ -+ ld106u, ld106uo, ld106uu, \ -+ ld113x, ld113d, ld113do, ld113du, \ -+ ld113n, ld113no, ld113nu, \ -+ ld113z, ld113zo, ld113zu, \ -+ ld113u, ld113uo, ld113uu) \ - { \ - L_ (s), \ - { XNTRY (fx, dx, ld64ix, ld64mx, ld106x, ld113x) }, \ -@@ -163,6 +174,12 @@ - { XNTRY (fdo, ddo, ld64ido, ld64mdo, ld106do, ld113do) }, \ - { XNTRY (fzo, dzo, ld64izo, ld64mzo, ld106zo, ld113zo) }, \ - { XNTRY (fuo, duo, ld64iuo, ld64muo, ld106uo, ld113uo) } \ -+ }, \ -+ { \ -+ { XNTRY (fnu, dnu, ld64inu, ld64mnu, ld106nu, ld113nu) }, \ -+ { XNTRY (fdu, ddu, ld64idu, ld64mdu, ld106du, ld113du) }, \ -+ { XNTRY (fzu, dzu, ld64izu, ld64mzu, ld106zu, ld113zu) }, \ -+ { XNTRY (fuu, duu, ld64iuu, ld64muu, ld106uu, ld113uu) } \ - } \ - } - -@@ -181,11 +198,17 @@ struct test_overflow - STRUCT_FOREACH_FLOAT_BOOL - }; - -+struct test_underflow -+ { -+ STRUCT_FOREACH_FLOAT_BOOL -+ }; -+ - struct test { - const CHAR *s; - struct test_exactness exact; - struct test_results r[4]; - struct test_overflow o[4]; -+ struct test_underflow u[4]; - }; - - /* Include the generated test data. */ -@@ -203,10 +226,14 @@ struct test { - # define FE_OVERFLOW 0 - #endif - -+#ifndef FE_UNDERFLOW -+# define FE_UNDERFLOW 0 -+#endif -+ - #define GEN_ONE_TEST(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ - { \ - feclearexcept (FE_ALL_EXCEPT); \ -- errno = 0; \ -+ errno = 12345; \ - FTYPE f = STRTO (FSUF) (s, NULL); \ - int new_errno = errno; \ - if (f != expected->FSUF \ -@@ -265,6 +292,40 @@ struct test { - s, new_errno, ERANGE); \ - result = 1; \ - } \ -+ if (FE_UNDERFLOW != 0) \ -+ { \ -+ bool underflow_raised \ -+ = fetestexcept (FE_UNDERFLOW) != 0; \ -+ if (underflow_raised != underflow->FSUF) \ -+ { \ -+ printf (FNPFXS "to" #FSUF \ -+ " (" STRM ") underflow %d " \ -+ "not %d\n", s, underflow_raised, \ -+ underflow->FSUF); \ -+ if (EXCEPTION_TESTS (FTYPE)) \ -+ result = 1; \ -+ else \ -+ printf ("ignoring this exception error\n"); \ -+ } \ -+ } \ -+ if (underflow->FSUF && new_errno != ERANGE) \ -+ { \ -+ printf (FNPFXS "to" #FSUF \ -+ " (" STRM ") left errno == %d," \ -+ " not %d (ERANGE)\n", \ -+ s, new_errno, ERANGE); \ -+ result = 1; \ -+ } \ -+ if (!overflow->FSUF \ -+ && !underflow->FSUF \ -+ && new_errno != 12345) \ -+ { \ -+ printf (FNPFXS "to" #FSUF \ -+ " (" STRM ") set errno == %d," \ -+ " should be unchanged\n", \ -+ s, new_errno); \ -+ result = 1; \ -+ } \ - } \ - } - -@@ -272,6 +333,7 @@ static int - test_in_one_mode (const CHAR *s, const struct test_results *expected, - const struct test_exactness *exact, - const struct test_overflow *overflow, -+ const struct test_underflow *underflow, - const char *mode_name, int rnd_mode) - { - int result = 0; -@@ -307,6 +369,7 @@ do_test (void) - { - result |= test_in_one_mode (tests[i].s, &tests[i].r[modes[0].rnd_i], - &tests[i].exact, &tests[i].o[modes[0].rnd_i], -+ &tests[i].u[modes[0].rnd_i], - modes[0].mode_name, modes[0].rnd_mode); - for (const struct fetestmodes *m = &modes[1]; m->mode_name != NULL; m++) - { -@@ -314,7 +377,9 @@ do_test (void) - { - result |= test_in_one_mode (tests[i].s, &tests[i].r[m->rnd_i], - &tests[i].exact, -- &tests[i].o[m->rnd_i], m->mode_name, -+ &tests[i].o[m->rnd_i], -+ &tests[i].u[m->rnd_i], -+ m->mode_name, - m->rnd_mode); - fesetround (save_round_mode); - } - -commit d0c1792ad269566f877208ffda91c21dcd1a72e6 -Author: Joseph Myers -Date: Tue Aug 27 12:41:02 2024 +0000 - - Fix strtod subnormal rounding (bug 30220) - - As reported in bug 30220, the implementation of strtod-family - functions has a bug in the following case: the input string would, - with infinite exponent range, take one more bit to represent than is - available in the normal precision of the return type; the value - represented is in the subnormal range; and there are no nonzero bits - in the value, below those that can be represented in subnormal - precision, other than the least significant bit and possibly the - 0.5ulp bit. In this case, round_and_return ends up discarding the - least significant bit. - - Fix by saving that bit to merge into more_bits (it can't be merged in - at the time it's computed, because more_bits mustn't include this bit - in the case of after-rounding tininess detection checking if the - result is still subnormal when rounded to normal precision, so merging - this bit into more_bits needs to take place after that check). - - Tested for x86_64. - - (cherry picked from commit 457622c2fa8f9f7435822d5287a437bc8be8090d) - -diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c -index be515ce659..beb97b3d0c 100644 ---- a/stdlib/strtod_l.c -+++ b/stdlib/strtod_l.c -@@ -222,6 +222,7 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, - - mp_size_t shift = MIN_EXP - 1 - exponent; - bool is_tiny = true; -+ bool old_half_bit = (round_limb & (((mp_limb_t) 1) << round_bit)) != 0; - - more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0; - if (shift == MANT_DIG) -@@ -292,6 +293,7 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, - round_bit = shift - 1; - (void) __mpn_rshift (retval, retval, RETURN_LIMB_SIZE, shift); - } -+ more_bits |= old_half_bit; - /* This is a hook for the m68k long double format, where the - exponent bias is the same for normalized and denormalized - numbers. */ -diff --git a/stdlib/tst-strtod-round-data b/stdlib/tst-strtod-round-data -index 84ab705709..9489fbcc9c 100644 ---- a/stdlib/tst-strtod-round-data -+++ b/stdlib/tst-strtod-round-data -@@ -265,3 +265,15 @@ - 1.000000000000000000000000000000000385185988877447170611195588516985463707620329643077639047987759113311767578125 - 1.0000000000000000000000000000000001925929944387235853055977942584927318538101648215388195239938795566558837890625 - 1.00000000000000000000000000000000009629649721936179265279889712924636592690508241076940976199693977832794189453125 -+0x30000002222225p-1077 -+0x0.7fffffffffffeap-1022 -+0x0.7fffffffffffe9p-1022 -+0x0.7ffffd4p-126 -+0x0.7ffffffffffffffd4p-16382 -+0x0.7ffffffffffffffd4p-16383 -+0x0.7ffffffffffffffffffffffffffeap-16382 -+0x0.7000004p-126 -+0x0.70000000000002p-1022 -+0x0.70000000000000004p-16382 -+0x0.70000000000000004p-16383 -+0x0.70000000000000000000000000002p-16382 -diff --git a/stdlib/tst-strtod-round-data.h b/stdlib/tst-strtod-round-data.h -index 13e62dd2b0..ed50eb2537 100644 ---- a/stdlib/tst-strtod-round-data.h -+++ b/stdlib/tst-strtod-round-data.h -@@ -15437,4 +15437,376 @@ static const struct test tests[] = { - 0x1p+0, false, false, - 0x1p+0, false, false, - 0x1.0000000000000000000000000001p+0, false, false), -+ TEST ("0x30000002222225p-1077", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x1.800000111111p-1024, false, true, -+ 0x1.8000001111114p-1024, false, true, -+ 0x1.800000111111p-1024, false, true, -+ 0x1.8000001111114p-1024, false, true, -+ true, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ true, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ false, -+ 0x1.800000111111p-1024, false, true, -+ 0x1.8000001111114p-1024, false, true, -+ 0x1.800000111111p-1024, false, true, -+ 0x1.8000001111114p-1024, false, true, -+ true, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false, -+ 0x1.80000011111128p-1024, false, false), -+ TEST ("0x0.7fffffffffffeap-1022", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ true, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ true, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ false, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ true, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false, -+ 0x1.ffffffffffffa8p-1024, false, false), -+ TEST ("0x0.7fffffffffffe9p-1022", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ true, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ true, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ false, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ 0x1.ffffffffffff8p-1024, false, true, -+ 0x1.ffffffffffffcp-1024, false, true, -+ true, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false, -+ 0x1.ffffffffffffa4p-1024, false, false), -+ TEST ("0x0.7ffffd4p-126", -+ false, -+ 0x1.fffffp-128, false, true, -+ 0x1.fffff8p-128, false, true, -+ 0x1.fffffp-128, false, true, -+ 0x1.fffff8p-128, false, true, -+ true, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ true, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ true, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ true, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ true, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false, -+ 0x1.fffff5p-128, false, false), -+ TEST ("0x0.7ffffffffffffffd4p-16382", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.fffffffffffffffp-16384, false, true, -+ 0x1.fffffffffffffff8p-16384, false, true, -+ 0x1.fffffffffffffffp-16384, false, true, -+ 0x1.fffffffffffffff8p-16384, false, true, -+ false, -+ 0x1.fffffffffffffff4p-16384, false, true, -+ 0x1.fffffffffffffff4p-16384, false, true, -+ 0x1.fffffffffffffff4p-16384, false, true, -+ 0x1.fffffffffffffff8p-16384, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x1.fffffffffffffff5p-16384, false, false, -+ 0x1.fffffffffffffff5p-16384, false, false, -+ 0x1.fffffffffffffff5p-16384, false, false, -+ 0x1.fffffffffffffff5p-16384, false, false), -+ TEST ("0x0.7ffffffffffffffd4p-16383", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0xf.ffffffffffffff8p-16388, false, true, -+ 0xf.ffffffffffffff8p-16388, false, true, -+ 0xf.ffffffffffffff8p-16388, false, true, -+ 0x1p-16384, false, true, -+ false, -+ 0xf.ffffffffffffff8p-16388, false, true, -+ 0xf.ffffffffffffffcp-16388, false, true, -+ 0xf.ffffffffffffff8p-16388, false, true, -+ 0xf.ffffffffffffffcp-16388, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0xf.ffffffffffffffa8p-16388, false, false, -+ 0xf.ffffffffffffffa8p-16388, false, false, -+ 0xf.ffffffffffffffa8p-16388, false, false, -+ 0xf.ffffffffffffffa8p-16388, false, false), -+ TEST ("0x0.7ffffffffffffffffffffffffffeap-16382", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.fffffffffffffff8p-16384, false, true, -+ 0x2p-16384, false, true, -+ 0x1.fffffffffffffff8p-16384, false, true, -+ 0x2p-16384, false, true, -+ false, -+ 0x1.fffffffffffffffcp-16384, false, true, -+ 0x2p-16384, false, true, -+ 0x1.fffffffffffffffcp-16384, false, true, -+ 0x2p-16384, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.fffffffffffffffffffffffffff8p-16384, false, true, -+ 0x1.fffffffffffffffffffffffffffcp-16384, false, true, -+ 0x1.fffffffffffffffffffffffffff8p-16384, false, true, -+ 0x1.fffffffffffffffffffffffffffcp-16384, false, true), -+ TEST ("0x0.7000004p-126", -+ false, -+ 0x1.cp-128, false, true, -+ 0x1.cp-128, false, true, -+ 0x1.cp-128, false, true, -+ 0x1.c00008p-128, false, true, -+ true, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ true, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ true, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ true, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ true, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false, -+ 0x1.c00001p-128, false, false), -+ TEST ("0x0.70000000000002p-1022", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x1.cp-1024, false, true, -+ 0x1.cp-1024, false, true, -+ 0x1.cp-1024, false, true, -+ 0x1.c000000000004p-1024, false, true, -+ true, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ true, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ false, -+ 0x1.cp-1024, false, true, -+ 0x1.cp-1024, false, true, -+ 0x1.cp-1024, false, true, -+ 0x1.c000000000004p-1024, false, true, -+ true, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false, -+ 0x1.c0000000000008p-1024, false, false), -+ TEST ("0x0.70000000000000004p-16382", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.c000000000000008p-16384, false, true, -+ false, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.c000000000000004p-16384, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0x1.c000000000000001p-16384, false, false, -+ 0x1.c000000000000001p-16384, false, false, -+ 0x1.c000000000000001p-16384, false, false, -+ 0x1.c000000000000001p-16384, false, false), -+ TEST ("0x0.70000000000000004p-16383", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0xep-16388, false, true, -+ 0xep-16388, false, true, -+ 0xep-16388, false, true, -+ 0xe.000000000000008p-16388, false, true, -+ false, -+ 0xep-16388, false, true, -+ 0xep-16388, false, true, -+ 0xep-16388, false, true, -+ 0xe.000000000000004p-16388, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ true, -+ 0xe.0000000000000008p-16388, false, false, -+ 0xe.0000000000000008p-16388, false, false, -+ 0xe.0000000000000008p-16388, false, false, -+ 0xe.0000000000000008p-16388, false, false), -+ TEST ("0x0.70000000000000000000000000002p-16382", -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x8p-152, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.c000000000000008p-16384, false, true, -+ false, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.c000000000000004p-16384, false, true, -+ false, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x0p+0, false, true, -+ 0x4p-1076, false, true, -+ false, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.cp-16384, false, true, -+ 0x1.c000000000000000000000000004p-16384, false, true), - }; - -commit cac10d88c684c0171e549d813bfef7a31029f257 -Author: Joseph Myers -Date: Tue Aug 27 20:41:54 2024 +0000 - - Make __strtod_internal tests type-generic - - Some of the strtod tests use type-generic machinery in tst-strtod.h to - test the strto* functions for all floating types, while others only - test double even when the tests are in fact meaningful for all - floating types. - - Convert the tests of the internal __strtod_internal interface to cover - all floating types. I haven't tried to convert them to use newer test - interfaces in other ways, just made the changes necessary to use the - type-generic machinery. As an internal interface, there are no - aliases for different types with the same ABI (however, - __strtold_internal is defined even if long double has the same ABI as - double), so macros used by the type-generic testing code are redefined - as needed to avoid expecting such aliases to be present. - - Tested for x86_64. - - (cherry picked from commit 3fc063dee01da4f80920a14b7db637c8501d6fd4) - -diff --git a/stdlib/tst-strtod1i.c b/stdlib/tst-strtod1i.c -index 9d6bb760fb..44ae0264f4 100644 ---- a/stdlib/tst-strtod1i.c -+++ b/stdlib/tst-strtod1i.c -@@ -25,60 +25,91 @@ - #include - #include - --/* Perform a few tests in a locale with thousands separators. */ --static int --do_test (void) --{ -- static const struct -- { -- const char *loc; -- const char *str; -- double exp; -- ptrdiff_t nread; -- } tests[] = -- { -- { "de_DE.UTF-8", "1,5", 1.5, 3 }, -- { "de_DE.UTF-8", "1.5", 1.0, 1 }, -- { "de_DE.UTF-8", "1.500", 1500.0, 5 }, -- { "de_DE.UTF-8", "36.893.488.147.419.103.232", 0x1.0p65, 26 } -- }; --#define ntests (sizeof (tests) / sizeof (tests[0])) -- size_t n; -- int result = 0; -- -- puts ("\nLocale tests"); -+#include "tst-strtod.h" - -- for (n = 0; n < ntests; ++n) -- { -- double d; -- char *endp; -+/* This tests internal interfaces, which are only defined for types -+ with distinct ABIs, so disable testing for types without distinct -+ ABIs. */ -+#undef IF_FLOAT32 -+#define IF_FLOAT32(x) -+#undef IF_FLOAT64 -+#define IF_FLOAT64(x) -+#undef IF_FLOAT32X -+#define IF_FLOAT32X(x) -+#undef IF_FLOAT64X -+#define IF_FLOAT64X(x) -+#if !__HAVE_DISTINCT_FLOAT128 -+# undef IF_FLOAT128 -+# define IF_FLOAT128(x) -+#endif - -- if (setlocale (LC_ALL, tests[n].loc) == NULL) -- { -- printf ("cannot set locale %s\n", tests[n].loc); -- result = 1; -- continue; -- } -+#define ntests (sizeof (tests) / sizeof (tests[0])) - -- d = __strtod_internal (tests[n].str, &endp, 1); -- if (d != tests[n].exp) -- { -- printf ("strtod(\"%s\") returns %g and not %g\n", -- tests[n].str, d, tests[n].exp); -- result = 1; -- } -- else if (endp - tests[n].str != tests[n].nread) -- { -- printf ("strtod(\"%s\") read %td bytes and not %td\n", -- tests[n].str, endp - tests[n].str, tests[n].nread); -- result = 1; -- } -- } -+/* Perform a few tests in a locale with thousands separators. */ -+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+static int \ -+test_strto ## FSUF (void) \ -+{ \ -+ static const struct \ -+ { \ -+ const char *loc; \ -+ const char *str; \ -+ FTYPE exp; \ -+ ptrdiff_t nread; \ -+ } tests[] = \ -+ { \ -+ { "de_DE.UTF-8", "1,5", 1.5 ## LSUF, 3 }, \ -+ { "de_DE.UTF-8", "1.5", 1.0 ## LSUF, 1 }, \ -+ { "de_DE.UTF-8", "1.500", 1500.0 ## LSUF, 5 }, \ -+ { "de_DE.UTF-8", "36.893.488.147.419.103.232", 0x1.0p65 ## LSUF, 26 } \ -+ }; \ -+ size_t n; \ -+ int result = 0; \ -+ \ -+ puts ("\nLocale tests"); \ -+ \ -+ for (n = 0; n < ntests; ++n) \ -+ { \ -+ FTYPE d; \ -+ char *endp; \ -+ \ -+ if (setlocale (LC_ALL, tests[n].loc) == NULL) \ -+ { \ -+ printf ("cannot set locale %s\n", tests[n].loc); \ -+ result = 1; \ -+ continue; \ -+ } \ -+ \ -+ d = __strto ## FSUF ## _internal (tests[n].str, &endp, 1); \ -+ if (d != tests[n].exp) \ -+ { \ -+ char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \ -+ FTOSTR (buf1, sizeof (buf1), "%g", d); \ -+ FTOSTR (buf2, sizeof (buf2), "%g", tests[n].exp); \ -+ printf ("strto" # FSUF "(\"%s\") returns %s and not %s\n", \ -+ tests[n].str, buf1, buf2); \ -+ result = 1; \ -+ } \ -+ else if (endp - tests[n].str != tests[n].nread) \ -+ { \ -+ printf ("strto" # FSUF "(\"%s\") read %td bytes and not %td\n", \ -+ tests[n].str, endp - tests[n].str, tests[n].nread); \ -+ result = 1; \ -+ } \ -+ } \ -+ \ -+ if (result == 0) \ -+ puts ("all OK"); \ -+ \ -+ return result ? EXIT_FAILURE : EXIT_SUCCESS; \ -+} - -- if (result == 0) -- puts ("all OK"); -+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) - -- return result ? EXIT_FAILURE : EXIT_SUCCESS; -+static int -+do_test (void) -+{ -+ return STRTOD_TEST_FOREACH (test_strto); - } - - #include -diff --git a/stdlib/tst-strtod3.c b/stdlib/tst-strtod3.c -index 23abec1896..0d662d8be8 100644 ---- a/stdlib/tst-strtod3.c -+++ b/stdlib/tst-strtod3.c -@@ -3,19 +3,73 @@ - #include - #include - --static const struct --{ -- const char *in; -- const char *out; -- double expected; --} tests[] = -- { -- { "000,,,e1", ",,,e1", 0.0 }, -- { "000e1", "", 0.0 }, -- { "000,1e1", ",1e1", 0.0 } -- }; --#define NTESTS (sizeof (tests) / sizeof (tests[0])) -+#include "tst-strtod.h" -+ -+/* This tests internal interfaces, which are only defined for types -+ with distinct ABIs, so disable testing for types without distinct -+ ABIs. */ -+#undef IF_FLOAT32 -+#define IF_FLOAT32(x) -+#undef IF_FLOAT64 -+#define IF_FLOAT64(x) -+#undef IF_FLOAT32X -+#define IF_FLOAT32X(x) -+#undef IF_FLOAT64X -+#define IF_FLOAT64X(x) -+#if !__HAVE_DISTINCT_FLOAT128 -+# undef IF_FLOAT128 -+# define IF_FLOAT128(x) -+#endif - -+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+static const struct \ -+{ \ -+ const char *in; \ -+ const char *out; \ -+ FTYPE expected; \ -+} tests_strto ## FSUF[] = \ -+ { \ -+ { "000,,,e1", ",,,e1", 0.0 ## LSUF }, \ -+ { "000e1", "", 0.0 ## LSUF }, \ -+ { "000,1e1", ",1e1", 0.0 ## LSUF } \ -+ }; \ -+ \ -+static int \ -+test_strto ## FSUF (void) \ -+{ \ -+ int status = 0; \ -+ \ -+ for (int i = 0; \ -+ i < sizeof (tests_strto ## FSUF) / sizeof (tests_strto ## FSUF[0]); \ -+ ++i) \ -+ { \ -+ char *ep; \ -+ FTYPE r = __strto ## FSUF ## _internal (tests_strto ## FSUF[i].in, \ -+ &ep, 1); \ -+ \ -+ if (strcmp (ep, tests_strto ## FSUF[i].out) != 0) \ -+ { \ -+ printf ("%d: got rest string \"%s\", expected \"%s\"\n", \ -+ i, ep, tests_strto ## FSUF[i].out); \ -+ status = 1; \ -+ } \ -+ \ -+ if (r != tests_strto ## FSUF[i].expected) \ -+ { \ -+ char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \ -+ FTOSTR (buf1, sizeof (buf1), "%g", r); \ -+ FTOSTR (buf2, sizeof (buf2), "%g", \ -+ tests_strto ## FSUF[i].expected); \ -+ printf ("%d: got wrong results %s, expected %s\n", \ -+ i, buf1, buf2); \ -+ status = 1; \ -+ } \ -+ } \ -+ \ -+ return status; \ -+} -+ -+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) - - static int - do_test (void) -@@ -26,29 +80,7 @@ do_test (void) - return 1; - } - -- int status = 0; -- -- for (int i = 0; i < NTESTS; ++i) -- { -- char *ep; -- double r = __strtod_internal (tests[i].in, &ep, 1); -- -- if (strcmp (ep, tests[i].out) != 0) -- { -- printf ("%d: got rest string \"%s\", expected \"%s\"\n", -- i, ep, tests[i].out); -- status = 1; -- } -- -- if (r != tests[i].expected) -- { -- printf ("%d: got wrong results %g, expected %g\n", -- i, r, tests[i].expected); -- status = 1; -- } -- } -- -- return status; -+ return STRTOD_TEST_FOREACH (test_strto); - } - - #define TEST_FUNCTION do_test () -diff --git a/stdlib/tst-strtod4.c b/stdlib/tst-strtod4.c -index 6cc4e843c7..dfd3f05027 100644 ---- a/stdlib/tst-strtod4.c -+++ b/stdlib/tst-strtod4.c -@@ -3,22 +3,76 @@ - #include - #include - -+#include "tst-strtod.h" -+ -+/* This tests internal interfaces, which are only defined for types -+ with distinct ABIs, so disable testing for types without distinct -+ ABIs. */ -+#undef IF_FLOAT32 -+#define IF_FLOAT32(x) -+#undef IF_FLOAT64 -+#define IF_FLOAT64(x) -+#undef IF_FLOAT32X -+#define IF_FLOAT32X(x) -+#undef IF_FLOAT64X -+#define IF_FLOAT64X(x) -+#if !__HAVE_DISTINCT_FLOAT128 -+# undef IF_FLOAT128 -+# define IF_FLOAT128(x) -+#endif -+ - #define NNBSP "\xe2\x80\xaf" - --static const struct --{ -- const char *in; -- const char *out; -- double expected; --} tests[] = -- { -- { "000"NNBSP"000"NNBSP"000", "", 0.0 }, -- { "1"NNBSP"000"NNBSP"000,5x", "x", 1000000.5 }, -- /* Bug 30964 */ -- { "10"NNBSP NNBSP"200", NNBSP NNBSP"200", 10.0 } -- }; --#define NTESTS (sizeof (tests) / sizeof (tests[0])) -+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+static const struct \ -+{ \ -+ const char *in; \ -+ const char *out; \ -+ FTYPE expected; \ -+} tests_strto ## FSUF[] = \ -+ { \ -+ { "000"NNBSP"000"NNBSP"000", "", 0.0 ## LSUF }, \ -+ { "1"NNBSP"000"NNBSP"000,5x", "x", 1000000.5 ## LSUF }, \ -+ /* Bug 30964 */ \ -+ { "10"NNBSP NNBSP"200", NNBSP NNBSP"200", 10.0 ## LSUF } \ -+ }; \ -+ \ -+static int \ -+test_strto ## FSUF (void) \ -+{ \ -+ int status = 0; \ -+ \ -+ for (int i = 0; \ -+ i < sizeof (tests_strto ## FSUF) / sizeof (tests_strto ## FSUF[0]); \ -+ ++i) \ -+ { \ -+ char *ep; \ -+ FTYPE r = __strto ## FSUF ## _internal (tests_strto ## FSUF[i].in, \ -+ &ep, 1); \ -+ \ -+ if (strcmp (ep, tests_strto ## FSUF[i].out) != 0) \ -+ { \ -+ printf ("%d: got rest string \"%s\", expected \"%s\"\n", \ -+ i, ep, tests_strto ## FSUF[i].out); \ -+ status = 1; \ -+ } \ -+ \ -+ if (r != tests_strto ## FSUF[i].expected) \ -+ { \ -+ char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \ -+ FTOSTR (buf1, sizeof (buf1), "%g", r); \ -+ FTOSTR (buf2, sizeof (buf2), "%g", \ -+ tests_strto ## FSUF[i].expected); \ -+ printf ("%d: got wrong results %s, expected %s\n", \ -+ i, buf1, buf2); \ -+ status = 1; \ -+ } \ -+ } \ -+ \ -+ return status; \ -+} - -+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) - - static int - do_test (void) -@@ -29,29 +83,7 @@ do_test (void) - return 1; - } - -- int status = 0; -- -- for (int i = 0; i < NTESTS; ++i) -- { -- char *ep; -- double r = __strtod_internal (tests[i].in, &ep, 1); -- -- if (strcmp (ep, tests[i].out) != 0) -- { -- printf ("%d: got rest string \"%s\", expected \"%s\"\n", -- i, ep, tests[i].out); -- status = 1; -- } -- -- if (r != tests[i].expected) -- { -- printf ("%d: got wrong results %g, expected %g\n", -- i, r, tests[i].expected); -- status = 1; -- } -- } -- -- return status; -+ return STRTOD_TEST_FOREACH (test_strto); - } - - #define TEST_FUNCTION do_test () -diff --git a/stdlib/tst-strtod5i.c b/stdlib/tst-strtod5i.c -index ee54e3404c..136aedea68 100644 ---- a/stdlib/tst-strtod5i.c -+++ b/stdlib/tst-strtod5i.c -@@ -16,52 +16,112 @@ - License along with the GNU C Library; if not, see - . */ - -+/* Defining _LIBC_TEST ensures long double math functions are -+ declared in the headers. */ -+#define _LIBC_TEST 1 - #include - #include - #include - #include - #include - -+#include "tst-strtod.h" -+ -+/* This tests internal interfaces, which are only defined for types -+ with distinct ABIs, so disable testing for types without distinct -+ ABIs. */ -+#undef IF_FLOAT32 -+#define IF_FLOAT32(x) -+#undef IF_FLOAT64 -+#define IF_FLOAT64(x) -+#undef IF_FLOAT32X -+#define IF_FLOAT32X(x) -+#undef IF_FLOAT64X -+#define IF_FLOAT64X(x) -+#if !__HAVE_DISTINCT_FLOAT128 -+# undef IF_FLOAT128 -+# define IF_FLOAT128(x) -+#endif -+ - #define NNBSP "\xe2\x80\xaf" - --static const struct --{ -- const char *in; -- int group; -- double expected; --} tests[] = -- { -- { "0", 0, 0.0 }, -- { "000", 0, 0.0 }, -- { "-0", 0, -0.0 }, -- { "-000", 0, -0.0 }, -- { "0,", 0, 0.0 }, -- { "-0,", 0, -0.0 }, -- { "0,0", 0, 0.0 }, -- { "-0,0", 0, -0.0 }, -- { "0e-10", 0, 0.0 }, -- { "-0e-10", 0, -0.0 }, -- { "0,e-10", 0, 0.0 }, -- { "-0,e-10", 0, -0.0 }, -- { "0,0e-10", 0, 0.0 }, -- { "-0,0e-10", 0, -0.0 }, -- { "0e-1000000", 0, 0.0 }, -- { "-0e-1000000", 0, -0.0 }, -- { "0,0e-1000000", 0, 0.0 }, -- { "-0,0e-1000000", 0, -0.0 }, -- { "0", 1, 0.0 }, -- { "000", 1, 0.0 }, -- { "-0", 1, -0.0 }, -- { "-000", 1, -0.0 }, -- { "0e-10", 1, 0.0 }, -- { "-0e-10", 1, -0.0 }, -- { "0e-1000000", 1, 0.0 }, -- { "-0e-1000000", 1, -0.0 }, -- { "000"NNBSP"000"NNBSP"000", 1, 0.0 }, -- { "-000"NNBSP"000"NNBSP"000", 1, -0.0 } -- }; --#define NTESTS (sizeof (tests) / sizeof (tests[0])) -+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+static const struct \ -+{ \ -+ const char *in; \ -+ int group; \ -+ FTYPE expected; \ -+} tests_strto ## FSUF[] = \ -+ { \ -+ { "0", 0, 0.0 ## LSUF }, \ -+ { "000", 0, 0.0 ## LSUF }, \ -+ { "-0", 0, -0.0 ## LSUF }, \ -+ { "-000", 0, -0.0 ## LSUF }, \ -+ { "0,", 0, 0.0 ## LSUF }, \ -+ { "-0,", 0, -0.0 ## LSUF }, \ -+ { "0,0", 0, 0.0 ## LSUF }, \ -+ { "-0,0", 0, -0.0 ## LSUF }, \ -+ { "0e-10", 0, 0.0 ## LSUF }, \ -+ { "-0e-10", 0, -0.0 ## LSUF }, \ -+ { "0,e-10", 0, 0.0 ## LSUF }, \ -+ { "-0,e-10", 0, -0.0 ## LSUF }, \ -+ { "0,0e-10", 0, 0.0 ## LSUF }, \ -+ { "-0,0e-10", 0, -0.0 ## LSUF }, \ -+ { "0e-1000000", 0, 0.0 ## LSUF }, \ -+ { "-0e-1000000", 0, -0.0 ## LSUF }, \ -+ { "0,0e-1000000", 0, 0.0 ## LSUF }, \ -+ { "-0,0e-1000000", 0, -0.0 ## LSUF }, \ -+ { "0", 1, 0.0 ## LSUF }, \ -+ { "000", 1, 0.0 ## LSUF }, \ -+ { "-0", 1, -0.0 ## LSUF }, \ -+ { "-000", 1, -0.0 ## LSUF }, \ -+ { "0e-10", 1, 0.0 ## LSUF }, \ -+ { "-0e-10", 1, -0.0 ## LSUF }, \ -+ { "0e-1000000", 1, 0.0 ## LSUF }, \ -+ { "-0e-1000000", 1, -0.0 ## LSUF }, \ -+ { "000"NNBSP"000"NNBSP"000", 1, 0.0 ## LSUF }, \ -+ { "-000"NNBSP"000"NNBSP"000", 1, -0.0 ## LSUF } \ -+ }; \ -+ \ -+static int \ -+test_strto ## FSUF (void) \ -+{ \ -+ int status = 0; \ -+ \ -+ for (int i = 0; \ -+ i < sizeof (tests_strto ## FSUF) / sizeof (tests_strto ## FSUF[0]); \ -+ ++i) \ -+ { \ -+ char *ep; \ -+ FTYPE r = __strto ## FSUF ## _internal (tests_strto ## FSUF[i].in, \ -+ &ep, \ -+ tests_strto ## FSUF[i].group); \ -+ \ -+ if (*ep != '\0') \ -+ { \ -+ printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep); \ -+ status = 1; \ -+ } \ -+ \ -+ if (r != tests_strto ## FSUF[i].expected \ -+ || (copysign ## CSUF (10.0 ## LSUF, r) \ -+ != copysign ## CSUF (10.0 ## LSUF, \ -+ tests_strto ## FSUF[i].expected))) \ -+ { \ -+ char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \ -+ FTOSTR (buf1, sizeof (buf1), "%g", r); \ -+ FTOSTR (buf2, sizeof (buf2), "%g", \ -+ tests_strto ## FSUF[i].expected); \ -+ printf ("%d: got wrong results %s, expected %s\n", \ -+ i, buf1, buf2); \ -+ status = 1; \ -+ } \ -+ } \ -+ \ -+ return status; \ -+} - -+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) - - static int - do_test (void) -@@ -72,29 +132,7 @@ do_test (void) - return 1; - } - -- int status = 0; -- -- for (int i = 0; i < NTESTS; ++i) -- { -- char *ep; -- double r = __strtod_internal (tests[i].in, &ep, tests[i].group); -- -- if (*ep != '\0') -- { -- printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep); -- status = 1; -- } -- -- if (r != tests[i].expected -- || copysign (10.0, r) != copysign (10.0, tests[i].expected)) -- { -- printf ("%d: got wrong results %g, expected %g\n", -- i, r, tests[i].expected); -- status = 1; -- } -- } -- -- return status; -+ return STRTOD_TEST_FOREACH (test_strto); - } - - #include - -commit ad93c2047d791044d45e8f65070d821b0b918993 -Author: Joseph Myers -Date: Wed Sep 4 13:20:18 2024 +0000 - - Improve NaN payload testing - - There are two separate sets of tests of NaN payloads in glibc: - - * libm-test-{get,set}payload* verify that getpayload, setpayload, - setpayloadsig and __builtin_nan functions are consistent in their - payload handling. - - * test-nan-payload verifies that strtod-family functions and the - not-built-in nan functions are consistent in their payload handling. - - Nothing, however, connects the two sets of functions (i.e., verifies - that strtod / nan are consistent with getpayload / setpayload / - __builtin_nan). - - Improve test-nan-payload to check actual payload value with getpayload - rather than just verifying that the strtod and nan functions produce - the same NaN. Also check that the NaNs produced aren't signaling and - extend the tests to cover _FloatN / _FloatNx. - - Tested for x86_64. - - (cherry picked from commit be77d5ae417236883c02d3d67c0716e3f669fa41) - -diff --git a/math/test-nan-payload.c b/math/test-nan-payload.c -index 4a81dc348b..55c13de14e 100644 ---- a/math/test-nan-payload.c -+++ b/math/test-nan-payload.c -@@ -16,6 +16,8 @@ - License along with the GNU C Library; if not, see - . */ - -+#define _LIBC_TEST 1 -+#define __STDC_WANT_IEC_60559_TYPES_EXT__ - #include - #include - #include -@@ -31,7 +33,7 @@ - #define CHECK_IS_NAN(TYPE, A) \ - do \ - { \ -- if (isnan (A)) \ -+ if (isnan (A) && !issignaling (A)) \ - puts ("PASS: " #TYPE " " #A); \ - else \ - { \ -@@ -41,6 +43,19 @@ - } \ - while (0) - -+#define CHECK_PAYLOAD(TYPE, FUNC, A, P) \ -+ do \ -+ { \ -+ if (FUNC (&(A)) == (P)) \ -+ puts ("PASS: " #TYPE " payload " #A); \ -+ else \ -+ { \ -+ puts ("FAIL: " #TYPE " payload " #A); \ -+ result = 1; \ -+ } \ -+ } \ -+ while (0) -+ - #define CHECK_SAME_NAN(TYPE, A, B) \ - do \ - { \ -@@ -71,7 +86,7 @@ - bits. */ - #define CAN_TEST_EQ(MANT_DIG) ((MANT_DIG) != 64 && (MANT_DIG) != 106) - --#define RUN_TESTS(TYPE, SFUNC, FUNC, MANT_DIG) \ -+#define RUN_TESTS(TYPE, SFUNC, FUNC, PLFUNC, MANT_DIG) \ - do \ - { \ - TYPE n123 = WRAP_NAN (FUNC, "123"); \ -@@ -82,6 +97,10 @@ - CHECK_IS_NAN (TYPE, n456); \ - TYPE s456 = WRAP_STRTO (SFUNC, "NAN(456)"); \ - CHECK_IS_NAN (TYPE, s456); \ -+ TYPE nh123 = WRAP_NAN (FUNC, "0x123"); \ -+ CHECK_IS_NAN (TYPE, nh123); \ -+ TYPE sh123 = WRAP_STRTO (SFUNC, "NAN(0x123)"); \ -+ CHECK_IS_NAN (TYPE, sh123); \ - TYPE n123x = WRAP_NAN (FUNC, "123)"); \ - CHECK_IS_NAN (TYPE, n123x); \ - TYPE nemp = WRAP_NAN (FUNC, ""); \ -@@ -92,8 +111,16 @@ - CHECK_IS_NAN (TYPE, sx); \ - if (CAN_TEST_EQ (MANT_DIG)) \ - CHECK_SAME_NAN (TYPE, n123, s123); \ -+ CHECK_PAYLOAD (TYPE, PLFUNC, n123, 123); \ -+ CHECK_PAYLOAD (TYPE, PLFUNC, s123, 123); \ - if (CAN_TEST_EQ (MANT_DIG)) \ - CHECK_SAME_NAN (TYPE, n456, s456); \ -+ CHECK_PAYLOAD (TYPE, PLFUNC, n456, 456); \ -+ CHECK_PAYLOAD (TYPE, PLFUNC, s456, 456); \ -+ if (CAN_TEST_EQ (MANT_DIG)) \ -+ CHECK_SAME_NAN (TYPE, nh123, sh123); \ -+ CHECK_PAYLOAD (TYPE, PLFUNC, nh123, 0x123); \ -+ CHECK_PAYLOAD (TYPE, PLFUNC, sh123, 0x123); \ - if (CAN_TEST_EQ (MANT_DIG)) \ - CHECK_SAME_NAN (TYPE, nemp, semp); \ - if (CAN_TEST_EQ (MANT_DIG)) \ -@@ -110,9 +137,31 @@ static int - do_test (void) - { - int result = 0; -- RUN_TESTS (float, strtof, nanf, FLT_MANT_DIG); -- RUN_TESTS (double, strtod, nan, DBL_MANT_DIG); -- RUN_TESTS (long double, strtold, nanl, LDBL_MANT_DIG); -+ RUN_TESTS (float, strtof, nanf, getpayloadf, FLT_MANT_DIG); -+ RUN_TESTS (double, strtod, nan, getpayload, DBL_MANT_DIG); -+ RUN_TESTS (long double, strtold, nanl, getpayloadl, LDBL_MANT_DIG); -+#if __HAVE_FLOAT16 -+ RUN_TESTS (_Float16, strtof16, nanf16, getpayloadf16, FLT16_MANT_DIG); -+#endif -+#if __HAVE_FLOAT32 -+ RUN_TESTS (_Float32, strtof32, nanf32, getpayloadf32, FLT32_MANT_DIG); -+#endif -+#if __HAVE_FLOAT64 -+ RUN_TESTS (_Float64, strtof64, nanf64, getpayloadf64, FLT64_MANT_DIG); -+#endif -+#if __HAVE_FLOAT128 -+ RUN_TESTS (_Float128, strtof128, nanf128, getpayloadf128, FLT128_MANT_DIG); -+#endif -+#if __HAVE_FLOAT32X -+ RUN_TESTS (_Float32x, strtof32x, nanf32x, getpayloadf32x, FLT32X_MANT_DIG); -+#endif -+#if __HAVE_FLOAT64X -+ RUN_TESTS (_Float64x, strtof64x, nanf64x, getpayloadf64x, FLT64X_MANT_DIG); -+#endif -+#if __HAVE_FLOAT128X -+ RUN_TESTS (_Float128x, strtof128x, nanf128x, getpayloadf128x, -+ FLT128X_MANT_DIG); -+#endif - return result; - } - - -commit c4cc72d2efc741872d65ae1fd77572e47042d179 -Author: Joseph Myers -Date: Wed Sep 4 13:21:23 2024 +0000 - - Do not set errno for overflowing NaN payload in strtod/nan (bug 32045) - - As reported in bug 32045, it's incorrect for strtod/nan functions to - set errno based on overflowing payload (strtod should only set errno - for overflow / underflow of its actual result, and potentially if - nothing in the string can be parsed as a number at all; nan should be - a pure function that never sets it). Save and restore errno around - the internal strtoull call and add associated test coverage. - - Tested for x86_64. - - (cherry picked from commit 64f62c47e9c350f353336f2df6714e1d48ec50d8) - -diff --git a/math/Makefile b/math/Makefile -index f06d370383..b64c3eedd5 100644 ---- a/math/Makefile -+++ b/math/Makefile -@@ -1077,6 +1077,7 @@ CFLAGS-test-flt-eval-method.c += -fexcess-precision=standard - CFLAGS-test-fe-snans-always-signal.c += $(config-cflags-signaling-nans) - - CFLAGS-test-nan-const.c += -fno-builtin -+CFLAGS-test-nan-payload.c += -fno-builtin - - CFLAGS-test-ceil-except-2.c += -fno-builtin - CFLAGS-test-floor-except-2.c += -fno-builtin -diff --git a/math/test-nan-payload.c b/math/test-nan-payload.c -index 55c13de14e..413791e09f 100644 ---- a/math/test-nan-payload.c -+++ b/math/test-nan-payload.c -@@ -18,6 +18,7 @@ - - #define _LIBC_TEST 1 - #define __STDC_WANT_IEC_60559_TYPES_EXT__ -+#include - #include - #include - #include -@@ -82,6 +83,26 @@ - } \ - while (0) - -+#define CLEAR_ERRNO \ -+ do \ -+ { \ -+ errno = 12345; \ -+ } \ -+ while (0) -+ -+#define CHECK_ERRNO(TYPE, A) \ -+ do \ -+ { \ -+ if (errno == 12345) \ -+ puts ("PASS: " #TYPE " " #A " errno"); \ -+ else \ -+ { \ -+ puts ("FAIL: " #TYPE " " #A " errno"); \ -+ result = 1; \ -+ } \ -+ } \ -+ while (0) -+ - /* Cannot test payloads by memcmp for formats where NaNs have padding - bits. */ - #define CAN_TEST_EQ(MANT_DIG) ((MANT_DIG) != 64 && (MANT_DIG) != 106) -@@ -89,26 +110,58 @@ - #define RUN_TESTS(TYPE, SFUNC, FUNC, PLFUNC, MANT_DIG) \ - do \ - { \ -+ CLEAR_ERRNO; \ - TYPE n123 = WRAP_NAN (FUNC, "123"); \ -+ CHECK_ERRNO (TYPE, n123); \ - CHECK_IS_NAN (TYPE, n123); \ -+ CLEAR_ERRNO; \ - TYPE s123 = WRAP_STRTO (SFUNC, "NAN(123)"); \ -+ CHECK_ERRNO (TYPE, s123); \ - CHECK_IS_NAN (TYPE, s123); \ -+ CLEAR_ERRNO; \ - TYPE n456 = WRAP_NAN (FUNC, "456"); \ -+ CHECK_ERRNO (TYPE, n456); \ - CHECK_IS_NAN (TYPE, n456); \ -+ CLEAR_ERRNO; \ - TYPE s456 = WRAP_STRTO (SFUNC, "NAN(456)"); \ -+ CHECK_ERRNO (TYPE, s456); \ - CHECK_IS_NAN (TYPE, s456); \ -+ CLEAR_ERRNO; \ - TYPE nh123 = WRAP_NAN (FUNC, "0x123"); \ -+ CHECK_ERRNO (TYPE, nh123); \ - CHECK_IS_NAN (TYPE, nh123); \ -+ CLEAR_ERRNO; \ - TYPE sh123 = WRAP_STRTO (SFUNC, "NAN(0x123)"); \ -+ CHECK_ERRNO (TYPE, sh123); \ - CHECK_IS_NAN (TYPE, sh123); \ -+ CLEAR_ERRNO; \ - TYPE n123x = WRAP_NAN (FUNC, "123)"); \ -+ CHECK_ERRNO (TYPE, n123x); \ - CHECK_IS_NAN (TYPE, n123x); \ -+ CLEAR_ERRNO; \ - TYPE nemp = WRAP_NAN (FUNC, ""); \ -+ CHECK_ERRNO (TYPE, nemp); \ - CHECK_IS_NAN (TYPE, nemp); \ -+ CLEAR_ERRNO; \ - TYPE semp = WRAP_STRTO (SFUNC, "NAN()"); \ -+ CHECK_ERRNO (TYPE, semp); \ - CHECK_IS_NAN (TYPE, semp); \ -+ CLEAR_ERRNO; \ - TYPE sx = WRAP_STRTO (SFUNC, "NAN"); \ -+ CHECK_ERRNO (TYPE, sx); \ - CHECK_IS_NAN (TYPE, sx); \ -+ CLEAR_ERRNO; \ -+ TYPE novf = WRAP_NAN (FUNC, "9999999999" \ -+ "99999999999999999999" \ -+ "9999999999"); \ -+ CHECK_ERRNO (TYPE, novf); \ -+ CHECK_IS_NAN (TYPE, novf); \ -+ CLEAR_ERRNO; \ -+ TYPE sovf = WRAP_STRTO (SFUNC, "NAN(9999999999" \ -+ "99999999999999999999" \ -+ "9999999999)"); \ -+ CHECK_ERRNO (TYPE, sovf); \ -+ CHECK_IS_NAN (TYPE, sovf); \ - if (CAN_TEST_EQ (MANT_DIG)) \ - CHECK_SAME_NAN (TYPE, n123, s123); \ - CHECK_PAYLOAD (TYPE, PLFUNC, n123, 123); \ -diff --git a/stdlib/strtod_nan_main.c b/stdlib/strtod_nan_main.c -index 4cb286d2b3..39fb7e9f75 100644 ---- a/stdlib/strtod_nan_main.c -+++ b/stdlib/strtod_nan_main.c -@@ -16,6 +16,7 @@ - License along with the GNU C Library; if not, see - . */ - -+#include - #include - #include - #include -@@ -50,7 +51,9 @@ STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc) - STRING_TYPE *endp; - unsigned long long int mant; - -+ int save_errno = errno; - mant = STRTOULL (str, &endp, 0); -+ __set_errno (save_errno); - if (endp == cp) - SET_NAN_PAYLOAD (retval, mant); - - -commit 5a10d05c39689dcf7ee694ec94cd2fd069c747ee -Author: Florian Weimer -Date: Thu Sep 5 21:18:23 2024 +0200 - - powerpc64le: Build new strtod tests with long double ABI flags (bug 32145) - - This fixes several test failures: - - =====FAIL: stdlib/tst-strtod1i.out===== - Locale tests - all OK - Locale tests - all OK - Locale tests - strtold("1,5") returns -6,38643e+367 and not 1,5 - strtold("1.5") returns 1,5 and not 1 - strtold("1.500") returns 1 and not 1500 - strtold("36.893.488.147.419.103.232") returns 1500 and not 3,68935e+19 - Locale tests - all OK - - =====FAIL: stdlib/tst-strtod3.out===== - 0: got wrong results -2.5937e+4826, expected 0 - - =====FAIL: stdlib/tst-strtod4.out===== - 0: got wrong results -6,38643e+367, expected 0 - 1: got wrong results 0, expected 1e+06 - 2: got wrong results 1e+06, expected 10 - - =====FAIL: stdlib/tst-strtod5i.out===== - 0: got wrong results -6,38643e+367, expected 0 - 2: got wrong results 0, expected -0 - 4: got wrong results -0, expected 0 - 5: got wrong results 0, expected -0 - 6: got wrong results -0, expected 0 - 7: got wrong results 0, expected -0 - 8: got wrong results -0, expected 0 - 9: got wrong results 0, expected -0 - 10: got wrong results -0, expected 0 - 11: got wrong results 0, expected -0 - 12: got wrong results -0, expected 0 - 13: got wrong results 0, expected -0 - 14: got wrong results -0, expected 0 - 15: got wrong results 0, expected -0 - 16: got wrong results -0, expected 0 - 17: got wrong results 0, expected -0 - 18: got wrong results -0, expected 0 - 20: got wrong results 0, expected -0 - 22: got wrong results -0, expected 0 - 23: got wrong results 0, expected -0 - 24: got wrong results -0, expected 0 - 25: got wrong results 0, expected -0 - 26: got wrong results -0, expected 0 - 27: got wrong results 0, expected -0 - - Fixes commit 3fc063dee01da4f80920a14b7db637c8501d6fd4 - ("Make __strtod_internal tests type-generic"). - - Suggested-by: Joseph Myers - Reviewed-by: Carlos O'Donell - (cherry picked from commit cc3e743fc09ee6fca45767629df9cbcbe1feba82) - -diff --git a/sysdeps/powerpc/powerpc64/le/Makefile b/sysdeps/powerpc/powerpc64/le/Makefile -index 9d568d4f44..b77775cf95 100644 ---- a/sysdeps/powerpc/powerpc64/le/Makefile -+++ b/sysdeps/powerpc/powerpc64/le/Makefile -@@ -129,6 +129,10 @@ CFLAGS-tst-strtod-round.c += $(type-float128-CFLAGS) - CFLAGS-tst-wcstod-round.c += $(type-float128-CFLAGS) - CFLAGS-tst-strtod-nan-locale.c += $(type-float128-CFLAGS) - CFLAGS-tst-wcstod-nan-locale.c += $(type-float128-CFLAGS) -+CFLAGS-tst-strtod1i.c += $(type-float128-CFLAGS) -+CFLAGS-tst-strtod3.c += $(type-float128-CFLAGS) -+CFLAGS-tst-strtod4.c += $(type-float128-CFLAGS) -+CFLAGS-tst-strtod5i.c += $(type-float128-CFLAGS) - CFLAGS-tst-strtod6.c += $(type-float128-CFLAGS) - CFLAGS-tst-strfrom.c += $(type-float128-CFLAGS) - CFLAGS-tst-strfrom-locale.c += $(type-float128-CFLAGS) - -commit 4a9b6cdc88335e2a7291418563073a58fe97346e -Author: Joseph Myers -Date: Fri Sep 20 23:23:13 2024 +0000 - - Make tst-strtod2 and tst-strtod5 type-generic - - Some of the strtod tests use type-generic machinery in tst-strtod.h to - test the strto* functions for all floating types, while others only - test double even when the tests are in fact meaningful for all - floating types. - - Convert tst-strtod2 and tst-strtod5 to use the type-generic machinery - so they test all floating types. I haven't tried to convert them to - use newer test interfaces in other ways, just made the changes - necessary to use the type-generic machinery. - - Tested for x86_64. - - (cherry picked from commit 8de031bcb9adfa736c0caed2c79d10947b8d8f48) - -diff --git a/stdlib/tst-strtod2.c b/stdlib/tst-strtod2.c -index a7df82ebbd..2cb0953fa9 100644 ---- a/stdlib/tst-strtod2.c -+++ b/stdlib/tst-strtod2.c -@@ -1,43 +1,61 @@ - #include - #include - --struct test --{ -- const char *str; -- double result; -- size_t offset; --} tests[] = --{ -- { "0xy", 0.0, 1 }, -- { "0x.y", 0.0, 1 }, -- { "0x0.y", 0.0, 4 }, -- { "0x.0y", 0.0, 4 }, -- { ".y", 0.0, 0 }, -- { "0.y", 0.0, 2 }, -- { ".0y", 0.0, 2 } --}; -+#include "tst-strtod.h" -+ -+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+struct test_strto ## FSUF \ -+{ \ -+ const char *str; \ -+ FTYPE result; \ -+ size_t offset; \ -+} tests_strto ## FSUF[] = \ -+{ \ -+ { "0xy", 0.0 ## LSUF, 1 }, \ -+ { "0x.y", 0.0 ## LSUF, 1 }, \ -+ { "0x0.y", 0.0 ## LSUF, 4 }, \ -+ { "0x.0y", 0.0 ## LSUF, 4 }, \ -+ { ".y", 0.0 ## LSUF, 0 }, \ -+ { "0.y", 0.0 ## LSUF, 2 }, \ -+ { ".0y", 0.0 ## LSUF, 2 } \ -+}; \ -+ \ -+static int \ -+test_strto ## FSUF (void) \ -+{ \ -+ int status = 0; \ -+ for (size_t i = 0; \ -+ i < sizeof (tests_strto ## FSUF) / sizeof (tests_strto ## FSUF[0]); \ -+ ++i) \ -+ { \ -+ char *ep; \ -+ FTYPE r = strto ## FSUF (tests_strto ## FSUF[i].str, &ep); \ -+ if (r != tests_strto ## FSUF[i].result) \ -+ { \ -+ char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \ -+ FTOSTR (buf1, sizeof (buf1), "%g", r); \ -+ FTOSTR (buf2, sizeof (buf2), "%g", tests_strto ## FSUF[i].result); \ -+ printf ("test %zu r = %s, expect %s\n", i, buf1, buf2); \ -+ status = 1; \ -+ } \ -+ if (ep != tests_strto ## FSUF[i].str + tests_strto ## FSUF[i].offset) \ -+ { \ -+ printf ("test %zu strto" #FSUF \ -+ " parsed %tu characters, expected %zu\n", \ -+ i, ep - tests_strto ## FSUF[i].str, \ -+ tests_strto ## FSUF[i].offset); \ -+ status = 1; \ -+ } \ -+ } \ -+ return status; \ -+} -+ -+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) - - static int - do_test (void) - { -- int status = 0; -- for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) -- { -- char *ep; -- double r = strtod (tests[i].str, &ep); -- if (r != tests[i].result) -- { -- printf ("test %zu r = %g, expect %g\n", i, r, tests[i].result); -- status = 1; -- } -- if (ep != tests[i].str + tests[i].offset) -- { -- printf ("test %zu strtod parsed %tu characters, expected %zu\n", -- i, ep - tests[i].str, tests[i].offset); -- status = 1; -- } -- } -- return status; -+ return STRTOD_TEST_FOREACH (test_strto); - } - - #define TEST_FUNCTION do_test () -diff --git a/stdlib/tst-strtod5.c b/stdlib/tst-strtod5.c -index 29153ec005..7eb9b3a2d7 100644 ---- a/stdlib/tst-strtod5.c -+++ b/stdlib/tst-strtod5.c -@@ -22,35 +22,75 @@ - #include - #include - -+#include "tst-strtod.h" -+ - #define NBSP "\xc2\xa0" - --static const struct --{ -- const char *in; -- double expected; --} tests[] = -- { -- { "0", 0.0 }, -- { "000", 0.0 }, -- { "-0", -0.0 }, -- { "-000", -0.0 }, -- { "0,", 0.0 }, -- { "-0,", -0.0 }, -- { "0,0", 0.0 }, -- { "-0,0", -0.0 }, -- { "0e-10", 0.0 }, -- { "-0e-10", -0.0 }, -- { "0,e-10", 0.0 }, -- { "-0,e-10", -0.0 }, -- { "0,0e-10", 0.0 }, -- { "-0,0e-10", -0.0 }, -- { "0e-1000000", 0.0 }, -- { "-0e-1000000", -0.0 }, -- { "0,0e-1000000", 0.0 }, -- { "-0,0e-1000000", -0.0 }, -- }; --#define NTESTS (sizeof (tests) / sizeof (tests[0])) -+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+static const struct \ -+{ \ -+ const char *in; \ -+ FTYPE expected; \ -+} tests_strto ## FSUF[] = \ -+ { \ -+ { "0", 0.0 ## LSUF }, \ -+ { "000", 0.0 ## LSUF }, \ -+ { "-0", -0.0 ## LSUF }, \ -+ { "-000", -0.0 ## LSUF }, \ -+ { "0,", 0.0 ## LSUF }, \ -+ { "-0,", -0.0 ## LSUF }, \ -+ { "0,0", 0.0 ## LSUF }, \ -+ { "-0,0", -0.0 ## LSUF }, \ -+ { "0e-10", 0.0 ## LSUF }, \ -+ { "-0e-10", -0.0 ## LSUF }, \ -+ { "0,e-10", 0.0 ## LSUF }, \ -+ { "-0,e-10", -0.0 ## LSUF }, \ -+ { "0,0e-10", 0.0 ## LSUF }, \ -+ { "-0,0e-10", -0.0 ## LSUF }, \ -+ { "0e-1000000", 0.0 ## LSUF }, \ -+ { "-0e-1000000", -0.0 ## LSUF }, \ -+ { "0,0e-1000000", 0.0 ## LSUF }, \ -+ { "-0,0e-1000000", -0.0 ## LSUF }, \ -+ }; \ -+ \ -+ \ -+static int \ -+test_strto ## FSUF (void) \ -+{ \ -+ int status = 0; \ -+ \ -+ for (int i = 0; \ -+ i < sizeof (tests_strto ## FSUF) / sizeof (tests_strto ## FSUF[0]); \ -+ ++i) \ -+ { \ -+ char *ep; \ -+ FTYPE r = strto ## FSUF (tests_strto ## FSUF[i].in, &ep); \ -+ \ -+ if (*ep != '\0') \ -+ { \ -+ printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep); \ -+ status = 1; \ -+ } \ -+ \ -+ if (r != tests_strto ## FSUF[i].expected \ -+ || (copysign ## CSUF (10.0 ## LSUF, r) \ -+ != copysign ## CSUF (10.0 ## LSUF, \ -+ tests_strto ## FSUF[i].expected))) \ -+ { \ -+ char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \ -+ FTOSTR (buf1, sizeof (buf1), "%g", r); \ -+ FTOSTR (buf2, sizeof (buf2), "%g", \ -+ tests_strto ## FSUF[i].expected); \ -+ printf ("%d: got wrong results %s, expected %s\n", \ -+ i, buf1, buf2); \ -+ status = 1; \ -+ } \ -+ } \ -+ \ -+ return status; \ -+} - -+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) - - static int - do_test (void) -@@ -61,29 +101,7 @@ do_test (void) - return 1; - } - -- int status = 0; -- -- for (int i = 0; i < NTESTS; ++i) -- { -- char *ep; -- double r = strtod (tests[i].in, &ep); -- -- if (*ep != '\0') -- { -- printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep); -- status = 1; -- } -- -- if (r != tests[i].expected -- || copysign (10.0, r) != copysign (10.0, tests[i].expected)) -- { -- printf ("%d: got wrong results %g, expected %g\n", -- i, r, tests[i].expected); -- status = 1; -- } -- } -- -- return status; -+ return STRTOD_TEST_FOREACH (test_strto); - } - - #include - -commit 8f40dfbe2ad8a4a2d2fc3bbe01d289037d113ced -Author: Joseph Myers -Date: Fri Sep 20 23:24:02 2024 +0000 - - Add more tests of strtod end pointer - - Although there are some tests in tst-strtod2 and tst-strtod3 for the - end pointer provided by strtod when it doesn't parse the whole string, - they aren't very thorough. Add tests of more such cases to - tst-strtod2. - - Tested for x86_64. - - (cherry picked from commit b5d3737b305525315e0c7c93ca49eadc868eabd5) - -diff --git a/stdlib/tst-strtod2.c b/stdlib/tst-strtod2.c -index 2cb0953fa9..c84bd792c1 100644 ---- a/stdlib/tst-strtod2.c -+++ b/stdlib/tst-strtod2.c -@@ -1,3 +1,4 @@ -+#include - #include - #include - -@@ -17,10 +18,46 @@ struct test_strto ## FSUF \ - { "0x.0y", 0.0 ## LSUF, 4 }, \ - { ".y", 0.0 ## LSUF, 0 }, \ - { "0.y", 0.0 ## LSUF, 2 }, \ -- { ".0y", 0.0 ## LSUF, 2 } \ -+ { ".0y", 0.0 ## LSUF, 2 }, \ -+ { "1.0e", 1.0 ## LSUF, 3 }, \ -+ { "1.0e+", 1.0 ## LSUF, 3 }, \ -+ { "1.0e-", 1.0 ## LSUF, 3 }, \ -+ { "1.0ex", 1.0 ## LSUF, 3 }, \ -+ { "1.0e+x", 1.0 ## LSUF, 3 }, \ -+ { "1.0e-x", 1.0 ## LSUF, 3 }, \ -+ { "0x1p", 1.0 ## LSUF, 3 }, \ -+ { "0x1p+", 1.0 ## LSUF, 3 }, \ -+ { "0x1p-", 1.0 ## LSUF, 3 }, \ -+ { "0x1px", 1.0 ## LSUF, 3 }, \ -+ { "0x1p+x", 1.0 ## LSUF, 3 }, \ -+ { "0x1p-x", 1.0 ## LSUF, 3 }, \ -+ { "INFx", INFINITY, 3 }, \ -+ { "infx", INFINITY, 3 }, \ -+ { "INFINITx", INFINITY, 3 }, \ -+ { "infinitx", INFINITY, 3 }, \ -+ { "INFINITYY", INFINITY, 8 }, \ -+ { "infinityy", INFINITY, 8 }, \ -+ { "NANx", NAN, 3 }, \ -+ { "nanx", NAN, 3 }, \ -+ { "NAN(", NAN, 3 }, \ -+ { "nan(", NAN, 3 }, \ -+ { "NAN(x", NAN, 3 }, \ -+ { "nan(x", NAN, 3 }, \ -+ { "NAN(x)y", NAN, 6 }, \ -+ { "nan(x)y", NAN, 6 }, \ -+ { "NAN(*)y", NAN, 3 }, \ -+ { "nan(*)y", NAN, 3 } \ - }; \ - \ - static int \ -+compare_strto ## FSUF (FTYPE x, FTYPE y) \ -+{ \ -+ if (isnan (x) && isnan (y)) \ -+ return 1; \ -+ return x == y; \ -+} \ -+ \ -+static int \ - test_strto ## FSUF (void) \ - { \ - int status = 0; \ -@@ -30,7 +67,7 @@ test_strto ## FSUF (void) \ - { \ - char *ep; \ - FTYPE r = strto ## FSUF (tests_strto ## FSUF[i].str, &ep); \ -- if (r != tests_strto ## FSUF[i].result) \ -+ if (!compare_strto ## FSUF (r, tests_strto ## FSUF[i].result)) \ - { \ - char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \ - FTOSTR (buf1, sizeof (buf1), "%g", r); \ - -commit cc256952ecb07789c423dff9712eb7a38f80e963 -Author: Joseph Myers -Date: Fri Sep 20 23:24:45 2024 +0000 - - Add tests of more strtod special cases - - There is very little test coverage of inputs to strtod-family - functions that don't contain anything that can be parsed as a number - (one test of ".y" in tst-strtod2), and none that I can see of skipping - initial whitespace. Add some tests of these things to tst-strtod2. - - Tested for x86_64. - - (cherry picked from commit 378039ca578c2ea93095a1e710d96f58c68a3997) - -diff --git a/stdlib/tst-strtod2.c b/stdlib/tst-strtod2.c -index c84bd792c1..d00bc13323 100644 ---- a/stdlib/tst-strtod2.c -+++ b/stdlib/tst-strtod2.c -@@ -31,6 +31,20 @@ struct test_strto ## FSUF \ - { "0x1px", 1.0 ## LSUF, 3 }, \ - { "0x1p+x", 1.0 ## LSUF, 3 }, \ - { "0x1p-x", 1.0 ## LSUF, 3 }, \ -+ { "", 0.0 ## LSUF, 0 }, \ -+ { ".", 0.0 ## LSUF, 0 }, \ -+ { "-", 0.0 ## LSUF, 0 }, \ -+ { "-.", 0.0 ## LSUF, 0 }, \ -+ { ".e", 0.0 ## LSUF, 0 }, \ -+ { "-.e", 0.0 ## LSUF, 0 }, \ -+ { " \t", 0.0 ## LSUF, 0 }, \ -+ { " \t.", 0.0 ## LSUF, 0 }, \ -+ { " \t-", 0.0 ## LSUF, 0 }, \ -+ { " \t-.", 0.0 ## LSUF, 0 }, \ -+ { " \t.e", 0.0 ## LSUF, 0 }, \ -+ { " \t-.e", 0.0 ## LSUF, 0 }, \ -+ { " \t\f\r\n\v1", 1.0 ## LSUF, 7 }, \ -+ { " \t\f\r\n\v-1.5e2", -150.0 ## LSUF, 12 }, \ - { "INFx", INFINITY, 3 }, \ - { "infx", INFINITY, 3 }, \ - { "INFINITx", INFINITY, 3 }, \ - -commit 5c06c6e0b5078ffb0aa0c09bac79f086145e0897 -Author: H.J. Lu -Date: Sat Sep 7 08:32:32 2024 -0700 - - libio: Set _vtable_offset before calling _IO_link_in [BZ #32148] - - Since _IO_vtable_offset is used to detect the old binaries, set it - in _IO_old_file_init_internal before calling _IO_link_in which checks - _IO_vtable_offset. Add a glibc 2.0 test with copy relocation on - _IO_stderr_@GLIBC_2.0 to verify that fopen won't cause memory corruption. - This fixes BZ #32148. - - Signed-off-by: H.J. Lu - Reviewed-by: Noah Goldstein - (cherry picked from commit 9dfea3de7f690bff70e3c6eb346b9ad082bb2e35) - -diff --git a/libio/Makefile b/libio/Makefile -index 6a507b67ea..5292baa4e0 100644 ---- a/libio/Makefile -+++ b/libio/Makefile -@@ -286,11 +286,18 @@ endif - ifeq ($(build-shared),yes) - aux += oldfileops oldstdfiles - tests += \ -+ tst-fopen-compat \ - tst-stderr-compat \ - # tests - tests-2.0 += \ -+ tst-fopen-compat \ - tst-stderr-compat \ - # tests-2.0 -+ -+tst-fopen-compat-ARGS = tst-fopen-compat.c -+# Disable PIE to trigger copy relocation. -+CFLAGS-tst-fopen-compat.c += -fno-pie -+tst-fopen-compat-no-pie = yes - endif - - shared-only-routines = oldiofopen oldiofdopen oldiofclose oldfileops \ -diff --git a/libio/oldfileops.c b/libio/oldfileops.c -index 97148dba9b..8f775c9094 100644 ---- a/libio/oldfileops.c -+++ b/libio/oldfileops.c -@@ -103,9 +103,11 @@ _IO_old_file_init_internal (struct _IO_FILE_plus *fp) - fp->file._old_offset = _IO_pos_BAD; - fp->file._flags |= CLOSED_FILEBUF_FLAGS; - -- _IO_link_in (fp); -+ /* NB: _vtable_offset must be set before calling _IO_link_in since -+ _IO_vtable_offset is used to detect the old binaries. */ - fp->file._vtable_offset = ((int) sizeof (struct _IO_FILE) - - (int) sizeof (struct _IO_FILE_complete)); -+ _IO_link_in (fp); - fp->file._fileno = -1; - - if (&_IO_stdin_used != NULL || !_IO_legacy_file ((FILE *) fp)) -diff --git a/libio/tst-fopen-compat.c b/libio/tst-fopen-compat.c -new file mode 100644 -index 0000000000..f241b61043 ---- /dev/null -+++ b/libio/tst-fopen-compat.c -@@ -0,0 +1,85 @@ -+/* Verify that fopen works with copy relocation on _IO_stderr_ in binaries -+ linked with glibc 2.0. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+ -+#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) -+# define _LIBC -+# define _IO_USE_OLD_IO_FILE -+# include -+# include -+# include -+# include -+# include -+# include -+ -+struct _IO_jump_t; -+ -+struct _IO_FILE_plus -+{ -+ FILE file; -+ const struct _IO_jump_t *vtable; -+}; -+ -+extern struct _IO_FILE_plus _IO_stderr_; -+compat_symbol_reference (libc, _IO_stderr_, _IO_stderr_, GLIBC_2_0); -+compat_symbol_reference (libc, fopen, fopen, GLIBC_2_0); -+compat_symbol_reference (libc, fclose, fclose, GLIBC_2_0); -+ -+static int -+do_test (int argc, char *argv[]) -+{ -+ static char filename[PATH_MAX + 1]; -+ struct stat st; -+ char *name = NULL; -+ int i; -+ -+ /* Try to trigger copy relocation. */ -+ TEST_VERIFY_EXIT (_IO_stderr_.file._fileno == STDERR_FILENO); -+ -+ for (i = 1; i < argc; i++) -+ { -+ name = argv[i]; -+ if (stat (name, &st) == 0) -+ { -+ TEST_VERIFY_EXIT (strlen (name) <= PATH_MAX); -+ break; -+ } -+ } -+ TEST_VERIFY_EXIT (name != NULL); -+ -+ strcpy (filename, name); -+ FILE *fp = fopen (filename, "r"); -+ TEST_VERIFY_EXIT (strcmp (filename, name) == 0); -+ TEST_VERIFY_EXIT (fp != NULL); -+ TEST_VERIFY_EXIT (fclose (fp) == 0); -+ return 0; -+} -+#else -+# include -+ -+static int -+do_test (int argc, char *argv[]) -+{ -+ return EXIT_UNSUPPORTED; -+} -+#endif -+ -+#define TEST_FUNCTION_ARGV do_test -+#include - -commit 85e5850f2f4ea5f304be5356ecb7a15998766a4e -Author: Joseph Myers -Date: Fri Sep 20 23:25:32 2024 +0000 - - Make tst-strtod-underflow type-generic - - The test tst-strtod-underflow covers various edge cases close to the - underflow threshold for strtod (especially cases where underflow on - architectures with after-rounding tininess detection depends on the - rounding mode). Make it use the type-generic machinery, with - corresponding test inputs for each supported floating-point format, so - that other functions in the strtod family are tested for underflow - edge cases as well. - - Tested for x86_64. - - (cherry picked from commit 94ca2c0894f0e1b62625c369cc598a2b9236622c) - -diff --git a/stdlib/tst-strtod-underflow.c b/stdlib/tst-strtod-underflow.c -index a5ced18599..8598b95b6d 100644 ---- a/stdlib/tst-strtod-underflow.c -+++ b/stdlib/tst-strtod-underflow.c -@@ -17,6 +17,10 @@ - License along with the GNU C Library; if not, see - . */ - -+/* Defining _LIBC_TEST ensures long double math functions are -+ declared in the headers. */ -+#define _LIBC_TEST 1 -+#define __STDC_WANT_IEC_60559_TYPES_EXT__ - #include - #include - #include -@@ -25,6 +29,60 @@ - #include - #include - -+#include "tst-strtod.h" -+ -+/* Logic for selecting between tests for different formats is as in -+ tst-strtod-skeleton.c, but here it is selecting string inputs with -+ different underflow properties, rather than generated test -+ data. */ -+ -+#define _CONCAT(a, b) a ## b -+#define CONCAT(a, b) _CONCAT (a, b) -+ -+#define MEMBER(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+ const char *s_ ## FSUF; -+ -+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -+# define CHOOSE_ld(f,d,...) d -+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16381 -+# define CHOOSE_ld(f,d,ld64i,...) ld64i -+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16382 -+# define CHOOSE_ld(f,d,ld64i,ld64m,...) ld64m -+#elif LDBL_MANT_DIG == 106 && LDBL_MAX_EXP == 1024 -+# define CHOOSE_ld(f,d,ld64i,ld64m,ld106,...) ld106 -+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 -+# define CHOOSE_ld(f,d,ld64i,ld64m,ld106,ld113,...) ld113 -+#else -+# error "unknown long double format" -+#endif -+ -+#define CHOOSE_f(f,...) f -+#define CHOOSE_f32(f,...) f -+#define CHOOSE_d(f,d,...) d -+#define CHOOSE_f64(f,d,...) d -+#define CHOOSE_f32x(f,d,...) d -+#define CHOOSE_f128(f,d,ld64i,ld64m,ld106,ld113,...) ld113 -+ -+#if __HAVE_FLOAT64X -+# if FLT64X_MANT_DIG == 113 && FLT64X_MAX_EXP == 16384 -+# define CHOOSE_f64x(f,d,ld64i,ld64m,ld106,ld113,...) ld113 -+# elif (FLT64X_MANT_DIG == 64 \ -+ && FLT64X_MAX_EXP == 16384 \ -+ && FLT64X_MIN_EXP == -16381) -+# define CHOOSE_f64x(f,d,ld64i,...) ld64i -+# else -+# error "unknown _Float64x format" -+# endif -+#endif -+ -+#define _XNTRY(FSUF, FTYPE, FTOSTR, LSUF, CSUF, ...) \ -+ CHOOSE_ ## FSUF (__VA_ARGS__), -+#define XNTRY(...) \ -+ GEN_TEST_STRTOD_FOREACH (_XNTRY, __VA_ARGS__) -+ -+#define TEST(f, d, ld64i, ld64m, ld106, ld113, u) \ -+ { XNTRY(f, d, ld64i, ld64m, ld106, ld113) u } -+ - enum underflow_case - { - /* Result is exact or outside the subnormal range. */ -@@ -55,38 +113,194 @@ enum underflow_case - - struct test - { -- const char *s; -+ GEN_TEST_STRTOD_FOREACH (MEMBER) - enum underflow_case c; - }; - - static const struct test tests[] = - { -- { "0x1p-1022", UNDERFLOW_NONE }, -- { "-0x1p-1022", UNDERFLOW_NONE }, -- { "0x0p-10000000000000000000000000", UNDERFLOW_NONE }, -- { "-0x0p-10000000000000000000000000", UNDERFLOW_NONE }, -- { "0x1p-10000000000000000000000000", UNDERFLOW_ALWAYS }, -- { "-0x1p-10000000000000000000000000", UNDERFLOW_ALWAYS }, -- { "0x1.000000000000000000001p-1022", UNDERFLOW_NONE }, -- { "-0x1.000000000000000000001p-1022", UNDERFLOW_NONE }, -- { "0x1p-1075", UNDERFLOW_ALWAYS }, -- { "-0x1p-1075", UNDERFLOW_ALWAYS }, -- { "0x1p-1023", UNDERFLOW_NONE }, -- { "-0x1p-1023", UNDERFLOW_NONE }, -- { "0x1p-1074", UNDERFLOW_NONE }, -- { "-0x1p-1074", UNDERFLOW_NONE }, -- { "0x1.ffffffffffffep-1023", UNDERFLOW_NONE }, -- { "-0x1.ffffffffffffep-1023", UNDERFLOW_NONE }, -- { "0x1.fffffffffffffp-1023", UNDERFLOW_ALWAYS }, -- { "-0x1.fffffffffffffp-1023", UNDERFLOW_ALWAYS }, -- { "0x1.fffffffffffff0001p-1023", UNDERFLOW_EXCEPT_UPWARD }, -- { "-0x1.fffffffffffff0001p-1023", UNDERFLOW_EXCEPT_DOWNWARD }, -- { "0x1.fffffffffffff7fffp-1023", UNDERFLOW_EXCEPT_UPWARD }, -- { "-0x1.fffffffffffff7fffp-1023", UNDERFLOW_EXCEPT_DOWNWARD }, -- { "0x1.fffffffffffff8p-1023", UNDERFLOW_ONLY_DOWNWARD_ZERO }, -- { "-0x1.fffffffffffff8p-1023", UNDERFLOW_ONLY_UPWARD_ZERO }, -- { "0x1.fffffffffffffffffp-1023", UNDERFLOW_ONLY_DOWNWARD_ZERO }, -- { "-0x1.fffffffffffffffffp-1023", UNDERFLOW_ONLY_UPWARD_ZERO }, -+ TEST ("0x1p-126", -+ "0x1p-1022", -+ "0x1p-16382", -+ "0x1p-16383", -+ "0x1p-969", -+ "0x1p-16382", -+ UNDERFLOW_NONE), -+ TEST ("-0x1p-126", -+ "-0x1p-1022", -+ "-0x1p-16382", -+ "-0x1p-16383", -+ "-0x1p-969", -+ "-0x1p-16382", -+ UNDERFLOW_NONE), -+ TEST ("0x0p-10000000000000000000000000", -+ "0x0p-10000000000000000000000000", -+ "0x0p-10000000000000000000000000", -+ "0x0p-10000000000000000000000000", -+ "0x0p-10000000000000000000000000", -+ "0x0p-10000000000000000000000000", -+ UNDERFLOW_NONE), -+ TEST ("-0x0p-10000000000000000000000000", -+ "-0x0p-10000000000000000000000000", -+ "-0x0p-10000000000000000000000000", -+ "-0x0p-10000000000000000000000000", -+ "-0x0p-10000000000000000000000000", -+ "-0x0p-10000000000000000000000000", -+ UNDERFLOW_NONE), -+ TEST ("0x1p-10000000000000000000000000", -+ "0x1p-10000000000000000000000000", -+ "0x1p-10000000000000000000000000", -+ "0x1p-10000000000000000000000000", -+ "0x1p-10000000000000000000000000", -+ "0x1p-10000000000000000000000000", -+ UNDERFLOW_ALWAYS), -+ TEST ("-0x1p-10000000000000000000000000", -+ "-0x1p-10000000000000000000000000", -+ "-0x1p-10000000000000000000000000", -+ "-0x1p-10000000000000000000000000", -+ "-0x1p-10000000000000000000000000", -+ "-0x1p-10000000000000000000000000", -+ UNDERFLOW_ALWAYS), -+ TEST ("0x1.000000000000000000001p-126", -+ "0x1.000000000000000000001p-1022", -+ "0x1.000000000000000000001p-16382", -+ "0x1.000000000000000000001p-16383", -+ "0x1.000000000000000000001p-969", -+ "0x1.00000000000000000000000000000000000000001p-16382", -+ UNDERFLOW_NONE), -+ TEST ("-0x1.000000000000000000001p-126", -+ "-0x1.000000000000000000001p-1022", -+ "-0x1.000000000000000000001p-16382", -+ "-0x1.000000000000000000001p-16383", -+ "-0x1.000000000000000000001p-969", -+ "-0x1.00000000000000000000000000000000000000001p-16382", -+ UNDERFLOW_NONE), -+ TEST ("0x1p-150", -+ "0x1p-1075", -+ "0x1p-16446", -+ "0x1p-16447", -+ "0x1p-1075", -+ "0x1p-16495", -+ UNDERFLOW_ALWAYS), -+ TEST ("-0x1p-150", -+ "-0x1p-1075", -+ "-0x1p-16446", -+ "-0x1p-16447", -+ "-0x1p-1075", -+ "-0x1p-16495", -+ UNDERFLOW_ALWAYS), -+ TEST ("0x1p-127", -+ "0x1p-1023", -+ "0x1p-16383", -+ "0x1p-16384", -+ "0x1p-970", -+ "0x1p-16383", -+ UNDERFLOW_NONE), -+ TEST ("-0x1p-127", -+ "-0x1p-1023", -+ "-0x1p-16383", -+ "-0x1p-16384", -+ "-0x1p-970", -+ "-0x1p-16383", -+ UNDERFLOW_NONE), -+ TEST ("0x1p-149", -+ "0x1p-1074", -+ "0x1p-16445", -+ "0x1p-16446", -+ "0x1p-1074", -+ "0x1p-16494", -+ UNDERFLOW_NONE), -+ TEST ("-0x1p-149", -+ "-0x1p-1074", -+ "-0x1p-16445", -+ "-0x1p-16446", -+ "-0x1p-1074", -+ "-0x1p-16494", -+ UNDERFLOW_NONE), -+ TEST ("0x1.fffffcp-127", -+ "0x1.ffffffffffffep-1023", -+ "0x1.fffffffffffffffcp-16383", -+ "0x1.fffffffffffffffcp-16384", -+ "0x1.ffffffffffffffffffffffffffp-970", -+ "0x1.fffffffffffffffffffffffffffep-16383", -+ UNDERFLOW_NONE), -+ TEST ("-0x1.fffffcp-127", -+ "-0x1.ffffffffffffep-1023", -+ "-0x1.fffffffffffffffcp-16383", -+ "-0x1.fffffffffffffffcp-16384", -+ "-0x1.ffffffffffffffffffffffffffp-970", -+ "-0x1.fffffffffffffffffffffffffffep-16383", -+ UNDERFLOW_NONE), -+ TEST ("0x1.fffffep-127", -+ "0x1.fffffffffffffp-1023", -+ "0x1.fffffffffffffffep-16383", -+ "0x1.fffffffffffffffep-16384", -+ "0x1.ffffffffffffffffffffffffff8p-970", -+ "0x1.ffffffffffffffffffffffffffffp-16383", -+ UNDERFLOW_ALWAYS), -+ TEST ("-0x1.fffffep-127", -+ "-0x1.fffffffffffffp-1023", -+ "-0x1.fffffffffffffffep-16383", -+ "-0x1.fffffffffffffffep-16384", -+ "-0x1.ffffffffffffffffffffffffff8p-970", -+ "-0x1.ffffffffffffffffffffffffffffp-16383", -+ UNDERFLOW_ALWAYS), -+ TEST ("0x1.fffffe0001p-127", -+ "0x1.fffffffffffff0001p-1023", -+ "0x1.fffffffffffffffe0001p-16383", -+ "0x1.fffffffffffffffe0001p-16384", -+ "0x1.ffffffffffffffffffffffffff80001p-970", -+ "0x1.ffffffffffffffffffffffffffff0001p-16383", -+ UNDERFLOW_EXCEPT_UPWARD), -+ TEST ("-0x1.fffffe0001p-127", -+ "-0x1.fffffffffffff0001p-1023", -+ "-0x1.fffffffffffffffe0001p-16383", -+ "-0x1.fffffffffffffffe0001p-16384", -+ "-0x1.ffffffffffffffffffffffffff80001p-970", -+ "-0x1.ffffffffffffffffffffffffffff0001p-16383", -+ UNDERFLOW_EXCEPT_DOWNWARD), -+ TEST ("0x1.fffffeffffp-127", -+ "0x1.fffffffffffff7fffp-1023", -+ "0x1.fffffffffffffffeffffp-16383", -+ "0x1.fffffffffffffffeffffp-16384", -+ "0x1.ffffffffffffffffffffffffffbffffp-970", -+ "0x1.ffffffffffffffffffffffffffff7fffp-16383", -+ UNDERFLOW_EXCEPT_UPWARD), -+ TEST ("-0x1.fffffeffffp-127", -+ "-0x1.fffffffffffff7fffp-1023", -+ "-0x1.fffffffffffffffeffffp-16383", -+ "-0x1.fffffffffffffffeffffp-16384", -+ "-0x1.ffffffffffffffffffffffffffbffffp-970", -+ "-0x1.ffffffffffffffffffffffffffff7fffp-16383", -+ UNDERFLOW_EXCEPT_DOWNWARD), -+ TEST ("0x1.ffffffp-127", -+ "0x1.fffffffffffff8p-1023", -+ "0x1.ffffffffffffffffp-16383", -+ "0x1.ffffffffffffffffp-16384", -+ "0x1.ffffffffffffffffffffffffffcp-970", -+ "0x1.ffffffffffffffffffffffffffff8p-16383", -+ UNDERFLOW_ONLY_DOWNWARD_ZERO), -+ TEST ("-0x1.ffffffp-127", -+ "-0x1.fffffffffffff8p-1023", -+ "-0x1.ffffffffffffffffp-16383", -+ "-0x1.ffffffffffffffffp-16384", -+ "-0x1.ffffffffffffffffffffffffffcp-970", -+ "-0x1.ffffffffffffffffffffffffffff8p-16383", -+ UNDERFLOW_ONLY_UPWARD_ZERO), -+ TEST ("0x1.ffffffffffp-127", -+ "0x1.fffffffffffffffffp-1023", -+ "0x1.ffffffffffffffffffffp-16383", -+ "0x1.ffffffffffffffffffffp-16384", -+ "0x1.ffffffffffffffffffffffffffffffp-970", -+ "0x1.ffffffffffffffffffffffffffffffffp-16383", -+ UNDERFLOW_ONLY_DOWNWARD_ZERO), -+ TEST ("-0x1.ffffffffffp-127", -+ "-0x1.fffffffffffffffffp-1023", -+ "-0x1.ffffffffffffffffffffp-16383", -+ "-0x1.ffffffffffffffffffffp-16384", -+ "-0x1.ffffffffffffffffffffffffffffffp-970", -+ "-0x1.ffffffffffffffffffffffffffffffffp-16383", -+ UNDERFLOW_ONLY_UPWARD_ZERO), - }; - - /* Return whether to expect underflow from a particular testcase, in a -@@ -133,39 +347,62 @@ static bool support_underflow_exception = false; - volatile double d = DBL_MIN; - volatile double dd; - --static int --test_in_one_mode (const char *s, enum underflow_case c, int rm, -- const char *mode_name) -+static bool -+test_got_fe_underflow (void) - { -- int result = 0; -- feclearexcept (FE_ALL_EXCEPT); -- errno = 0; -- double d = strtod (s, NULL); -- int got_errno = errno; - #ifdef FE_UNDERFLOW -- bool got_fe_underflow = fetestexcept (FE_UNDERFLOW) != 0; -+ return fetestexcept (FE_UNDERFLOW) != 0; - #else -- bool got_fe_underflow = false; -+ return false; - #endif -- printf ("strtod (%s) (%s) returned %a, errno = %d, %sunderflow exception\n", -- s, mode_name, d, got_errno, got_fe_underflow ? "" : "no "); -- bool this_expect_underflow = expect_underflow (c, rm); -- if (got_errno != 0 && got_errno != ERANGE) -- { -- puts ("FAIL: errno neither 0 nor ERANGE"); -- result = 1; -- } -- else if (this_expect_underflow != (errno == ERANGE)) -- { -- puts ("FAIL: underflow from errno differs from expectations"); -- result = 1; -- } -- if (support_underflow_exception && got_fe_underflow != this_expect_underflow) -- { -- puts ("FAIL: underflow from exceptions differs from expectations"); -- result = 1; -- } -- return result; -+} -+ -+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ -+static int \ -+test_strto ## FSUF (int i, int rm, const char *mode_name) \ -+{ \ -+ const char *s = tests[i].s_ ## FSUF; \ -+ enum underflow_case c = tests[i].c; \ -+ int result = 0; \ -+ feclearexcept (FE_ALL_EXCEPT); \ -+ errno = 0; \ -+ FTYPE d = strto ## FSUF (s, NULL); \ -+ int got_errno = errno; \ -+ bool got_fe_underflow = test_got_fe_underflow (); \ -+ char buf[FSTRLENMAX]; \ -+ FTOSTR (buf, sizeof (buf), "%a", d); \ -+ printf ("strto" #FSUF \ -+ " (%s) (%s) returned %s, errno = %d, " \ -+ "%sunderflow exception\n", \ -+ s, mode_name, buf, got_errno, \ -+ got_fe_underflow ? "" : "no "); \ -+ bool this_expect_underflow = expect_underflow (c, rm); \ -+ if (got_errno != 0 && got_errno != ERANGE) \ -+ { \ -+ puts ("FAIL: errno neither 0 nor ERANGE"); \ -+ result = 1; \ -+ } \ -+ else if (this_expect_underflow != (errno == ERANGE)) \ -+ { \ -+ puts ("FAIL: underflow from errno differs from expectations"); \ -+ result = 1; \ -+ } \ -+ if (support_underflow_exception \ -+ && got_fe_underflow != this_expect_underflow) \ -+ { \ -+ puts ("FAIL: underflow from exceptions " \ -+ "differs from expectations"); \ -+ result = 1; \ -+ } \ -+ return result; \ -+} -+ -+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) -+ -+static int -+test_in_one_mode (size_t i, int rm, const char *mode_name) -+{ -+ return STRTOD_TEST_FOREACH (test_strto, i, rm, mode_name); - } - - static int -@@ -191,12 +428,12 @@ do_test (void) - #endif - for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) - { -- result |= test_in_one_mode (tests[i].s, tests[i].c, fe_tonearest, -+ result |= test_in_one_mode (i, fe_tonearest, - "default rounding mode"); - #ifdef FE_DOWNWARD - if (!fesetround (FE_DOWNWARD)) - { -- result |= test_in_one_mode (tests[i].s, tests[i].c, FE_DOWNWARD, -+ result |= test_in_one_mode (i, FE_DOWNWARD, - "FE_DOWNWARD"); - fesetround (save_round_mode); - } -@@ -204,7 +441,7 @@ do_test (void) - #ifdef FE_TOWARDZERO - if (!fesetround (FE_TOWARDZERO)) - { -- result |= test_in_one_mode (tests[i].s, tests[i].c, FE_TOWARDZERO, -+ result |= test_in_one_mode (i, FE_TOWARDZERO, - "FE_TOWARDZERO"); - fesetround (save_round_mode); - } -@@ -212,7 +449,7 @@ do_test (void) - #ifdef FE_UPWARD - if (!fesetround (FE_UPWARD)) - { -- result |= test_in_one_mode (tests[i].s, tests[i].c, FE_UPWARD, -+ result |= test_in_one_mode (i, FE_UPWARD, - "FE_UPWARD"); - fesetround (save_round_mode); - } - -commit 3a34851103d554b2c9b269ecae111648f9d7bb6d -Author: Florian Weimer -Date: Mon Oct 28 14:45:30 2024 +0100 - - elf: Change ldconfig auxcache magic number (bug 32231) - - In commit c628c2296392ed3bf2cb8d8470668e64fe53389f (elf: Remove - ldconfig kernel version check), the layout of auxcache entries - changed because the osversion field was removed from - struct aux_cache_file_entry. However, AUX_CACHEMAGIC was not - changed, so existing files are still used, potentially leading - to unintended ldconfig behavior. This commit changes AUX_CACHEMAGIC, - so that the file is regenerated. - - Reported-by: DJ Delorie - Reviewed-by: Adhemerval Zanella - (cherry picked from commit 0a536f6e2f76e3ef581b3fd9af1e5cf4ddc7a5a2) - -diff --git a/NEWS b/NEWS -index 9033335db1..928c516bec 100644 ---- a/NEWS -+++ b/NEWS -@@ -17,6 +17,7 @@ The following bugs are resolved with this release: - [32026] strerror/strsignal TLS not handled correctly for secondary namespaces - [32052] Name space violation in fortify wrappers - [32137] libio: Attempt wide backup free only for non-legacy code -+ [32231] elf: Change ldconfig auxcache magic number - - Version 2.40 - -diff --git a/elf/cache.c b/elf/cache.c -index 8a618e11fa..62d681df42 100644 ---- a/elf/cache.c -+++ b/elf/cache.c -@@ -820,7 +820,7 @@ struct aux_cache_entry - struct aux_cache_entry *next; - }; - --#define AUX_CACHEMAGIC "glibc-ld.so.auxcache-1.0" -+#define AUX_CACHEMAGIC "glibc-ld.so.auxcache-2.0" - - struct aux_cache_file_entry - { - -commit 234458024300f0b4b430785999f33eddf059af6a -Author: Michael Karcher -Date: Sun Jul 28 15:30:57 2024 +0200 - - Mitigation for "clone on sparc might fail with -EFAULT for no valid reason" (bz 31394) - - It seems the kernel can not deal with uncommitted stack space in the area intended - for the register window when executing the clone() system call. So create a nested - frame (proxy for the kernel frame) and flush it from the processor to memory to - force committing pages to the stack before invoking the system call. - - Bug: https://www.mail-archive.com/debian-glibc@lists.debian.org/msg62592.html - Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31394 - See-also: https://lore.kernel.org/sparclinux/62f9be9d-a086-4134-9a9f-5df8822708af@mkarcher.dialup.fu-berlin.de/ - Signed-off-by: Michael Karcher - Reviewed-by: DJ Delorie - (cherry picked from commit faeaa3bc9f76030b9882ccfdee232fc0ca6dcb06) - -diff --git a/NEWS b/NEWS -index 928c516bec..dc815fb6d3 100644 ---- a/NEWS -+++ b/NEWS -@@ -11,6 +11,7 @@ The following bugs are resolved with this release: - - [27821] ungetc: Fix backup buffer leak on program exit - [30081] resolv: Do not wait for non-existing second DNS response after error -+ [31394] clone on sparc might fail with -EFAULT for no valid reason - [31717] elf: Avoid re-initializing already allocated TLS in dlopen - [31890] resolv: Allow short error responses to match any DNS query - [31968] mremap implementation in C does not handle arguments correctly -diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S -index 748d25fcfe..c9cf9bb055 100644 ---- a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S -+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S -@@ -28,6 +28,9 @@ - .text - ENTRY (__clone) - save %sp,-96,%sp -+ save %sp,-96,%sp -+ flushw -+ restore - cfi_def_cfa_register(%fp) - cfi_window_save - cfi_register(%o7, %i7) -diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S -index e5ff2cf1a0..370d51fda2 100644 ---- a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S -+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S -@@ -32,6 +32,9 @@ - - ENTRY (__clone) - save %sp, -192, %sp -+ save %sp, -192, %sp -+ flushw -+ restore - cfi_def_cfa_register(%fp) - cfi_window_save - cfi_register(%o7, %i7) - -commit efb710034e4c5e734d100cc4ef1b1e27d4315825 -Author: Adhemerval Zanella -Date: Mon Sep 2 16:58:51 2024 -0300 - - linux: sparc: Fix clone for LEON/sparcv8 (BZ 31394) - - The sparc clone mitigation (faeaa3bc9f76030) added the use of - flushw, which is not support by LEON/sparcv8. As discussed on - the libc-alpha, 'ta 3' is a working alternative [1]. - - [1] https://sourceware.org/pipermail/libc-alpha/2024-August/158905.html - - Checked with a build for sparcv8-linux-gnu targetting leon. - - Acked-by: John Paul Adrian Glaubitz - (cherry picked from commit 5e8cfc5d625e6dd000a0371d21d792836ea7951a) - -diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S -index c9cf9bb055..c84244f56b 100644 ---- a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S -+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S -@@ -29,7 +29,11 @@ - ENTRY (__clone) - save %sp,-96,%sp - save %sp,-96,%sp -+#ifdef __sparcv9 - flushw -+#else -+ ta 3 -+#endif - restore - cfi_def_cfa_register(%fp) - cfi_window_save - -commit 626c048f32a979f77662bdcb1cca477c11d3f9c1 -Author: Aurelien Jarno -Date: Sun Nov 10 10:50:34 2024 +0100 - - elf: handle addition overflow in _dl_find_object_update_1 [BZ #32245] - - The remaining_to_add variable can be 0 if (current_used + count) wraps, - This is caught by GCC 14+ on hppa, which determines from there that - target_seg could be be NULL when remaining_to_add is zero, which in - turns causes a -Wstringop-overflow warning: - - In file included from ../include/atomic.h:49, - from dl-find_object.c:20: - In function '_dlfo_update_init_seg', - inlined from '_dl_find_object_update_1' at dl-find_object.c:689:30, - inlined from '_dl_find_object_update' at dl-find_object.c:805:13: - ../sysdeps/unix/sysv/linux/hppa/atomic-machine.h:44:4: error: '__atomic_store_4' writing 4 bytes into a region of size 0 overflows the destination [-Werror=stringop-overflow=] - 44 | __atomic_store_n ((mem), (val), __ATOMIC_RELAXED); \ - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - dl-find_object.c:644:3: note: in expansion of macro 'atomic_store_relaxed' - 644 | atomic_store_relaxed (&seg->size, new_seg_size); - | ^~~~~~~~~~~~~~~~~~~~ - In function '_dl_find_object_update': - cc1: note: destination object is likely at address zero - - In practice, this is not possible as it represent counts of link maps. - Link maps have sizes larger than 1 byte, so the sum of any two link map - counts will always fit within a size_t without wrapping around. - - This patch therefore adds a check on remaining_to_add == 0 and tell GCC - that this can not happen using __builtin_unreachable. - - Thanks to Andreas Schwab for the investigation. - - Closes: BZ #32245 - Signed-off-by: Aurelien Jarno - Tested-by: John David Anglin - Reviewed-by: Florian Weimer - (cherry picked from commit 6c915c73d08028987232f6dc718f218c61113240) - -diff --git a/NEWS b/NEWS -index dc815fb6d3..bd0b3bd66a 100644 ---- a/NEWS -+++ b/NEWS -@@ -19,6 +19,7 @@ The following bugs are resolved with this release: - [32052] Name space violation in fortify wrappers - [32137] libio: Attempt wide backup free only for non-legacy code - [32231] elf: Change ldconfig auxcache magic number -+ [32245] glibc -Wstringop-overflow= build failure on hppa - - Version 2.40 - -diff --git a/elf/dl-find_object.c b/elf/dl-find_object.c -index 449302eda3..ae18b438d3 100644 ---- a/elf/dl-find_object.c -+++ b/elf/dl-find_object.c -@@ -662,6 +662,14 @@ _dl_find_object_update_1 (struct link_map **loaded, size_t count) - = _dlfo_loaded_mappings[!active_idx]; - size_t remaining_to_add = current_used + count; - -+ /* remaining_to_add can be 0 if (current_used + count) wraps, but in practice -+ this is not possible as it represent counts of link maps. Link maps have -+ sizes larger than 1 byte, so the sum of any two link map counts will -+ always fit within a size_t without wrapping around. This check ensures -+ that target_seg is not erroneously considered potentially NULL by GCC. */ -+ if (remaining_to_add == 0) -+ __builtin_unreachable (); -+ - /* Ensure that the new segment chain has enough space. */ - { - size_t new_allocated - -commit 9b9545ba27613fa41efdfa7965b6fc580bf1b919 -Author: Michael Jeanson -Date: Thu Nov 7 22:23:49 2024 +0100 - - nptl: initialize rseq area prior to registration - - Per the rseq syscall documentation, 3 fields are required to be - initialized by userspace prior to registration, they are 'cpu_id', - 'rseq_cs' and 'flags'. Since we have no guarantee that 'struct pthread' - is cleared on all architectures, explicitly set those 3 fields prior to - registration. - - Signed-off-by: Michael Jeanson - Reviewed-by: Florian Weimer - (cherry picked from commit 97f60abd25628425971f07e9b0e7f8eec0741235) - -diff --git a/nptl/descr.h b/nptl/descr.h -index 8cef95810c..c4bdd7757a 100644 ---- a/nptl/descr.h -+++ b/nptl/descr.h -@@ -414,6 +414,8 @@ struct pthread - { - uint32_t cpu_id_start; - uint32_t cpu_id; -+ uint64_t rseq_cs; -+ uint32_t flags; - }; - char pad[32]; /* Original rseq area size. */ - } rseq_area __attribute__ ((aligned (32))); -diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h -index 7ea935b4ad..37a8f630b6 100644 ---- a/sysdeps/unix/sysv/linux/rseq-internal.h -+++ b/sysdeps/unix/sysv/linux/rseq-internal.h -@@ -51,11 +51,21 @@ rseq_register_current_thread (struct pthread *self, bool do_rseq) - /* The initial implementation used only 20 bytes out of 32, - but still expected size 32. */ - size = RSEQ_AREA_SIZE_INITIAL; -+ -+ /* Initialize the rseq fields that are read by the kernel on -+ registration, there is no guarantee that struct pthread is -+ cleared on all architectures. */ -+ THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_UNINITIALIZED); -+ THREAD_SETMEM (self, rseq_area.rseq_cs, 0); -+ THREAD_SETMEM (self, rseq_area.flags, 0); -+ - int ret = INTERNAL_SYSCALL_CALL (rseq, &self->rseq_area, - size, 0, RSEQ_SIG); - if (!INTERNAL_SYSCALL_ERROR_P (ret)) - return true; - } -+ /* When rseq is disabled by tunables or the registration fails, inform -+ userspace by setting 'cpu_id' to RSEQ_CPU_ID_REGISTRATION_FAILED. */ - THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_REGISTRATION_FAILED); - return false; - } - -commit 091dd12831792cef16eee24fe240c73a25b47a1d -Author: Michael Jeanson -Date: Wed Nov 20 14:15:42 2024 -0500 - - nptl: initialize cpu_id_start prior to rseq registration - - When adding explicit initialization of rseq fields prior to - registration, I glossed over the fact that 'cpu_id_start' is also - documented as initialized by user-space. - - While current kernels don't validate the content of this field on - registration, future ones could. - - Signed-off-by: Michael Jeanson - Reviewed-by: Mathieu Desnoyers - (cherry picked from commit d9f40387d3305d97e30a8cf8724218c42a63680a) - -diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h -index 37a8f630b6..ef3eab1fef 100644 ---- a/sysdeps/unix/sysv/linux/rseq-internal.h -+++ b/sysdeps/unix/sysv/linux/rseq-internal.h -@@ -56,6 +56,7 @@ rseq_register_current_thread (struct pthread *self, bool do_rseq) - registration, there is no guarantee that struct pthread is - cleared on all architectures. */ - THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_UNINITIALIZED); -+ THREAD_SETMEM (self, rseq_area.cpu_id_start, 0); - THREAD_SETMEM (self, rseq_area.rseq_cs, 0); - THREAD_SETMEM (self, rseq_area.flags, 0); - - -commit c6cdab1e01bc11bc4036dc5b1be6086f6259c123 -Author: Sam James -Date: Mon Dec 9 23:11:25 2024 +0000 - - malloc: add indirection for malloc(-like) functions in tests [BZ #32366] - - GCC 15 introduces allocation dead code removal (DCE) for PR117370 in - r15-5255-g7828dc070510f8. This breaks various glibc tests which want - to assert various properties of the allocator without doing anything - obviously useful with the allocated memory. - - Alexander Monakov rightly pointed out that we can and should do better - than passing -fno-malloc-dce to paper over the problem. Not least because - GCC 14 already does such DCE where there's no testing of malloc's return - value against NULL, and LLVM has such optimisations too. - - Handle this by providing malloc (and friends) wrappers with a volatile - function pointer to obscure that we're calling malloc (et. al) from the - compiler. - - Reviewed-by: Paul Eggert - (cherry picked from commit a9944a52c967ce76a5894c30d0274b824df43c7a) - -diff --git a/malloc/tst-aligned-alloc.c b/malloc/tst-aligned-alloc.c -index 91167d1392..b0f05a8fec 100644 ---- a/malloc/tst-aligned-alloc.c -+++ b/malloc/tst-aligned-alloc.c -@@ -25,6 +25,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - static int - do_test (void) - { -diff --git a/malloc/tst-compathooks-off.c b/malloc/tst-compathooks-off.c -index d0106f3fb7..4cce6e5a80 100644 ---- a/malloc/tst-compathooks-off.c -+++ b/malloc/tst-compathooks-off.c -@@ -25,6 +25,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - extern void (*volatile __free_hook) (void *, const void *); - extern void *(*volatile __malloc_hook)(size_t, const void *); - extern void *(*volatile __realloc_hook)(void *, size_t, const void *); -diff --git a/malloc/tst-malloc-aux.h b/malloc/tst-malloc-aux.h -new file mode 100644 -index 0000000000..54908b4a24 ---- /dev/null -+++ b/malloc/tst-malloc-aux.h -@@ -0,0 +1,41 @@ -+/* Wrappers for malloc-like functions to allow testing the implementation -+ without optimization. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public License as -+ published by the Free Software Foundation; either version 2.1 of the -+ License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; see the file COPYING.LIB. If -+ not, see . */ -+ -+#ifndef TST_MALLOC_AUX_H -+#define TST_MALLOC_AUX_H -+ -+#include -+#include -+ -+static void *(*volatile aligned_alloc_indirect)(size_t, size_t) = aligned_alloc; -+static void *(*volatile calloc_indirect)(size_t, size_t) = calloc; -+static void *(*volatile malloc_indirect)(size_t) = malloc; -+static void *(*volatile realloc_indirect)(void*, size_t) = realloc; -+ -+#undef aligned_alloc -+#undef calloc -+#undef malloc -+#undef realloc -+ -+#define aligned_alloc aligned_alloc_indirect -+#define calloc calloc_indirect -+#define malloc malloc_indirect -+#define realloc realloc_indirect -+ -+#endif /* TST_MALLOC_AUX_H */ -diff --git a/malloc/tst-malloc-check.c b/malloc/tst-malloc-check.c -index fde8863ad7..cc88bff3b3 100644 ---- a/malloc/tst-malloc-check.c -+++ b/malloc/tst-malloc-check.c -@@ -20,6 +20,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - static int errors = 0; - - static void -diff --git a/malloc/tst-malloc-too-large.c b/malloc/tst-malloc-too-large.c -index 8e9e0d5fa2..2b91377e54 100644 ---- a/malloc/tst-malloc-too-large.c -+++ b/malloc/tst-malloc-too-large.c -@@ -43,6 +43,7 @@ - #include - #include - -+#include "tst-malloc-aux.h" - - /* This function prepares for each 'too-large memory allocation' test by - performing a small successful malloc/free and resetting errno prior to -diff --git a/malloc/tst-malloc.c b/malloc/tst-malloc.c -index f7a6e4654c..68af399022 100644 ---- a/malloc/tst-malloc.c -+++ b/malloc/tst-malloc.c -@@ -22,6 +22,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - static int errors = 0; - - static void -diff --git a/malloc/tst-realloc.c b/malloc/tst-realloc.c -index f50499ecb1..74a28fb45e 100644 ---- a/malloc/tst-realloc.c -+++ b/malloc/tst-realloc.c -@@ -23,6 +23,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - static int - do_test (void) - { -diff --git a/support/support.h b/support/support.h -index ba21ec9b5a..1a77f79793 100644 ---- a/support/support.h -+++ b/support/support.h -@@ -113,7 +113,7 @@ void *xposix_memalign (size_t alignment, size_t n) - __attribute_malloc__ __attribute_alloc_align__ ((1)) - __attribute_alloc_size__ ((2)) __attr_dealloc_free __returns_nonnull; - char *xasprintf (const char *format, ...) -- __attribute__ ((format (printf, 1, 2), malloc)) __attr_dealloc_free -+ __attribute__ ((format (printf, 1, 2), __malloc__)) __attr_dealloc_free - __returns_nonnull; - char *xstrdup (const char *) __attr_dealloc_free __returns_nonnull; - char *xstrndup (const char *, size_t) __attr_dealloc_free __returns_nonnull; -diff --git a/test-skeleton.c b/test-skeleton.c -index ae185a4f28..690f26e7cf 100644 ---- a/test-skeleton.c -+++ b/test-skeleton.c -@@ -27,7 +27,6 @@ - #include - #include - #include --#include - #include - #include - #include - -commit 846e64257e5fc9b5b723c2eec2b7155ab5944d1f -Author: Adhemerval Zanella -Date: Fri Sep 13 11:10:05 2024 -0300 - - support: Make support_process_state_wait return the found state - - So caller can check which state was found if multiple ones are - asked. - - Checked on x86_64-linux-gnu. - - Reviewed-by: Florian Weimer - (cherry picked from commit 38316352e0f742f3a2b5816a61a4b603cb5573f8) - (cherry picked from commit 2e38c5a090b3a54040b6e508d42e5a76e492c6e8) - -diff --git a/support/process_state.h b/support/process_state.h -index 1cf902e91b..9541d8c343 100644 ---- a/support/process_state.h -+++ b/support/process_state.h -@@ -31,13 +31,16 @@ enum support_process_state - support_process_state_dead = 0x20, /* X (dead). */ - support_process_state_zombie = 0x40, /* Z (zombie). */ - support_process_state_parked = 0x80, /* P (parked). */ -+ support_process_state_invalid = 0x100 /* Invalid state. */ - }; - - /* Wait for process PID to reach state STATE. It can be a combination of - multiple possible states ('process_state_running | process_state_sleeping') - where the function return when any of these state are observed. - For an invalid state not represented by SUPPORT_PROCESS_STATE, it fallbacks -- to a 2 second sleep. */ --void support_process_state_wait (pid_t pid, enum support_process_state state); -+ to a 2 second sleep. -+ Return the found process state. */ -+enum support_process_state -+support_process_state_wait (pid_t pid, enum support_process_state state); - - #endif -diff --git a/support/support_process_state.c b/support/support_process_state.c -index 062335234f..ae8e0a531c 100644 ---- a/support/support_process_state.c -+++ b/support/support_process_state.c -@@ -27,7 +27,7 @@ - #include - #include - --void -+enum support_process_state - support_process_state_wait (pid_t pid, enum support_process_state state) - { - #ifdef __linux__ -@@ -75,7 +75,7 @@ support_process_state_wait (pid_t pid, enum support_process_state state) - { - free (line); - xfclose (fstatus); -- return; -+ return process_states[i].s; - } - - rewind (fstatus); -@@ -90,4 +90,6 @@ support_process_state_wait (pid_t pid, enum support_process_state state) - /* Fallback to nanosleep if an invalid state is found. */ - #endif - nanosleep (&(struct timespec) { 1, 0 }, NULL); -+ -+ return support_process_state_invalid; - } -diff --git a/support/tst-support-process_state.c b/support/tst-support-process_state.c -index d73269320f..4a88eae3a7 100644 ---- a/support/tst-support-process_state.c -+++ b/support/tst-support-process_state.c -@@ -68,28 +68,39 @@ do_test (void) - if (test_verbose) - printf ("info: waiting pid %d, state_stopped/state_tracing_stop\n", - (int) pid); -- support_process_state_wait (pid, stop_state); -+ { -+ enum support_process_state state = -+ support_process_state_wait (pid, stop_state); -+ TEST_VERIFY (state == support_process_state_stopped -+ || state == support_process_state_tracing_stop); -+ } - - if (kill (pid, SIGCONT) != 0) - FAIL_RET ("kill (%d, SIGCONT): %m\n", pid); - - if (test_verbose) - printf ("info: waiting pid %d, state_sleeping\n", (int) pid); -- support_process_state_wait (pid, support_process_state_sleeping); -+ TEST_COMPARE (support_process_state_wait (pid, -+ support_process_state_sleeping), -+ support_process_state_sleeping); - - if (kill (pid, SIGUSR1) != 0) - FAIL_RET ("kill (%d, SIGUSR1): %m\n", pid); - - if (test_verbose) - printf ("info: waiting pid %d, state_running\n", (int) pid); -- support_process_state_wait (pid, support_process_state_running); -+ TEST_COMPARE (support_process_state_wait (pid, -+ support_process_state_running), -+ support_process_state_running); - - if (kill (pid, SIGKILL) != 0) - FAIL_RET ("kill (%d, SIGKILL): %m\n", pid); - - if (test_verbose) - printf ("info: waiting pid %d, state_zombie\n", (int) pid); -- support_process_state_wait (pid, support_process_state_zombie); -+ TEST_COMPARE (support_process_state_wait (pid, -+ support_process_state_zombie), -+ support_process_state_zombie);; - - siginfo_t info; - int r = waitid (P_PID, pid, &info, WEXITED); - -commit 11d9f49cebe64939f50e16a59c9ebefb80a294ab -Author: Adhemerval Zanella -Date: Fri Sep 13 11:11:56 2024 -0300 - - sparc: Fix restartable syscalls (BZ 32173) - - The commit 'sparc: Use Linux kABI for syscall return' - (86c5d2cf0ce046279baddc7faa27da71f1a89fde) did not take into account - a subtle sparc syscall kABI constraint. For syscalls that might block - indefinitely, on an interrupt (like SIGCONT) the kernel will set the - instruction pointer to just before the syscall: - - arch/sparc/kernel/signal_64.c - 476 static void do_signal(struct pt_regs *regs, unsigned long orig_i0) - 477 { - [...] - 525 if (restart_syscall) { - 526 switch (regs->u_regs[UREG_I0]) { - 527 case ERESTARTNOHAND: - 528 case ERESTARTSYS: - 529 case ERESTARTNOINTR: - 530 /* replay the system call when we are done */ - 531 regs->u_regs[UREG_I0] = orig_i0; - 532 regs->tpc -= 4; - 533 regs->tnpc -= 4; - 534 pt_regs_clear_syscall(regs); - 535 fallthrough; - 536 case ERESTART_RESTARTBLOCK: - 537 regs->u_regs[UREG_G1] = __NR_restart_syscall; - 538 regs->tpc -= 4; - 539 regs->tnpc -= 4; - 540 pt_regs_clear_syscall(regs); - 541 } - - However, on a SIGCONT it seems that 'g1' register is being clobbered after the - syscall returns. Before 86c5d2cf0ce046279, the 'g1' was always placed jus - before the 'ta' instruction which then reloads the syscall number and restarts - the syscall. - - On master, where 'g1' might be placed before 'ta': - - $ cat test.c - #include - - int main () - { - pause (); - } - $ gcc test.c -o test - $ strace -f ./t - [...] - ppoll(NULL, 0, NULL, NULL, 0 - - On another terminal - - $ kill -STOP 2262828 - - $ strace -f ./t - [...] - --- SIGSTOP {si_signo=SIGSTOP, si_code=SI_USER, si_pid=2521813, si_uid=8289} --- - --- stopped by SIGSTOP --- - - And then - - $ kill -CONT 2262828 - - Results in: - - --- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=2521813, si_uid=8289} --- - restart_syscall(<... resuming interrupted ppoll ...>) = -1 EINTR (Interrupted system call) - - Where the expected behaviour would be: - - $ strace -f ./t - [...] - ppoll(NULL, 0, NULL, NULL, 0) = ? ERESTARTNOHAND (To be restarted if no handler) - --- SIGSTOP {si_signo=SIGSTOP, si_code=SI_USER, si_pid=2521813, si_uid=8289} --- - --- stopped by SIGSTOP --- - --- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=2521813, si_uid=8289} --- - ppoll(NULL, 0, NULL, NULL, 0 - - Just moving the 'g1' setting near the syscall asm is not suffice, - the compiler might optimize it away (as I saw on cancellation.c by - trying this fix). Instead, I have change the inline asm to put the - 'g1' setup in ithe asm block. This would require to change the asm - constraint for INTERNAL_SYSCALL_NCS, since the syscall number is not - constant. - - Checked on sparc64-linux-gnu. - - Reported-by: René Rebe - Tested-by: Sam James - Reviewed-by: Sam James - (cherry picked from commit 2c1903cbbac0022153a67776f474c221250ad6ed) - (cherry picked from commit 1cd7e13289b91e1495a1865c1f678196d1bb7be4) - -diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile -index 59998c7af4..34890ef69a 100644 ---- a/sysdeps/unix/sysv/linux/Makefile -+++ b/sysdeps/unix/sysv/linux/Makefile -@@ -227,6 +227,7 @@ tests += \ - tst-scm_rights \ - tst-sigtimedwait \ - tst-sync_file_range \ -+ tst-syscall-restart \ - tst-sysconf-iov_max \ - tst-sysvmsg-linux \ - tst-sysvsem-linux \ -diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h -index d2d68f5312..c2ffbb5c8f 100644 ---- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h -+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h -@@ -107,6 +107,7 @@ ENTRY(name); \ - #else /* __ASSEMBLER__ */ - - #define __SYSCALL_STRING \ -+ "mov %[scn], %%g1;" \ - "ta 0x10;" \ - "bcc 1f;" \ - " nop;" \ -@@ -114,7 +115,7 @@ ENTRY(name); \ - "1:" - - #define __SYSCALL_CLOBBERS \ -- "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ -+ "g1", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ - "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ - "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \ - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \ -diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h -index 96047424e9..5598fab08a 100644 ---- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h -+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h -@@ -106,6 +106,7 @@ ENTRY(name); \ - #else /* __ASSEMBLER__ */ - - #define __SYSCALL_STRING \ -+ "mov %[scn], %%g1;" \ - "ta 0x6d;" \ - "bcc,pt %%xcc, 1f;" \ - " nop;" \ -@@ -113,7 +114,7 @@ ENTRY(name); \ - "1:" - - #define __SYSCALL_CLOBBERS \ -- "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ -+ "g1", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ - "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ - "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \ - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \ -diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sysdep.h -index dcabb57fe2..c287740a8c 100644 ---- a/sysdeps/unix/sysv/linux/sparc/sysdep.h -+++ b/sysdeps/unix/sysv/linux/sparc/sysdep.h -@@ -50,97 +50,109 @@ - - #undef INTERNAL_SYSCALL_NCS - #define INTERNAL_SYSCALL_NCS(name, nr, args...) \ -- internal_syscall##nr(__SYSCALL_STRING, name, args) -+ _internal_syscall##nr(__SYSCALL_STRING, "p", name, args) - --#define internal_syscall0(string,name,dummy...) \ -+#define _internal_syscall0(string,nc,name,dummy...) \ - ({ \ -- register long int __g1 __asm__ ("g1") = (name); \ - register long __o0 __asm__ ("o0"); \ -+ long int _name = (long int) (name); \ - __asm __volatile (string : "=r" (__o0) : \ -- "r" (__g1) : \ -+ [scn] nc (_name) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ - }) -+#define internal_syscall0(string,name,args...) \ -+ _internal_syscall0(string, "i", name, args) - --#define internal_syscall1(string,name,arg1) \ -+#define _internal_syscall1(string,nc,name,arg1) \ - ({ \ - long int _arg1 = (long int) (arg1); \ -- register long int __g1 __asm__("g1") = (name); \ -+ long int _name = (long int) (name); \ - register long int __o0 __asm__ ("o0") = _arg1; \ -- __asm __volatile (string : "=r" (__o0) : \ -- "r" (__g1), "0" (__o0) : \ -+ __asm __volatile (string : "+r" (__o0) : \ -+ [scn] nc (_name) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ - }) -+#define internal_syscall1(string,name,args...) \ -+ _internal_syscall1(string, "i", name, args) - --#define internal_syscall2(string,name,arg1,arg2) \ -+#define _internal_syscall2(string,nc,name,arg1,arg2) \ - ({ \ - long int _arg1 = (long int) (arg1); \ - long int _arg2 = (long int) (arg2); \ -- register long int __g1 __asm__("g1") = (name); \ -+ long int _name = (long int) (name); \ - register long int __o0 __asm__ ("o0") = _arg1; \ - register long int __o1 __asm__ ("o1") = _arg2; \ -- __asm __volatile (string : "=r" (__o0) : \ -- "r" (__g1), "0" (__o0), "r" (__o1) : \ -+ __asm __volatile (string : "+r" (__o0) : \ -+ [scn] nc (_name), "r" (__o1) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ - }) -+#define internal_syscall2(string,name,args...) \ -+ _internal_syscall2(string, "i", name, args) - --#define internal_syscall3(string,name,arg1,arg2,arg3) \ -+#define _internal_syscall3(string,nc,name,arg1,arg2,arg3) \ - ({ \ - long int _arg1 = (long int) (arg1); \ - long int _arg2 = (long int) (arg2); \ - long int _arg3 = (long int) (arg3); \ -- register long int __g1 __asm__("g1") = (name); \ -+ long int _name = (long int) (name); \ - register long int __o0 __asm__ ("o0") = _arg1; \ - register long int __o1 __asm__ ("o1") = _arg2; \ - register long int __o2 __asm__ ("o2") = _arg3; \ -- __asm __volatile (string : "=r" (__o0) : \ -- "r" (__g1), "0" (__o0), "r" (__o1), \ -+ __asm __volatile (string : "+r" (__o0) : \ -+ [scn] nc (_name), "r" (__o1), \ - "r" (__o2) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ - }) -+#define internal_syscall3(string,name,args...) \ -+ _internal_syscall3(string, "i", name, args) - --#define internal_syscall4(string,name,arg1,arg2,arg3,arg4) \ -+#define _internal_syscall4(string,nc,name,arg1,arg2,arg3,arg4) \ - ({ \ - long int _arg1 = (long int) (arg1); \ - long int _arg2 = (long int) (arg2); \ - long int _arg3 = (long int) (arg3); \ - long int _arg4 = (long int) (arg4); \ -- register long int __g1 __asm__("g1") = (name); \ -+ long int _name = (long int) (name); \ - register long int __o0 __asm__ ("o0") = _arg1; \ - register long int __o1 __asm__ ("o1") = _arg2; \ - register long int __o2 __asm__ ("o2") = _arg3; \ - register long int __o3 __asm__ ("o3") = _arg4; \ -- __asm __volatile (string : "=r" (__o0) : \ -- "r" (__g1), "0" (__o0), "r" (__o1), \ -+ __asm __volatile (string : "+r" (__o0) : \ -+ [scn] nc (_name), "r" (__o1), \ - "r" (__o2), "r" (__o3) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ - }) -+#define internal_syscall4(string,name,args...) \ -+ _internal_syscall4(string, "i", name, args) - --#define internal_syscall5(string,name,arg1,arg2,arg3,arg4,arg5) \ -+#define _internal_syscall5(string,nc,name,arg1,arg2,arg3,arg4,arg5) \ - ({ \ - long int _arg1 = (long int) (arg1); \ - long int _arg2 = (long int) (arg2); \ - long int _arg3 = (long int) (arg3); \ - long int _arg4 = (long int) (arg4); \ - long int _arg5 = (long int) (arg5); \ -- register long int __g1 __asm__("g1") = (name); \ -+ long int _name = (long int) (name); \ - register long int __o0 __asm__ ("o0") = _arg1; \ - register long int __o1 __asm__ ("o1") = _arg2; \ - register long int __o2 __asm__ ("o2") = _arg3; \ - register long int __o3 __asm__ ("o3") = _arg4; \ - register long int __o4 __asm__ ("o4") = _arg5; \ -- __asm __volatile (string : "=r" (__o0) : \ -- "r" (__g1), "0" (__o0), "r" (__o1), \ -+ __asm __volatile (string : "+r" (__o0) : \ -+ [scn] nc (_name), "r" (__o1), \ - "r" (__o2), "r" (__o3), "r" (__o4) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ - }) -+#define internal_syscall5(string,name,args...) \ -+ _internal_syscall5(string, "i", name, args) - --#define internal_syscall6(string,name,arg1,arg2,arg3,arg4,arg5,arg6) \ -+#define _internal_syscall6(string,nc,name,arg1,arg2,arg3,arg4,arg5,arg6)\ - ({ \ - long int _arg1 = (long int) (arg1); \ - long int _arg2 = (long int) (arg2); \ -@@ -148,20 +160,22 @@ - long int _arg4 = (long int) (arg4); \ - long int _arg5 = (long int) (arg5); \ - long int _arg6 = (long int) (arg6); \ -- register long int __g1 __asm__("g1") = (name); \ -+ long int _name = (long int) (name); \ - register long int __o0 __asm__ ("o0") = _arg1; \ - register long int __o1 __asm__ ("o1") = _arg2; \ - register long int __o2 __asm__ ("o2") = _arg3; \ - register long int __o3 __asm__ ("o3") = _arg4; \ - register long int __o4 __asm__ ("o4") = _arg5; \ - register long int __o5 __asm__ ("o5") = _arg6; \ -- __asm __volatile (string : "=r" (__o0) : \ -- "r" (__g1), "0" (__o0), "r" (__o1), \ -+ __asm __volatile (string : "+r" (__o0) : \ -+ [scn] nc (_name), "r" (__o1), \ - "r" (__o2), "r" (__o3), "r" (__o4), \ - "r" (__o5) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ - }) -+#define internal_syscall6(string,name,args...) \ -+ _internal_syscall6(string, "i", name, args) - - #define INLINE_CLONE_SYSCALL(arg1,arg2,arg3,arg4,arg5) \ - ({ \ -@@ -170,15 +184,15 @@ - long int _arg3 = (long int) (arg3); \ - long int _arg4 = (long int) (arg4); \ - long int _arg5 = (long int) (arg5); \ -+ long int _name = __NR_clone; \ - register long int __o0 __asm__ ("o0") = _arg1; \ - register long int __o1 __asm__ ("o1") = _arg2; \ - register long int __o2 __asm__ ("o2") = _arg3; \ - register long int __o3 __asm__ ("o3") = _arg4; \ - register long int __o4 __asm__ ("o4") = _arg5; \ -- register long int __g1 __asm__ ("g1") = __NR_clone; \ - __asm __volatile (__SYSCALL_STRING : \ - "=r" (__o0), "=r" (__o1) : \ -- "r" (__g1), "0" (__o0), "1" (__o1), \ -+ [scn] "i" (_name), "0" (__o0), "1" (__o1), \ - "r" (__o2), "r" (__o3), "r" (__o4) : \ - __SYSCALL_CLOBBERS); \ - if (__glibc_unlikely ((unsigned long int) (__o0) > -4096UL)) \ -diff --git a/sysdeps/unix/sysv/linux/tst-syscall-restart.c b/sysdeps/unix/sysv/linux/tst-syscall-restart.c -new file mode 100644 -index 0000000000..84a8a41b5c ---- /dev/null -+++ b/sysdeps/unix/sysv/linux/tst-syscall-restart.c -@@ -0,0 +1,112 @@ -+/* Test if a syscall is correctly restarted. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int -+check_pid (pid_t pid) -+{ -+ /* Wait until the child has called pause and it blocking on kernel. */ -+ support_process_state_wait (pid, support_process_state_sleeping); -+ -+ TEST_COMPARE (kill (pid, SIGSTOP), 0); -+ -+ /* Adding process_state_tracing_stop ('t') allows the test to work under -+ trace programs such as ptrace. */ -+ support_process_state_wait (pid, support_process_state_stopped -+ | support_process_state_tracing_stop); -+ -+ TEST_COMPARE (kill (pid, SIGCONT), 0); -+ -+ enum support_process_state state -+ = support_process_state_wait (pid, support_process_state_sleeping -+ | support_process_state_zombie); -+ -+ TEST_COMPARE (state, support_process_state_sleeping); -+ -+ TEST_COMPARE (kill (pid, SIGTERM), 0); -+ -+ siginfo_t info; -+ TEST_COMPARE (waitid (P_PID, pid, &info, WEXITED), 0); -+ TEST_COMPARE (info.si_signo, SIGCHLD); -+ TEST_COMPARE (info.si_code, CLD_KILLED); -+ TEST_COMPARE (info.si_status, SIGTERM); -+ TEST_COMPARE (info.si_pid, pid); -+ -+ return 0; -+} -+ -+static void * -+tf (void *) -+{ -+ pause (); -+ return NULL; -+} -+ -+static void -+child_mt (void) -+{ -+ /* Let only the created thread to handle signals. */ -+ sigset_t set; -+ sigfillset (&set); -+ xpthread_sigmask (SIG_BLOCK, &set, NULL); -+ -+ sigdelset (&set, SIGSTOP); -+ sigdelset (&set, SIGCONT); -+ sigdelset (&set, SIGTERM); -+ -+ pthread_attr_t attr; -+ xpthread_attr_init (&attr); -+ TEST_COMPARE (pthread_attr_setsigmask_np (&attr, &set), 0); -+ -+ xpthread_join (xpthread_create (&attr, tf, NULL)); -+} -+ -+static void -+do_test_syscall (bool multithread) -+{ -+ pid_t pid = xfork (); -+ if (pid == 0) -+ { -+ if (multithread) -+ child_mt (); -+ else -+ pause (); -+ _exit (127); -+ } -+ -+ check_pid (pid); -+} -+ -+static int -+do_test (void) -+{ -+ /* Check for both single and multi thread, since they use different syscall -+ mechanisms. */ -+ do_test_syscall (false); -+ do_test_syscall (true); -+ -+ return 0; -+} -+ -+#include - -commit 9af64ca64c532b7e42a40b48fe5e01726a9b7943 -Author: H.J. Lu -Date: Thu Dec 5 08:39:44 2024 +0800 - - math: Exclude internal math symbols for tests [BZ #32414] - - Since internal tests don't have access to internal symbols in libm, - exclude them for internal tests. Also make tst-strtod5 and tst-strtod5i - depend on $(libm) to support older versions of GCC which can't inline - copysign family functions. This fixes BZ #32414. - - Signed-off-by: H.J. Lu - Reviewed-by: Sunil K Pandey - (cherry picked from commit 5df09b444835fca6e64b3d4b4a5beb19b3b2ba21) - -diff --git a/include/math.h b/include/math.h -index fa11a710a6..035fd160ff 100644 ---- a/include/math.h -+++ b/include/math.h -@@ -130,7 +130,10 @@ fabsf128 (_Float128 x) - } - # endif - --# if !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0) -+ -+/* NB: Internal tests don't have access to internal symbols. */ -+# if !IS_IN (testsuite_internal) \ -+ && !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0) - # ifndef NO_MATH_REDIRECT - /* Declare some functions for use within GLIBC. Compilers typically - inline those functions as a single instruction. Use an asm to -diff --git a/stdlib/Makefile b/stdlib/Makefile -index 8b0ac63ddb..8213fa83ef 100644 ---- a/stdlib/Makefile -+++ b/stdlib/Makefile -@@ -603,6 +603,8 @@ $(objpfx)bug-strtod2: $(libm) - $(objpfx)tst-strtod-round: $(libm) - $(objpfx)tst-tininess: $(libm) - $(objpfx)tst-strtod-underflow: $(libm) -+$(objpfx)tst-strtod5: $(libm) -+$(objpfx)tst-strtod5i: $(libm) - $(objpfx)tst-strtod6: $(libm) - $(objpfx)tst-strtod-nan-locale: $(libm) - $(objpfx)tst-strtod-nan-sign: $(libm) - -commit 0b39fe801208e805cc911f64a2fdd25d04b7151e -Author: Adhemerval Zanella -Date: Fri Oct 18 08:48:22 2024 -0300 - - linux: Fix tst-syscall-restart.c on old gcc (BZ 32283) - - To avoid a parameter name omitted error. - - (cherry picked from commit ab564362d0470d10947c24155ec048c4e14a009d) - -diff --git a/sysdeps/unix/sysv/linux/tst-syscall-restart.c b/sysdeps/unix/sysv/linux/tst-syscall-restart.c -index 84a8a41b5c..0ee7dc8517 100644 ---- a/sysdeps/unix/sysv/linux/tst-syscall-restart.c -+++ b/sysdeps/unix/sysv/linux/tst-syscall-restart.c -@@ -57,7 +57,7 @@ check_pid (pid_t pid) - } - - static void * --tf (void *) -+tf (void *closure) - { - pause (); - return NULL; - -commit 94e4a8c7d68129075f1b494a0b26151a4f989b36 -Author: Florian Weimer -Date: Tue Dec 17 18:12:03 2024 +0100 - - x86: Avoid integer truncation with large cache sizes (bug 32470) - - Some hypervisors report 1 TiB L3 cache size. This results - in some variables incorrectly getting zeroed, causing crashes - in memcpy/memmove because invariants are violated. - - (cherry picked from commit 61c3450db96dce96ad2b24b4f0b548e6a46d68e5) - -diff --git a/NEWS b/NEWS -index bd0b3bd66a..97a1e1f5d4 100644 ---- a/NEWS -+++ b/NEWS -@@ -20,6 +20,7 @@ The following bugs are resolved with this release: - [32137] libio: Attempt wide backup free only for non-legacy code - [32231] elf: Change ldconfig auxcache magic number - [32245] glibc -Wstringop-overflow= build failure on hppa -+ [32470] x86: Avoid integer truncation with large cache sizes - - Version 2.40 - -diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h -index a1c03b8903..ac97414b5b 100644 ---- a/sysdeps/x86/dl-cacheinfo.h -+++ b/sysdeps/x86/dl-cacheinfo.h -@@ -961,11 +961,11 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) - non_temporal_threshold = maximum_non_temporal_threshold; - - /* NB: The REP MOVSB threshold must be greater than VEC_SIZE * 8. */ -- unsigned int minimum_rep_movsb_threshold; -+ unsigned long int minimum_rep_movsb_threshold; - /* NB: The default REP MOVSB threshold is 4096 * (VEC_SIZE / 16) for - VEC_SIZE == 64 or 32. For VEC_SIZE == 16, the default REP MOVSB - threshold is 2048 * (VEC_SIZE / 16). */ -- unsigned int rep_movsb_threshold; -+ unsigned long int rep_movsb_threshold; - if (CPU_FEATURE_USABLE_P (cpu_features, AVX512F) - && !CPU_FEATURE_PREFERRED_P (cpu_features, Prefer_No_AVX512)) - { - -commit 9fbfbd924f718663d5303858f34d1f857c375093 -Author: John David Anglin -Date: Thu Dec 19 11:30:09 2024 -0500 - - hppa: Fix strace detach-vfork test - - This change implements vfork.S for direct support of the vfork - syscall. clone.S is revised to correct child support for the - vfork case. - - The main bug was creating a frame prior to the clone syscall. - This was done to allow the rp and r4 registers to be saved and - restored from the stack frame. r4 was used to save and restore - the PIC register, r19, across the system call and the call to - set errno. But in the vfork case, it is undefined behavior - for the child to return from the function in which vfork was - called. It is surprising that this usually worked. - - Syscalls on hppa save and restore rp and r19, so we don't need - to create a frame prior to the clone syscall. We only need a - frame when __syscall_error is called. We also don't need to - save and restore r19 around the call to $$dyncall as r19 is not - used in the code after $$dyncall. - - This considerably simplifies clone.S. - - Signed-off-by: John David Anglin - -diff --git a/sysdeps/unix/sysv/linux/hppa/clone.S b/sysdeps/unix/sysv/linux/hppa/clone.S -index a31afea429..c18163d0f7 100644 ---- a/sysdeps/unix/sysv/linux/hppa/clone.S -+++ b/sysdeps/unix/sysv/linux/hppa/clone.S -@@ -59,16 +59,6 @@ - - .text - ENTRY(__clone) -- /* Prologue */ -- stwm %r4, 64(%sp) -- .cfi_def_cfa_offset -64 -- .cfi_offset 4, 0 -- stw %sp, -4(%sp) --#ifdef PIC -- stw %r19, -32(%sp) -- .cfi_offset 19, 32 --#endif -- - /* Sanity check arguments. */ - comib,=,n 0,%arg0,.LerrorSanity /* no NULL function pointers */ - comib,=,n 0,%arg1,.LerrorSanity /* no NULL stack pointers */ -@@ -87,54 +77,34 @@ ENTRY(__clone) - /* User stack pointer is in the correct register already */ - - /* Load args from stack... */ -- ldw -116(%sp), %r24 /* Load parent_tidptr */ -- ldw -120(%sp), %r23 /* Load newtls */ -- ldw -124(%sp), %r22 /* Load child_tidptr */ -- -- /* Save the PIC register. */ --#ifdef PIC -- copy %r19, %r4 /* parent */ --#endif -+ ldw -52(%sp), %r24 /* Load parent_tidptr */ -+ ldw -56(%sp), %r23 /* Load newtls */ -+ ldw -60(%sp), %r22 /* Load child_tidptr */ - - /* Do the system call */ - ble 0x100(%sr2, %r0) - ldi __NR_clone, %r20 - - ldi -4096, %r1 -- comclr,>>= %r1, %ret0, %r0 /* Note: unsigned compare. */ -- b,n .LerrorRest -- -- /* Restore the PIC register. */ --#ifdef PIC -- copy %r4, %r19 /* parent */ --#endif -- -+ comb,<<,n %r1, %ret0, .LerrorRest /* Note: unsigned compare. */ - comib,=,n 0, %ret0, .LthreadStart -- -- /* Successful return from the parent -- No need to restore the PIC register, -- since we return immediately. */ -- -- ldw -84(%sp), %rp -- bv %r0(%rp) -- ldwm -64(%sp), %r4 -+ bv,n %r0(%rp) - - .LerrorRest: -- /* Something bad happened -- no child created */ -+ /* Something bad happened -- no child created -- need a frame */ -+ ldo 64(%sp),%sp -+ .cfi_def_cfa_offset -64 - bl __syscall_error, %rp - sub %r0, %ret0, %arg0 - ldw -84(%sp), %rp - /* Return after setting errno, ret0 is set to -1 by __syscall_error. */ - bv %r0(%rp) -- ldwm -64(%sp), %r4 -+ ldo -64(%sp), %sp - - .LerrorSanity: - /* Sanity checks failed, return -1, and set errno to EINVAL. */ -- bl __syscall_error, %rp -- ldi EINVAL, %arg0 -- ldw -84(%sp), %rp -- bv %r0(%rp) -- ldwm -64(%sp), %r4 -+ b .LerrorRest -+ ldi -EINVAL, %ret0 - - .LthreadStart: - /* Load up the arguments. */ -@@ -144,14 +114,8 @@ ENTRY(__clone) - /* $$dyncall fixes child's PIC register */ - - /* Call the user's function */ --#ifdef PIC -- copy %r19, %r4 --#endif - bl $$dyncall, %r31 - copy %r31, %rp --#ifdef PIC -- copy %r4, %r19 --#endif - copy %r28, %r26 - ble 0x100(%sr2, %r0) - ldi __NR_exit, %r20 -diff --git a/sysdeps/unix/sysv/linux/hppa/vfork.S b/sysdeps/unix/sysv/linux/hppa/vfork.S -new file mode 100644 -index 0000000000..5fd368f3cf ---- /dev/null -+++ b/sysdeps/unix/sysv/linux/hppa/vfork.S -@@ -0,0 +1,53 @@ -+/* Copyright (C) 1999-2024 Free Software Foundation, Inc. -+ -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public License as -+ published by the Free Software Foundation; either version 2.1 of the -+ License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#define _ERRNO_H 1 -+#include -+ -+/* Clone the calling process, but without copying the whole address space. -+ The calling process is suspended until the new process exits or is -+ replaced by a call to `execve'. Return -1 for errors, 0 to the new process, -+ and the process ID of the new process to the old process. */ -+ -+ENTRY (__vfork) -+ ble 0x100(%sr2, %r0) -+ ldi __NR_vfork, %r20 -+ -+ ldi -4096, %r1 -+ comclr,<< %r1, %ret0, %r0 /* Note: unsigned compare. */ -+ bv,n %r0(%rp) -+ -+ /* Something bad happened -- no child created -- we need a frame */ -+ ldo 64(%sp), %sp -+ .cfi_def_cfa_offset -64 -+ -+ /* Set errno */ -+ bl __syscall_error, %rp -+ sub %r0, %ret0, %arg0 -+ -+ /* ret0 is set to -1 by __syscall_error */ -+ ldw -84(%sp), %rp -+ bv %r0(%rp) -+ ldo -64(%sp), %sp -+ -+PSEUDO_END (__vfork) -+libc_hidden_def (__vfork) -+ -+weak_alias (__vfork, vfork) -+strong_alias (__vfork, __libc_vfork) - -commit 7648e3c8e80b3f1b3b43506b2fbe370e4824ab97 -Author: John David Anglin -Date: Sun Dec 22 09:58:02 2024 -0500 - - hppa: Simplify handling of sanity check errors in clone.S. - - This simplifies the handling of sanity check errors in clone.S. - Adjusted a couple of comments to reflect current code. - - Signed-off-by: John David Anglin - -diff --git a/sysdeps/unix/sysv/linux/hppa/clone.S b/sysdeps/unix/sysv/linux/hppa/clone.S -index c18163d0f7..e85e7f517f 100644 ---- a/sysdeps/unix/sysv/linux/hppa/clone.S -+++ b/sysdeps/unix/sysv/linux/hppa/clone.S -@@ -90,6 +90,10 @@ ENTRY(__clone) - comib,=,n 0, %ret0, .LthreadStart - bv,n %r0(%rp) - -+.LerrorSanity: -+ /* Sanity checks failed, set errno to EINVAL. */ -+ ldi -EINVAL, %ret0 -+ - .LerrorRest: - /* Something bad happened -- no child created -- need a frame */ - ldo 64(%sp),%sp -@@ -101,11 +105,6 @@ ENTRY(__clone) - bv %r0(%rp) - ldo -64(%sp), %sp - --.LerrorSanity: -- /* Sanity checks failed, return -1, and set errno to EINVAL. */ -- b .LerrorRest -- ldi -EINVAL, %ret0 -- - .LthreadStart: - /* Load up the arguments. */ - ldw -60(%sp), %arg0 -@@ -121,7 +120,7 @@ ENTRY(__clone) - ldi __NR_exit, %r20 - - /* We should not return from exit. -- We do not restore r4, or the stack state. */ -+ We do not restore the stack state. */ - iitlbp %r0, (%sr0, %r0) - - PSEUDO_END(__clone) - -commit 473597d8167f86afee3544215db108b170ec13c0 -Author: Andreas Schwab -Date: Wed Sep 25 11:49:30 2024 +0200 - - Fix missing randomness in __gen_tempname (bug 32214) - - Make sure to update the random value also if getrandom fails. - - Fixes: 686d542025 ("posix: Sync tempname with gnulib") - (cherry picked from commit 5f62cf88c4530c11904482775b7582bd7f6d80d2) - -diff --git a/NEWS b/NEWS -index 97a1e1f5d4..57feba81cd 100644 ---- a/NEWS -+++ b/NEWS -@@ -18,6 +18,7 @@ The following bugs are resolved with this release: - [32026] strerror/strsignal TLS not handled correctly for secondary namespaces - [32052] Name space violation in fortify wrappers - [32137] libio: Attempt wide backup free only for non-legacy code -+ [32214] Fix missing randomness in __gen_tempname - [32231] elf: Change ldconfig auxcache magic number - [32245] glibc -Wstringop-overflow= build failure on hppa - [32470] x86: Avoid integer truncation with large cache sizes -diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c -index c00fe0c181..fc30958a0c 100644 ---- a/sysdeps/posix/tempname.c -+++ b/sysdeps/posix/tempname.c -@@ -117,6 +117,8 @@ random_bits (random_value *r, random_value s) - succeed. */ - #if !_LIBC - *r = mix_random_values (v, clock ()); -+#else -+ *r = v; - #endif - return false; - } - -commit 7d4b6bcae91f29d7b4daf15bab06b66cf1d2217c -Author: Siddhesh Poyarekar -Date: Tue Jan 21 16:11:06 2025 -0500 - - Fix underallocation of abort_msg_s struct (CVE-2025-0395) - - Include the space needed to store the length of the message itself, in - addition to the message string. This resolves BZ #32582. - - Signed-off-by: Siddhesh Poyarekar - Reviewed: Adhemerval Zanella - (cherry picked from commit 68ee0f704cb81e9ad0a78c644a83e1e9cd2ee578) - -diff --git a/assert/assert.c b/assert/assert.c -index c29629f5f6..b6e37d694c 100644 ---- a/assert/assert.c -+++ b/assert/assert.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -65,7 +66,8 @@ __assert_fail_base (const char *fmt, const char *assertion, const char *file, - (void) __fxprintf (NULL, "%s", str); - (void) fflush (stderr); - -- total = (total + 1 + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); -+ total = ALIGN_UP (total + sizeof (struct abort_msg_s) + 1, -+ GLRO(dl_pagesize)); - struct abort_msg_s *buf = __mmap (NULL, total, PROT_READ | PROT_WRITE, - MAP_ANON | MAP_PRIVATE, -1, 0); - if (__glibc_likely (buf != MAP_FAILED)) -diff --git a/sysdeps/posix/libc_fatal.c b/sysdeps/posix/libc_fatal.c -index f9e3425e04..089c47b04b 100644 ---- a/sysdeps/posix/libc_fatal.c -+++ b/sysdeps/posix/libc_fatal.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -105,7 +106,8 @@ __libc_message_impl (const char *fmt, ...) - { - WRITEV_FOR_FATAL (fd, iov, iovcnt, total); - -- total = (total + 1 + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); -+ total = ALIGN_UP (total + sizeof (struct abort_msg_s) + 1, -+ GLRO(dl_pagesize)); - struct abort_msg_s *buf = __mmap (NULL, total, - PROT_READ | PROT_WRITE, - MAP_ANON | MAP_PRIVATE, -1, 0); - -commit aef8f8d6a947b290162393e1d717c7aee96fef8e -Author: H.J. Lu -Date: Tue Dec 17 18:41:45 2024 +0800 - - Hide all malloc functions from compiler [BZ #32366] - - Since -1 isn't a power of two, compiler may reject it, hide memalign from - Clang 19 which issues an error: - - tst-memalign.c:86:31: error: requested alignment is not a power of 2 [-Werror,-Wnon-power-of-two-alignment] - 86 | p = memalign (-1, pagesize); - | ^~ - tst-memalign.c:86:31: error: requested alignment must be 4294967296 bytes or smaller; maximum alignment assumed [-Werror,-Wbuiltin-assume-aligned-alignment] - 86 | p = memalign (-1, pagesize); - | ^~ - - Update tst-malloc-aux.h to hide all malloc functions and include it in - all malloc tests to prevent compiler from optimizing out any malloc - functions. - - Tested with Clang 19.1.5 and GCC 15 20241206 for BZ #32366. - - Signed-off-by: H.J. Lu - Reviewed-by: Sam James - (cherry picked from commit f9493a15ea9cfb63a815c00c23142369ec09d8ce) - -diff --git a/malloc/tst-mallinfo2.c b/malloc/tst-mallinfo2.c -index 2c02f5f700..f072b9f24b 100644 ---- a/malloc/tst-mallinfo2.c -+++ b/malloc/tst-mallinfo2.c -@@ -23,6 +23,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - /* This is not specifically needed for the test, but (1) does - something to the data so gcc doesn't optimize it away, and (2) may - help when developing future tests. */ -diff --git a/malloc/tst-malloc-aux.h b/malloc/tst-malloc-aux.h -index 54908b4a24..3e1b61ce34 100644 ---- a/malloc/tst-malloc-aux.h -+++ b/malloc/tst-malloc-aux.h -@@ -22,20 +22,35 @@ - - #include - #include -- --static void *(*volatile aligned_alloc_indirect)(size_t, size_t) = aligned_alloc; --static void *(*volatile calloc_indirect)(size_t, size_t) = calloc; --static void *(*volatile malloc_indirect)(size_t) = malloc; --static void *(*volatile realloc_indirect)(void*, size_t) = realloc; -+#include -+ -+static __typeof (aligned_alloc) * volatile aligned_alloc_indirect -+ = aligned_alloc; -+static __typeof (calloc) * volatile calloc_indirect = calloc; -+static __typeof (malloc) * volatile malloc_indirect = malloc; -+static __typeof (memalign) * volatile memalign_indirect = memalign; -+static __typeof (posix_memalign) * volatile posix_memalign_indirect -+ = posix_memalign; -+static __typeof (pvalloc) * volatile pvalloc_indirect = pvalloc; -+static __typeof (realloc) * volatile realloc_indirect = realloc; -+static __typeof (valloc) * volatile valloc_indirect = valloc; - - #undef aligned_alloc - #undef calloc - #undef malloc -+#undef memalign -+#undef posix_memalign -+#undef pvalloc - #undef realloc -+#undef valloc - - #define aligned_alloc aligned_alloc_indirect - #define calloc calloc_indirect - #define malloc malloc_indirect -+#define memalign memalign_indirect -+#define posix_memalign posix_memalign_indirect -+#define pvalloc pvalloc_indirect - #define realloc realloc_indirect -+#define valloc valloc_indirect - - #endif /* TST_MALLOC_AUX_H */ -diff --git a/malloc/tst-malloc-backtrace.c b/malloc/tst-malloc-backtrace.c -index c7b1d65e5c..65fa91f6fd 100644 ---- a/malloc/tst-malloc-backtrace.c -+++ b/malloc/tst-malloc-backtrace.c -@@ -22,6 +22,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - #define SIZE 4096 - - /* Wrap free with a function to prevent gcc from optimizing it out. */ -diff --git a/malloc/tst-memalign.c b/malloc/tst-memalign.c -index 563f6413d2..ac9770d3f9 100644 ---- a/malloc/tst-memalign.c -+++ b/malloc/tst-memalign.c -@@ -23,6 +23,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - static int errors = 0; - - static void -diff --git a/malloc/tst-safe-linking.c b/malloc/tst-safe-linking.c -index 01dd07004d..63a7e2bc8e 100644 ---- a/malloc/tst-safe-linking.c -+++ b/malloc/tst-safe-linking.c -@@ -26,6 +26,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - /* Run CALLBACK and check that the data on standard error equals - EXPECTED. */ - static void -diff --git a/malloc/tst-valloc.c b/malloc/tst-valloc.c -index 9bab8c6470..0243d3dfd4 100644 ---- a/malloc/tst-valloc.c -+++ b/malloc/tst-valloc.c -@@ -23,6 +23,8 @@ - #include - #include - -+#include "tst-malloc-aux.h" -+ - static int errors = 0; - - static void - -commit be48b8f6ad0ec6d0d6b1d2f45eb59bf8e8c67dd7 -Author: Sam James -Date: Fri Jan 10 03:03:47 2025 +0000 - - malloc: obscure calloc use in tst-calloc - - Similar to a9944a52c967ce76a5894c30d0274b824df43c7a and - f9493a15ea9cfb63a815c00c23142369ec09d8ce, we need to hide calloc use from - the compiler to accommodate GCC's r15-6566-g804e9d55d9e54c change. - - First, include tst-malloc-aux.h, but then use `volatile` variables - for size. - - The test passes without the tst-malloc-aux.h change but IMO we want - it there for consistency and to avoid future problems (possibly silent). - - Reviewed-by: H.J. Lu - (cherry picked from commit c3d1dac96bdd10250aa37bb367d5ef8334a093a1) - -diff --git a/malloc/tst-calloc.c b/malloc/tst-calloc.c -index 01f17f9e65..5a8c7ab121 100644 ---- a/malloc/tst-calloc.c -+++ b/malloc/tst-calloc.c -@@ -23,6 +23,7 @@ - #include - #include - -+#include "tst-malloc-aux.h" - - /* Number of samples per size. */ - #define N 50000 -@@ -94,16 +95,19 @@ random_test (void) - static void - null_test (void) - { -+ /* Obscure allocation size from the compiler. */ -+ volatile size_t max_size = UINT_MAX; -+ volatile size_t zero_size = 0; - /* If the size is 0 the result is implementation defined. Just make - sure the program doesn't crash. The result of calloc is - deliberately ignored, so do not warn about that. */ - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_NEEDS_COMMENT (10, "-Wunused-result"); - calloc (0, 0); -- calloc (0, UINT_MAX); -- calloc (UINT_MAX, 0); -- calloc (0, ~((size_t) 0)); -- calloc (~((size_t) 0), 0); -+ calloc (0, max_size); -+ calloc (max_size, 0); -+ calloc (0, ~((size_t) zero_size)); -+ calloc (~((size_t) zero_size), 0); - DIAG_POP_NEEDS_COMMENT; - } - - -commit 85668221974db44459527e04d04f77ca8f8e3115 -Author: H.J. Lu -Date: Fri Jan 24 18:53:13 2025 +0800 - - stdlib: Test using setenv with updated environ [BZ #32588] - - Add a test for setenv with updated environ. Verify that BZ #32588 is - fixed. - - Signed-off-by: H.J. Lu - Reviewed-by: Florian Weimer - (cherry picked from commit 8ab34497de14e35aff09b607222fe1309ef156da) - -diff --git a/stdlib/Makefile b/stdlib/Makefile -index 8213fa83ef..d3a84fa641 100644 ---- a/stdlib/Makefile -+++ b/stdlib/Makefile -@@ -307,6 +307,7 @@ tests := \ - tst-setcontext9 \ - tst-setcontext10 \ - tst-setcontext11 \ -+ tst-setenv-environ \ - tst-stdbit-Wconversion \ - tst-stdbit-builtins \ - tst-stdc_bit_ceil \ -diff --git a/stdlib/tst-setenv-environ.c b/stdlib/tst-setenv-environ.c -new file mode 100644 -index 0000000000..02fcef96d0 ---- /dev/null -+++ b/stdlib/tst-setenv-environ.c -@@ -0,0 +1,36 @@ -+/* Test using setenv with updated environ. -+ Copyright (C) 2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+ -+extern char **environ; -+ -+int -+do_test (void) -+{ -+ char *valp; -+ static char *dummy_environ[] = { NULL }; -+ environ = dummy_environ; -+ setenv ("A", "1", 0); -+ valp = getenv ("A"); -+ TEST_VERIFY_EXIT (valp[0] == '1' && valp[1] == '\0'); -+ return 0; -+} -+ -+#include - -commit e899ca3651f8c5e01bf3420cfb34aad97d093f74 -Author: John David Anglin -Date: Wed Jan 29 16:51:16 2025 -0500 - - nptl: Correct stack size attribute when stack grows up [BZ #32574] - - Set stack size attribute to the size of the mmap'd region only - when the size of the remaining stack space is less than the size - of the mmap'd region. - - This was reversed. As a result, the initial stack size was only - 135168 bytes. On architectures where the stack grows down, the - initial stack size is approximately 8384512 bytes with the default - rlimit settings. The small main stack size on hppa broke - applications like ruby that check for stack overflows. - - Signed-off-by: John David Anglin - -diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c -index 1e91874767..3ce34437bc 100644 ---- a/nptl/pthread_getattr_np.c -+++ b/nptl/pthread_getattr_np.c -@@ -145,9 +145,9 @@ __pthread_getattr_np (pthread_t thread_id, pthread_attr_t *attr) - > (size_t) iattr->stackaddr - last_to) - iattr->stacksize = (size_t) iattr->stackaddr - last_to; - #else -- /* The limit might be too high. */ -+ /* The limit might be too low. */ - if ((size_t) iattr->stacksize -- > to - (size_t) iattr->stackaddr) -+ < to - (size_t) iattr->stackaddr) - iattr->stacksize = to - (size_t) iattr->stackaddr; - #endif - /* We succeed and no need to look further. */ - -commit d6c156c326999f144cb5b73d29982108d549ad8a -Author: Siddhesh Poyarekar -Date: Fri Jan 31 12:16:30 2025 -0500 - - assert: Add test for CVE-2025-0395 - - Use the __progname symbol to override the program name to induce the - failure that CVE-2025-0395 describes. - - This is related to BZ #32582 - - Signed-off-by: Siddhesh Poyarekar - Reviewed-by: Adhemerval Zanella - (cherry picked from commit cdb9ba84191ce72e86346fb8b1d906e7cd930ea2) - -diff --git a/assert/Makefile b/assert/Makefile -index 35dc908ddb..c0fe660bd6 100644 ---- a/assert/Makefile -+++ b/assert/Makefile -@@ -38,6 +38,7 @@ tests := \ - test-assert-perr \ - tst-assert-c++ \ - tst-assert-g++ \ -+ tst-assert-sa-2025-0001 \ - # tests - - ifeq ($(have-cxx-thread_local),yes) -diff --git a/assert/tst-assert-sa-2025-0001.c b/assert/tst-assert-sa-2025-0001.c -new file mode 100644 -index 0000000000..102cb0078d ---- /dev/null -+++ b/assert/tst-assert-sa-2025-0001.c -@@ -0,0 +1,92 @@ -+/* Test for CVE-2025-0395. -+ Copyright The GNU Toolchain Authors. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* Test that a large enough __progname does not result in a buffer overflow -+ when printing an assertion failure. This was CVE-2025-0395. */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+extern const char *__progname; -+ -+int -+do_test (int argc, char **argv) -+{ -+ -+ support_need_proc ("Reads /proc/self/maps to add guards to writable maps."); -+ ignore_stderr (); -+ -+ /* XXX assumes that the assert is on a 2 digit line number. */ -+ const char *prompt = ": %s:99: do_test: Assertion `argc < 1' failed.\n"; -+ -+ int ret = fprintf (stderr, prompt, __FILE__); -+ if (ret < 0) -+ FAIL_EXIT1 ("fprintf failed: %m\n"); -+ -+ size_t pagesize = getpagesize (); -+ size_t namesize = pagesize - 1 - ret; -+ -+ /* Alter the progname so that the assert message fills the entire page. */ -+ char progname[namesize]; -+ memset (progname, 'A', namesize - 1); -+ progname[namesize - 1] = '\0'; -+ __progname = progname; -+ -+ FILE *f = xfopen ("/proc/self/maps", "r"); -+ char *line = NULL; -+ size_t len = 0; -+ uintptr_t prev_to = 0; -+ -+ /* Pad the beginning of every writable mapping with a PROT_NONE map. This -+ ensures that the mmap in the assert_fail path never ends up below a -+ writable map and will terminate immediately in case of a buffer -+ overflow. */ -+ while (xgetline (&line, &len, f)) -+ { -+ uintptr_t from, to; -+ char perm[4]; -+ -+ sscanf (line, "%" SCNxPTR "-%" SCNxPTR " %c%c%c%c ", -+ &from, &to, -+ &perm[0], &perm[1], &perm[2], &perm[3]); -+ -+ bool writable = (memchr (perm, 'w', 4) != NULL); -+ -+ if (prev_to != 0 && from - prev_to > pagesize && writable) -+ xmmap ((void *) from - pagesize, pagesize, PROT_NONE, -+ MAP_ANONYMOUS | MAP_PRIVATE, 0); -+ -+ prev_to = to; -+ } -+ -+ xfclose (f); -+ -+ assert (argc < 1); -+ return 0; -+} -+ -+#define EXPECTED_SIGNAL SIGABRT -+#define TEST_FUNCTION_ARGV do_test -+#include - -commit 523f85558152a1b9cced6d669f758c27677775ba -Author: John David Anglin -Date: Tue Feb 25 15:57:53 2025 -0500 - - math: Add optimization barrier to ensure a1 + u.d is not reused [BZ #30664] - - A number of fma tests started to fail on hppa when gcc was changed to - use Ranger rather than EVRP. Eventually I found that the value of - a1 + u.d in this is block of code was being computed in FE_TOWARDZERO - mode and not the original rounding mode: - - if (TININESS_AFTER_ROUNDING) - { - w.d = a1 + u.d; - if (w.ieee.exponent == 109) - return w.d * 0x1p-108; - } - - This caused the exponent value to be wrong and the wrong return path - to be used. - - Here we add an optimization barrier after the rounding mode is reset - to ensure that the previous value of a1 + u.d is not reused. - - Signed-off-by: John David Anglin - -diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c -index c5f5abdc68..79a3cd721d 100644 ---- a/sysdeps/ieee754/dbl-64/s_fma.c -+++ b/sysdeps/ieee754/dbl-64/s_fma.c -@@ -244,6 +244,9 @@ __fma (double x, double y, double z) - /* Reset rounding mode and test for inexact simultaneously. */ - int j = libc_feupdateenv_test (&env, FE_INEXACT) != 0; - -+ /* Ensure value of a1 + u.d is not reused. */ -+ a1 = math_opt_barrier (a1); -+ - if (__glibc_likely (adjust == 0)) - { - if ((u.ieee.mantissa1 & 1) == 0 && u.ieee.exponent != 0x7ff) - -commit ff10623706ea0096f3af7b38a3330ffb7fb15ae7 -Author: Joe Ramsay -Date: Mon Sep 9 13:00:01 2024 +0100 - - aarch64: Avoid redundant MOVs in AdvSIMD F32 logs - - Since the last operation is destructive, the first argument to the FMA - also has to be the first argument to the special-case in order to - avoid unnecessary MOVs. Reorder arguments and adjust special-case - bounds to facilitate this. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 8b09af572b208bfde4d31c6abbae047dcc217675) - -diff --git a/sysdeps/aarch64/fpu/log10f_advsimd.c b/sysdeps/aarch64/fpu/log10f_advsimd.c -index 9347422a77..82228b599a 100644 ---- a/sysdeps/aarch64/fpu/log10f_advsimd.c -+++ b/sysdeps/aarch64/fpu/log10f_advsimd.c -@@ -22,11 +22,11 @@ - - static const struct data - { -- uint32x4_t min_norm; -+ uint32x4_t off, offset_lower_bound; - uint16x8_t special_bound; -+ uint32x4_t mantissa_mask; - float32x4_t poly[8]; - float32x4_t inv_ln10, ln2; -- uint32x4_t off, mantissa_mask; - } data = { - /* Use order 9 for log10(1+x), i.e. order 8 for log10(1+x)/x, with x in - [-1/3, 1/3] (offset=2/3). Max. relative error: 0x1.068ee468p-25. */ -@@ -35,18 +35,22 @@ static const struct data - V4 (-0x1.0fc92cp-4f), V4 (0x1.f5f76ap-5f) }, - .ln2 = V4 (0x1.62e43p-1f), - .inv_ln10 = V4 (0x1.bcb7b2p-2f), -- .min_norm = V4 (0x00800000), -- .special_bound = V8 (0x7f00), /* asuint32(inf) - min_norm. */ -+ /* Lower bound is the smallest positive normal float 0x00800000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound is 0x0080000 - offset (which wraps around). */ -+ .offset_lower_bound = V4 (0x00800000 - 0x3f2aaaab), -+ .special_bound = V8 (0x7f00), /* top16(asuint32(inf) - 0x00800000). */ - .off = V4 (0x3f2aaaab), /* 0.666667. */ - .mantissa_mask = V4 (0x007fffff), - }; - - static float32x4_t VPCS_ATTR NOINLINE --special_case (float32x4_t x, float32x4_t y, float32x4_t p, float32x4_t r2, -- uint16x4_t cmp) -+special_case (float32x4_t y, uint32x4_t u_off, float32x4_t p, float32x4_t r2, -+ uint16x4_t cmp, const struct data *d) - { - /* Fall back to scalar code. */ -- return v_call_f32 (log10f, x, vfmaq_f32 (y, p, r2), vmovl_u16 (cmp)); -+ return v_call_f32 (log10f, vreinterpretq_f32_u32 (vaddq_u32 (u_off, d->off)), -+ vfmaq_f32 (y, p, r2), vmovl_u16 (cmp)); - } - - /* Fast implementation of AdvSIMD log10f, -@@ -58,15 +62,21 @@ special_case (float32x4_t x, float32x4_t y, float32x4_t p, float32x4_t r2, - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log10) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- uint32x4_t u = vreinterpretq_u32_f32 (x); -- uint16x4_t special = vcge_u16 (vsubhn_u32 (u, d->min_norm), -- vget_low_u16 (d->special_bound)); -+ -+ /* To avoid having to mov x out of the way, keep u after offset has been -+ applied, and recover x by adding the offset back in the special-case -+ handler. */ -+ uint32x4_t u_off = vreinterpretq_u32_f32 (x); - - /* x = 2^n * (1+r), where 2/3 < 1+r < 4/3. */ -- u = vsubq_u32 (u, d->off); -+ u_off = vsubq_u32 (u_off, d->off); - float32x4_t n = vcvtq_f32_s32 ( -- vshrq_n_s32 (vreinterpretq_s32_u32 (u), 23)); /* signextend. */ -- u = vaddq_u32 (vandq_u32 (u, d->mantissa_mask), d->off); -+ vshrq_n_s32 (vreinterpretq_s32_u32 (u_off), 23)); /* signextend. */ -+ -+ uint16x4_t special = vcge_u16 (vsubhn_u32 (u_off, d->offset_lower_bound), -+ vget_low_u16 (d->special_bound)); -+ -+ uint32x4_t u = vaddq_u32 (vandq_u32 (u_off, d->mantissa_mask), d->off); - float32x4_t r = vsubq_f32 (vreinterpretq_f32_u32 (u), v_f32 (1.0f)); - - /* y = log10(1+r) + n * log10(2). */ -@@ -77,7 +87,7 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log10) (float32x4_t x) - y = vmulq_f32 (y, d->inv_ln10); - - if (__glibc_unlikely (v_any_u16h (special))) -- return special_case (x, y, poly, r2, special); -+ return special_case (y, u_off, poly, r2, special, d); - return vfmaq_f32 (y, poly, r2); - } - libmvec_hidden_def (V_NAME_F1 (log10)) -diff --git a/sysdeps/aarch64/fpu/log2f_advsimd.c b/sysdeps/aarch64/fpu/log2f_advsimd.c -index db21836749..84effe4fe9 100644 ---- a/sysdeps/aarch64/fpu/log2f_advsimd.c -+++ b/sysdeps/aarch64/fpu/log2f_advsimd.c -@@ -22,9 +22,9 @@ - - static const struct data - { -- uint32x4_t min_norm; -+ uint32x4_t off, offset_lower_bound; - uint16x8_t special_bound; -- uint32x4_t off, mantissa_mask; -+ uint32x4_t mantissa_mask; - float32x4_t poly[9]; - } data = { - /* Coefficients generated using Remez algorithm approximate -@@ -34,18 +34,22 @@ static const struct data - V4 (-0x1.715458p-1f), V4 (0x1.ec701cp-2f), V4 (-0x1.7171a4p-2f), - V4 (0x1.27a0b8p-2f), V4 (-0x1.e5143ep-3f), V4 (0x1.9d8ecap-3f), - V4 (-0x1.c675bp-3f), V4 (0x1.9e495p-3f) }, -- .min_norm = V4 (0x00800000), -- .special_bound = V8 (0x7f00), /* asuint32(inf) - min_norm. */ -+ /* Lower bound is the smallest positive normal float 0x00800000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound is 0x0080000 - offset (which wraps around). */ -+ .offset_lower_bound = V4 (0x00800000 - 0x3f2aaaab), -+ .special_bound = V8 (0x7f00), /* top16(asuint32(inf) - 0x00800000). */ - .off = V4 (0x3f2aaaab), /* 0.666667. */ - .mantissa_mask = V4 (0x007fffff), - }; - - static float32x4_t VPCS_ATTR NOINLINE --special_case (float32x4_t x, float32x4_t n, float32x4_t p, float32x4_t r, -- uint16x4_t cmp) -+special_case (float32x4_t n, uint32x4_t u_off, float32x4_t p, float32x4_t r, -+ uint16x4_t cmp, const struct data *d) - { - /* Fall back to scalar code. */ -- return v_call_f32 (log2f, x, vfmaq_f32 (n, p, r), vmovl_u16 (cmp)); -+ return v_call_f32 (log2f, vreinterpretq_f32_u32 (vaddq_u32 (u_off, d->off)), -+ vfmaq_f32 (n, p, r), vmovl_u16 (cmp)); - } - - /* Fast implementation for single precision AdvSIMD log2, -@@ -56,15 +60,21 @@ special_case (float32x4_t x, float32x4_t n, float32x4_t p, float32x4_t r, - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log2) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- uint32x4_t u = vreinterpretq_u32_f32 (x); -- uint16x4_t special = vcge_u16 (vsubhn_u32 (u, d->min_norm), -- vget_low_u16 (d->special_bound)); -+ -+ /* To avoid having to mov x out of the way, keep u after offset has been -+ applied, and recover x by adding the offset back in the special-case -+ handler. */ -+ uint32x4_t u_off = vreinterpretq_u32_f32 (x); - - /* x = 2^n * (1+r), where 2/3 < 1+r < 4/3. */ -- u = vsubq_u32 (u, d->off); -+ u_off = vsubq_u32 (u_off, d->off); - float32x4_t n = vcvtq_f32_s32 ( -- vshrq_n_s32 (vreinterpretq_s32_u32 (u), 23)); /* signextend. */ -- u = vaddq_u32 (vandq_u32 (u, d->mantissa_mask), d->off); -+ vshrq_n_s32 (vreinterpretq_s32_u32 (u_off), 23)); /* signextend. */ -+ -+ uint16x4_t special = vcge_u16 (vsubhn_u32 (u_off, d->offset_lower_bound), -+ vget_low_u16 (d->special_bound)); -+ -+ uint32x4_t u = vaddq_u32 (vandq_u32 (u_off, d->mantissa_mask), d->off); - float32x4_t r = vsubq_f32 (vreinterpretq_f32_u32 (u), v_f32 (1.0f)); - - /* y = log2(1+r) + n. */ -@@ -72,7 +82,7 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log2) (float32x4_t x) - float32x4_t p = v_pw_horner_8_f32 (r, r2, d->poly); - - if (__glibc_unlikely (v_any_u16h (special))) -- return special_case (x, n, p, r, special); -+ return special_case (n, u_off, p, r, special, d); - return vfmaq_f32 (n, p, r); - } - libmvec_hidden_def (V_NAME_F1 (log2)) -diff --git a/sysdeps/aarch64/fpu/logf_advsimd.c b/sysdeps/aarch64/fpu/logf_advsimd.c -index 3c0d0fcdc7..c20dbfd6c0 100644 ---- a/sysdeps/aarch64/fpu/logf_advsimd.c -+++ b/sysdeps/aarch64/fpu/logf_advsimd.c -@@ -21,20 +21,22 @@ - - static const struct data - { -- uint32x4_t min_norm; -+ uint32x4_t off, offset_lower_bound; - uint16x8_t special_bound; -+ uint32x4_t mantissa_mask; - float32x4_t poly[7]; -- float32x4_t ln2, tiny_bound; -- uint32x4_t off, mantissa_mask; -+ float32x4_t ln2; - } data = { - /* 3.34 ulp error. */ - .poly = { V4 (-0x1.3e737cp-3f), V4 (0x1.5a9aa2p-3f), V4 (-0x1.4f9934p-3f), - V4 (0x1.961348p-3f), V4 (-0x1.00187cp-2f), V4 (0x1.555d7cp-2f), - V4 (-0x1.ffffc8p-2f) }, - .ln2 = V4 (0x1.62e43p-1f), -- .tiny_bound = V4 (0x1p-126), -- .min_norm = V4 (0x00800000), -- .special_bound = V8 (0x7f00), /* asuint32(inf) - min_norm. */ -+ /* Lower bound is the smallest positive normal float 0x00800000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound is 0x0080000 - offset (which wraps around). */ -+ .offset_lower_bound = V4 (0x00800000 - 0x3f2aaaab), -+ .special_bound = V8 (0x7f00), /* top16(asuint32(inf) - 0x00800000). */ - .off = V4 (0x3f2aaaab), /* 0.666667. */ - .mantissa_mask = V4 (0x007fffff) - }; -@@ -42,32 +44,37 @@ static const struct data - #define P(i) d->poly[7 - i] - - static float32x4_t VPCS_ATTR NOINLINE --special_case (float32x4_t x, float32x4_t y, float32x4_t r2, float32x4_t p, -- uint16x4_t cmp) -+special_case (float32x4_t p, uint32x4_t u_off, float32x4_t y, float32x4_t r2, -+ uint16x4_t cmp, const struct data *d) - { - /* Fall back to scalar code. */ -- return v_call_f32 (logf, x, vfmaq_f32 (p, y, r2), vmovl_u16 (cmp)); -+ return v_call_f32 (logf, vreinterpretq_f32_u32 (vaddq_u32 (u_off, d->off)), -+ vfmaq_f32 (p, y, r2), vmovl_u16 (cmp)); - } - - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); - float32x4_t n, p, q, r, r2, y; -- uint32x4_t u; -+ uint32x4_t u, u_off; - uint16x4_t cmp; - -- u = vreinterpretq_u32_f32 (x); -- cmp = vcge_u16 (vsubhn_u32 (u, d->min_norm), -- vget_low_u16 (d->special_bound)); -+ /* To avoid having to mov x out of the way, keep u after offset has been -+ applied, and recover x by adding the offset back in the special-case -+ handler. */ -+ u_off = vreinterpretq_u32_f32 (x); - - /* x = 2^n * (1+r), where 2/3 < 1+r < 4/3. */ -- u = vsubq_u32 (u, d->off); -+ u_off = vsubq_u32 (u_off, d->off); - n = vcvtq_f32_s32 ( -- vshrq_n_s32 (vreinterpretq_s32_u32 (u), 23)); /* signextend. */ -- u = vandq_u32 (u, d->mantissa_mask); -+ vshrq_n_s32 (vreinterpretq_s32_u32 (u_off), 23)); /* signextend. */ -+ u = vandq_u32 (u_off, d->mantissa_mask); - u = vaddq_u32 (u, d->off); - r = vsubq_f32 (vreinterpretq_f32_u32 (u), v_f32 (1.0f)); - -+ cmp = vcge_u16 (vsubhn_u32 (u_off, d->offset_lower_bound), -+ vget_low_u16 (d->special_bound)); -+ - /* y = log(1+r) + n*ln2. */ - r2 = vmulq_f32 (r, r); - /* n*ln2 + r + r2*(P1 + r*P2 + r2*(P3 + r*P4 + r2*(P5 + r*P6 + r2*P7))). */ -@@ -80,7 +87,7 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log) (float32x4_t x) - p = vfmaq_f32 (r, d->ln2, n); - - if (__glibc_unlikely (v_any_u16h (cmp))) -- return special_case (x, y, r2, p, cmp); -+ return special_case (p, u_off, y, r2, cmp, d); - return vfmaq_f32 (p, y, r2); - } - libmvec_hidden_def (V_NAME_F1 (log)) - -commit a991a0fc7c051d7ef2ea7778e0a699f22d4e53d7 -Author: Joe Ramsay -Date: Thu Sep 19 17:34:02 2024 +0100 - - AArch64: Add vector logp1 alias for log1p - - This enables vectorisation of C23 logp1, which is an alias for log1p. - There are no new tests or ulp entries because the new symbols are simply - aliases. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 751a5502bea1d13551c62c47bb9bd25bff870cda) - -diff --git a/bits/libm-simd-decl-stubs.h b/bits/libm-simd-decl-stubs.h -index 08a41c46ad..5019e8e25c 100644 ---- a/bits/libm-simd-decl-stubs.h -+++ b/bits/libm-simd-decl-stubs.h -@@ -253,6 +253,17 @@ - #define __DECL_SIMD_log1pf64x - #define __DECL_SIMD_log1pf128x - -+#define __DECL_SIMD_logp1 -+#define __DECL_SIMD_logp1f -+#define __DECL_SIMD_logp1l -+#define __DECL_SIMD_logp1f16 -+#define __DECL_SIMD_logp1f32 -+#define __DECL_SIMD_logp1f64 -+#define __DECL_SIMD_logp1f128 -+#define __DECL_SIMD_logp1f32x -+#define __DECL_SIMD_logp1f64x -+#define __DECL_SIMD_logp1f128x -+ - #define __DECL_SIMD_atanh - #define __DECL_SIMD_atanhf - #define __DECL_SIMD_atanhl -diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h -index 6cb594b6ff..92856becc4 100644 ---- a/math/bits/mathcalls.h -+++ b/math/bits/mathcalls.h -@@ -126,7 +126,7 @@ __MATHCALL (log2p1,, (_Mdouble_ __x)); - __MATHCALL (log10p1,, (_Mdouble_ __x)); - - /* Return log(1 + X). */ --__MATHCALL (logp1,, (_Mdouble_ __x)); -+__MATHCALL_VEC (logp1,, (_Mdouble_ __x)); - #endif - - #if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 -diff --git a/sysdeps/aarch64/fpu/Versions b/sysdeps/aarch64/fpu/Versions -index cc15ce2d1e..015211f5f4 100644 ---- a/sysdeps/aarch64/fpu/Versions -+++ b/sysdeps/aarch64/fpu/Versions -@@ -135,4 +135,11 @@ libmvec { - _ZGVsMxv_tanh; - _ZGVsMxv_tanhf; - } -+ GLIBC_2.41 { -+ _ZGVnN2v_logp1; -+ _ZGVnN2v_logp1f; -+ _ZGVnN4v_logp1f; -+ _ZGVsMxv_logp1; -+ _ZGVsMxv_logp1f; -+ } - } -diff --git a/sysdeps/aarch64/fpu/advsimd_f32_protos.h b/sysdeps/aarch64/fpu/advsimd_f32_protos.h -index 097d403ffe..5909bb4ce9 100644 ---- a/sysdeps/aarch64/fpu/advsimd_f32_protos.h -+++ b/sysdeps/aarch64/fpu/advsimd_f32_protos.h -@@ -36,6 +36,7 @@ libmvec_hidden_proto (V_NAME_F2(hypot)); - libmvec_hidden_proto (V_NAME_F1(log10)); - libmvec_hidden_proto (V_NAME_F1(log1p)); - libmvec_hidden_proto (V_NAME_F1(log2)); -+libmvec_hidden_proto (V_NAME_F1(logp1)); - libmvec_hidden_proto (V_NAME_F1(log)); - libmvec_hidden_proto (V_NAME_F2(pow)); - libmvec_hidden_proto (V_NAME_F1(sin)); -diff --git a/sysdeps/aarch64/fpu/bits/math-vector.h b/sysdeps/aarch64/fpu/bits/math-vector.h -index 7484150131..f295fe185d 100644 ---- a/sysdeps/aarch64/fpu/bits/math-vector.h -+++ b/sysdeps/aarch64/fpu/bits/math-vector.h -@@ -113,6 +113,10 @@ - # define __DECL_SIMD_log2 __DECL_SIMD_aarch64 - # undef __DECL_SIMD_log2f - # define __DECL_SIMD_log2f __DECL_SIMD_aarch64 -+# undef __DECL_SIMD_logp1 -+# define __DECL_SIMD_logp1 __DECL_SIMD_aarch64 -+# undef __DECL_SIMD_logp1f -+# define __DECL_SIMD_logp1f __DECL_SIMD_aarch64 - # undef __DECL_SIMD_pow - # define __DECL_SIMD_pow __DECL_SIMD_aarch64 - # undef __DECL_SIMD_powf -@@ -180,6 +184,7 @@ __vpcs __f32x4_t _ZGVnN4v_logf (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_log10f (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_log1pf (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_log2f (__f32x4_t); -+__vpcs __f32x4_t _ZGVnN4v_logp1f (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4vv_powf (__f32x4_t, __f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_sinf (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_sinhf (__f32x4_t); -@@ -207,6 +212,7 @@ __vpcs __f64x2_t _ZGVnN2v_log (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_log10 (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_log1p (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_log2 (__f64x2_t); -+__vpcs __f64x2_t _ZGVnN2v_logp1 (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2vv_pow (__f64x2_t, __f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_sin (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_sinh (__f64x2_t); -@@ -239,6 +245,7 @@ __sv_f32_t _ZGVsMxv_logf (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_log10f (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_log1pf (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_log2f (__sv_f32_t, __sv_bool_t); -+__sv_f32_t _ZGVsMxv_logp1f (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxvv_powf (__sv_f32_t, __sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_sinf (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_sinhf (__sv_f32_t, __sv_bool_t); -@@ -266,6 +273,7 @@ __sv_f64_t _ZGVsMxv_log (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_log10 (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_log1p (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_log2 (__sv_f64_t, __sv_bool_t); -+__sv_f64_t _ZGVsMxv_logp1 (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxvv_pow (__sv_f64_t, __sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_sin (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_sinh (__sv_f64_t, __sv_bool_t); -diff --git a/sysdeps/aarch64/fpu/log1p_advsimd.c b/sysdeps/aarch64/fpu/log1p_advsimd.c -index ffc418fc9c..114064c696 100644 ---- a/sysdeps/aarch64/fpu/log1p_advsimd.c -+++ b/sysdeps/aarch64/fpu/log1p_advsimd.c -@@ -127,3 +127,5 @@ VPCS_ATTR float64x2_t V_NAME_D1 (log1p) (float64x2_t x) - - return vfmaq_f64 (y, f2, p); - } -+ -+strong_alias (V_NAME_D1 (log1p), V_NAME_D1 (logp1)) -diff --git a/sysdeps/aarch64/fpu/log1p_sve.c b/sysdeps/aarch64/fpu/log1p_sve.c -index 04f7e5720e..b21cfb2c90 100644 ---- a/sysdeps/aarch64/fpu/log1p_sve.c -+++ b/sysdeps/aarch64/fpu/log1p_sve.c -@@ -116,3 +116,5 @@ svfloat64_t SV_NAME_D1 (log1p) (svfloat64_t x, svbool_t pg) - - return y; - } -+ -+strong_alias (SV_NAME_D1 (log1p), SV_NAME_D1 (logp1)) -diff --git a/sysdeps/aarch64/fpu/log1pf_advsimd.c b/sysdeps/aarch64/fpu/log1pf_advsimd.c -index dc15334a85..8cfa28fb8a 100644 ---- a/sysdeps/aarch64/fpu/log1pf_advsimd.c -+++ b/sysdeps/aarch64/fpu/log1pf_advsimd.c -@@ -128,3 +128,6 @@ VPCS_ATTR float32x4_t V_NAME_F1 (log1p) (float32x4_t x) - } - libmvec_hidden_def (V_NAME_F1 (log1p)) - HALF_WIDTH_ALIAS_F1 (log1p) -+strong_alias (V_NAME_F1 (log1p), V_NAME_F1 (logp1)) -+libmvec_hidden_def (V_NAME_F1 (logp1)) -+HALF_WIDTH_ALIAS_F1 (logp1) -diff --git a/sysdeps/aarch64/fpu/log1pf_sve.c b/sysdeps/aarch64/fpu/log1pf_sve.c -index f645cc997e..5256d5e94c 100644 ---- a/sysdeps/aarch64/fpu/log1pf_sve.c -+++ b/sysdeps/aarch64/fpu/log1pf_sve.c -@@ -98,3 +98,5 @@ svfloat32_t SV_NAME_F1 (log1p) (svfloat32_t x, svbool_t pg) - - return y; - } -+ -+strong_alias (SV_NAME_F1 (log1p), SV_NAME_F1 (logp1)) -diff --git a/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist b/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist -index b685106954..98687cae0d 100644 ---- a/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist -+++ b/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist -@@ -128,3 +128,8 @@ GLIBC_2.40 _ZGVsMxvv_hypot F - GLIBC_2.40 _ZGVsMxvv_hypotf F - GLIBC_2.40 _ZGVsMxvv_pow F - GLIBC_2.40 _ZGVsMxvv_powf F -+GLIBC_2.41 _ZGVnN2v_logp1 F -+GLIBC_2.41 _ZGVnN2v_logp1f F -+GLIBC_2.41 _ZGVnN4v_logp1f F -+GLIBC_2.41 _ZGVsMxv_logp1 F -+GLIBC_2.41 _ZGVsMxv_logp1f F - -commit 354aeaf2130c1484007025563fe87c997f07324a -Author: Joe Ramsay -Date: Mon Sep 23 15:26:12 2024 +0100 - - AArch64: Improve codegen in SVE expf & related routines - - Reduce MOV and MOVPRFX by improving special-case handling. Use inline - helper to duplicate the entire computation between the special- and - non-special case branches, removing the contention for z0 between x - and the return value. - - Also rearrange some MLAs and MLSs - by making the multiplicand the - destination we can avoid a MOVPRFX in several cases. Also change which - constants go in the vector used for lanewise ops - the last lane is no - longer wasted. - - Spotted that shift was incorrect in exp2f and exp10f, w.r.t. to the - comment that explains it. Fixed - worst-case ULP for exp2f moves - around but it doesn't change significantly for either routine. - - Worst-case error for coshf increases due to passing x to exp rather - than abs(x) - updated the comment, but does not require regen-ulps. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 7b8c134b5460ed933d610fa92ed1227372b68fdc) - -diff --git a/sysdeps/aarch64/fpu/coshf_sve.c b/sysdeps/aarch64/fpu/coshf_sve.c -index e5d8a299c6..7ad6efa0fc 100644 ---- a/sysdeps/aarch64/fpu/coshf_sve.c -+++ b/sysdeps/aarch64/fpu/coshf_sve.c -@@ -23,37 +23,42 @@ - static const struct data - { - struct sv_expf_data expf_consts; -- uint32_t special_bound; -+ float special_bound; - } data = { - .expf_consts = SV_EXPF_DATA, - /* 0x1.5a92d8p+6: expf overflows above this, so have to use special case. */ -- .special_bound = 0x42ad496c, -+ .special_bound = 0x1.5a92d8p+6, - }; - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t pg) -+special_case (svfloat32_t x, svfloat32_t half_e, svfloat32_t half_over_e, -+ svbool_t pg) - { -- return sv_call_f32 (coshf, x, y, pg); -+ return sv_call_f32 (coshf, x, svadd_x (svptrue_b32 (), half_e, half_over_e), -+ pg); - } - - /* Single-precision vector cosh, using vector expf. -- Maximum error is 1.89 ULP: -- _ZGVsMxv_coshf (-0x1.65898cp+6) got 0x1.f00aep+127 -- want 0x1.f00adcp+127. */ -+ Maximum error is 2.77 ULP: -+ _ZGVsMxv_coshf(-0x1.5b38f4p+1) got 0x1.e45946p+2 -+ want 0x1.e4594cp+2. */ - svfloat32_t SV_NAME_F1 (cosh) (svfloat32_t x, svbool_t pg) - { - const struct data *d = ptr_barrier (&data); - -- svfloat32_t ax = svabs_x (pg, x); -- svbool_t special = svcmpge (pg, svreinterpret_u32 (ax), d->special_bound); -+ svbool_t special = svacge (pg, x, d->special_bound); - -- /* Calculate cosh by exp(x) / 2 + exp(-x) / 2. */ -- svfloat32_t t = expf_inline (ax, pg, &d->expf_consts); -- svfloat32_t half_t = svmul_x (pg, t, 0.5); -- svfloat32_t half_over_t = svdivr_x (pg, t, 0.5); -+ /* Calculate cosh by exp(x) / 2 + exp(-x) / 2. -+ Note that x is passed to exp here, rather than |x|. This is to avoid using -+ destructive unary ABS for better register usage. However it means the -+ routine is not exactly symmetrical, as the exp helper is slightly less -+ accurate in the negative range. */ -+ svfloat32_t e = expf_inline (x, pg, &d->expf_consts); -+ svfloat32_t half_e = svmul_x (svptrue_b32 (), e, 0.5); -+ svfloat32_t half_over_e = svdivr_x (pg, e, 0.5); - - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svadd_x (pg, half_t, half_over_t), special); -+ return special_case (x, half_e, half_over_e, special); - -- return svadd_x (pg, half_t, half_over_t); -+ return svadd_x (svptrue_b32 (), half_e, half_over_e); - } -diff --git a/sysdeps/aarch64/fpu/exp10f_sve.c b/sysdeps/aarch64/fpu/exp10f_sve.c -index e09b2f3b27..8aa3fa9c43 100644 ---- a/sysdeps/aarch64/fpu/exp10f_sve.c -+++ b/sysdeps/aarch64/fpu/exp10f_sve.c -@@ -18,74 +18,83 @@ - . */ - - #include "sv_math.h" --#include "poly_sve_f32.h" - --/* For x < -SpecialBound, the result is subnormal and not handled correctly by -+/* For x < -Thres, the result is subnormal and not handled correctly by - FEXPA. */ --#define SpecialBound 37.9 -+#define Thres 37.9 - - static const struct data - { -- float poly[5]; -- float shift, log10_2, log2_10_hi, log2_10_lo, special_bound; -+ float log2_10_lo, c0, c2, c4; -+ float c1, c3, log10_2; -+ float shift, log2_10_hi, thres; - } data = { - /* Coefficients generated using Remez algorithm with minimisation of relative - error. - rel error: 0x1.89dafa3p-24 - abs error: 0x1.167d55p-23 in [-log10(2)/2, log10(2)/2] - maxerr: 0.52 +0.5 ulp. */ -- .poly = { 0x1.26bb16p+1f, 0x1.5350d2p+1f, 0x1.04744ap+1f, 0x1.2d8176p+0f, -- 0x1.12b41ap-1f }, -+ .c0 = 0x1.26bb16p+1f, -+ .c1 = 0x1.5350d2p+1f, -+ .c2 = 0x1.04744ap+1f, -+ .c3 = 0x1.2d8176p+0f, -+ .c4 = 0x1.12b41ap-1f, - /* 1.5*2^17 + 127, a shift value suitable for FEXPA. */ -- .shift = 0x1.903f8p17f, -+ .shift = 0x1.803f8p17f, - .log10_2 = 0x1.a934fp+1, - .log2_10_hi = 0x1.344136p-2, - .log2_10_lo = -0x1.ec10cp-27, -- .special_bound = SpecialBound, -+ .thres = Thres, - }; - --static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+static inline svfloat32_t -+sv_exp10f_inline (svfloat32_t x, const svbool_t pg, const struct data *d) - { -- return sv_call_f32 (exp10f, x, y, special); --} -- --/* Single-precision SVE exp10f routine. Implements the same algorithm -- as AdvSIMD exp10f. -- Worst case error is 1.02 ULPs. -- _ZGVsMxv_exp10f(-0x1.040488p-4) got 0x1.ba5f9ep-1 -- want 0x1.ba5f9cp-1. */ --svfloat32_t SV_NAME_F1 (exp10) (svfloat32_t x, const svbool_t pg) --{ -- const struct data *d = ptr_barrier (&data); - /* exp10(x) = 2^(n/N) * 10^r = 2^n * (1 + poly (r)), - with poly(r) in [1/sqrt(2), sqrt(2)] and - x = r + n * log10(2) / N, with r in [-log10(2)/2N, log10(2)/2N]. */ - -- /* Load some constants in quad-word chunks to minimise memory access (last -- lane is wasted). */ -- svfloat32_t log10_2_and_inv = svld1rq (svptrue_b32 (), &d->log10_2); -+ svfloat32_t lane_consts = svld1rq (svptrue_b32 (), &d->log2_10_lo); - - /* n = round(x/(log10(2)/N)). */ - svfloat32_t shift = sv_f32 (d->shift); -- svfloat32_t z = svmla_lane (shift, x, log10_2_and_inv, 0); -- svfloat32_t n = svsub_x (pg, z, shift); -+ svfloat32_t z = svmad_x (pg, sv_f32 (d->log10_2), x, shift); -+ svfloat32_t n = svsub_x (svptrue_b32 (), z, shift); - - /* r = x - n*log10(2)/N. */ -- svfloat32_t r = svmls_lane (x, n, log10_2_and_inv, 1); -- r = svmls_lane (r, n, log10_2_and_inv, 2); -+ svfloat32_t r = svmsb_x (pg, sv_f32 (d->log2_10_hi), n, x); -+ r = svmls_lane (r, n, lane_consts, 0); - -- svbool_t special = svacgt (pg, x, d->special_bound); - svfloat32_t scale = svexpa (svreinterpret_u32 (z)); - - /* Polynomial evaluation: poly(r) ~ exp10(r)-1. */ -- svfloat32_t r2 = svmul_x (pg, r, r); -- svfloat32_t poly -- = svmla_x (pg, svmul_x (pg, r, d->poly[0]), -- sv_pairwise_poly_3_f32_x (pg, r, r2, d->poly + 1), r2); -- -- if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svmla_x (pg, scale, scale, poly), special); -+ svfloat32_t p12 = svmla_lane (sv_f32 (d->c1), r, lane_consts, 2); -+ svfloat32_t p34 = svmla_lane (sv_f32 (d->c3), r, lane_consts, 3); -+ svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); -+ svfloat32_t p14 = svmla_x (pg, p12, p34, r2); -+ svfloat32_t p0 = svmul_lane (r, lane_consts, 1); -+ svfloat32_t poly = svmla_x (pg, p0, r2, p14); - - return svmla_x (pg, scale, scale, poly); - } -+ -+static svfloat32_t NOINLINE -+special_case (svfloat32_t x, svbool_t special, const struct data *d) -+{ -+ return sv_call_f32 (exp10f, x, sv_exp10f_inline (x, svptrue_b32 (), d), -+ special); -+} -+ -+/* Single-precision SVE exp10f routine. Implements the same algorithm -+ as AdvSIMD exp10f. -+ Worst case error is 1.02 ULPs. -+ _ZGVsMxv_exp10f(-0x1.040488p-4) got 0x1.ba5f9ep-1 -+ want 0x1.ba5f9cp-1. */ -+svfloat32_t SV_NAME_F1 (exp10) (svfloat32_t x, const svbool_t pg) -+{ -+ const struct data *d = ptr_barrier (&data); -+ svbool_t special = svacgt (pg, x, d->thres); -+ if (__glibc_unlikely (svptest_any (special, special))) -+ return special_case (x, special, d); -+ return sv_exp10f_inline (x, pg, d); -+} -diff --git a/sysdeps/aarch64/fpu/exp2f_sve.c b/sysdeps/aarch64/fpu/exp2f_sve.c -index 8a686e3e05..c6216bed9e 100644 ---- a/sysdeps/aarch64/fpu/exp2f_sve.c -+++ b/sysdeps/aarch64/fpu/exp2f_sve.c -@@ -24,54 +24,64 @@ - - static const struct data - { -- float poly[5]; -+ float c0, c2, c4, c1, c3; - float shift, thres; - } data = { -- /* Coefficients copied from the polynomial in AdvSIMD variant, reversed for -- compatibility with polynomial helpers. */ -- .poly = { 0x1.62e422p-1f, 0x1.ebf9bcp-3f, 0x1.c6bd32p-5f, 0x1.3ce9e4p-7f, -- 0x1.59977ap-10f }, -+ /* Coefficients copied from the polynomial in AdvSIMD variant. */ -+ .c0 = 0x1.62e422p-1f, -+ .c1 = 0x1.ebf9bcp-3f, -+ .c2 = 0x1.c6bd32p-5f, -+ .c3 = 0x1.3ce9e4p-7f, -+ .c4 = 0x1.59977ap-10f, - /* 1.5*2^17 + 127. */ -- .shift = 0x1.903f8p17f, -+ .shift = 0x1.803f8p17f, - /* Roughly 87.3. For x < -Thres, the result is subnormal and not handled - correctly by FEXPA. */ - .thres = Thres, - }; - --static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) --{ -- return sv_call_f32 (exp2f, x, y, special); --} -- --/* Single-precision SVE exp2f routine. Implements the same algorithm -- as AdvSIMD exp2f. -- Worst case error is 1.04 ULPs. -- SV_NAME_F1 (exp2)(0x1.943b9p-1) got 0x1.ba7eb2p+0 -- want 0x1.ba7ebp+0. */ --svfloat32_t SV_NAME_F1 (exp2) (svfloat32_t x, const svbool_t pg) -+static inline svfloat32_t -+sv_exp2f_inline (svfloat32_t x, const svbool_t pg, const struct data *d) - { -- const struct data *d = ptr_barrier (&data); - /* exp2(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] - x = n + r, with r in [-1/2, 1/2]. */ -- svfloat32_t shift = sv_f32 (d->shift); -- svfloat32_t z = svadd_x (pg, x, shift); -- svfloat32_t n = svsub_x (pg, z, shift); -- svfloat32_t r = svsub_x (pg, x, n); -+ svfloat32_t z = svadd_x (svptrue_b32 (), x, d->shift); -+ svfloat32_t n = svsub_x (svptrue_b32 (), z, d->shift); -+ svfloat32_t r = svsub_x (svptrue_b32 (), x, n); - -- svbool_t special = svacgt (pg, x, d->thres); - svfloat32_t scale = svexpa (svreinterpret_u32 (z)); - - /* Polynomial evaluation: poly(r) ~ exp2(r)-1. - Evaluate polynomial use hybrid scheme - offset ESTRIN by 1 for - coefficients 1 to 4, and apply most significant coefficient directly. */ -- svfloat32_t r2 = svmul_x (pg, r, r); -- svfloat32_t p14 = sv_pairwise_poly_3_f32_x (pg, r, r2, d->poly + 1); -- svfloat32_t p0 = svmul_x (pg, r, d->poly[0]); -+ svfloat32_t even_coeffs = svld1rq (svptrue_b32 (), &d->c0); -+ svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); -+ svfloat32_t p12 = svmla_lane (sv_f32 (d->c1), r, even_coeffs, 1); -+ svfloat32_t p34 = svmla_lane (sv_f32 (d->c3), r, even_coeffs, 2); -+ svfloat32_t p14 = svmla_x (pg, p12, r2, p34); -+ svfloat32_t p0 = svmul_lane (r, even_coeffs, 0); - svfloat32_t poly = svmla_x (pg, p0, r2, p14); - -- if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svmla_x (pg, scale, scale, poly), special); -- - return svmla_x (pg, scale, scale, poly); - } -+ -+static svfloat32_t NOINLINE -+special_case (svfloat32_t x, svbool_t special, const struct data *d) -+{ -+ return sv_call_f32 (exp2f, x, sv_exp2f_inline (x, svptrue_b32 (), d), -+ special); -+} -+ -+/* Single-precision SVE exp2f routine. Implements the same algorithm -+ as AdvSIMD exp2f. -+ Worst case error is 1.04 ULPs. -+ _ZGVsMxv_exp2f(-0x1.af994ap-3) got 0x1.ba6a66p-1 -+ want 0x1.ba6a64p-1. */ -+svfloat32_t SV_NAME_F1 (exp2) (svfloat32_t x, const svbool_t pg) -+{ -+ const struct data *d = ptr_barrier (&data); -+ svbool_t special = svacgt (pg, x, d->thres); -+ if (__glibc_unlikely (svptest_any (special, special))) -+ return special_case (x, special, d); -+ return sv_exp2f_inline (x, pg, d); -+} -diff --git a/sysdeps/aarch64/fpu/expf_sve.c b/sysdeps/aarch64/fpu/expf_sve.c -index 3ba79bc4f1..da93e01b87 100644 ---- a/sysdeps/aarch64/fpu/expf_sve.c -+++ b/sysdeps/aarch64/fpu/expf_sve.c -@@ -18,33 +18,25 @@ - . */ - - #include "sv_math.h" -+#include "sv_expf_inline.h" -+ -+/* Roughly 87.3. For x < -Thres, the result is subnormal and not handled -+ correctly by FEXPA. */ -+#define Thres 0x1.5d5e2ap+6f - - static const struct data - { -- float poly[5]; -- float inv_ln2, ln2_hi, ln2_lo, shift, thres; -+ struct sv_expf_data d; -+ float thres; - } data = { -- /* Coefficients copied from the polynomial in AdvSIMD variant, reversed for -- compatibility with polynomial helpers. */ -- .poly = { 0x1.ffffecp-1f, 0x1.fffdb6p-2f, 0x1.555e66p-3f, 0x1.573e2ep-5f, -- 0x1.0e4020p-7f }, -- .inv_ln2 = 0x1.715476p+0f, -- .ln2_hi = 0x1.62e4p-1f, -- .ln2_lo = 0x1.7f7d1cp-20f, -- /* 1.5*2^17 + 127. */ -- .shift = 0x1.903f8p17f, -- /* Roughly 87.3. For x < -Thres, the result is subnormal and not handled -- correctly by FEXPA. */ -- .thres = 0x1.5d5e2ap+6f, -+ .d = SV_EXPF_DATA, -+ .thres = Thres, - }; - --#define C(i) sv_f32 (d->poly[i]) --#define ExponentBias 0x3f800000 -- - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+special_case (svfloat32_t x, svbool_t special, const struct sv_expf_data *d) - { -- return sv_call_f32 (expf, x, y, special); -+ return sv_call_f32 (expf, x, expf_inline (x, svptrue_b32 (), d), special); - } - - /* Optimised single-precision SVE exp function. -@@ -54,36 +46,8 @@ special_case (svfloat32_t x, svfloat32_t y, svbool_t special) - svfloat32_t SV_NAME_F1 (exp) (svfloat32_t x, const svbool_t pg) - { - const struct data *d = ptr_barrier (&data); -- -- /* exp(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] -- x = ln2*n + r, with r in [-ln2/2, ln2/2]. */ -- -- /* Load some constants in quad-word chunks to minimise memory access (last -- lane is wasted). */ -- svfloat32_t invln2_and_ln2 = svld1rq (svptrue_b32 (), &d->inv_ln2); -- -- /* n = round(x/(ln2/N)). */ -- svfloat32_t z = svmla_lane (sv_f32 (d->shift), x, invln2_and_ln2, 0); -- svfloat32_t n = svsub_x (pg, z, d->shift); -- -- /* r = x - n*ln2/N. */ -- svfloat32_t r = svmls_lane (x, n, invln2_and_ln2, 1); -- r = svmls_lane (r, n, invln2_and_ln2, 2); -- -- /* scale = 2^(n/N). */ - svbool_t is_special_case = svacgt (pg, x, d->thres); -- svfloat32_t scale = svexpa (svreinterpret_u32 (z)); -- -- /* y = exp(r) - 1 ~= r + C0 r^2 + C1 r^3 + C2 r^4 + C3 r^5 + C4 r^6. */ -- svfloat32_t p12 = svmla_x (pg, C (1), C (2), r); -- svfloat32_t p34 = svmla_x (pg, C (3), C (4), r); -- svfloat32_t r2 = svmul_x (pg, r, r); -- svfloat32_t p14 = svmla_x (pg, p12, p34, r2); -- svfloat32_t p0 = svmul_x (pg, r, C (0)); -- svfloat32_t poly = svmla_x (pg, p0, r2, p14); -- - if (__glibc_unlikely (svptest_any (pg, is_special_case))) -- return special_case (x, svmla_x (pg, scale, scale, poly), is_special_case); -- -- return svmla_x (pg, scale, scale, poly); -+ return special_case (x, is_special_case, &d->d); -+ return expf_inline (x, pg, &d->d); - } -diff --git a/sysdeps/aarch64/fpu/sv_expf_inline.h b/sysdeps/aarch64/fpu/sv_expf_inline.h -index 23963b5f8e..6166df6553 100644 ---- a/sysdeps/aarch64/fpu/sv_expf_inline.h -+++ b/sysdeps/aarch64/fpu/sv_expf_inline.h -@@ -24,19 +24,20 @@ - - struct sv_expf_data - { -- float poly[5]; -- float inv_ln2, ln2_hi, ln2_lo, shift; -+ float c1, c3, inv_ln2; -+ float ln2_lo, c0, c2, c4; -+ float ln2_hi, shift; - }; - - /* Coefficients copied from the polynomial in AdvSIMD variant, reversed for - compatibility with polynomial helpers. Shift is 1.5*2^17 + 127. */ - #define SV_EXPF_DATA \ - { \ -- .poly = { 0x1.ffffecp-1f, 0x1.fffdb6p-2f, 0x1.555e66p-3f, 0x1.573e2ep-5f, \ -- 0x1.0e4020p-7f }, \ -- \ -- .inv_ln2 = 0x1.715476p+0f, .ln2_hi = 0x1.62e4p-1f, \ -- .ln2_lo = 0x1.7f7d1cp-20f, .shift = 0x1.803f8p17f, \ -+ /* Coefficients copied from the polynomial in AdvSIMD variant. */ \ -+ .c0 = 0x1.ffffecp-1f, .c1 = 0x1.fffdb6p-2f, .c2 = 0x1.555e66p-3f, \ -+ .c3 = 0x1.573e2ep-5f, .c4 = 0x1.0e4020p-7f, .inv_ln2 = 0x1.715476p+0f, \ -+ .ln2_hi = 0x1.62e4p-1f, .ln2_lo = 0x1.7f7d1cp-20f, \ -+ .shift = 0x1.803f8p17f, \ - } - - #define C(i) sv_f32 (d->poly[i]) -@@ -47,26 +48,25 @@ expf_inline (svfloat32_t x, const svbool_t pg, const struct sv_expf_data *d) - /* exp(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] - x = ln2*n + r, with r in [-ln2/2, ln2/2]. */ - -- /* Load some constants in quad-word chunks to minimise memory access. */ -- svfloat32_t c4_invln2_and_ln2 = svld1rq (svptrue_b32 (), &d->poly[4]); -+ svfloat32_t lane_consts = svld1rq (svptrue_b32 (), &d->ln2_lo); - - /* n = round(x/(ln2/N)). */ -- svfloat32_t z = svmla_lane (sv_f32 (d->shift), x, c4_invln2_and_ln2, 1); -+ svfloat32_t z = svmad_x (pg, sv_f32 (d->inv_ln2), x, d->shift); - svfloat32_t n = svsub_x (pg, z, d->shift); - - /* r = x - n*ln2/N. */ -- svfloat32_t r = svmls_lane (x, n, c4_invln2_and_ln2, 2); -- r = svmls_lane (r, n, c4_invln2_and_ln2, 3); -+ svfloat32_t r = svmsb_x (pg, sv_f32 (d->ln2_hi), n, x); -+ r = svmls_lane (r, n, lane_consts, 0); - - /* scale = 2^(n/N). */ -- svfloat32_t scale = svexpa (svreinterpret_u32_f32 (z)); -+ svfloat32_t scale = svexpa (svreinterpret_u32 (z)); - - /* y = exp(r) - 1 ~= r + C0 r^2 + C1 r^3 + C2 r^4 + C3 r^5 + C4 r^6. */ -- svfloat32_t p12 = svmla_x (pg, C (1), C (2), r); -- svfloat32_t p34 = svmla_lane (C (3), r, c4_invln2_and_ln2, 0); -- svfloat32_t r2 = svmul_f32_x (pg, r, r); -+ svfloat32_t p12 = svmla_lane (sv_f32 (d->c1), r, lane_consts, 2); -+ svfloat32_t p34 = svmla_lane (sv_f32 (d->c3), r, lane_consts, 3); -+ svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); - svfloat32_t p14 = svmla_x (pg, p12, p34, r2); -- svfloat32_t p0 = svmul_f32_x (pg, r, C (0)); -+ svfloat32_t p0 = svmul_lane (r, lane_consts, 1); - svfloat32_t poly = svmla_x (pg, p0, r2, p14); - - return svmla_x (pg, scale, scale, poly); - -commit c4373426e3a85ec483a0f412c2a7c6cdfa32ccdb -Author: Joe Ramsay -Date: Mon Sep 23 15:30:20 2024 +0100 - - AArch64: Improve codegen in SVE F32 logs - - Reduce MOVPRFXs by using unpredicated (non-destructive) instructions - where possible. Similar to the recent change to AdvSIMD F32 logs, - adjust special-case arguments and bounds to allow for more optimal - register usage. For all 3 routines one MOVPRFX remains in the - reduction, which cannot be avoided as immediate AND and ASR are both - destructive. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit a15b1394b5eba98ffe28a02a392b587e4fe13c0d) - -diff --git a/sysdeps/aarch64/fpu/log10f_sve.c b/sysdeps/aarch64/fpu/log10f_sve.c -index bdbb49cd32..7913679f67 100644 ---- a/sysdeps/aarch64/fpu/log10f_sve.c -+++ b/sysdeps/aarch64/fpu/log10f_sve.c -@@ -24,6 +24,7 @@ static const struct data - float poly_0246[4]; - float poly_1357[4]; - float ln2, inv_ln10; -+ uint32_t off, lower; - } data = { - .poly_1357 = { - /* Coefficients copied from the AdvSIMD routine, then rearranged so that coeffs -@@ -35,18 +36,23 @@ static const struct data - -0x1.0fc92cp-4f }, - .ln2 = 0x1.62e43p-1f, - .inv_ln10 = 0x1.bcb7b2p-2f, -+ .off = 0x3f2aaaab, -+ /* Lower bound is the smallest positive normal float 0x00800000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound is 0x0080000 - offset (which wraps around). */ -+ .lower = 0x00800000 - 0x3f2aaaab - }; - --#define Min 0x00800000 --#define Max 0x7f800000 --#define Thres 0x7f000000 /* Max - Min. */ --#define Offset 0x3f2aaaab /* 0.666667. */ -+#define Thres 0x7f000000 /* asuint32(inf) - 0x00800000. */ - #define MantissaMask 0x007fffff - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+special_case (svuint32_t u_off, svfloat32_t p, svfloat32_t r2, svfloat32_t y, -+ svbool_t cmp) - { -- return sv_call_f32 (log10f, x, y, special); -+ return sv_call_f32 ( -+ log10f, svreinterpret_f32 (svadd_x (svptrue_b32 (), u_off, data.off)), -+ svmla_x (svptrue_b32 (), p, r2, y), cmp); - } - - /* Optimised implementation of SVE log10f using the same algorithm and -@@ -57,23 +63,25 @@ special_case (svfloat32_t x, svfloat32_t y, svbool_t special) - svfloat32_t SV_NAME_F1 (log10) (svfloat32_t x, const svbool_t pg) - { - const struct data *d = ptr_barrier (&data); -- svuint32_t ix = svreinterpret_u32 (x); -- svbool_t special = svcmpge (pg, svsub_x (pg, ix, Min), Thres); -+ -+ svuint32_t u_off = svreinterpret_u32 (x); -+ -+ u_off = svsub_x (pg, u_off, d->off); -+ svbool_t special = svcmpge (pg, svsub_x (pg, u_off, d->lower), Thres); - - /* x = 2^n * (1+r), where 2/3 < 1+r < 4/3. */ -- ix = svsub_x (pg, ix, Offset); - svfloat32_t n = svcvt_f32_x ( -- pg, svasr_x (pg, svreinterpret_s32 (ix), 23)); /* signextend. */ -- ix = svand_x (pg, ix, MantissaMask); -- ix = svadd_x (pg, ix, Offset); -+ pg, svasr_x (pg, svreinterpret_s32 (u_off), 23)); /* signextend. */ -+ svuint32_t ix = svand_x (pg, u_off, MantissaMask); -+ ix = svadd_x (pg, ix, d->off); - svfloat32_t r = svsub_x (pg, svreinterpret_f32 (ix), 1.0f); - - /* y = log10(1+r) + n*log10(2) - log10(1+r) ~ r * InvLn(10) + P(r) - where P(r) is a polynomial. Use order 9 for log10(1+x), i.e. order 8 for - log10(1+x)/x, with x in [-1/3, 1/3] (offset=2/3). */ -- svfloat32_t r2 = svmul_x (pg, r, r); -- svfloat32_t r4 = svmul_x (pg, r2, r2); -+ svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); -+ svfloat32_t r4 = svmul_x (svptrue_b32 (), r2, r2); - svfloat32_t p_1357 = svld1rq (svptrue_b32 (), &d->poly_1357[0]); - svfloat32_t q_01 = svmla_lane (sv_f32 (d->poly_0246[0]), r, p_1357, 0); - svfloat32_t q_23 = svmla_lane (sv_f32 (d->poly_0246[1]), r, p_1357, 1); -@@ -88,7 +96,6 @@ svfloat32_t SV_NAME_F1 (log10) (svfloat32_t x, const svbool_t pg) - hi = svmul_x (pg, hi, d->inv_ln10); - - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svmla_x (svnot_z (pg, special), hi, r2, y), -- special); -- return svmla_x (pg, hi, r2, y); -+ return special_case (u_off, hi, r2, y, special); -+ return svmla_x (svptrue_b32 (), hi, r2, y); - } -diff --git a/sysdeps/aarch64/fpu/log2f_sve.c b/sysdeps/aarch64/fpu/log2f_sve.c -index 5031c42483..939d89bfb9 100644 ---- a/sysdeps/aarch64/fpu/log2f_sve.c -+++ b/sysdeps/aarch64/fpu/log2f_sve.c -@@ -23,6 +23,7 @@ static const struct data - { - float poly_02468[5]; - float poly_1357[4]; -+ uint32_t off, lower; - } data = { - .poly_1357 = { - /* Coefficients copied from the AdvSIMD routine, then rearranged so that coeffs -@@ -32,18 +33,23 @@ static const struct data - }, - .poly_02468 = { 0x1.715476p0f, 0x1.ec701cp-2f, 0x1.27a0b8p-2f, - 0x1.9d8ecap-3f, 0x1.9e495p-3f }, -+ .off = 0x3f2aaaab, -+ /* Lower bound is the smallest positive normal float 0x00800000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound is 0x0080000 - offset (which wraps around). */ -+ .lower = 0x00800000 - 0x3f2aaaab - }; - --#define Min (0x00800000) --#define Max (0x7f800000) --#define Thres (0x7f000000) /* Max - Min. */ -+#define Thresh (0x7f000000) /* asuint32(inf) - 0x00800000. */ - #define MantissaMask (0x007fffff) --#define Off (0x3f2aaaab) /* 0.666667. */ - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t cmp) -+special_case (svuint32_t u_off, svfloat32_t p, svfloat32_t r2, svfloat32_t y, -+ svbool_t cmp) - { -- return sv_call_f32 (log2f, x, y, cmp); -+ return sv_call_f32 ( -+ log2f, svreinterpret_f32 (svadd_x (svptrue_b32 (), u_off, data.off)), -+ svmla_x (svptrue_b32 (), p, r2, y), cmp); - } - - /* Optimised implementation of SVE log2f, using the same algorithm -@@ -55,19 +61,20 @@ svfloat32_t SV_NAME_F1 (log2) (svfloat32_t x, const svbool_t pg) - { - const struct data *d = ptr_barrier (&data); - -- svuint32_t u = svreinterpret_u32 (x); -- svbool_t special = svcmpge (pg, svsub_x (pg, u, Min), Thres); -+ svuint32_t u_off = svreinterpret_u32 (x); -+ -+ u_off = svsub_x (pg, u_off, d->off); -+ svbool_t special = svcmpge (pg, svsub_x (pg, u_off, d->lower), Thresh); - - /* x = 2^n * (1+r), where 2/3 < 1+r < 4/3. */ -- u = svsub_x (pg, u, Off); - svfloat32_t n = svcvt_f32_x ( -- pg, svasr_x (pg, svreinterpret_s32 (u), 23)); /* Sign-extend. */ -- u = svand_x (pg, u, MantissaMask); -- u = svadd_x (pg, u, Off); -+ pg, svasr_x (pg, svreinterpret_s32 (u_off), 23)); /* Sign-extend. */ -+ svuint32_t u = svand_x (pg, u_off, MantissaMask); -+ u = svadd_x (pg, u, d->off); - svfloat32_t r = svsub_x (pg, svreinterpret_f32 (u), 1.0f); - - /* y = log2(1+r) + n. */ -- svfloat32_t r2 = svmul_x (pg, r, r); -+ svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); - - /* Evaluate polynomial using pairwise Horner scheme. */ - svfloat32_t p_1357 = svld1rq (svptrue_b32 (), &d->poly_1357[0]); -@@ -81,6 +88,6 @@ svfloat32_t SV_NAME_F1 (log2) (svfloat32_t x, const svbool_t pg) - y = svmla_x (pg, q_01, r2, y); - - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svmla_x (svnot_z (pg, special), n, r, y), special); -- return svmla_x (pg, n, r, y); -+ return special_case (u_off, n, r, y, special); -+ return svmla_x (svptrue_b32 (), n, r, y); - } -diff --git a/sysdeps/aarch64/fpu/logf_sve.c b/sysdeps/aarch64/fpu/logf_sve.c -index d64e810cfe..5b9324678d 100644 ---- a/sysdeps/aarch64/fpu/logf_sve.c -+++ b/sysdeps/aarch64/fpu/logf_sve.c -@@ -24,6 +24,7 @@ static const struct data - float poly_0135[4]; - float poly_246[3]; - float ln2; -+ uint32_t off, lower; - } data = { - .poly_0135 = { - /* Coefficients copied from the AdvSIMD routine in math/, then rearranged so -@@ -32,19 +33,24 @@ static const struct data - -0x1.3e737cp-3f, 0x1.5a9aa2p-3f, 0x1.961348p-3f, 0x1.555d7cp-2f - }, - .poly_246 = { -0x1.4f9934p-3f, -0x1.00187cp-2f, -0x1.ffffc8p-2f }, -- .ln2 = 0x1.62e43p-1f -+ .ln2 = 0x1.62e43p-1f, -+ .off = 0x3f2aaaab, -+ /* Lower bound is the smallest positive normal float 0x00800000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound is 0x0080000 - offset (which wraps around). */ -+ .lower = 0x00800000 - 0x3f2aaaab - }; - --#define Min (0x00800000) --#define Max (0x7f800000) --#define Thresh (0x7f000000) /* Max - Min. */ -+#define Thresh (0x7f000000) /* asuint32(inf) - 0x00800000. */ - #define Mask (0x007fffff) --#define Off (0x3f2aaaab) /* 0.666667. */ - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t cmp) -+special_case (svuint32_t u_off, svfloat32_t p, svfloat32_t r2, svfloat32_t y, -+ svbool_t cmp) - { -- return sv_call_f32 (logf, x, y, cmp); -+ return sv_call_f32 ( -+ logf, svreinterpret_f32 (svadd_x (svptrue_b32 (), u_off, data.off)), -+ svmla_x (svptrue_b32 (), p, r2, y), cmp); - } - - /* Optimised implementation of SVE logf, using the same algorithm and -@@ -55,19 +61,21 @@ svfloat32_t SV_NAME_F1 (log) (svfloat32_t x, const svbool_t pg) - { - const struct data *d = ptr_barrier (&data); - -- svuint32_t u = svreinterpret_u32 (x); -- svbool_t cmp = svcmpge (pg, svsub_x (pg, u, Min), Thresh); -+ svuint32_t u_off = svreinterpret_u32 (x); -+ -+ u_off = svsub_x (pg, u_off, d->off); -+ svbool_t cmp = svcmpge (pg, svsub_x (pg, u_off, d->lower), Thresh); - - /* x = 2^n * (1+r), where 2/3 < 1+r < 4/3. */ -- u = svsub_x (pg, u, Off); - svfloat32_t n = svcvt_f32_x ( -- pg, svasr_x (pg, svreinterpret_s32 (u), 23)); /* Sign-extend. */ -- u = svand_x (pg, u, Mask); -- u = svadd_x (pg, u, Off); -+ pg, svasr_x (pg, svreinterpret_s32 (u_off), 23)); /* Sign-extend. */ -+ -+ svuint32_t u = svand_x (pg, u_off, Mask); -+ u = svadd_x (pg, u, d->off); - svfloat32_t r = svsub_x (pg, svreinterpret_f32 (u), 1.0f); - - /* y = log(1+r) + n*ln2. */ -- svfloat32_t r2 = svmul_x (pg, r, r); -+ svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); - /* n*ln2 + r + r2*(P6 + r*P5 + r2*(P4 + r*P3 + r2*(P2 + r*P1 + r2*P0))). */ - svfloat32_t p_0135 = svld1rq (svptrue_b32 (), &d->poly_0135[0]); - svfloat32_t p = svmla_lane (sv_f32 (d->poly_246[0]), r, p_0135, 1); -@@ -80,6 +88,6 @@ svfloat32_t SV_NAME_F1 (log) (svfloat32_t x, const svbool_t pg) - p = svmla_x (pg, r, n, d->ln2); - - if (__glibc_unlikely (svptest_any (pg, cmp))) -- return special_case (x, svmla_x (svnot_z (pg, cmp), p, r2, y), cmp); -+ return special_case (u_off, p, r2, y, cmp); - return svmla_x (pg, p, r2, y); - } - -commit 520240173029fd03388ec01db9a5359291cbbd27 -Author: Joe Ramsay -Date: Mon Sep 23 15:32:14 2024 +0100 - - AArch64: Improve codegen in users of AdvSIMD log1pf helper - - log1pf is quite register-intensive - use fewer registers for the - polynomial, and make various changes to shorten dependency chains in - parent routines. There is now no spilling with GCC 14. Accuracy moves - around a little - comments adjusted accordingly but does not require - regen-ulps. - - Use the helper in log1pf as well, instead of having separate - implementations. The more accurate polynomial means special-casing can - be simplified, and the shorter dependency chain avoids the usual dance - around v0, which is otherwise difficult. - - There is a small duplication of vectors containing 1.0f (or 0x3f800000) - - GCC is not currently able to efficiently handle values which fit in FMOV - but not MOVI, and are reinterpreted to integer. There may be potential - for more optimisation if this is fixed. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 5bc100bd4b7e00db3009ae93d25d303341545d23) - -diff --git a/sysdeps/aarch64/fpu/acoshf_advsimd.c b/sysdeps/aarch64/fpu/acoshf_advsimd.c -index 8916dcbf40..004474acf9 100644 ---- a/sysdeps/aarch64/fpu/acoshf_advsimd.c -+++ b/sysdeps/aarch64/fpu/acoshf_advsimd.c -@@ -25,35 +25,32 @@ const static struct data - { - struct v_log1pf_data log1pf_consts; - uint32x4_t one; -- uint16x4_t thresh; --} data = { -- .log1pf_consts = V_LOG1PF_CONSTANTS_TABLE, -- .one = V4 (0x3f800000), -- .thresh = V4 (0x2000) /* top(asuint(SquareLim) - asuint(1)). */ --}; -+} data = { .log1pf_consts = V_LOG1PF_CONSTANTS_TABLE, .one = V4 (0x3f800000) }; -+ -+#define Thresh vdup_n_u16 (0x2000) /* top(asuint(SquareLim) - asuint(1)). */ - - static float32x4_t NOINLINE VPCS_ATTR - special_case (float32x4_t x, float32x4_t y, uint16x4_t special, -- const struct v_log1pf_data d) -+ const struct v_log1pf_data *d) - { - return v_call_f32 (acoshf, x, log1pf_inline (y, d), vmovl_u16 (special)); - } - - /* Vector approximation for single-precision acosh, based on log1p. Maximum - error depends on WANT_SIMD_EXCEPT. With SIMD fp exceptions enabled, it -- is 2.78 ULP: -- __v_acoshf(0x1.07887p+0) got 0x1.ef9e9cp-3 -- want 0x1.ef9ea2p-3. -+ is 3.00 ULP: -+ _ZGVnN4v_acoshf(0x1.01df3ap+0) got 0x1.ef0a82p-4 -+ want 0x1.ef0a7cp-4. - With exceptions disabled, we can compute u with a shorter dependency chain, -- which gives maximum error of 3.07 ULP: -- __v_acoshf(0x1.01f83ep+0) got 0x1.fbc7fap-4 -- want 0x1.fbc7f4p-4. */ -+ which gives maximum error of 3.22 ULP: -+ _ZGVnN4v_acoshf(0x1.007ef2p+0) got 0x1.fdcdccp-5 -+ want 0x1.fdcdd2p-5. */ - - VPCS_ATTR float32x4_t NOINLINE V_NAME_F1 (acosh) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); - uint32x4_t ix = vreinterpretq_u32_f32 (x); -- uint16x4_t special = vcge_u16 (vsubhn_u32 (ix, d->one), d->thresh); -+ uint16x4_t special = vcge_u16 (vsubhn_u32 (ix, d->one), Thresh); - - #if WANT_SIMD_EXCEPT - /* Mask special lanes with 1 to side-step spurious invalid or overflow. Use -@@ -64,15 +61,16 @@ VPCS_ATTR float32x4_t NOINLINE V_NAME_F1 (acosh) (float32x4_t x) - float32x4_t xm1 = v_zerofy_f32 (vsubq_f32 (x, v_f32 (1)), p); - float32x4_t u = vfmaq_f32 (vaddq_f32 (xm1, xm1), xm1, xm1); - #else -- float32x4_t xm1 = vsubq_f32 (x, v_f32 (1)); -- float32x4_t u = vmulq_f32 (xm1, vaddq_f32 (x, v_f32 (1.0f))); -+ float32x4_t xm1 = vsubq_f32 (x, vreinterpretq_f32_u32 (d->one)); -+ float32x4_t u -+ = vmulq_f32 (xm1, vaddq_f32 (x, vreinterpretq_f32_u32 (d->one))); - #endif - - float32x4_t y = vaddq_f32 (xm1, vsqrtq_f32 (u)); - - if (__glibc_unlikely (v_any_u16h (special))) -- return special_case (x, y, special, d->log1pf_consts); -- return log1pf_inline (y, d->log1pf_consts); -+ return special_case (x, y, special, &d->log1pf_consts); -+ return log1pf_inline (y, &d->log1pf_consts); - } - libmvec_hidden_def (V_NAME_F1 (acosh)) - HALF_WIDTH_ALIAS_F1 (acosh) -diff --git a/sysdeps/aarch64/fpu/asinhf_advsimd.c b/sysdeps/aarch64/fpu/asinhf_advsimd.c -index 09fd8a6143..eb789b91b6 100644 ---- a/sysdeps/aarch64/fpu/asinhf_advsimd.c -+++ b/sysdeps/aarch64/fpu/asinhf_advsimd.c -@@ -20,16 +20,16 @@ - #include "v_math.h" - #include "v_log1pf_inline.h" - --#define SignMask v_u32 (0x80000000) -- - const static struct data - { - struct v_log1pf_data log1pf_consts; -+ float32x4_t one; - uint32x4_t big_bound; - #if WANT_SIMD_EXCEPT - uint32x4_t tiny_bound; - #endif - } data = { -+ .one = V4 (1), - .log1pf_consts = V_LOG1PF_CONSTANTS_TABLE, - .big_bound = V4 (0x5f800000), /* asuint(0x1p64). */ - #if WANT_SIMD_EXCEPT -@@ -38,20 +38,27 @@ const static struct data - }; - - static float32x4_t NOINLINE VPCS_ATTR --special_case (float32x4_t x, float32x4_t y, uint32x4_t special) -+special_case (float32x4_t x, uint32x4_t sign, float32x4_t y, -+ uint32x4_t special, const struct data *d) - { -- return v_call_f32 (asinhf, x, y, special); -+ return v_call_f32 ( -+ asinhf, x, -+ vreinterpretq_f32_u32 (veorq_u32 ( -+ sign, vreinterpretq_u32_f32 (log1pf_inline (y, &d->log1pf_consts)))), -+ special); - } - - /* Single-precision implementation of vector asinh(x), using vector log1p. -- Worst-case error is 2.66 ULP, at roughly +/-0.25: -- __v_asinhf(0x1.01b04p-2) got 0x1.fe163ep-3 want 0x1.fe1638p-3. */ -+ Worst-case error is 2.59 ULP: -+ _ZGVnN4v_asinhf(0x1.d86124p-3) got 0x1.d449bep-3 -+ want 0x1.d449c4p-3. */ - VPCS_ATTR float32x4_t NOINLINE V_NAME_F1 (asinh) (float32x4_t x) - { - const struct data *dat = ptr_barrier (&data); -- uint32x4_t iax = vbicq_u32 (vreinterpretq_u32_f32 (x), SignMask); -- float32x4_t ax = vreinterpretq_f32_u32 (iax); -+ float32x4_t ax = vabsq_f32 (x); -+ uint32x4_t iax = vreinterpretq_u32_f32 (ax); - uint32x4_t special = vcgeq_u32 (iax, dat->big_bound); -+ uint32x4_t sign = veorq_u32 (vreinterpretq_u32_f32 (x), iax); - float32x4_t special_arg = x; - - #if WANT_SIMD_EXCEPT -@@ -68,13 +75,13 @@ VPCS_ATTR float32x4_t NOINLINE V_NAME_F1 (asinh) (float32x4_t x) - /* asinh(x) = log(x + sqrt(x * x + 1)). - For positive x, asinh(x) = log1p(x + x * x / (1 + sqrt(x * x + 1))). */ - float32x4_t d -- = vaddq_f32 (v_f32 (1), vsqrtq_f32 (vfmaq_f32 (v_f32 (1), x, x))); -- float32x4_t y = log1pf_inline ( -- vaddq_f32 (ax, vdivq_f32 (vmulq_f32 (ax, ax), d)), dat->log1pf_consts); -+ = vaddq_f32 (v_f32 (1), vsqrtq_f32 (vfmaq_f32 (dat->one, ax, ax))); -+ float32x4_t y = vaddq_f32 (ax, vdivq_f32 (vmulq_f32 (ax, ax), d)); - - if (__glibc_unlikely (v_any_u32 (special))) -- return special_case (special_arg, vbslq_f32 (SignMask, x, y), special); -- return vbslq_f32 (SignMask, x, y); -+ return special_case (special_arg, sign, y, special, dat); -+ return vreinterpretq_f32_u32 (veorq_u32 ( -+ sign, vreinterpretq_u32_f32 (log1pf_inline (y, &dat->log1pf_consts)))); - } - libmvec_hidden_def (V_NAME_F1 (asinh)) - HALF_WIDTH_ALIAS_F1 (asinh) -diff --git a/sysdeps/aarch64/fpu/atanhf_advsimd.c b/sysdeps/aarch64/fpu/atanhf_advsimd.c -index ae488f7b54..818b6c92ad 100644 ---- a/sysdeps/aarch64/fpu/atanhf_advsimd.c -+++ b/sysdeps/aarch64/fpu/atanhf_advsimd.c -@@ -40,15 +40,17 @@ const static struct data - #define Half v_u32 (0x3f000000) - - static float32x4_t NOINLINE VPCS_ATTR --special_case (float32x4_t x, float32x4_t y, uint32x4_t special) -+special_case (float32x4_t x, float32x4_t halfsign, float32x4_t y, -+ uint32x4_t special) - { -- return v_call_f32 (atanhf, x, y, special); -+ return v_call_f32 (atanhf, vbslq_f32 (AbsMask, x, halfsign), -+ vmulq_f32 (halfsign, y), special); - } - - /* Approximation for vector single-precision atanh(x) using modified log1p. -- The maximum error is 3.08 ULP: -- __v_atanhf(0x1.ff215p-5) got 0x1.ffcb7cp-5 -- want 0x1.ffcb82p-5. */ -+ The maximum error is 2.93 ULP: -+ _ZGVnN4v_atanhf(0x1.f43d7p-5) got 0x1.f4dcfep-5 -+ want 0x1.f4dcf8p-5. */ - VPCS_ATTR float32x4_t NOINLINE V_NAME_F1 (atanh) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -@@ -68,11 +70,19 @@ VPCS_ATTR float32x4_t NOINLINE V_NAME_F1 (atanh) (float32x4_t x) - uint32x4_t special = vcgeq_u32 (iax, d->one); - #endif - -- float32x4_t y = vdivq_f32 (vaddq_f32 (ax, ax), vsubq_f32 (v_f32 (1), ax)); -- y = log1pf_inline (y, d->log1pf_consts); -+ float32x4_t y = vdivq_f32 (vaddq_f32 (ax, ax), -+ vsubq_f32 (vreinterpretq_f32_u32 (d->one), ax)); -+ y = log1pf_inline (y, &d->log1pf_consts); - -+ /* If exceptions not required, pass ax to special-case for shorter dependency -+ chain. If exceptions are required ax will have been zerofied, so have to -+ pass x. */ - if (__glibc_unlikely (v_any_u32 (special))) -- return special_case (x, vmulq_f32 (halfsign, y), special); -+#if WANT_SIMD_EXCEPT -+ return special_case (x, halfsign, y, special); -+#else -+ return special_case (ax, halfsign, y, special); -+#endif - return vmulq_f32 (halfsign, y); - } - libmvec_hidden_def (V_NAME_F1 (atanh)) -diff --git a/sysdeps/aarch64/fpu/log1pf_advsimd.c b/sysdeps/aarch64/fpu/log1pf_advsimd.c -index 8cfa28fb8a..00006fc703 100644 ---- a/sysdeps/aarch64/fpu/log1pf_advsimd.c -+++ b/sysdeps/aarch64/fpu/log1pf_advsimd.c -@@ -18,114 +18,79 @@ - . */ - - #include "v_math.h" --#include "poly_advsimd_f32.h" -+#include "v_log1pf_inline.h" -+ -+#if WANT_SIMD_EXCEPT - - const static struct data - { -- float32x4_t poly[8], ln2; -- uint32x4_t tiny_bound, minus_one, four, thresh; -- int32x4_t three_quarters; -+ uint32x4_t minus_one, thresh; -+ struct v_log1pf_data d; - } data = { -- .poly = { /* Generated using FPMinimax in [-0.25, 0.5]. First two coefficients -- (1, -0.5) are not stored as they can be generated more -- efficiently. */ -- V4 (0x1.5555aap-2f), V4 (-0x1.000038p-2f), V4 (0x1.99675cp-3f), -- V4 (-0x1.54ef78p-3f), V4 (0x1.28a1f4p-3f), V4 (-0x1.0da91p-3f), -- V4 (0x1.abcb6p-4f), V4 (-0x1.6f0d5ep-5f) }, -- .ln2 = V4 (0x1.62e43p-1f), -- .tiny_bound = V4 (0x34000000), /* asuint32(0x1p-23). ulp=0.5 at 0x1p-23. */ -- .thresh = V4 (0x4b800000), /* asuint32(INFINITY) - tiny_bound. */ -+ .d = V_LOG1PF_CONSTANTS_TABLE, -+ .thresh = V4 (0x4b800000), /* asuint32(INFINITY) - TinyBound. */ - .minus_one = V4 (0xbf800000), -- .four = V4 (0x40800000), -- .three_quarters = V4 (0x3f400000) - }; - --static inline float32x4_t --eval_poly (float32x4_t m, const float32x4_t *p) --{ -- /* Approximate log(1+m) on [-0.25, 0.5] using split Estrin scheme. */ -- float32x4_t p_12 = vfmaq_f32 (v_f32 (-0.5), m, p[0]); -- float32x4_t p_34 = vfmaq_f32 (p[1], m, p[2]); -- float32x4_t p_56 = vfmaq_f32 (p[3], m, p[4]); -- float32x4_t p_78 = vfmaq_f32 (p[5], m, p[6]); -- -- float32x4_t m2 = vmulq_f32 (m, m); -- float32x4_t p_02 = vfmaq_f32 (m, m2, p_12); -- float32x4_t p_36 = vfmaq_f32 (p_34, m2, p_56); -- float32x4_t p_79 = vfmaq_f32 (p_78, m2, p[7]); -- -- float32x4_t m4 = vmulq_f32 (m2, m2); -- float32x4_t p_06 = vfmaq_f32 (p_02, m4, p_36); -- return vfmaq_f32 (p_06, m4, vmulq_f32 (m4, p_79)); --} -+/* asuint32(0x1p-23). ulp=0.5 at 0x1p-23. */ -+# define TinyBound v_u32 (0x34000000) - - static float32x4_t NOINLINE VPCS_ATTR --special_case (float32x4_t x, float32x4_t y, uint32x4_t special) -+special_case (float32x4_t x, uint32x4_t cmp, const struct data *d) - { -- return v_call_f32 (log1pf, x, y, special); -+ /* Side-step special lanes so fenv exceptions are not triggered -+ inadvertently. */ -+ float32x4_t x_nospecial = v_zerofy_f32 (x, cmp); -+ return v_call_f32 (log1pf, x, log1pf_inline (x_nospecial, &d->d), cmp); - } - --/* Vector log1pf approximation using polynomial on reduced interval. Accuracy -- is roughly 2.02 ULP: -- log1pf(0x1.21e13ap-2) got 0x1.fe8028p-3 want 0x1.fe802cp-3. */ -+/* Vector log1pf approximation using polynomial on reduced interval. Worst-case -+ error is 1.69 ULP: -+ _ZGVnN4v_log1pf(0x1.04418ap-2) got 0x1.cfcbd8p-3 -+ want 0x1.cfcbdcp-3. */ - VPCS_ATTR float32x4_t V_NAME_F1 (log1p) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- - uint32x4_t ix = vreinterpretq_u32_f32 (x); - uint32x4_t ia = vreinterpretq_u32_f32 (vabsq_f32 (x)); -+ - uint32x4_t special_cases -- = vorrq_u32 (vcgeq_u32 (vsubq_u32 (ia, d->tiny_bound), d->thresh), -+ = vorrq_u32 (vcgeq_u32 (vsubq_u32 (ia, TinyBound), d->thresh), - vcgeq_u32 (ix, d->minus_one)); -- float32x4_t special_arg = x; - --#if WANT_SIMD_EXCEPT - if (__glibc_unlikely (v_any_u32 (special_cases))) -- /* Side-step special lanes so fenv exceptions are not triggered -- inadvertently. */ -- x = v_zerofy_f32 (x, special_cases); --#endif -+ return special_case (x, special_cases, d); - -- /* With x + 1 = t * 2^k (where t = m + 1 and k is chosen such that m -- is in [-0.25, 0.5]): -- log1p(x) = log(t) + log(2^k) = log1p(m) + k*log(2). -- -- We approximate log1p(m) with a polynomial, then scale by -- k*log(2). Instead of doing this directly, we use an intermediate -- scale factor s = 4*k*log(2) to ensure the scale is representable -- as a normalised fp32 number. */ -+ return log1pf_inline (x, &d->d); -+} - -- float32x4_t m = vaddq_f32 (x, v_f32 (1.0f)); -+#else - -- /* Choose k to scale x to the range [-1/4, 1/2]. */ -- int32x4_t k -- = vandq_s32 (vsubq_s32 (vreinterpretq_s32_f32 (m), d->three_quarters), -- v_s32 (0xff800000)); -- uint32x4_t ku = vreinterpretq_u32_s32 (k); -+const static struct v_log1pf_data data = V_LOG1PF_CONSTANTS_TABLE; - -- /* Scale x by exponent manipulation. */ -- float32x4_t m_scale -- = vreinterpretq_f32_u32 (vsubq_u32 (vreinterpretq_u32_f32 (x), ku)); -+static float32x4_t NOINLINE VPCS_ATTR -+special_case (float32x4_t x, uint32x4_t cmp) -+{ -+ return v_call_f32 (log1pf, x, log1pf_inline (x, ptr_barrier (&data)), cmp); -+} - -- /* Scale up to ensure that the scale factor is representable as normalised -- fp32 number, and scale m down accordingly. */ -- float32x4_t s = vreinterpretq_f32_u32 (vsubq_u32 (d->four, ku)); -- m_scale = vaddq_f32 (m_scale, vfmaq_f32 (v_f32 (-1.0f), v_f32 (0.25f), s)); -+/* Vector log1pf approximation using polynomial on reduced interval. Worst-case -+ error is 1.63 ULP: -+ _ZGVnN4v_log1pf(0x1.216d12p-2) got 0x1.fdcb12p-3 -+ want 0x1.fdcb16p-3. */ -+VPCS_ATTR float32x4_t V_NAME_F1 (log1p) (float32x4_t x) -+{ -+ uint32x4_t special_cases = vornq_u32 (vcleq_f32 (x, v_f32 (-1)), -+ vcaleq_f32 (x, v_f32 (0x1p127f))); - -- /* Evaluate polynomial on the reduced interval. */ -- float32x4_t p = eval_poly (m_scale, d->poly); -+ if (__glibc_unlikely (v_any_u32 (special_cases))) -+ return special_case (x, special_cases); - -- /* The scale factor to be applied back at the end - by multiplying float(k) -- by 2^-23 we get the unbiased exponent of k. */ -- float32x4_t scale_back = vcvtq_f32_s32 (vshrq_n_s32 (k, 23)); -+ return log1pf_inline (x, ptr_barrier (&data)); -+} - -- /* Apply the scaling back. */ -- float32x4_t y = vfmaq_f32 (p, scale_back, d->ln2); -+#endif - -- if (__glibc_unlikely (v_any_u32 (special_cases))) -- return special_case (special_arg, y, special_cases); -- return y; --} - libmvec_hidden_def (V_NAME_F1 (log1p)) - HALF_WIDTH_ALIAS_F1 (log1p) - strong_alias (V_NAME_F1 (log1p), V_NAME_F1 (logp1)) -diff --git a/sysdeps/aarch64/fpu/v_log1pf_inline.h b/sysdeps/aarch64/fpu/v_log1pf_inline.h -index 643a6cdcfc..73e45a942e 100644 ---- a/sysdeps/aarch64/fpu/v_log1pf_inline.h -+++ b/sysdeps/aarch64/fpu/v_log1pf_inline.h -@@ -25,54 +25,81 @@ - - struct v_log1pf_data - { -- float32x4_t poly[8], ln2; - uint32x4_t four; - int32x4_t three_quarters; -+ float c0, c3, c5, c7; -+ float32x4_t c4, c6, c1, c2, ln2; - }; - - /* Polynomial generated using FPMinimax in [-0.25, 0.5]. First two coefficients - (1, -0.5) are not stored as they can be generated more efficiently. */ - #define V_LOG1PF_CONSTANTS_TABLE \ - { \ -- .poly \ -- = { V4 (0x1.5555aap-2f), V4 (-0x1.000038p-2f), V4 (0x1.99675cp-3f), \ -- V4 (-0x1.54ef78p-3f), V4 (0x1.28a1f4p-3f), V4 (-0x1.0da91p-3f), \ -- V4 (0x1.abcb6p-4f), V4 (-0x1.6f0d5ep-5f) }, \ -- .ln2 = V4 (0x1.62e43p-1f), .four = V4 (0x40800000), \ -- .three_quarters = V4 (0x3f400000) \ -+ .c0 = 0x1.5555aap-2f, .c1 = V4 (-0x1.000038p-2f), \ -+ .c2 = V4 (0x1.99675cp-3f), .c3 = -0x1.54ef78p-3f, \ -+ .c4 = V4 (0x1.28a1f4p-3f), .c5 = -0x1.0da91p-3f, \ -+ .c6 = V4 (0x1.abcb6p-4f), .c7 = -0x1.6f0d5ep-5f, \ -+ .ln2 = V4 (0x1.62e43p-1f), .four = V4 (0x40800000), \ -+ .three_quarters = V4 (0x3f400000) \ - } - - static inline float32x4_t --eval_poly (float32x4_t m, const float32x4_t *c) -+eval_poly (float32x4_t m, const struct v_log1pf_data *d) - { -- /* Approximate log(1+m) on [-0.25, 0.5] using pairwise Horner (main routine -- uses split Estrin, but this way reduces register pressure in the calling -- routine). */ -- float32x4_t q = vfmaq_f32 (v_f32 (-0.5), m, c[0]); -+ /* Approximate log(1+m) on [-0.25, 0.5] using pairwise Horner. */ -+ float32x4_t c0357 = vld1q_f32 (&d->c0); -+ float32x4_t q = vfmaq_laneq_f32 (v_f32 (-0.5), m, c0357, 0); - float32x4_t m2 = vmulq_f32 (m, m); -- q = vfmaq_f32 (m, m2, q); -- float32x4_t p = v_pw_horner_6_f32 (m, m2, c + 1); -+ float32x4_t p67 = vfmaq_laneq_f32 (d->c6, m, c0357, 3); -+ float32x4_t p45 = vfmaq_laneq_f32 (d->c4, m, c0357, 2); -+ float32x4_t p23 = vfmaq_laneq_f32 (d->c2, m, c0357, 1); -+ float32x4_t p = vfmaq_f32 (p45, m2, p67); -+ p = vfmaq_f32 (p23, m2, p); -+ p = vfmaq_f32 (d->c1, m, p); - p = vmulq_f32 (m2, p); -- return vfmaq_f32 (q, m2, p); -+ p = vfmaq_f32 (m, m2, p); -+ return vfmaq_f32 (p, m2, q); - } - - static inline float32x4_t --log1pf_inline (float32x4_t x, const struct v_log1pf_data d) -+log1pf_inline (float32x4_t x, const struct v_log1pf_data *d) - { -- /* Helper for calculating log(x + 1). Copied from log1pf_2u1.c, with no -- special-case handling. See that file for details of the algorithm. */ -+ /* Helper for calculating log(x + 1). */ -+ -+ /* With x + 1 = t * 2^k (where t = m + 1 and k is chosen such that m -+ is in [-0.25, 0.5]): -+ log1p(x) = log(t) + log(2^k) = log1p(m) + k*log(2). -+ -+ We approximate log1p(m) with a polynomial, then scale by -+ k*log(2). Instead of doing this directly, we use an intermediate -+ scale factor s = 4*k*log(2) to ensure the scale is representable -+ as a normalised fp32 number. */ - float32x4_t m = vaddq_f32 (x, v_f32 (1.0f)); -+ -+ /* Choose k to scale x to the range [-1/4, 1/2]. */ - int32x4_t k -- = vandq_s32 (vsubq_s32 (vreinterpretq_s32_f32 (m), d.three_quarters), -+ = vandq_s32 (vsubq_s32 (vreinterpretq_s32_f32 (m), d->three_quarters), - v_s32 (0xff800000)); - uint32x4_t ku = vreinterpretq_u32_s32 (k); -- float32x4_t s = vreinterpretq_f32_u32 (vsubq_u32 (d.four, ku)); -+ -+ /* Scale up to ensure that the scale factor is representable as normalised -+ fp32 number, and scale m down accordingly. */ -+ float32x4_t s = vreinterpretq_f32_u32 (vsubq_u32 (d->four, ku)); -+ -+ /* Scale x by exponent manipulation. */ - float32x4_t m_scale - = vreinterpretq_f32_u32 (vsubq_u32 (vreinterpretq_u32_f32 (x), ku)); - m_scale = vaddq_f32 (m_scale, vfmaq_f32 (v_f32 (-1.0f), v_f32 (0.25f), s)); -- float32x4_t p = eval_poly (m_scale, d.poly); -+ -+ /* Evaluate polynomial on the reduced interval. */ -+ float32x4_t p = eval_poly (m_scale, d); -+ -+ /* The scale factor to be applied back at the end - by multiplying float(k) -+ by 2^-23 we get the unbiased exponent of k. */ - float32x4_t scale_back = vmulq_f32 (vcvtq_f32_s32 (k), v_f32 (0x1.0p-23f)); -- return vfmaq_f32 (p, scale_back, d.ln2); -+ -+ /* Apply the scaling back. */ -+ return vfmaq_f32 (p, scale_back, d->ln2); - } - - #endif - -commit a947a43b95bbea53ec50df058b42392fd5ea52b6 -Author: Joe Ramsay -Date: Mon Sep 23 15:32:53 2024 +0100 - - AArch64: Improve codegen in users of ADVSIMD expm1f helper - - Rearrange operations so MOV is not necessary in reduction or around - the special-case handler. Reduce memory access by using more indexed - MLAs in polynomial. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 7900ac490db32f6bccff812733f00280dde34e27) - -diff --git a/sysdeps/aarch64/fpu/expm1f_advsimd.c b/sysdeps/aarch64/fpu/expm1f_advsimd.c -index a0616ec754..8303ca296e 100644 ---- a/sysdeps/aarch64/fpu/expm1f_advsimd.c -+++ b/sysdeps/aarch64/fpu/expm1f_advsimd.c -@@ -18,27 +18,18 @@ - . */ - - #include "v_math.h" --#include "poly_advsimd_f32.h" -+#include "v_expm1f_inline.h" - - static const struct data - { -- float32x4_t poly[5]; -- float invln2_and_ln2[4]; -- float32x4_t shift; -- int32x4_t exponent_bias; -+ struct v_expm1f_data d; - #if WANT_SIMD_EXCEPT - uint32x4_t thresh; - #else - float32x4_t oflow_bound; - #endif - } data = { -- /* Generated using fpminimax with degree=5 in [-log(2)/2, log(2)/2]. */ -- .poly = { V4 (0x1.fffffep-2), V4 (0x1.5554aep-3), V4 (0x1.555736p-5), -- V4 (0x1.12287cp-7), V4 (0x1.6b55a2p-10) }, -- /* Stores constants: invln2, ln2_hi, ln2_lo, 0. */ -- .invln2_and_ln2 = { 0x1.715476p+0f, 0x1.62e4p-1f, 0x1.7f7d1cp-20f, 0 }, -- .shift = V4 (0x1.8p23f), -- .exponent_bias = V4 (0x3f800000), -+ .d = V_EXPM1F_DATA, - #if !WANT_SIMD_EXCEPT - /* Value above which expm1f(x) should overflow. Absolute value of the - underflow bound is greater than this, so it catches both cases - there is -@@ -55,67 +46,38 @@ static const struct data - #define TinyBound v_u32 (0x34000000 << 1) - - static float32x4_t VPCS_ATTR NOINLINE --special_case (float32x4_t x, float32x4_t y, uint32x4_t special) -+special_case (float32x4_t x, uint32x4_t special, const struct data *d) - { -- return v_call_f32 (expm1f, x, y, special); -+ return v_call_f32 ( -+ expm1f, x, expm1f_inline (v_zerofy_f32 (x, special), &d->d), special); - } - - /* Single-precision vector exp(x) - 1 function. -- The maximum error is 1.51 ULP: -- _ZGVnN4v_expm1f (0x1.8baa96p-2) got 0x1.e2fb9p-2 -- want 0x1.e2fb94p-2. */ -+ The maximum error is 1.62 ULP: -+ _ZGVnN4v_expm1f(0x1.85f83p-2) got 0x1.da9f4p-2 -+ want 0x1.da9f44p-2. */ - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (expm1) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- uint32x4_t ix = vreinterpretq_u32_f32 (x); - - #if WANT_SIMD_EXCEPT -+ uint32x4_t ix = vreinterpretq_u32_f32 (x); - /* If fp exceptions are to be triggered correctly, fall back to scalar for - |x| < 2^-23, |x| > oflow_bound, Inf & NaN. Add ix to itself for - shift-left by 1, and compare with thresh which was left-shifted offline - - this is effectively an absolute compare. */ - uint32x4_t special - = vcgeq_u32 (vsubq_u32 (vaddq_u32 (ix, ix), TinyBound), d->thresh); -- if (__glibc_unlikely (v_any_u32 (special))) -- x = v_zerofy_f32 (x, special); - #else - /* Handles very large values (+ve and -ve), +/-NaN, +/-Inf. */ - uint32x4_t special = vcagtq_f32 (x, d->oflow_bound); - #endif - -- /* Reduce argument to smaller range: -- Let i = round(x / ln2) -- and f = x - i * ln2, then f is in [-ln2/2, ln2/2]. -- exp(x) - 1 = 2^i * (expm1(f) + 1) - 1 -- where 2^i is exact because i is an integer. */ -- float32x4_t invln2_and_ln2 = vld1q_f32 (d->invln2_and_ln2); -- float32x4_t j -- = vsubq_f32 (vfmaq_laneq_f32 (d->shift, x, invln2_and_ln2, 0), d->shift); -- int32x4_t i = vcvtq_s32_f32 (j); -- float32x4_t f = vfmsq_laneq_f32 (x, j, invln2_and_ln2, 1); -- f = vfmsq_laneq_f32 (f, j, invln2_and_ln2, 2); -- -- /* Approximate expm1(f) using polynomial. -- Taylor expansion for expm1(x) has the form: -- x + ax^2 + bx^3 + cx^4 .... -- So we calculate the polynomial P(f) = a + bf + cf^2 + ... -- and assemble the approximation expm1(f) ~= f + f^2 * P(f). */ -- float32x4_t p = v_horner_4_f32 (f, d->poly); -- p = vfmaq_f32 (f, vmulq_f32 (f, f), p); -- -- /* Assemble the result. -- expm1(x) ~= 2^i * (p + 1) - 1 -- Let t = 2^i. */ -- int32x4_t u = vaddq_s32 (vshlq_n_s32 (i, 23), d->exponent_bias); -- float32x4_t t = vreinterpretq_f32_s32 (u); -- - if (__glibc_unlikely (v_any_u32 (special))) -- return special_case (vreinterpretq_f32_u32 (ix), -- vfmaq_f32 (vsubq_f32 (t, v_f32 (1.0f)), p, t), -- special); -+ return special_case (x, special, d); - - /* expm1(x) ~= p * t + (t - 1). */ -- return vfmaq_f32 (vsubq_f32 (t, v_f32 (1.0f)), p, t); -+ return expm1f_inline (x, &d->d); - } - libmvec_hidden_def (V_NAME_F1 (expm1)) - HALF_WIDTH_ALIAS_F1 (expm1) -diff --git a/sysdeps/aarch64/fpu/sinhf_advsimd.c b/sysdeps/aarch64/fpu/sinhf_advsimd.c -index 6bb7482dc2..c6ed7598e7 100644 ---- a/sysdeps/aarch64/fpu/sinhf_advsimd.c -+++ b/sysdeps/aarch64/fpu/sinhf_advsimd.c -@@ -23,15 +23,13 @@ - static const struct data - { - struct v_expm1f_data expm1f_consts; -- uint32x4_t halff; - #if WANT_SIMD_EXCEPT - uint32x4_t tiny_bound, thresh; - #else -- uint32x4_t oflow_bound; -+ float32x4_t oflow_bound; - #endif - } data = { - .expm1f_consts = V_EXPM1F_DATA, -- .halff = V4 (0x3f000000), - #if WANT_SIMD_EXCEPT - /* 0x1.6a09e8p-32, below which expm1f underflows. */ - .tiny_bound = V4 (0x2fb504f4), -@@ -39,14 +37,15 @@ static const struct data - .thresh = V4 (0x12fbbbb3), - #else - /* 0x1.61814ep+6, above which expm1f helper overflows. */ -- .oflow_bound = V4 (0x42b0c0a7), -+ .oflow_bound = V4 (0x1.61814ep+6), - #endif - }; - - static float32x4_t NOINLINE VPCS_ATTR --special_case (float32x4_t x, float32x4_t y, uint32x4_t special) -+special_case (float32x4_t x, float32x4_t t, float32x4_t halfsign, -+ uint32x4_t special) - { -- return v_call_f32 (sinhf, x, y, special); -+ return v_call_f32 (sinhf, x, vmulq_f32 (t, halfsign), special); - } - - /* Approximation for vector single-precision sinh(x) using expm1. -@@ -60,15 +59,15 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (sinh) (float32x4_t x) - - uint32x4_t ix = vreinterpretq_u32_f32 (x); - float32x4_t ax = vabsq_f32 (x); -- uint32x4_t iax = vreinterpretq_u32_f32 (ax); -- uint32x4_t sign = veorq_u32 (ix, iax); -- float32x4_t halfsign = vreinterpretq_f32_u32 (vorrq_u32 (sign, d->halff)); -+ float32x4_t halfsign = vreinterpretq_f32_u32 ( -+ vbslq_u32 (v_u32 (0x80000000), ix, vreinterpretq_u32_f32 (v_f32 (0.5)))); - - #if WANT_SIMD_EXCEPT -- uint32x4_t special = vcgeq_u32 (vsubq_u32 (iax, d->tiny_bound), d->thresh); -+ uint32x4_t special = vcgeq_u32 ( -+ vsubq_u32 (vreinterpretq_u32_f32 (ax), d->tiny_bound), d->thresh); - ax = v_zerofy_f32 (ax, special); - #else -- uint32x4_t special = vcgeq_u32 (iax, d->oflow_bound); -+ uint32x4_t special = vcageq_f32 (x, d->oflow_bound); - #endif - - /* Up to the point that expm1f overflows, we can use it to calculate sinhf -@@ -80,7 +79,7 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (sinh) (float32x4_t x) - /* Fall back to the scalar variant for any lanes that should trigger an - exception. */ - if (__glibc_unlikely (v_any_u32 (special))) -- return special_case (x, vmulq_f32 (t, halfsign), special); -+ return special_case (x, t, halfsign, special); - - return vmulq_f32 (t, halfsign); - } -diff --git a/sysdeps/aarch64/fpu/tanhf_advsimd.c b/sysdeps/aarch64/fpu/tanhf_advsimd.c -index 50defd6ef0..3ced9b7a41 100644 ---- a/sysdeps/aarch64/fpu/tanhf_advsimd.c -+++ b/sysdeps/aarch64/fpu/tanhf_advsimd.c -@@ -28,13 +28,16 @@ static const struct data - /* 0x1.205966p+3, above which tanhf rounds to 1 (or -1 for negative). */ - .boring_bound = V4 (0x41102cb3), - .large_bound = V4 (0x7f800000), -- .onef = V4 (0x3f800000), - }; - - static float32x4_t NOINLINE VPCS_ATTR --special_case (float32x4_t x, float32x4_t y, uint32x4_t special) -+special_case (float32x4_t x, uint32x4_t is_boring, float32x4_t boring, -+ float32x4_t q, uint32x4_t special) - { -- return v_call_f32 (tanhf, x, y, special); -+ return v_call_f32 ( -+ tanhf, x, -+ vbslq_f32 (is_boring, boring, vdivq_f32 (q, vaddq_f32 (q, v_f32 (2.0)))), -+ special); - } - - /* Approximation for single-precision vector tanh(x), using a simplified -@@ -50,7 +53,9 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (tanh) (float32x4_t x) - uint32x4_t iax = vreinterpretq_u32_f32 (ax); - uint32x4_t sign = veorq_u32 (ix, iax); - uint32x4_t is_boring = vcgtq_u32 (iax, d->boring_bound); -- float32x4_t boring = vreinterpretq_f32_u32 (vorrq_u32 (sign, d->onef)); -+ /* expm1 exponent bias is 1.0f reinterpreted to int. */ -+ float32x4_t boring = vreinterpretq_f32_u32 (vorrq_u32 ( -+ sign, vreinterpretq_u32_s32 (d->expm1f_consts.exponent_bias))); - - #if WANT_SIMD_EXCEPT - /* If fp exceptions are to be triggered properly, set all special and boring -@@ -66,10 +71,12 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (tanh) (float32x4_t x) - - /* tanh(x) = (e^2x - 1) / (e^2x + 1). */ - float32x4_t q = expm1f_inline (vmulq_n_f32 (x, 2), &d->expm1f_consts); -- float32x4_t y = vdivq_f32 (q, vaddq_f32 (q, v_f32 (2.0))); -+ - if (__glibc_unlikely (v_any_u32 (special))) -- return special_case (vreinterpretq_f32_u32 (ix), -- vbslq_f32 (is_boring, boring, y), special); -+ return special_case (vreinterpretq_f32_u32 (ix), is_boring, boring, q, -+ special); -+ -+ float32x4_t y = vdivq_f32 (q, vaddq_f32 (q, v_f32 (2.0))); - return vbslq_f32 (is_boring, boring, y); - } - libmvec_hidden_def (V_NAME_F1 (tanh)) -diff --git a/sysdeps/aarch64/fpu/v_expm1f_inline.h b/sysdeps/aarch64/fpu/v_expm1f_inline.h -index 59b552da6b..1daedfdd51 100644 ---- a/sysdeps/aarch64/fpu/v_expm1f_inline.h -+++ b/sysdeps/aarch64/fpu/v_expm1f_inline.h -@@ -21,48 +21,47 @@ - #define AARCH64_FPU_V_EXPM1F_INLINE_H - - #include "v_math.h" --#include "poly_advsimd_f32.h" -+#include "math_config.h" - - struct v_expm1f_data - { -- float32x4_t poly[5]; -- float invln2_and_ln2[4]; -- float32x4_t shift; -+ float32x4_t c0, c2; - int32x4_t exponent_bias; -+ float c1, c3, inv_ln2, c4; -+ float ln2_hi, ln2_lo; - }; - - /* Coefficients generated using fpminimax with degree=5 in [-log(2)/2, -- log(2)/2]. Exponent bias is asuint(1.0f). -- invln2_and_ln2 Stores constants: invln2, ln2_lo, ln2_hi, 0. */ -+ log(2)/2]. Exponent bias is asuint(1.0f). */ - #define V_EXPM1F_DATA \ - { \ -- .poly = { V4 (0x1.fffffep-2), V4 (0x1.5554aep-3), V4 (0x1.555736p-5), \ -- V4 (0x1.12287cp-7), V4 (0x1.6b55a2p-10) }, \ -- .shift = V4 (0x1.8p23f), .exponent_bias = V4 (0x3f800000), \ -- .invln2_and_ln2 = { 0x1.715476p+0f, 0x1.62e4p-1f, 0x1.7f7d1cp-20f, 0 }, \ -+ .c0 = V4 (0x1.fffffep-2), .c1 = 0x1.5554aep-3, .c2 = V4 (0x1.555736p-5), \ -+ .c3 = 0x1.12287cp-7, .c4 = 0x1.6b55a2p-10, \ -+ .exponent_bias = V4 (0x3f800000), .inv_ln2 = 0x1.715476p+0f, \ -+ .ln2_hi = 0x1.62e4p-1f, .ln2_lo = 0x1.7f7d1cp-20f, \ - } - - static inline float32x4_t - expm1f_inline (float32x4_t x, const struct v_expm1f_data *d) - { -- /* Helper routine for calculating exp(x) - 1. -- Copied from v_expm1f_1u6.c, with all special-case handling removed - the -- calling routine should handle special values if required. */ -+ /* Helper routine for calculating exp(x) - 1. */ -+ -+ float32x2_t ln2 = vld1_f32 (&d->ln2_hi); -+ float32x4_t lane_consts = vld1q_f32 (&d->c1); - - /* Reduce argument: f in [-ln2/2, ln2/2], i is exact. */ -- float32x4_t invln2_and_ln2 = vld1q_f32 (d->invln2_and_ln2); -- float32x4_t j -- = vsubq_f32 (vfmaq_laneq_f32 (d->shift, x, invln2_and_ln2, 0), d->shift); -+ float32x4_t j = vrndaq_f32 (vmulq_laneq_f32 (x, lane_consts, 2)); - int32x4_t i = vcvtq_s32_f32 (j); -- float32x4_t f = vfmsq_laneq_f32 (x, j, invln2_and_ln2, 1); -- f = vfmsq_laneq_f32 (f, j, invln2_and_ln2, 2); -+ float32x4_t f = vfmsq_lane_f32 (x, j, ln2, 0); -+ f = vfmsq_lane_f32 (f, j, ln2, 1); - -- /* Approximate expm1(f) with polynomial P, expm1(f) ~= f + f^2 * P(f). -- Uses Estrin scheme, where the main _ZGVnN4v_expm1f routine uses -- Horner. */ -+ /* Approximate expm1(f) with polynomial P, expm1(f) ~= f + f^2 * P(f). */ - float32x4_t f2 = vmulq_f32 (f, f); - float32x4_t f4 = vmulq_f32 (f2, f2); -- float32x4_t p = v_estrin_4_f32 (f, f2, f4, d->poly); -+ float32x4_t p01 = vfmaq_laneq_f32 (d->c0, f, lane_consts, 0); -+ float32x4_t p23 = vfmaq_laneq_f32 (d->c2, f, lane_consts, 1); -+ float32x4_t p = vfmaq_f32 (p01, f2, p23); -+ p = vfmaq_laneq_f32 (p, f4, lane_consts, 3); - p = vfmaq_f32 (f, f2, p); - - /* t = 2^i. */ - -commit 68f2eb20de698675ddc74068c2cd03fee29207df -Author: Joe Ramsay -Date: Mon Sep 23 15:33:31 2024 +0100 - - AArch64: Simplify rounding-multiply pattern in several AdvSIMD routines - - This operation can be simplified to use simpler multiply-round-convert - sequence, which uses fewer instructions and constants. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 16a59571e4e9fd019d3fc23a2e7d73c1df8bb5cb) - -diff --git a/sysdeps/aarch64/fpu/cos_advsimd.c b/sysdeps/aarch64/fpu/cos_advsimd.c -index 3924c9ce44..11a89b1530 100644 ---- a/sysdeps/aarch64/fpu/cos_advsimd.c -+++ b/sysdeps/aarch64/fpu/cos_advsimd.c -@@ -22,7 +22,7 @@ - static const struct data - { - float64x2_t poly[7]; -- float64x2_t range_val, shift, inv_pi, half_pi, pi_1, pi_2, pi_3; -+ float64x2_t range_val, inv_pi, pi_1, pi_2, pi_3; - } data = { - /* Worst-case error is 3.3 ulp in [-pi/2, pi/2]. */ - .poly = { V2 (-0x1.555555555547bp-3), V2 (0x1.1111111108a4dp-7), -@@ -30,11 +30,9 @@ static const struct data - V2 (-0x1.ae633919987c6p-26), V2 (0x1.60e277ae07cecp-33), - V2 (-0x1.9e9540300a1p-41) }, - .inv_pi = V2 (0x1.45f306dc9c883p-2), -- .half_pi = V2 (0x1.921fb54442d18p+0), - .pi_1 = V2 (0x1.921fb54442d18p+1), - .pi_2 = V2 (0x1.1a62633145c06p-53), - .pi_3 = V2 (0x1.c1cd129024e09p-106), -- .shift = V2 (0x1.8p52), - .range_val = V2 (0x1p23) - }; - -@@ -68,10 +66,9 @@ float64x2_t VPCS_ATTR V_NAME_D1 (cos) (float64x2_t x) - #endif - - /* n = rint((|x|+pi/2)/pi) - 0.5. */ -- n = vfmaq_f64 (d->shift, d->inv_pi, vaddq_f64 (r, d->half_pi)); -- odd = vshlq_n_u64 (vreinterpretq_u64_f64 (n), 63); -- n = vsubq_f64 (n, d->shift); -- n = vsubq_f64 (n, v_f64 (0.5)); -+ n = vrndaq_f64 (vfmaq_f64 (v_f64 (0.5), r, d->inv_pi)); -+ odd = vshlq_n_u64 (vreinterpretq_u64_s64 (vcvtq_s64_f64 (n)), 63); -+ n = vsubq_f64 (n, v_f64 (0.5f)); - - /* r = |x| - n*pi (range reduction into -pi/2 .. pi/2). */ - r = vfmsq_f64 (r, d->pi_1, n); -diff --git a/sysdeps/aarch64/fpu/cosf_advsimd.c b/sysdeps/aarch64/fpu/cosf_advsimd.c -index d0c285b03a..85a1b37373 100644 ---- a/sysdeps/aarch64/fpu/cosf_advsimd.c -+++ b/sysdeps/aarch64/fpu/cosf_advsimd.c -@@ -22,7 +22,7 @@ - static const struct data - { - float32x4_t poly[4]; -- float32x4_t range_val, inv_pi, half_pi, shift, pi_1, pi_2, pi_3; -+ float32x4_t range_val, inv_pi, pi_1, pi_2, pi_3; - } data = { - /* 1.886 ulp error. */ - .poly = { V4 (-0x1.555548p-3f), V4 (0x1.110df4p-7f), V4 (-0x1.9f42eap-13f), -@@ -33,8 +33,6 @@ static const struct data - .pi_3 = V4 (-0x1.ee59dap-49f), - - .inv_pi = V4 (0x1.45f306p-2f), -- .shift = V4 (0x1.8p+23f), -- .half_pi = V4 (0x1.921fb6p0f), - .range_val = V4 (0x1p20f) - }; - -@@ -69,9 +67,8 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (cos) (float32x4_t x) - #endif - - /* n = rint((|x|+pi/2)/pi) - 0.5. */ -- n = vfmaq_f32 (d->shift, d->inv_pi, vaddq_f32 (r, d->half_pi)); -- odd = vshlq_n_u32 (vreinterpretq_u32_f32 (n), 31); -- n = vsubq_f32 (n, d->shift); -+ n = vrndaq_f32 (vfmaq_f32 (v_f32 (0.5), r, d->inv_pi)); -+ odd = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtq_s32_f32 (n)), 31); - n = vsubq_f32 (n, v_f32 (0.5f)); - - /* r = |x| - n*pi (range reduction into -pi/2 .. pi/2). */ -diff --git a/sysdeps/aarch64/fpu/expf_advsimd.c b/sysdeps/aarch64/fpu/expf_advsimd.c -index 99d2e647aa..5c9cb72620 100644 ---- a/sysdeps/aarch64/fpu/expf_advsimd.c -+++ b/sysdeps/aarch64/fpu/expf_advsimd.c -@@ -22,7 +22,7 @@ - static const struct data - { - float32x4_t poly[5]; -- float32x4_t shift, inv_ln2, ln2_hi, ln2_lo; -+ float32x4_t inv_ln2, ln2_hi, ln2_lo; - uint32x4_t exponent_bias; - #if !WANT_SIMD_EXCEPT - float32x4_t special_bound, scale_thresh; -@@ -31,7 +31,6 @@ static const struct data - /* maxerr: 1.45358 +0.5 ulp. */ - .poly = { V4 (0x1.0e4020p-7f), V4 (0x1.573e2ep-5f), V4 (0x1.555e66p-3f), - V4 (0x1.fffdb6p-2f), V4 (0x1.ffffecp-1f) }, -- .shift = V4 (0x1.8p23f), - .inv_ln2 = V4 (0x1.715476p+0f), - .ln2_hi = V4 (0x1.62e4p-1f), - .ln2_lo = V4 (0x1.7f7d1cp-20f), -@@ -85,7 +84,7 @@ special_case (float32x4_t poly, float32x4_t n, uint32x4_t e, uint32x4_t cmp1, - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (exp) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- float32x4_t n, r, r2, scale, p, q, poly, z; -+ float32x4_t n, r, r2, scale, p, q, poly; - uint32x4_t cmp, e; - - #if WANT_SIMD_EXCEPT -@@ -104,11 +103,10 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (exp) (float32x4_t x) - - /* exp(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] - x = ln2*n + r, with r in [-ln2/2, ln2/2]. */ -- z = vfmaq_f32 (d->shift, x, d->inv_ln2); -- n = vsubq_f32 (z, d->shift); -+ n = vrndaq_f32 (vmulq_f32 (x, d->inv_ln2)); - r = vfmsq_f32 (x, n, d->ln2_hi); - r = vfmsq_f32 (r, n, d->ln2_lo); -- e = vshlq_n_u32 (vreinterpretq_u32_f32 (z), 23); -+ e = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtq_s32_f32 (n)), 23); - scale = vreinterpretq_f32_u32 (vaddq_u32 (e, d->exponent_bias)); - - #if !WANT_SIMD_EXCEPT -diff --git a/sysdeps/aarch64/fpu/sin_advsimd.c b/sysdeps/aarch64/fpu/sin_advsimd.c -index a0d9d3b819..718125cbad 100644 ---- a/sysdeps/aarch64/fpu/sin_advsimd.c -+++ b/sysdeps/aarch64/fpu/sin_advsimd.c -@@ -22,7 +22,7 @@ - static const struct data - { - float64x2_t poly[7]; -- float64x2_t range_val, inv_pi, shift, pi_1, pi_2, pi_3; -+ float64x2_t range_val, inv_pi, pi_1, pi_2, pi_3; - } data = { - .poly = { V2 (-0x1.555555555547bp-3), V2 (0x1.1111111108a4dp-7), - V2 (-0x1.a01a019936f27p-13), V2 (0x1.71de37a97d93ep-19), -@@ -34,12 +34,13 @@ static const struct data - .pi_1 = V2 (0x1.921fb54442d18p+1), - .pi_2 = V2 (0x1.1a62633145c06p-53), - .pi_3 = V2 (0x1.c1cd129024e09p-106), -- .shift = V2 (0x1.8p52), - }; - - #if WANT_SIMD_EXCEPT --# define TinyBound v_u64 (0x3000000000000000) /* asuint64 (0x1p-255). */ --# define Thresh v_u64 (0x1160000000000000) /* RangeVal - TinyBound. */ -+/* asuint64(0x1p-253)), below which multiply by inv_pi underflows. */ -+# define TinyBound v_u64 (0x3020000000000000) -+/* RangeVal - TinyBound. */ -+# define Thresh v_u64 (0x1160000000000000) - #endif - - #define C(i) d->poly[i] -@@ -72,16 +73,15 @@ float64x2_t VPCS_ATTR V_NAME_D1 (sin) (float64x2_t x) - fenv). These lanes will be fixed by special-case handler later. */ - uint64x2_t ir = vreinterpretq_u64_f64 (vabsq_f64 (x)); - cmp = vcgeq_u64 (vsubq_u64 (ir, TinyBound), Thresh); -- r = vbslq_f64 (cmp, vreinterpretq_f64_u64 (cmp), x); -+ r = vreinterpretq_f64_u64 (vbicq_u64 (vreinterpretq_u64_f64 (x), cmp)); - #else - r = x; - cmp = vcageq_f64 (x, d->range_val); - #endif - - /* n = rint(|x|/pi). */ -- n = vfmaq_f64 (d->shift, d->inv_pi, r); -- odd = vshlq_n_u64 (vreinterpretq_u64_f64 (n), 63); -- n = vsubq_f64 (n, d->shift); -+ n = vrndaq_f64 (vmulq_f64 (r, d->inv_pi)); -+ odd = vshlq_n_u64 (vreinterpretq_u64_s64 (vcvtq_s64_f64 (n)), 63); - - /* r = |x| - n*pi (range reduction into -pi/2 .. pi/2). */ - r = vfmsq_f64 (r, d->pi_1, n); -diff --git a/sysdeps/aarch64/fpu/sinf_advsimd.c b/sysdeps/aarch64/fpu/sinf_advsimd.c -index 375dfc3331..6ee9a23d5b 100644 ---- a/sysdeps/aarch64/fpu/sinf_advsimd.c -+++ b/sysdeps/aarch64/fpu/sinf_advsimd.c -@@ -22,7 +22,7 @@ - static const struct data - { - float32x4_t poly[4]; -- float32x4_t range_val, inv_pi, shift, pi_1, pi_2, pi_3; -+ float32x4_t range_val, inv_pi, pi_1, pi_2, pi_3; - } data = { - /* 1.886 ulp error. */ - .poly = { V4 (-0x1.555548p-3f), V4 (0x1.110df4p-7f), V4 (-0x1.9f42eap-13f), -@@ -33,13 +33,14 @@ static const struct data - .pi_3 = V4 (-0x1.ee59dap-49f), - - .inv_pi = V4 (0x1.45f306p-2f), -- .shift = V4 (0x1.8p+23f), - .range_val = V4 (0x1p20f) - }; - - #if WANT_SIMD_EXCEPT --# define TinyBound v_u32 (0x21000000) /* asuint32(0x1p-61f). */ --# define Thresh v_u32 (0x28800000) /* RangeVal - TinyBound. */ -+/* asuint32(0x1p-59f), below which multiply by inv_pi underflows. */ -+# define TinyBound v_u32 (0x22000000) -+/* RangeVal - TinyBound. */ -+# define Thresh v_u32 (0x27800000) - #endif - - #define C(i) d->poly[i] -@@ -64,23 +65,22 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (sin) (float32x4_t x) - /* If fenv exceptions are to be triggered correctly, set any special lanes - to 1 (which is neutral w.r.t. fenv). These lanes will be fixed by - special-case handler later. */ -- r = vbslq_f32 (cmp, vreinterpretq_f32_u32 (cmp), x); -+ r = vreinterpretq_f32_u32 (vbicq_u32 (vreinterpretq_u32_f32 (x), cmp)); - #else - r = x; - cmp = vcageq_f32 (x, d->range_val); - #endif - -- /* n = rint(|x|/pi) */ -- n = vfmaq_f32 (d->shift, d->inv_pi, r); -- odd = vshlq_n_u32 (vreinterpretq_u32_f32 (n), 31); -- n = vsubq_f32 (n, d->shift); -+ /* n = rint(|x|/pi). */ -+ n = vrndaq_f32 (vmulq_f32 (r, d->inv_pi)); -+ odd = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtq_s32_f32 (n)), 31); - -- /* r = |x| - n*pi (range reduction into -pi/2 .. pi/2) */ -+ /* r = |x| - n*pi (range reduction into -pi/2 .. pi/2). */ - r = vfmsq_f32 (r, d->pi_1, n); - r = vfmsq_f32 (r, d->pi_2, n); - r = vfmsq_f32 (r, d->pi_3, n); - -- /* y = sin(r) */ -+ /* y = sin(r). */ - r2 = vmulq_f32 (r, r); - y = vfmaq_f32 (C (2), C (3), r2); - y = vfmaq_f32 (C (1), y, r2); - -commit 9ff7559b274eb0dbce2cbcf87284c1d30d47a2d6 -Author: Joe Ramsay -Date: Mon Oct 28 14:58:35 2024 +0000 - - AArch64: Small optimisation in AdvSIMD erf and erfc - - In both routines, reduce register pressure such that GCC 14 emits no - spills for erf and fewer spills for erfc. Also use more efficient - comparison for the special-case in erf. - - Benchtests show erf improves by 6.4%, erfc by 1.0%. - - (cherry picked from commit 1cf29fbc5be23db775d1dfa6b332ded6e6554252) - -diff --git a/sysdeps/aarch64/fpu/erf_advsimd.c b/sysdeps/aarch64/fpu/erf_advsimd.c -index 19cbb7d0f4..c0116735e4 100644 ---- a/sysdeps/aarch64/fpu/erf_advsimd.c -+++ b/sysdeps/aarch64/fpu/erf_advsimd.c -@@ -22,19 +22,21 @@ - static const struct data - { - float64x2_t third; -- float64x2_t tenth, two_over_five, two_over_fifteen; -- float64x2_t two_over_nine, two_over_fortyfive; -+ float64x2_t tenth, two_over_five, two_over_nine; -+ double two_over_fifteen, two_over_fortyfive; - float64x2_t max, shift; -+ uint64x2_t max_idx; - #if WANT_SIMD_EXCEPT - float64x2_t tiny_bound, huge_bound, scale_minus_one; - #endif - } data = { -+ .max_idx = V2 (768), - .third = V2 (0x1.5555555555556p-2), /* used to compute 2/3 and 1/6 too. */ -- .two_over_fifteen = V2 (0x1.1111111111111p-3), -+ .two_over_fifteen = 0x1.1111111111111p-3, - .tenth = V2 (-0x1.999999999999ap-4), - .two_over_five = V2 (-0x1.999999999999ap-2), - .two_over_nine = V2 (-0x1.c71c71c71c71cp-3), -- .two_over_fortyfive = V2 (0x1.6c16c16c16c17p-5), -+ .two_over_fortyfive = 0x1.6c16c16c16c17p-5, - .max = V2 (5.9921875), /* 6 - 1/128. */ - .shift = V2 (0x1p45), - #if WANT_SIMD_EXCEPT -@@ -87,8 +89,8 @@ float64x2_t VPCS_ATTR V_NAME_D1 (erf) (float64x2_t x) - float64x2_t a = vabsq_f64 (x); - /* Reciprocal conditions that do not catch NaNs so they can be used in BSLs - to return expected results. */ -- uint64x2_t a_le_max = vcleq_f64 (a, dat->max); -- uint64x2_t a_gt_max = vcgtq_f64 (a, dat->max); -+ uint64x2_t a_le_max = vcaleq_f64 (x, dat->max); -+ uint64x2_t a_gt_max = vcagtq_f64 (x, dat->max); - - #if WANT_SIMD_EXCEPT - /* |x| huge or tiny. */ -@@ -115,7 +117,7 @@ float64x2_t VPCS_ATTR V_NAME_D1 (erf) (float64x2_t x) - segfault. */ - uint64x2_t i - = vsubq_u64 (vreinterpretq_u64_f64 (z), vreinterpretq_u64_f64 (shift)); -- i = vbslq_u64 (a_le_max, i, v_u64 (768)); -+ i = vbslq_u64 (a_le_max, i, dat->max_idx); - struct entry e = lookup (i); - - float64x2_t r = vsubq_f64 (z, shift); -@@ -125,14 +127,19 @@ float64x2_t VPCS_ATTR V_NAME_D1 (erf) (float64x2_t x) - float64x2_t d2 = vmulq_f64 (d, d); - float64x2_t r2 = vmulq_f64 (r, r); - -+ float64x2_t two_over_fifteen_and_fortyfive -+ = vld1q_f64 (&dat->two_over_fifteen); -+ - /* poly (d, r) = 1 + p1(r) * d + p2(r) * d^2 + ... + p5(r) * d^5. */ - float64x2_t p1 = r; - float64x2_t p2 - = vfmsq_f64 (dat->third, r2, vaddq_f64 (dat->third, dat->third)); - float64x2_t p3 = vmulq_f64 (r, vfmaq_f64 (v_f64 (-0.5), r2, dat->third)); -- float64x2_t p4 = vfmaq_f64 (dat->two_over_five, r2, dat->two_over_fifteen); -+ float64x2_t p4 = vfmaq_laneq_f64 (dat->two_over_five, r2, -+ two_over_fifteen_and_fortyfive, 0); - p4 = vfmsq_f64 (dat->tenth, r2, p4); -- float64x2_t p5 = vfmaq_f64 (dat->two_over_nine, r2, dat->two_over_fortyfive); -+ float64x2_t p5 = vfmaq_laneq_f64 (dat->two_over_nine, r2, -+ two_over_fifteen_and_fortyfive, 1); - p5 = vmulq_f64 (r, vfmaq_f64 (vmulq_f64 (v_f64 (0.5), dat->third), r2, p5)); - - float64x2_t p34 = vfmaq_f64 (p3, d, p4); -diff --git a/sysdeps/aarch64/fpu/erfc_advsimd.c b/sysdeps/aarch64/fpu/erfc_advsimd.c -index f1b3bfe830..2f2f755c46 100644 ---- a/sysdeps/aarch64/fpu/erfc_advsimd.c -+++ b/sysdeps/aarch64/fpu/erfc_advsimd.c -@@ -24,8 +24,8 @@ static const struct data - { - uint64x2_t offset, table_scale; - float64x2_t max, shift; -- float64x2_t p20, p40, p41, p42; -- float64x2_t p51, p52; -+ float64x2_t p20, p40, p41, p51; -+ double p42, p52; - double qr5[2], qr6[2], qr7[2], qr8[2], qr9[2]; - #if WANT_SIMD_EXCEPT - float64x2_t uflow_bound; -@@ -41,9 +41,9 @@ static const struct data - .p20 = V2 (0x1.5555555555555p-2), /* 1/3, used to compute 2/3 and 1/6. */ - .p40 = V2 (-0x1.999999999999ap-4), /* 1/10. */ - .p41 = V2 (-0x1.999999999999ap-2), /* 2/5. */ -- .p42 = V2 (0x1.1111111111111p-3), /* 2/15. */ -+ .p42 = 0x1.1111111111111p-3, /* 2/15. */ - .p51 = V2 (-0x1.c71c71c71c71cp-3), /* 2/9. */ -- .p52 = V2 (0x1.6c16c16c16c17p-5), /* 2/45. */ -+ .p52 = 0x1.6c16c16c16c17p-5, /* 2/45. */ - /* Qi = (i+1) / i, Ri = -2 * i / ((i+1)*(i+2)), for i = 5, ..., 9. */ - .qr5 = { 0x1.3333333333333p0, -0x1.e79e79e79e79ep-3 }, - .qr6 = { 0x1.2aaaaaaaaaaabp0, -0x1.b6db6db6db6dbp-3 }, -@@ -157,9 +157,10 @@ float64x2_t V_NAME_D1 (erfc) (float64x2_t x) - float64x2_t p1 = r; - float64x2_t p2 = vfmsq_f64 (dat->p20, r2, vaddq_f64 (dat->p20, dat->p20)); - float64x2_t p3 = vmulq_f64 (r, vfmaq_f64 (v_f64 (-0.5), r2, dat->p20)); -- float64x2_t p4 = vfmaq_f64 (dat->p41, r2, dat->p42); -+ float64x2_t p42_p52 = vld1q_f64 (&dat->p42); -+ float64x2_t p4 = vfmaq_laneq_f64 (dat->p41, r2, p42_p52, 0); - p4 = vfmsq_f64 (dat->p40, r2, p4); -- float64x2_t p5 = vfmaq_f64 (dat->p51, r2, dat->p52); -+ float64x2_t p5 = vfmaq_laneq_f64 (dat->p51, r2, p42_p52, 1); - p5 = vmulq_f64 (r, vfmaq_f64 (vmulq_f64 (v_f64 (0.5), dat->p20), r2, p5)); - /* Compute p_i using recurrence relation: - p_{i+2} = (p_i + r * Q_{i+1} * p_{i+1}) * R_{i+1}. */ - -commit 76c923fe9d09befc8131205659d99cb9ac97460a -Author: Joe Ramsay -Date: Fri Nov 1 15:48:54 2024 +0000 - - AArch64: Remove SVE erf and erfc tables - - By using a combination of mask-and-add instead of the shift-based - index calculation the routines can share the same table as other - variants with no performance degradation. - - The tables change name because of other changes in downstream AOR. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 2d82d781a539ce8e82178fc1fa2c99ae1884e7fe) - -diff --git a/sysdeps/aarch64/fpu/Makefile b/sysdeps/aarch64/fpu/Makefile -index 234a6c457c..be8541f649 100644 ---- a/sysdeps/aarch64/fpu/Makefile -+++ b/sysdeps/aarch64/fpu/Makefile -@@ -41,8 +41,6 @@ libmvec-support = $(addsuffix f_advsimd,$(float-advsimd-funcs)) \ - v_log10_data \ - erf_data \ - erff_data \ -- sv_erf_data \ -- sv_erff_data \ - v_exp_tail_data \ - erfc_data \ - erfcf_data \ -diff --git a/sysdeps/aarch64/fpu/erf_advsimd.c b/sysdeps/aarch64/fpu/erf_advsimd.c -index c0116735e4..a48092e838 100644 ---- a/sysdeps/aarch64/fpu/erf_advsimd.c -+++ b/sysdeps/aarch64/fpu/erf_advsimd.c -@@ -58,8 +58,8 @@ static inline struct entry - lookup (uint64x2_t i) - { - struct entry e; -- float64x2_t e1 = vld1q_f64 (&__erf_data.tab[vgetq_lane_u64 (i, 0)].erf), -- e2 = vld1q_f64 (&__erf_data.tab[vgetq_lane_u64 (i, 1)].erf); -+ float64x2_t e1 = vld1q_f64 (&__v_erf_data.tab[vgetq_lane_u64 (i, 0)].erf), -+ e2 = vld1q_f64 (&__v_erf_data.tab[vgetq_lane_u64 (i, 1)].erf); - e.erf = vuzp1q_f64 (e1, e2); - e.scale = vuzp2q_f64 (e1, e2); - return e; -diff --git a/sysdeps/aarch64/fpu/erf_data.c b/sysdeps/aarch64/fpu/erf_data.c -index 6d2dcd235c..ea01fad7ca 100644 ---- a/sysdeps/aarch64/fpu/erf_data.c -+++ b/sysdeps/aarch64/fpu/erf_data.c -@@ -19,14 +19,14 @@ - - #include "vecmath_config.h" - --/* Lookup table used in erf. -+/* Lookup table used in vector erf. - For each possible rounded input r (multiples of 1/128), between - r = 0.0 and r = 6.0 (769 values): -- - the first entry __erff_data.tab.erf contains the values of erf(r), -- - the second entry __erff_data.tab.scale contains the values of -+ - the first entry __v_erff_data.tab.erf contains the values of erf(r), -+ - the second entry __v_erff_data.tab.scale contains the values of - 2/sqrt(pi)*exp(-r^2). Note that indices 0 and 1 are never hit by the - algorithm, since lookup is performed only for x >= 1/64-1/512. */ --const struct erf_data __erf_data = { -+const struct v_erf_data __v_erf_data = { - .tab = { { 0x0.0000000000000p+0, 0x1.20dd750429b6dp+0 }, - { 0x1.20dbf3deb1340p-7, 0x1.20d8f1975c85dp+0 }, - { 0x1.20d77083f17a0p-6, 0x1.20cb67bd452c7p+0 }, -diff --git a/sysdeps/aarch64/fpu/erf_sve.c b/sysdeps/aarch64/fpu/erf_sve.c -index 7d51417406..671d55a02b 100644 ---- a/sysdeps/aarch64/fpu/erf_sve.c -+++ b/sysdeps/aarch64/fpu/erf_sve.c -@@ -67,14 +67,16 @@ svfloat64_t SV_NAME_D1 (erf) (svfloat64_t x, const svbool_t pg) - svfloat64_t a = svabs_x (pg, x); - svfloat64_t shift = sv_f64 (dat->shift); - svfloat64_t z = svadd_x (pg, a, shift); -- svuint64_t i -- = svsub_x (pg, svreinterpret_u64 (z), svreinterpret_u64 (shift)); -+ svuint64_t i = svand_x (pg, svreinterpret_u64 (z), 0xfff); -+ i = svadd_x (pg, i, i); - - /* Lookup without shortcut for small values but with predicate to avoid - segfault for large values and NaNs. */ - svfloat64_t r = svsub_x (pg, z, shift); -- svfloat64_t erfr = svld1_gather_index (a_lt_max, __sv_erf_data.erf, i); -- svfloat64_t scale = svld1_gather_index (a_lt_max, __sv_erf_data.scale, i); -+ svfloat64_t erfr -+ = svld1_gather_index (a_lt_max, &__v_erf_data.tab[0].erf, i); -+ svfloat64_t scale -+ = svld1_gather_index (a_lt_max, &__v_erf_data.tab[0].scale, i); - - /* erf(x) ~ erf(r) + scale * d * poly (r, d). */ - svfloat64_t d = svsub_x (pg, a, r); -diff --git a/sysdeps/aarch64/fpu/erfc_advsimd.c b/sysdeps/aarch64/fpu/erfc_advsimd.c -index 2f2f755c46..d05eac61a2 100644 ---- a/sysdeps/aarch64/fpu/erfc_advsimd.c -+++ b/sysdeps/aarch64/fpu/erfc_advsimd.c -@@ -69,9 +69,9 @@ lookup (uint64x2_t i) - { - struct entry e; - float64x2_t e1 -- = vld1q_f64 (&__erfc_data.tab[vgetq_lane_u64 (i, 0) - Off].erfc); -+ = vld1q_f64 (&__v_erfc_data.tab[vgetq_lane_u64 (i, 0) - Off].erfc); - float64x2_t e2 -- = vld1q_f64 (&__erfc_data.tab[vgetq_lane_u64 (i, 1) - Off].erfc); -+ = vld1q_f64 (&__v_erfc_data.tab[vgetq_lane_u64 (i, 1) - Off].erfc); - e.erfc = vuzp1q_f64 (e1, e2); - e.scale = vuzp2q_f64 (e1, e2); - return e; -diff --git a/sysdeps/aarch64/fpu/erfc_data.c b/sysdeps/aarch64/fpu/erfc_data.c -index 76a94e4681..8dc6a8c42c 100644 ---- a/sysdeps/aarch64/fpu/erfc_data.c -+++ b/sysdeps/aarch64/fpu/erfc_data.c -@@ -19,14 +19,14 @@ - - #include "vecmath_config.h" - --/* Lookup table used in erfc. -+/* Lookup table used in vector erfc. - For each possible rounded input r (multiples of 1/128), between - r = 0.0 and r = ~27.0 (3488 values): -- - the first entry __erfc_data.tab.erfc contains the values of erfc(r), -- - the second entry __erfc_data.tab.scale contains the values of -+ - the first entry __v_erfc_data.tab.erfc contains the values of erfc(r), -+ - the second entry __v_erfc_data.tab.scale contains the values of - 2/sqrt(pi)*exp(-r^2). Both values may go into subnormal range, therefore - they are scaled by a large enough value 2^128 (fits in 8bit). */ --const struct erfc_data __erfc_data = { -+const struct v_erfc_data __v_erfc_data = { - .tab = { { 0x1p128, 0x1.20dd750429b6dp128 }, - { 0x1.fb7c9030853b3p127, 0x1.20d8f1975c85dp128 }, - { 0x1.f6f9447be0743p127, 0x1.20cb67bd452c7p128 }, -diff --git a/sysdeps/aarch64/fpu/erfc_sve.c b/sysdeps/aarch64/fpu/erfc_sve.c -index c17d3e4484..703926ee41 100644 ---- a/sysdeps/aarch64/fpu/erfc_sve.c -+++ b/sysdeps/aarch64/fpu/erfc_sve.c -@@ -104,7 +104,7 @@ svfloat64_t SV_NAME_D1 (erfc) (svfloat64_t x, const svbool_t pg) - - /* Lookup erfc(r) and 2/sqrt(pi)*exp(-r^2) in tables. */ - i = svadd_x (pg, i, i); -- const float64_t *p = &__erfc_data.tab[0].erfc - 2 * dat->off_arr; -+ const float64_t *p = &__v_erfc_data.tab[0].erfc - 2 * dat->off_arr; - svfloat64_t erfcr = svld1_gather_index (pg, p, i); - svfloat64_t scale = svld1_gather_index (pg, p + 1, i); - -diff --git a/sysdeps/aarch64/fpu/erfcf_advsimd.c b/sysdeps/aarch64/fpu/erfcf_advsimd.c -index ca5bc3ab33..59b0b0d64b 100644 ---- a/sysdeps/aarch64/fpu/erfcf_advsimd.c -+++ b/sysdeps/aarch64/fpu/erfcf_advsimd.c -@@ -62,13 +62,13 @@ lookup (uint32x4_t i) - { - struct entry e; - float32x2_t t0 -- = vld1_f32 (&__erfcf_data.tab[vgetq_lane_u32 (i, 0) - Off].erfc); -+ = vld1_f32 (&__v_erfcf_data.tab[vgetq_lane_u32 (i, 0) - Off].erfc); - float32x2_t t1 -- = vld1_f32 (&__erfcf_data.tab[vgetq_lane_u32 (i, 1) - Off].erfc); -+ = vld1_f32 (&__v_erfcf_data.tab[vgetq_lane_u32 (i, 1) - Off].erfc); - float32x2_t t2 -- = vld1_f32 (&__erfcf_data.tab[vgetq_lane_u32 (i, 2) - Off].erfc); -+ = vld1_f32 (&__v_erfcf_data.tab[vgetq_lane_u32 (i, 2) - Off].erfc); - float32x2_t t3 -- = vld1_f32 (&__erfcf_data.tab[vgetq_lane_u32 (i, 3) - Off].erfc); -+ = vld1_f32 (&__v_erfcf_data.tab[vgetq_lane_u32 (i, 3) - Off].erfc); - float32x4_t e1 = vcombine_f32 (t0, t1); - float32x4_t e2 = vcombine_f32 (t2, t3); - e.erfc = vuzp1q_f32 (e1, e2); -diff --git a/sysdeps/aarch64/fpu/erfcf_data.c b/sysdeps/aarch64/fpu/erfcf_data.c -index 77fb889a78..d45087bbb9 100644 ---- a/sysdeps/aarch64/fpu/erfcf_data.c -+++ b/sysdeps/aarch64/fpu/erfcf_data.c -@@ -19,14 +19,14 @@ - - #include "vecmath_config.h" - --/* Lookup table used in erfcf. -+/* Lookup table used in vector erfcf. - For each possible rounded input r (multiples of 1/64), between - r = 0.0 and r = 10.0625 (645 values): -- - the first entry __erfcf_data.tab.erfc contains the values of erfc(r), -- - the second entry __erfcf_data.tab.scale contains the values of -+ - the first entry __v_erfcf_data.tab.erfc contains the values of erfc(r), -+ - the second entry __v_erfcf_data.tab.scale contains the values of - 2/sqrt(pi)*exp(-r^2). Both values may go into subnormal range, therefore - they are scaled by a large enough value 2^47 (fits in 8 bits). */ --const struct erfcf_data __erfcf_data = { -+const struct v_erfcf_data __v_erfcf_data = { - .tab = { { 0x1p47, 0x1.20dd76p47 }, - { 0x1.f6f944p46, 0x1.20cb68p47 }, - { 0x1.edf3aap46, 0x1.209546p47 }, -diff --git a/sysdeps/aarch64/fpu/erfcf_sve.c b/sysdeps/aarch64/fpu/erfcf_sve.c -index 48d1677eb4..ecacb933ac 100644 ---- a/sysdeps/aarch64/fpu/erfcf_sve.c -+++ b/sysdeps/aarch64/fpu/erfcf_sve.c -@@ -77,7 +77,7 @@ svfloat32_t SV_NAME_F1 (erfc) (svfloat32_t x, const svbool_t pg) - - /* Lookup erfc(r) and 2/sqrt(pi)*exp(-r^2) in tables. */ - i = svmul_x (pg, i, 2); -- const float32_t *p = &__erfcf_data.tab[0].erfc - 2 * dat->off_arr; -+ const float32_t *p = &__v_erfcf_data.tab[0].erfc - 2 * dat->off_arr; - svfloat32_t erfcr = svld1_gather_index (pg, p, i); - svfloat32_t scale = svld1_gather_index (pg, p + 1, i); - -diff --git a/sysdeps/aarch64/fpu/erff_advsimd.c b/sysdeps/aarch64/fpu/erff_advsimd.c -index f2fe6ff236..db39e789b6 100644 ---- a/sysdeps/aarch64/fpu/erff_advsimd.c -+++ b/sysdeps/aarch64/fpu/erff_advsimd.c -@@ -47,10 +47,10 @@ static inline struct entry - lookup (uint32x4_t i) - { - struct entry e; -- float32x2_t t0 = vld1_f32 (&__erff_data.tab[vgetq_lane_u32 (i, 0)].erf); -- float32x2_t t1 = vld1_f32 (&__erff_data.tab[vgetq_lane_u32 (i, 1)].erf); -- float32x2_t t2 = vld1_f32 (&__erff_data.tab[vgetq_lane_u32 (i, 2)].erf); -- float32x2_t t3 = vld1_f32 (&__erff_data.tab[vgetq_lane_u32 (i, 3)].erf); -+ float32x2_t t0 = vld1_f32 (&__v_erff_data.tab[vgetq_lane_u32 (i, 0)].erf); -+ float32x2_t t1 = vld1_f32 (&__v_erff_data.tab[vgetq_lane_u32 (i, 1)].erf); -+ float32x2_t t2 = vld1_f32 (&__v_erff_data.tab[vgetq_lane_u32 (i, 2)].erf); -+ float32x2_t t3 = vld1_f32 (&__v_erff_data.tab[vgetq_lane_u32 (i, 3)].erf); - float32x4_t e1 = vcombine_f32 (t0, t1); - float32x4_t e2 = vcombine_f32 (t2, t3); - e.erf = vuzp1q_f32 (e1, e2); -diff --git a/sysdeps/aarch64/fpu/erff_data.c b/sysdeps/aarch64/fpu/erff_data.c -index 9a32940915..da38aed205 100644 ---- a/sysdeps/aarch64/fpu/erff_data.c -+++ b/sysdeps/aarch64/fpu/erff_data.c -@@ -19,14 +19,14 @@ - - #include "vecmath_config.h" - --/* Lookup table used in erff. -+/* Lookup table used in vector erff. - For each possible rounded input r (multiples of 1/128), between - r = 0.0 and r = 4.0 (513 values): -- - the first entry __erff_data.tab.erf contains the values of erf(r), -- - the second entry __erff_data.tab.scale contains the values of -+ - the first entry __v_erff_data.tab.erf contains the values of erf(r), -+ - the second entry __v_erff_data.tab.scale contains the values of - 2/sqrt(pi)*exp(-r^2). Note that indices 0 and 1 are never hit by the - algorithm, since lookup is performed only for x >= 1/64-1/512. */ --const struct erff_data __erff_data = { -+const struct v_erff_data __v_erff_data = { - .tab = { { 0x0.000000p+0, 0x1.20dd76p+0 }, - { 0x1.20dbf4p-7, 0x1.20d8f2p+0 }, - { 0x1.20d770p-6, 0x1.20cb68p+0 }, -diff --git a/sysdeps/aarch64/fpu/erff_sve.c b/sysdeps/aarch64/fpu/erff_sve.c -index 38f00db9be..0e382eb09a 100644 ---- a/sysdeps/aarch64/fpu/erff_sve.c -+++ b/sysdeps/aarch64/fpu/erff_sve.c -@@ -62,18 +62,17 @@ svfloat32_t SV_NAME_F1 (erf) (svfloat32_t x, const svbool_t pg) - - svfloat32_t shift = sv_f32 (dat->shift); - svfloat32_t z = svadd_x (pg, a, shift); -- svuint32_t i -- = svsub_x (pg, svreinterpret_u32 (z), svreinterpret_u32 (shift)); -- -- /* Saturate lookup index. */ -- i = svsel (a_ge_max, sv_u32 (512), i); -+ svuint32_t i = svand_x (pg, svreinterpret_u32 (z), 0xfff); -+ i = svadd_x (pg, i, i); - - /* r and erf(r) set to 0 for |x| below min. */ - svfloat32_t r = svsub_z (a_gt_min, z, shift); -- svfloat32_t erfr = svld1_gather_index (a_gt_min, __sv_erff_data.erf, i); -+ svfloat32_t erfr -+ = svld1_gather_index (a_gt_min, &__v_erff_data.tab[0].erf, i); - - /* scale set to 2/sqrt(pi) for |x| below min. */ -- svfloat32_t scale = svld1_gather_index (a_gt_min, __sv_erff_data.scale, i); -+ svfloat32_t scale -+ = svld1_gather_index (a_gt_min, &__v_erff_data.tab[0].scale, i); - scale = svsel (a_gt_min, scale, sv_f32 (dat->scale)); - - /* erf(x) ~ erf(r) + scale * d * (1 - r * d + 1/3 * d^2). */ -diff --git a/sysdeps/aarch64/fpu/sv_erf_data.c b/sysdeps/aarch64/fpu/sv_erf_data.c -deleted file mode 100644 -index a53878f893..0000000000 ---- a/sysdeps/aarch64/fpu/sv_erf_data.c -+++ /dev/null -@@ -1,1570 +0,0 @@ --/* Table for SVE erf approximation -- -- Copyright (C) 2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --#include "vecmath_config.h" -- --/* Lookup table used in vector erf. -- For each possible rounded input r (multiples of 1/128), between -- r = 0.0 and r = 6.0 (769 values): -- - the first entry __erf_data.tab.erf contains the values of erf(r), -- - the second entry __erf_data.tab.scale contains the values of -- 2/sqrt(pi)*exp(-r^2). Note that indices 0 and 1 are never hit by the -- algorithm, since lookup is performed only for x >= 1/64-1/512. */ --const struct sv_erf_data __sv_erf_data = { -- .erf = { 0x0.0000000000000p+0, -- 0x1.20dbf3deb1340p-7, -- 0x1.20d77083f17a0p-6, -- 0x1.b137e0cf584dcp-6, -- 0x1.20c5645dd2538p-5, -- 0x1.68e5d3bbc9526p-5, -- 0x1.b0fafef135745p-5, -- 0x1.f902a77bd3821p-5, -- 0x1.207d480e90658p-4, -- 0x1.44703e87e8593p-4, -- 0x1.68591a1e83b5dp-4, -- 0x1.8c36beb8a8d23p-4, -- 0x1.b0081148a873ap-4, -- 0x1.d3cbf7e70a4b3p-4, -- 0x1.f78159ec8bb50p-4, -- 0x1.0d939005f65e5p-3, -- 0x1.1f5e1a35c3b89p-3, -- 0x1.311fc15f56d14p-3, -- 0x1.42d7fc2f64959p-3, -- 0x1.548642321d7c6p-3, -- 0x1.662a0bdf7a89fp-3, -- 0x1.77c2d2a765f9ep-3, -- 0x1.895010fdbdbfdp-3, -- 0x1.9ad142662e14dp-3, -- 0x1.ac45e37fe2526p-3, -- 0x1.bdad72110a648p-3, -- 0x1.cf076d1233237p-3, -- 0x1.e05354b96ff36p-3, -- 0x1.f190aa85540e2p-3, -- 0x1.015f78a3dcf3dp-2, -- 0x1.09eed6982b948p-2, -- 0x1.127631eb8de32p-2, -- 0x1.1af54e232d609p-2, -- 0x1.236bef825d9a2p-2, -- 0x1.2bd9db0f7827fp-2, -- 0x1.343ed6989b7d9p-2, -- 0x1.3c9aa8b84bedap-2, -- 0x1.44ed18d9f6462p-2, -- 0x1.4d35ef3e5372ep-2, -- 0x1.5574f4ffac98ep-2, -- 0x1.5da9f415ff23fp-2, -- 0x1.65d4b75b00471p-2, -- 0x1.6df50a8dff772p-2, -- 0x1.760aba57a76bfp-2, -- 0x1.7e15944d9d3e4p-2, -- 0x1.861566f5fd3c0p-2, -- 0x1.8e0a01cab516bp-2, -- 0x1.95f3353cbb146p-2, -- 0x1.9dd0d2b721f39p-2, -- 0x1.a5a2aca209394p-2, -- 0x1.ad68966569a87p-2, -- 0x1.b522646bbda68p-2, -- 0x1.bccfec24855b8p-2, -- 0x1.c4710406a65fcp-2, -- 0x1.cc058392a6d2dp-2, -- 0x1.d38d4354c3bd0p-2, -- 0x1.db081ce6e2a48p-2, -- 0x1.e275eaf25e458p-2, -- 0x1.e9d68931ae650p-2, -- 0x1.f129d471eabb1p-2, -- 0x1.f86faa9428f9dp-2, -- 0x1.ffa7ea8eb5fd0p-2, -- 0x1.03693a371519cp-1, -- 0x1.06f794ab2cae7p-1, -- 0x1.0a7ef5c18edd2p-1, -- 0x1.0dff4f247f6c6p-1, -- 0x1.1178930ada115p-1, -- 0x1.14eab43841b55p-1, -- 0x1.1855a5fd3dd50p-1, -- 0x1.1bb95c3746199p-1, -- 0x1.1f15cb50bc4dep-1, -- 0x1.226ae840d4d70p-1, -- 0x1.25b8a88b6dd7fp-1, -- 0x1.28ff0240d52cdp-1, -- 0x1.2c3debfd7d6c1p-1, -- 0x1.2f755ce9a21f4p-1, -- 0x1.32a54cb8db67bp-1, -- 0x1.35cdb3a9a144dp-1, -- 0x1.38ee8a84beb71p-1, -- 0x1.3c07ca9cb4f9ep-1, -- 0x1.3f196dcd0f135p-1, -- 0x1.42236e79a5fa6p-1, -- 0x1.4525c78dd5966p-1, -- 0x1.4820747ba2dc2p-1, -- 0x1.4b13713ad3513p-1, -- 0x1.4dfeba47f63ccp-1, -- 0x1.50e24ca35fd2cp-1, -- 0x1.53be25d016a4fp-1, -- 0x1.569243d2b3a9bp-1, -- 0x1.595ea53035283p-1, -- 0x1.5c2348ecc4dc3p-1, -- 0x1.5ee02e8a71a53p-1, -- 0x1.61955607dd15dp-1, -- 0x1.6442bfdedd397p-1, -- 0x1.66e86d0312e82p-1, -- 0x1.69865ee075011p-1, -- 0x1.6c1c9759d0e5fp-1, -- 0x1.6eab18c74091bp-1, -- 0x1.7131e5f496a5ap-1, -- 0x1.73b1021fc0cb8p-1, -- 0x1.762870f720c6fp-1, -- 0x1.78983697dc96fp-1, -- 0x1.7b00578c26037p-1, -- 0x1.7d60d8c979f7bp-1, -- 0x1.7fb9bfaed8078p-1, -- 0x1.820b1202f27fbp-1, -- 0x1.8454d5f25760dp-1, -- 0x1.8697120d92a4ap-1, -- 0x1.88d1cd474a2e0p-1, -- 0x1.8b050ef253c37p-1, -- 0x1.8d30debfc572ep-1, -- 0x1.8f5544bd00c04p-1, -- 0x1.91724951b8fc6p-1, -- 0x1.9387f53df5238p-1, -- 0x1.959651980da31p-1, -- 0x1.979d67caa6631p-1, -- 0x1.999d4192a5715p-1, -- 0x1.9b95e8fd26abap-1, -- 0x1.9d8768656cc42p-1, -- 0x1.9f71ca72cffb6p-1, -- 0x1.a1551a16aaeafp-1, -- 0x1.a331628a45b92p-1, -- 0x1.a506af4cc00f4p-1, -- 0x1.a6d50c20fa293p-1, -- 0x1.a89c850b7d54dp-1, -- 0x1.aa5d265064366p-1, -- 0x1.ac16fc7143263p-1, -- 0x1.adca142b10f98p-1, -- 0x1.af767a741088bp-1, -- 0x1.b11c3c79bb424p-1, -- 0x1.b2bb679ead19cp-1, -- 0x1.b4540978921eep-1, -- 0x1.b5e62fce16095p-1, -- 0x1.b771e894d602ep-1, -- 0x1.b8f741ef54f83p-1, -- 0x1.ba764a2af2b78p-1, -- 0x1.bbef0fbde6221p-1, -- 0x1.bd61a1453ab44p-1, -- 0x1.bece0d82d1a5cp-1, -- 0x1.c034635b66e23p-1, -- 0x1.c194b1d49a184p-1, -- 0x1.c2ef0812fc1bdp-1, -- 0x1.c443755820d64p-1, -- 0x1.c5920900b5fd1p-1, -- 0x1.c6dad2829ec62p-1, -- 0x1.c81de16b14cefp-1, -- 0x1.c95b455cce69dp-1, -- 0x1.ca930e0e2a825p-1, -- 0x1.cbc54b476248dp-1, -- 0x1.ccf20ce0c0d27p-1, -- 0x1.ce1962c0e0d8bp-1, -- 0x1.cf3b5cdaf0c39p-1, -- 0x1.d0580b2cfd249p-1, -- 0x1.d16f7dbe41ca0p-1, -- 0x1.d281c49d818d0p-1, -- 0x1.d38eefdf64fddp-1, -- 0x1.d4970f9ce00d9p-1, -- 0x1.d59a33f19ed42p-1, -- 0x1.d6986cfa798e7p-1, -- 0x1.d791cad3eff01p-1, -- 0x1.d8865d98abe01p-1, -- 0x1.d97635600bb89p-1, -- 0x1.da61623cb41e0p-1, -- 0x1.db47f43b2980dp-1, -- 0x1.dc29fb60715afp-1, -- 0x1.dd0787a8bb39dp-1, -- 0x1.dde0a90611a0dp-1, -- 0x1.deb56f5f12d28p-1, -- 0x1.df85ea8db188ep-1, -- 0x1.e0522a5dfda73p-1, -- 0x1.e11a3e8cf4eb8p-1, -- 0x1.e1de36c75ba58p-1, -- 0x1.e29e22a89d766p-1, -- 0x1.e35a11b9b61cep-1, -- 0x1.e4121370224ccp-1, -- 0x1.e4c6372cd8927p-1, -- 0x1.e5768c3b4a3fcp-1, -- 0x1.e62321d06c5e0p-1, -- 0x1.e6cc0709c8a0dp-1, -- 0x1.e7714aec96534p-1, -- 0x1.e812fc64db369p-1, -- 0x1.e8b12a44944a8p-1, -- 0x1.e94be342e6743p-1, -- 0x1.e9e335fb56f87p-1, -- 0x1.ea7730ed0bbb9p-1, -- 0x1.eb07e27a133aap-1, -- 0x1.eb9558e6b42cep-1, -- 0x1.ec1fa258c4beap-1, -- 0x1.eca6ccd709544p-1, -- 0x1.ed2ae6489ac1ep-1, -- 0x1.edabfc7453e63p-1, -- 0x1.ee2a1d004692cp-1, -- 0x1.eea5557137ae0p-1, -- 0x1.ef1db32a2277cp-1, -- 0x1.ef93436bc2daap-1, -- 0x1.f006135426b26p-1, -- 0x1.f0762fde45ee6p-1, -- 0x1.f0e3a5e1a1788p-1, -- 0x1.f14e8211e8c55p-1, -- 0x1.f1b6d0fea5f4dp-1, -- 0x1.f21c9f12f0677p-1, -- 0x1.f27ff89525acfp-1, -- 0x1.f2e0e9a6a8b09p-1, -- 0x1.f33f7e43a706bp-1, -- 0x1.f39bc242e43e6p-1, -- 0x1.f3f5c1558b19ep-1, -- 0x1.f44d870704911p-1, -- 0x1.f4a31ebcd47dfp-1, -- 0x1.f4f693b67bd77p-1, -- 0x1.f547f10d60597p-1, -- 0x1.f59741b4b97cfp-1, -- 0x1.f5e4907982a07p-1, -- 0x1.f62fe80272419p-1, -- 0x1.f67952cff6282p-1, -- 0x1.f6c0db3c34641p-1, -- 0x1.f7068b7b10fd9p-1, -- 0x1.f74a6d9a38383p-1, -- 0x1.f78c8b812d498p-1, -- 0x1.f7cceef15d631p-1, -- 0x1.f80ba18636f07p-1, -- 0x1.f848acb544e95p-1, -- 0x1.f88419ce4e184p-1, -- 0x1.f8bdf1fb78370p-1, -- 0x1.f8f63e416ebffp-1, -- 0x1.f92d077f8d56dp-1, -- 0x1.f96256700da8ep-1, -- 0x1.f99633a838a57p-1, -- 0x1.f9c8a7989af0dp-1, -- 0x1.f9f9ba8d3c733p-1, -- 0x1.fa2974addae45p-1, -- 0x1.fa57ddfe27376p-1, -- 0x1.fa84fe5e05c8dp-1, -- 0x1.fab0dd89d1309p-1, -- 0x1.fadb831a9f9c3p-1, -- 0x1.fb04f6868a944p-1, -- 0x1.fb2d3f20f9101p-1, -- 0x1.fb54641aebbc9p-1, -- 0x1.fb7a6c834b5a2p-1, -- 0x1.fb9f5f4739170p-1, -- 0x1.fbc3433260ca5p-1, -- 0x1.fbe61eef4cf6ap-1, -- 0x1.fc07f907bc794p-1, -- 0x1.fc28d7e4f9cd0p-1, -- 0x1.fc48c1d033c7ap-1, -- 0x1.fc67bcf2d7b8fp-1, -- 0x1.fc85cf56ecd38p-1, -- 0x1.fca2fee770c79p-1, -- 0x1.fcbf5170b578bp-1, -- 0x1.fcdacca0bfb73p-1, -- 0x1.fcf57607a6e7cp-1, -- 0x1.fd0f5317f582fp-1, -- 0x1.fd2869270a56fp-1, -- 0x1.fd40bd6d7a785p-1, -- 0x1.fd58550773cb5p-1, -- 0x1.fd6f34f52013ap-1, -- 0x1.fd85621b0876dp-1, -- 0x1.fd9ae142795e3p-1, -- 0x1.fdafb719e6a69p-1, -- 0x1.fdc3e835500b3p-1, -- 0x1.fdd7790ea5bc0p-1, -- 0x1.fdea6e062d0c9p-1, -- 0x1.fdfccb62e52d3p-1, -- 0x1.fe0e9552ebdd6p-1, -- 0x1.fe1fcfebe2083p-1, -- 0x1.fe307f2b503d0p-1, -- 0x1.fe40a6f70af4bp-1, -- 0x1.fe504b1d9696cp-1, -- 0x1.fe5f6f568b301p-1, -- 0x1.fe6e1742f7cf6p-1, -- 0x1.fe7c466dc57a1p-1, -- 0x1.fe8a004c19ae6p-1, -- 0x1.fe97483db8670p-1, -- 0x1.fea4218d6594ap-1, -- 0x1.feb08f7146046p-1, -- 0x1.febc950b3fa75p-1, -- 0x1.fec835695932ep-1, -- 0x1.fed37386190fbp-1, -- 0x1.fede5248e38f4p-1, -- 0x1.fee8d486585eep-1, -- 0x1.fef2fd00af31ap-1, -- 0x1.fefcce6813974p-1, -- 0x1.ff064b5afffbep-1, -- 0x1.ff0f766697c76p-1, -- 0x1.ff18520700971p-1, -- 0x1.ff20e0a7ba8c2p-1, -- 0x1.ff2924a3f7a83p-1, -- 0x1.ff312046f2339p-1, -- 0x1.ff38d5cc4227fp-1, -- 0x1.ff404760319b4p-1, -- 0x1.ff47772010262p-1, -- 0x1.ff4e671a85425p-1, -- 0x1.ff55194fe19dfp-1, -- 0x1.ff5b8fb26f5f6p-1, -- 0x1.ff61cc26c1578p-1, -- 0x1.ff67d08401202p-1, -- 0x1.ff6d9e943c231p-1, -- 0x1.ff733814af88cp-1, -- 0x1.ff789eb6130c9p-1, -- 0x1.ff7dd41ce2b4dp-1, -- 0x1.ff82d9e1a76d8p-1, -- 0x1.ff87b1913e853p-1, -- 0x1.ff8c5cad200a5p-1, -- 0x1.ff90dcaba4096p-1, -- 0x1.ff9532f846ab0p-1, -- 0x1.ff9960f3eb327p-1, -- 0x1.ff9d67f51ddbap-1, -- 0x1.ffa14948549a7p-1, -- 0x1.ffa506302ebaep-1, -- 0x1.ffa89fe5b3625p-1, -- 0x1.ffac17988ef4bp-1, -- 0x1.ffaf6e6f4f5c0p-1, -- 0x1.ffb2a5879f35ep-1, -- 0x1.ffb5bdf67fe6fp-1, -- 0x1.ffb8b8c88295fp-1, -- 0x1.ffbb970200110p-1, -- 0x1.ffbe599f4f9d9p-1, -- 0x1.ffc10194fcb64p-1, -- 0x1.ffc38fcffbb7cp-1, -- 0x1.ffc60535dd7f5p-1, -- 0x1.ffc862a501fd7p-1, -- 0x1.ffcaa8f4c9beap-1, -- 0x1.ffccd8f5c66d1p-1, -- 0x1.ffcef371ea4d7p-1, -- 0x1.ffd0f92cb6ba7p-1, -- 0x1.ffd2eae369a07p-1, -- 0x1.ffd4c94d29fdbp-1, -- 0x1.ffd6951b33686p-1, -- 0x1.ffd84ef9009eep-1, -- 0x1.ffd9f78c7524ap-1, -- 0x1.ffdb8f7605ee7p-1, -- 0x1.ffdd1750e1220p-1, -- 0x1.ffde8fb314ebfp-1, -- 0x1.ffdff92db56e5p-1, -- 0x1.ffe1544d01ccbp-1, -- 0x1.ffe2a1988857cp-1, -- 0x1.ffe3e19349dc7p-1, -- 0x1.ffe514bbdc197p-1, -- 0x1.ffe63b8c8b5f7p-1, -- 0x1.ffe7567b7b5e1p-1, -- 0x1.ffe865fac722bp-1, -- 0x1.ffe96a78a04a9p-1, -- 0x1.ffea645f6d6dap-1, -- 0x1.ffeb5415e7c44p-1, -- 0x1.ffec39ff380b9p-1, -- 0x1.ffed167b12ac2p-1, -- 0x1.ffede9e5d3262p-1, -- 0x1.ffeeb49896c6dp-1, -- 0x1.ffef76e956a9fp-1, -- 0x1.fff0312b010b5p-1, -- 0x1.fff0e3ad91ec2p-1, -- 0x1.fff18ebe2b0e1p-1, -- 0x1.fff232a72b48ep-1, -- 0x1.fff2cfb0453d9p-1, -- 0x1.fff3661e9569dp-1, -- 0x1.fff3f634b79f9p-1, -- 0x1.fff48032dbe40p-1, -- 0x1.fff50456dab8cp-1, -- 0x1.fff582dc48d30p-1, -- 0x1.fff5fbfc8a439p-1, -- 0x1.fff66feee5129p-1, -- 0x1.fff6dee89352ep-1, -- 0x1.fff7491cd4af6p-1, -- 0x1.fff7aebcff755p-1, -- 0x1.fff80ff8911fdp-1, -- 0x1.fff86cfd3e657p-1, -- 0x1.fff8c5f702ccfp-1, -- 0x1.fff91b102fca8p-1, -- 0x1.fff96c717b695p-1, -- 0x1.fff9ba420e834p-1, -- 0x1.fffa04a7928b1p-1, -- 0x1.fffa4bc63ee9ap-1, -- 0x1.fffa8fc0e5f33p-1, -- 0x1.fffad0b901755p-1, -- 0x1.fffb0ecebee1bp-1, -- 0x1.fffb4a210b172p-1, -- 0x1.fffb82cd9dcbfp-1, -- 0x1.fffbb8f1049c6p-1, -- 0x1.fffbeca6adbe9p-1, -- 0x1.fffc1e08f25f5p-1, -- 0x1.fffc4d3120aa1p-1, -- 0x1.fffc7a37857d2p-1, -- 0x1.fffca53375ce3p-1, -- 0x1.fffcce3b57bffp-1, -- 0x1.fffcf564ab6b7p-1, -- 0x1.fffd1ac4135f9p-1, -- 0x1.fffd3e6d5cd87p-1, -- 0x1.fffd607387b07p-1, -- 0x1.fffd80e8ce0dap-1, -- 0x1.fffd9fdeabccep-1, -- 0x1.fffdbd65e5ad0p-1, -- 0x1.fffdd98e903b2p-1, -- 0x1.fffdf46816833p-1, -- 0x1.fffe0e0140857p-1, -- 0x1.fffe26683972ap-1, -- 0x1.fffe3daa95b18p-1, -- 0x1.fffe53d558ae9p-1, -- 0x1.fffe68f4fa777p-1, -- 0x1.fffe7d156d244p-1, -- 0x1.fffe904222101p-1, -- 0x1.fffea2860ee1ep-1, -- 0x1.fffeb3ebb267bp-1, -- 0x1.fffec47d19457p-1, -- 0x1.fffed443e2787p-1, -- 0x1.fffee34943b15p-1, -- 0x1.fffef1960d85dp-1, -- 0x1.fffeff32af7afp-1, -- 0x1.ffff0c273bea2p-1, -- 0x1.ffff187b6bc0ep-1, -- 0x1.ffff2436a21dcp-1, -- 0x1.ffff2f5fefcaap-1, -- 0x1.ffff39fe16963p-1, -- 0x1.ffff44178c8d2p-1, -- 0x1.ffff4db27f146p-1, -- 0x1.ffff56d4d5e5ep-1, -- 0x1.ffff5f8435efcp-1, -- 0x1.ffff67c604180p-1, -- 0x1.ffff6f9f67e55p-1, -- 0x1.ffff77154e0d6p-1, -- 0x1.ffff7e2c6aea2p-1, -- 0x1.ffff84e93cd75p-1, -- 0x1.ffff8b500e77cp-1, -- 0x1.ffff9164f8e46p-1, -- 0x1.ffff972be5c59p-1, -- 0x1.ffff9ca891572p-1, -- 0x1.ffffa1de8c582p-1, -- 0x1.ffffa6d13de73p-1, -- 0x1.ffffab83e54b8p-1, -- 0x1.ffffaff99bac4p-1, -- 0x1.ffffb43555b5fp-1, -- 0x1.ffffb839e52f3p-1, -- 0x1.ffffbc09fa7cdp-1, -- 0x1.ffffbfa82616bp-1, -- 0x1.ffffc316d9ed0p-1, -- 0x1.ffffc6586abf6p-1, -- 0x1.ffffc96f1165ep-1, -- 0x1.ffffcc5cec0c1p-1, -- 0x1.ffffcf23ff5fcp-1, -- 0x1.ffffd1c637b2bp-1, -- 0x1.ffffd4456a10dp-1, -- 0x1.ffffd6a3554a1p-1, -- 0x1.ffffd8e1a2f22p-1, -- 0x1.ffffdb01e8546p-1, -- 0x1.ffffdd05a75eap-1, -- 0x1.ffffdeee4f810p-1, -- 0x1.ffffe0bd3e852p-1, -- 0x1.ffffe273c15b7p-1, -- 0x1.ffffe41314e06p-1, -- 0x1.ffffe59c6698bp-1, -- 0x1.ffffe710d565ep-1, -- 0x1.ffffe8717232dp-1, -- 0x1.ffffe9bf4098cp-1, -- 0x1.ffffeafb377d5p-1, -- 0x1.ffffec2641a9ep-1, -- 0x1.ffffed413e5b7p-1, -- 0x1.ffffee4d01cd6p-1, -- 0x1.ffffef4a55bd4p-1, -- 0x1.fffff039f9e8fp-1, -- 0x1.fffff11ca4876p-1, -- 0x1.fffff1f302bc1p-1, -- 0x1.fffff2bdb904dp-1, -- 0x1.fffff37d63a36p-1, -- 0x1.fffff43297019p-1, -- 0x1.fffff4dde0118p-1, -- 0x1.fffff57fc4a95p-1, -- 0x1.fffff618c3da6p-1, -- 0x1.fffff6a956450p-1, -- 0x1.fffff731ee681p-1, -- 0x1.fffff7b2f8ed6p-1, -- 0x1.fffff82cdcf1bp-1, -- 0x1.fffff89ffc4aap-1, -- 0x1.fffff90cb3c81p-1, -- 0x1.fffff9735b73bp-1, -- 0x1.fffff9d446cccp-1, -- 0x1.fffffa2fc5015p-1, -- 0x1.fffffa8621251p-1, -- 0x1.fffffad7a2652p-1, -- 0x1.fffffb248c39dp-1, -- 0x1.fffffb6d1e95dp-1, -- 0x1.fffffbb196132p-1, -- 0x1.fffffbf22c1e2p-1, -- 0x1.fffffc2f171e3p-1, -- 0x1.fffffc688a9cfp-1, -- 0x1.fffffc9eb76acp-1, -- 0x1.fffffcd1cbc28p-1, -- 0x1.fffffd01f36afp-1, -- 0x1.fffffd2f57d68p-1, -- 0x1.fffffd5a2041fp-1, -- 0x1.fffffd8271d12p-1, -- 0x1.fffffda86faa9p-1, -- 0x1.fffffdcc3b117p-1, -- 0x1.fffffdedf37edp-1, -- 0x1.fffffe0db6b91p-1, -- 0x1.fffffe2ba0ea5p-1, -- 0x1.fffffe47ccb60p-1, -- 0x1.fffffe62534d4p-1, -- 0x1.fffffe7b4c81ep-1, -- 0x1.fffffe92ced93p-1, -- 0x1.fffffea8ef9cfp-1, -- 0x1.fffffebdc2ec6p-1, -- 0x1.fffffed15bcbap-1, -- 0x1.fffffee3cc32cp-1, -- 0x1.fffffef5251c2p-1, -- 0x1.ffffff0576917p-1, -- 0x1.ffffff14cfb92p-1, -- 0x1.ffffff233ee1dp-1, -- 0x1.ffffff30d18e8p-1, -- 0x1.ffffff3d9480fp-1, -- 0x1.ffffff4993c46p-1, -- 0x1.ffffff54dab72p-1, -- 0x1.ffffff5f74141p-1, -- 0x1.ffffff6969fb8p-1, -- 0x1.ffffff72c5fb6p-1, -- 0x1.ffffff7b91176p-1, -- 0x1.ffffff83d3d07p-1, -- 0x1.ffffff8b962bep-1, -- 0x1.ffffff92dfba2p-1, -- 0x1.ffffff99b79d2p-1, -- 0x1.ffffffa0248e8p-1, -- 0x1.ffffffa62ce54p-1, -- 0x1.ffffffabd69b4p-1, -- 0x1.ffffffb127525p-1, -- 0x1.ffffffb624592p-1, -- 0x1.ffffffbad2affp-1, -- 0x1.ffffffbf370cdp-1, -- 0x1.ffffffc355dfdp-1, -- 0x1.ffffffc733572p-1, -- 0x1.ffffffcad3626p-1, -- 0x1.ffffffce39b67p-1, -- 0x1.ffffffd169d0cp-1, -- 0x1.ffffffd466fa5p-1, -- 0x1.ffffffd7344aap-1, -- 0x1.ffffffd9d4aabp-1, -- 0x1.ffffffdc4ad7ap-1, -- 0x1.ffffffde9964ep-1, -- 0x1.ffffffe0c2bf0p-1, -- 0x1.ffffffe2c92dbp-1, -- 0x1.ffffffe4aed5ep-1, -- 0x1.ffffffe675bbdp-1, -- 0x1.ffffffe81fc4ep-1, -- 0x1.ffffffe9aeb97p-1, -- 0x1.ffffffeb24467p-1, -- 0x1.ffffffec81ff2p-1, -- 0x1.ffffffedc95e7p-1, -- 0x1.ffffffeefbc85p-1, -- 0x1.fffffff01a8b6p-1, -- 0x1.fffffff126e1ep-1, -- 0x1.fffffff221f30p-1, -- 0x1.fffffff30cd3fp-1, -- 0x1.fffffff3e8892p-1, -- 0x1.fffffff4b606fp-1, -- 0x1.fffffff57632dp-1, -- 0x1.fffffff629e44p-1, -- 0x1.fffffff6d1e56p-1, -- 0x1.fffffff76ef3fp-1, -- 0x1.fffffff801c1fp-1, -- 0x1.fffffff88af67p-1, -- 0x1.fffffff90b2e3p-1, -- 0x1.fffffff982fc1p-1, -- 0x1.fffffff9f2e9fp-1, -- 0x1.fffffffa5b790p-1, -- 0x1.fffffffabd229p-1, -- 0x1.fffffffb18582p-1, -- 0x1.fffffffb6d844p-1, -- 0x1.fffffffbbd0aap-1, -- 0x1.fffffffc0748fp-1, -- 0x1.fffffffc4c96cp-1, -- 0x1.fffffffc8d462p-1, -- 0x1.fffffffcc9a41p-1, -- 0x1.fffffffd01f89p-1, -- 0x1.fffffffd36871p-1, -- 0x1.fffffffd678edp-1, -- 0x1.fffffffd954aep-1, -- 0x1.fffffffdbff2ap-1, -- 0x1.fffffffde7ba0p-1, -- 0x1.fffffffe0cd16p-1, -- 0x1.fffffffe2f664p-1, -- 0x1.fffffffe4fa30p-1, -- 0x1.fffffffe6daf7p-1, -- 0x1.fffffffe89b0cp-1, -- 0x1.fffffffea3c9ap-1, -- 0x1.fffffffebc1a9p-1, -- 0x1.fffffffed2c21p-1, -- 0x1.fffffffee7dc8p-1, -- 0x1.fffffffefb847p-1, -- 0x1.ffffffff0dd2bp-1, -- 0x1.ffffffff1ede9p-1, -- 0x1.ffffffff2ebdap-1, -- 0x1.ffffffff3d843p-1, -- 0x1.ffffffff4b453p-1, -- 0x1.ffffffff58126p-1, -- 0x1.ffffffff63fc3p-1, -- 0x1.ffffffff6f121p-1, -- 0x1.ffffffff79626p-1, -- 0x1.ffffffff82fabp-1, -- 0x1.ffffffff8be77p-1, -- 0x1.ffffffff94346p-1, -- 0x1.ffffffff9bec8p-1, -- 0x1.ffffffffa319fp-1, -- 0x1.ffffffffa9c63p-1, -- 0x1.ffffffffaffa4p-1, -- 0x1.ffffffffb5be5p-1, -- 0x1.ffffffffbb1a2p-1, -- 0x1.ffffffffc014ep-1, -- 0x1.ffffffffc4b56p-1, -- 0x1.ffffffffc901cp-1, -- 0x1.ffffffffccfffp-1, -- 0x1.ffffffffd0b56p-1, -- 0x1.ffffffffd4271p-1, -- 0x1.ffffffffd759dp-1, -- 0x1.ffffffffda520p-1, -- 0x1.ffffffffdd13cp-1, -- 0x1.ffffffffdfa2dp-1, -- 0x1.ffffffffe202dp-1, -- 0x1.ffffffffe4371p-1, -- 0x1.ffffffffe642ap-1, -- 0x1.ffffffffe8286p-1, -- 0x1.ffffffffe9eb0p-1, -- 0x1.ffffffffeb8d0p-1, -- 0x1.ffffffffed10ap-1, -- 0x1.ffffffffee782p-1, -- 0x1.ffffffffefc57p-1, -- 0x1.fffffffff0fa7p-1, -- 0x1.fffffffff218fp-1, -- 0x1.fffffffff3227p-1, -- 0x1.fffffffff4188p-1, -- 0x1.fffffffff4fc9p-1, -- 0x1.fffffffff5cfdp-1, -- 0x1.fffffffff6939p-1, -- 0x1.fffffffff748ep-1, -- 0x1.fffffffff7f0dp-1, -- 0x1.fffffffff88c5p-1, -- 0x1.fffffffff91c6p-1, -- 0x1.fffffffff9a1bp-1, -- 0x1.fffffffffa1d2p-1, -- 0x1.fffffffffa8f6p-1, -- 0x1.fffffffffaf92p-1, -- 0x1.fffffffffb5b0p-1, -- 0x1.fffffffffbb58p-1, -- 0x1.fffffffffc095p-1, -- 0x1.fffffffffc56dp-1, -- 0x1.fffffffffc9e8p-1, -- 0x1.fffffffffce0dp-1, -- 0x1.fffffffffd1e1p-1, -- 0x1.fffffffffd56cp-1, -- 0x1.fffffffffd8b3p-1, -- 0x1.fffffffffdbbap-1, -- 0x1.fffffffffde86p-1, -- 0x1.fffffffffe11dp-1, -- 0x1.fffffffffe380p-1, -- 0x1.fffffffffe5b6p-1, -- 0x1.fffffffffe7c0p-1, -- 0x1.fffffffffe9a2p-1, -- 0x1.fffffffffeb60p-1, -- 0x1.fffffffffecfbp-1, -- 0x1.fffffffffee77p-1, -- 0x1.fffffffffefd6p-1, -- 0x1.ffffffffff11ap-1, -- 0x1.ffffffffff245p-1, -- 0x1.ffffffffff359p-1, -- 0x1.ffffffffff457p-1, -- 0x1.ffffffffff542p-1, -- 0x1.ffffffffff61bp-1, -- 0x1.ffffffffff6e3p-1, -- 0x1.ffffffffff79bp-1, -- 0x1.ffffffffff845p-1, -- 0x1.ffffffffff8e2p-1, -- 0x1.ffffffffff973p-1, -- 0x1.ffffffffff9f8p-1, -- 0x1.ffffffffffa73p-1, -- 0x1.ffffffffffae4p-1, -- 0x1.ffffffffffb4cp-1, -- 0x1.ffffffffffbadp-1, -- 0x1.ffffffffffc05p-1, -- 0x1.ffffffffffc57p-1, -- 0x1.ffffffffffca2p-1, -- 0x1.ffffffffffce7p-1, -- 0x1.ffffffffffd27p-1, -- 0x1.ffffffffffd62p-1, -- 0x1.ffffffffffd98p-1, -- 0x1.ffffffffffdcap-1, -- 0x1.ffffffffffdf8p-1, -- 0x1.ffffffffffe22p-1, -- 0x1.ffffffffffe49p-1, -- 0x1.ffffffffffe6cp-1, -- 0x1.ffffffffffe8dp-1, -- 0x1.ffffffffffeabp-1, -- 0x1.ffffffffffec7p-1, -- 0x1.ffffffffffee1p-1, -- 0x1.ffffffffffef8p-1, -- 0x1.fffffffffff0ep-1, -- 0x1.fffffffffff22p-1, -- 0x1.fffffffffff34p-1, -- 0x1.fffffffffff45p-1, -- 0x1.fffffffffff54p-1, -- 0x1.fffffffffff62p-1, -- 0x1.fffffffffff6fp-1, -- 0x1.fffffffffff7bp-1, -- 0x1.fffffffffff86p-1, -- 0x1.fffffffffff90p-1, -- 0x1.fffffffffff9ap-1, -- 0x1.fffffffffffa2p-1, -- 0x1.fffffffffffaap-1, -- 0x1.fffffffffffb1p-1, -- 0x1.fffffffffffb8p-1, -- 0x1.fffffffffffbep-1, -- 0x1.fffffffffffc3p-1, -- 0x1.fffffffffffc8p-1, -- 0x1.fffffffffffcdp-1, -- 0x1.fffffffffffd1p-1, -- 0x1.fffffffffffd5p-1, -- 0x1.fffffffffffd9p-1, -- 0x1.fffffffffffdcp-1, -- 0x1.fffffffffffdfp-1, -- 0x1.fffffffffffe2p-1, -- 0x1.fffffffffffe4p-1, -- 0x1.fffffffffffe7p-1, -- 0x1.fffffffffffe9p-1, -- 0x1.fffffffffffebp-1, -- 0x1.fffffffffffedp-1, -- 0x1.fffffffffffeep-1, -- 0x1.ffffffffffff0p-1, -- 0x1.ffffffffffff1p-1, -- 0x1.ffffffffffff3p-1, -- 0x1.ffffffffffff4p-1, -- 0x1.ffffffffffff5p-1, -- 0x1.ffffffffffff6p-1, -- 0x1.ffffffffffff7p-1, -- 0x1.ffffffffffff7p-1, -- 0x1.ffffffffffff8p-1, -- 0x1.ffffffffffff9p-1, -- 0x1.ffffffffffff9p-1, -- 0x1.ffffffffffffap-1, -- 0x1.ffffffffffffbp-1, -- 0x1.ffffffffffffbp-1, -- 0x1.ffffffffffffbp-1, -- 0x1.ffffffffffffcp-1, -- 0x1.ffffffffffffcp-1, -- 0x1.ffffffffffffdp-1, -- 0x1.ffffffffffffdp-1, -- 0x1.ffffffffffffdp-1, -- 0x1.ffffffffffffdp-1, -- 0x1.ffffffffffffep-1, -- 0x1.ffffffffffffep-1, -- 0x1.ffffffffffffep-1, -- 0x1.ffffffffffffep-1, -- 0x1.ffffffffffffep-1, -- 0x1.ffffffffffffep-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.fffffffffffffp-1, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- 0x1.0000000000000p+0, -- }, -- .scale = { 0x1.20dd750429b6dp+0, -- 0x1.20d8f1975c85dp+0, -- 0x1.20cb67bd452c7p+0, -- 0x1.20b4d8bac36c1p+0, -- 0x1.209546ad13ccfp+0, -- 0x1.206cb4897b148p+0, -- 0x1.203b261cd0052p+0, -- 0x1.2000a00ae3804p+0, -- 0x1.1fbd27cdc72d3p+0, -- 0x1.1f70c3b4f2cc7p+0, -- 0x1.1f1b7ae44867fp+0, -- 0x1.1ebd5552f795bp+0, -- 0x1.1e565bca400d4p+0, -- 0x1.1de697e413d28p+0, -- 0x1.1d6e14099944ap+0, -- 0x1.1cecdb718d61cp+0, -- 0x1.1c62fa1e869b6p+0, -- 0x1.1bd07cdd189acp+0, -- 0x1.1b357141d95d5p+0, -- 0x1.1a91e5a748165p+0, -- 0x1.19e5e92b964abp+0, -- 0x1.19318bae53a04p+0, -- 0x1.1874ddcdfce24p+0, -- 0x1.17aff0e56ec10p+0, -- 0x1.16e2d7093cd8cp+0, -- 0x1.160da304ed92fp+0, -- 0x1.153068581b781p+0, -- 0x1.144b3b337c90cp+0, -- 0x1.135e3075d076bp+0, -- 0x1.12695da8b5bdep+0, -- 0x1.116cd8fd67618p+0, -- 0x1.1068b94962e5ep+0, -- 0x1.0f5d1602f7e41p+0, -- 0x1.0e4a073dc1b91p+0, -- 0x1.0d2fa5a70c168p+0, -- 0x1.0c0e0a8223359p+0, -- 0x1.0ae54fa490722p+0, -- 0x1.09b58f724416bp+0, -- 0x1.087ee4d9ad247p+0, -- 0x1.07416b4fbfe7cp+0, -- 0x1.05fd3ecbec297p+0, -- 0x1.04b27bc403d30p+0, -- 0x1.03613f2812dafp+0, -- 0x1.0209a65e29545p+0, -- 0x1.00abcf3e187a9p+0, -- 0x1.fe8fb01a47307p-1, -- 0x1.fbbbbef34b4b2p-1, -- 0x1.f8dc092d58ff8p-1, -- 0x1.f5f0cdaf15313p-1, -- 0x1.f2fa4c16c0019p-1, -- 0x1.eff8c4b1375dbp-1, -- 0x1.ecec7870ebca7p-1, -- 0x1.e9d5a8e4c934ep-1, -- 0x1.e6b4982f158b9p-1, -- 0x1.e38988fc46e72p-1, -- 0x1.e054be79d3042p-1, -- 0x1.dd167c4cf9d2ap-1, -- 0x1.d9cf06898cdafp-1, -- 0x1.d67ea1a8b5368p-1, -- 0x1.d325927fb9d89p-1, -- 0x1.cfc41e36c7df9p-1, -- 0x1.cc5a8a3fbea40p-1, -- 0x1.c8e91c4d01368p-1, -- 0x1.c5701a484ef9dp-1, -- 0x1.c1efca49a5011p-1, -- 0x1.be68728e29d5dp-1, -- 0x1.bada596f25436p-1, -- 0x1.b745c55905bf8p-1, -- 0x1.b3aafcc27502ep-1, -- 0x1.b00a46237d5bep-1, -- 0x1.ac63e7ecc1411p-1, -- 0x1.a8b8287ec6a09p-1, -- 0x1.a5074e2157620p-1, -- 0x1.a1519efaf889ep-1, -- 0x1.9d97610879642p-1, -- 0x1.99d8da149c13fp-1, -- 0x1.96164fafd8de3p-1, -- 0x1.925007283d7aap-1, -- 0x1.8e86458169af8p-1, -- 0x1.8ab94f6caa71dp-1, -- 0x1.86e9694134b9ep-1, -- 0x1.8316d6f48133dp-1, -- 0x1.7f41dc12c9e89p-1, -- 0x1.7b6abbb7aaf19p-1, -- 0x1.7791b886e7403p-1, -- 0x1.73b714a552763p-1, -- 0x1.6fdb11b1e0c34p-1, -- 0x1.6bfdf0beddaf5p-1, -- 0x1.681ff24b4ab04p-1, -- 0x1.6441563c665d4p-1, -- 0x1.60625bd75d07bp-1, -- 0x1.5c8341bb23767p-1, -- 0x1.58a445da7c74cp-1, -- 0x1.54c5a57629db0p-1, -- 0x1.50e79d1749ac9p-1, -- 0x1.4d0a6889dfd9fp-1, -- 0x1.492e42d78d2c5p-1, -- 0x1.4553664273d24p-1, -- 0x1.417a0c4049fd0p-1, -- 0x1.3da26d759aef5p-1, -- 0x1.39ccc1b136d5ap-1, -- 0x1.35f93fe7d1b3dp-1, -- 0x1.32281e2fd1a92p-1, -- 0x1.2e5991bd4cbfcp-1, -- 0x1.2a8dcede3673bp-1, -- 0x1.26c508f6bd0ffp-1, -- 0x1.22ff727dd6f7bp-1, -- 0x1.1f3d3cf9ffe5ap-1, -- 0x1.1b7e98fe26217p-1, -- 0x1.17c3b626c7a11p-1, -- 0x1.140cc3173f007p-1, -- 0x1.1059ed7740313p-1, -- 0x1.0cab61f084b93p-1, -- 0x1.09014c2ca74dap-1, -- 0x1.055bd6d32e8d7p-1, -- 0x1.01bb2b87c6968p-1, -- 0x1.fc3ee5d1524b0p-2, -- 0x1.f511a91a67d2ap-2, -- 0x1.edeeee0959518p-2, -- 0x1.e6d6ffaa65a25p-2, -- 0x1.dfca26f5bbf88p-2, -- 0x1.d8c8aace11e63p-2, -- 0x1.d1d2cfff91594p-2, -- 0x1.cae8d93f1d7b6p-2, -- 0x1.c40b0729ed547p-2, -- 0x1.bd3998457afdap-2, -- 0x1.b674c8ffc6283p-2, -- 0x1.afbcd3afe8ab6p-2, -- 0x1.a911f096fbc26p-2, -- 0x1.a27455e14c93cp-2, -- 0x1.9be437a7de946p-2, -- 0x1.9561c7f23a47bp-2, -- 0x1.8eed36b886d93p-2, -- 0x1.8886b1e5ecfd1p-2, -- 0x1.822e655b417e6p-2, -- 0x1.7be47af1f5d89p-2, -- 0x1.75a91a7f4d2edp-2, -- 0x1.6f7c69d7d3ef8p-2, -- 0x1.695e8cd31867ep-2, -- 0x1.634fa54fa285fp-2, -- 0x1.5d4fd33729015p-2, -- 0x1.575f3483021c3p-2, -- 0x1.517de540ce2a3p-2, -- 0x1.4babff975a04cp-2, -- 0x1.45e99bcbb7915p-2, -- 0x1.4036d0468a7a2p-2, -- 0x1.3a93b1998736cp-2, -- 0x1.35005285227f1p-2, -- 0x1.2f7cc3fe6f423p-2, -- 0x1.2a09153529381p-2, -- 0x1.24a55399ea239p-2, -- 0x1.1f518ae487dc8p-2, -- 0x1.1a0dc51a9934dp-2, -- 0x1.14da0a961fd14p-2, -- 0x1.0fb6620c550afp-2, -- 0x1.0aa2d09497f2bp-2, -- 0x1.059f59af7a906p-2, -- 0x1.00abff4dec7a3p-2, -- 0x1.f79183b101c5bp-3, -- 0x1.edeb406d9c824p-3, -- 0x1.e4652fadcb6b2p-3, -- 0x1.daff4969c0b04p-3, -- 0x1.d1b982c501370p-3, -- 0x1.c893ce1dcbef7p-3, -- 0x1.bf8e1b1ca2279p-3, -- 0x1.b6a856c3ed54fp-3, -- 0x1.ade26b7fbed95p-3, -- 0x1.a53c4135a6526p-3, -- 0x1.9cb5bd549b111p-3, -- 0x1.944ec2e4f5630p-3, -- 0x1.8c07329874652p-3, -- 0x1.83deeada4d25ap-3, -- 0x1.7bd5c7df3fe9cp-3, -- 0x1.73eba3b5b07b7p-3, -- 0x1.6c205655be71fp-3, -- 0x1.6473b5b15a7a1p-3, -- 0x1.5ce595c455b0ap-3, -- 0x1.5575c8a468361p-3, -- 0x1.4e241e912c305p-3, -- 0x1.46f066040a832p-3, -- 0x1.3fda6bc016994p-3, -- 0x1.38e1fae1d6a9dp-3, -- 0x1.3206dceef5f87p-3, -- 0x1.2b48d9e5dea1cp-3, -- 0x1.24a7b84d38971p-3, -- 0x1.1e233d434b813p-3, -- 0x1.17bb2c8d41535p-3, -- 0x1.116f48a6476ccp-3, -- 0x1.0b3f52ce8c383p-3, -- 0x1.052b0b1a174eap-3, -- 0x1.fe6460fef4680p-4, -- 0x1.f2a901ccafb37p-4, -- 0x1.e723726b824a9p-4, -- 0x1.dbd32ac4c99b0p-4, -- 0x1.d0b7a0f921e7cp-4, -- 0x1.c5d0497c09e74p-4, -- 0x1.bb1c972f23e50p-4, -- 0x1.b09bfb7d11a83p-4, -- 0x1.a64de673e8837p-4, -- 0x1.9c31c6df3b1b8p-4, -- 0x1.92470a61b6965p-4, -- 0x1.888d1d8e510a3p-4, -- 0x1.7f036c0107294p-4, -- 0x1.75a96077274bap-4, -- 0x1.6c7e64e7281cbp-4, -- 0x1.6381e2980956bp-4, -- 0x1.5ab342383d177p-4, -- 0x1.5211ebf41880bp-4, -- 0x1.499d478bca735p-4, -- 0x1.4154bc68d75c3p-4, -- 0x1.3937b1b319259p-4, -- 0x1.31458e6542847p-4, -- 0x1.297db960e4f63p-4, -- 0x1.21df9981f8e53p-4, -- 0x1.1a6a95b1e786fp-4, -- 0x1.131e14fa1625dp-4, -- 0x1.0bf97e95f2a64p-4, -- 0x1.04fc3a0481321p-4, -- 0x1.fc4b5e32d6259p-5, -- 0x1.eeea8c1b1db93p-5, -- 0x1.e1d4cf1e2450ap-5, -- 0x1.d508f9a1ea64ep-5, -- 0x1.c885df3451a07p-5, -- 0x1.bc4a54a84e834p-5, -- 0x1.b055303221015p-5, -- 0x1.a4a549829587ep-5, -- 0x1.993979e14fffdp-5, -- 0x1.8e109c4622913p-5, -- 0x1.83298d717210ep-5, -- 0x1.78832c03aa2b1p-5, -- 0x1.6e1c5893c380bp-5, -- 0x1.63f3f5c4de13bp-5, -- 0x1.5a08e85af27e0p-5, -- 0x1.505a174e9c929p-5, -- 0x1.46e66be002240p-5, -- 0x1.3dacd1a8d8ccdp-5, -- 0x1.34ac36ad8dafep-5, -- 0x1.2be38b6d92415p-5, -- 0x1.2351c2f2d1449p-5, -- 0x1.1af5d2e04f3f6p-5, -- 0x1.12ceb37ff9bc3p-5, -- 0x1.0adb5fcfa8c75p-5, -- 0x1.031ad58d56279p-5, -- 0x1.f7182a851bca2p-6, -- 0x1.e85c449e377f2p-6, -- 0x1.da0005e5f28dfp-6, -- 0x1.cc0180af00a8bp-6, -- 0x1.be5ecd2fcb5f9p-6, -- 0x1.b1160991ff737p-6, -- 0x1.a4255a00b9f03p-6, -- 0x1.978ae8b55ce1bp-6, -- 0x1.8b44e6031383ep-6, -- 0x1.7f5188610ddc8p-6, -- 0x1.73af0c737bb45p-6, -- 0x1.685bb5134ef13p-6, -- 0x1.5d55cb54cd53ap-6, -- 0x1.529b9e8cf9a1ep-6, -- 0x1.482b8455dc491p-6, -- 0x1.3e03d891b37dep-6, -- 0x1.3422fd6d12e2bp-6, -- 0x1.2a875b5ffab56p-6, -- 0x1.212f612dee7fbp-6, -- 0x1.181983e5133ddp-6, -- 0x1.0f443edc5ce49p-6, -- 0x1.06ae13b0d3255p-6, -- 0x1.fcab1483ea7fcp-7, -- 0x1.ec72615a894c4p-7, -- 0x1.dcaf3691fc448p-7, -- 0x1.cd5ec93c12431p-7, -- 0x1.be7e5ac24963bp-7, -- 0x1.b00b38d6b3575p-7, -- 0x1.a202bd6372dcep-7, -- 0x1.94624e78e0fafp-7, -- 0x1.87275e3a6869dp-7, -- 0x1.7a4f6aca256cbp-7, -- 0x1.6dd7fe3358230p-7, -- 0x1.61beae53b72b7p-7, -- 0x1.56011cc3b036dp-7, -- 0x1.4a9cf6bda3f4cp-7, -- 0x1.3f8ff5042a88ep-7, -- 0x1.34d7dbc76d7e5p-7, -- 0x1.2a727a89a3f14p-7, -- 0x1.205dac02bd6b9p-7, -- 0x1.1697560347b25p-7, -- 0x1.0d1d69569b82dp-7, -- 0x1.03ede1a45bfeep-7, -- 0x1.f60d8aa2a88f2p-8, -- 0x1.e4cc4abf7d065p-8, -- 0x1.d4143a9dfe965p-8, -- 0x1.c3e1a5f5c077cp-8, -- 0x1.b430ecf4a83a8p-8, -- 0x1.a4fe83fb9db25p-8, -- 0x1.9646f35a76623p-8, -- 0x1.8806d70b2fc36p-8, -- 0x1.7a3ade6c8b3e4p-8, -- 0x1.6cdfcbfc1e263p-8, -- 0x1.5ff2750fe7820p-8, -- 0x1.536fc18f7ce5cp-8, -- 0x1.4754abacdf1dcp-8, -- 0x1.3b9e3f9d06e3fp-8, -- 0x1.30499b503957fp-8, -- 0x1.2553ee2a336bfp-8, -- 0x1.1aba78ba3af89p-8, -- 0x1.107a8c7323a6ep-8, -- 0x1.06918b6355624p-8, -- 0x1.f9f9cfd9c3035p-9, -- 0x1.e77448fb66bb9p-9, -- 0x1.d58da68fd1170p-9, -- 0x1.c4412bf4b8f0bp-9, -- 0x1.b38a3af2e55b4p-9, -- 0x1.a3645330550ffp-9, -- 0x1.93cb11a30d765p-9, -- 0x1.84ba3004a50d0p-9, -- 0x1.762d84469c18fp-9, -- 0x1.6821000795a03p-9, -- 0x1.5a90b00981d93p-9, -- 0x1.4d78bba8ca5fdp-9, -- 0x1.40d564548fad7p-9, -- 0x1.34a305080681fp-9, -- 0x1.28de11c5031ebp-9, -- 0x1.1d83170fbf6fbp-9, -- 0x1.128eb96be8798p-9, -- 0x1.07fdb4dafea5fp-9, -- 0x1.fb99b8b8279e1p-10, -- 0x1.e7f232d9e2630p-10, -- 0x1.d4fed7195d7e8p-10, -- 0x1.c2b9cf7f893bfp-10, -- 0x1.b11d702b3deb1p-10, -- 0x1.a024365f771bdp-10, -- 0x1.8fc8c794b03b5p-10, -- 0x1.8005f08d6f1efp-10, -- 0x1.70d6a46e07ddap-10, -- 0x1.6235fbd7a4345p-10, -- 0x1.541f340697987p-10, -- 0x1.468dadf4080abp-10, -- 0x1.397ced7af2b15p-10, -- 0x1.2ce898809244ep-10, -- 0x1.20cc76202c5fap-10, -- 0x1.15246dda49d47p-10, -- 0x1.09ec86c75d497p-10, -- 0x1.fe41cd9bb4eeep-11, -- 0x1.e97ba3b77f306p-11, -- 0x1.d57f524723822p-11, -- 0x1.c245d4b998479p-11, -- 0x1.afc85e0f82e12p-11, -- 0x1.9e005769dbc1dp-11, -- 0x1.8ce75e9f6f8a0p-11, -- 0x1.7c7744d9378f7p-11, -- 0x1.6caa0d3582fe9p-11, -- 0x1.5d79eb71e893bp-11, -- 0x1.4ee1429bf7cc0p-11, -- 0x1.40daa3c89f5b6p-11, -- 0x1.3360ccd23db3ap-11, -- 0x1.266ea71d4f71ap-11, -- 0x1.19ff4663ae9dfp-11, -- 0x1.0e0de78654d1ep-11, -- 0x1.0295ef6591848p-11, -- 0x1.ef25d37f49fe1p-12, -- 0x1.da01102b5f851p-12, -- 0x1.c5b5412dcafadp-12, -- 0x1.b23a5a23e4210p-12, -- 0x1.9f8893d8fd1c1p-12, -- 0x1.8d986a4187285p-12, -- 0x1.7c629a822bc9ep-12, -- 0x1.6be02102b3520p-12, -- 0x1.5c0a378c90bcap-12, -- 0x1.4cda5374ea275p-12, -- 0x1.3e4a23d1f4702p-12, -- 0x1.30538fbb77ecdp-12, -- 0x1.22f0b496539bdp-12, -- 0x1.161be46ad3b50p-12, -- 0x1.09cfa445b00ffp-12, -- 0x1.fc0d55470cf51p-13, -- 0x1.e577bbcd49935p-13, -- 0x1.cfd4a5adec5bfp-13, -- 0x1.bb1a9657ce465p-13, -- 0x1.a740684026555p-13, -- 0x1.943d4a1d1ed39p-13, -- 0x1.8208bc334a6a5p-13, -- 0x1.709a8db59f25cp-13, -- 0x1.5feada379d8b7p-13, -- 0x1.4ff207314a102p-13, -- 0x1.40a8c1949f75ep-13, -- 0x1.3207fb7420eb9p-13, -- 0x1.2408e9ba3327fp-13, -- 0x1.16a501f0e42cap-13, -- 0x1.09d5f819c9e29p-13, -- 0x1.fb2b792b40a22p-14, -- 0x1.e3bcf436a1a95p-14, -- 0x1.cd55277c18d05p-14, -- 0x1.b7e94604479dcp-14, -- 0x1.a36eec00926ddp-14, -- 0x1.8fdc1b2dcf7b9p-14, -- 0x1.7d2737527c3f9p-14, -- 0x1.6b4702d7d5849p-14, -- 0x1.5a329b7d30748p-14, -- 0x1.49e17724f4d41p-14, -- 0x1.3a4b60ba9aa4dp-14, -- 0x1.2b6875310f785p-14, -- 0x1.1d312098e9dbap-14, -- 0x1.0f9e1b4dd36dfp-14, -- 0x1.02a8673a94691p-14, -- 0x1.ec929a665b449p-15, -- 0x1.d4f4b4c8e09edp-15, -- 0x1.be6abbb10a5aap-15, -- 0x1.a8e8cc1fadef6p-15, -- 0x1.94637d5bacfdbp-15, -- 0x1.80cfdc72220cfp-15, -- 0x1.6e2367dc27f95p-15, -- 0x1.5c540b4936fd2p-15, -- 0x1.4b581b8d170fcp-15, -- 0x1.3b2652b06c2b2p-15, -- 0x1.2bb5cc22e5db6p-15, -- 0x1.1cfe010e2052dp-15, -- 0x1.0ef6c4c84a0fep-15, -- 0x1.01984165a5f36p-15, -- 0x1.e9b5e8d00ce76p-16, -- 0x1.d16f5716c6c1ap-16, -- 0x1.ba4f035d60e02p-16, -- 0x1.a447b7b03f045p-16, -- 0x1.8f4ccca7fc90dp-16, -- 0x1.7b5223dac7336p-16, -- 0x1.684c227fcacefp-16, -- 0x1.562fac4329b48p-16, -- 0x1.44f21e49054f2p-16, -- 0x1.34894a5e24657p-16, -- 0x1.24eb7254ccf83p-16, -- 0x1.160f438c70913p-16, -- 0x1.07ebd2a2d2844p-16, -- 0x1.f4f12e9ab070ap-17, -- 0x1.db5ad0b27805cp-17, -- 0x1.c304efa2c6f4ep-17, -- 0x1.abe09e9144b5ep-17, -- 0x1.95df988e76644p-17, -- 0x1.80f439b4ee04bp-17, -- 0x1.6d11788a69c64p-17, -- 0x1.5a2adfa0b4bc4p-17, -- 0x1.4834877429b8fp-17, -- 0x1.37231085c7d9ap-17, -- 0x1.26eb9daed6f7ep-17, -- 0x1.1783ceac28910p-17, -- 0x1.08e1badf0fcedp-17, -- 0x1.f5f7d88472604p-18, -- 0x1.db92b5212fb8dp-18, -- 0x1.c282cd3957edap-18, -- 0x1.aab7abace48dcp-18, -- 0x1.94219bfcb4928p-18, -- 0x1.7eb1a2075864dp-18, -- 0x1.6a597219a93d9p-18, -- 0x1.570b69502f313p-18, -- 0x1.44ba864670882p-18, -- 0x1.335a62115bce2p-18, -- 0x1.22df298214423p-18, -- 0x1.133d96ae7e0ddp-18, -- 0x1.046aeabcfcdecp-18, -- 0x1.ecb9cfe1d8642p-19, -- 0x1.d21397ead99cbp-19, -- 0x1.b8d094c86d374p-19, -- 0x1.a0df0f0c626dcp-19, -- 0x1.8a2e269750a39p-19, -- 0x1.74adc8f4064d3p-19, -- 0x1.604ea819f007cp-19, -- 0x1.4d0231928c6f9p-19, -- 0x1.3aba85fe22e1fp-19, -- 0x1.296a70f414053p-19, -- 0x1.1905613b3abf2p-19, -- 0x1.097f6156f32c5p-19, -- 0x1.f59a20caf6695p-20, -- 0x1.d9c73698fb1dcp-20, -- 0x1.bf716c6168baep-20, -- 0x1.a6852c6b58392p-20, -- 0x1.8eefd70594a88p-20, -- 0x1.789fb715aae95p-20, -- 0x1.6383f726a8e04p-20, -- 0x1.4f8c96f26a26ap-20, -- 0x1.3caa61607f920p-20, -- 0x1.2acee2f5ecdb8p-20, -- 0x1.19ec60b1242edp-20, -- 0x1.09f5cf4dd2877p-20, -- 0x1.f5bd95d8730d8p-21, -- 0x1.d9371e2ff7c35p-21, -- 0x1.be41de54d155ap-21, -- 0x1.a4c89e08ef4f3p-21, -- 0x1.8cb738399b12cp-21, -- 0x1.75fa8dbc84becp-21, -- 0x1.608078a70dcbcp-21, -- 0x1.4c37c0394d094p-21, -- 0x1.39100d5687bfep-21, -- 0x1.26f9df8519bd6p-21, -- 0x1.15e6827001f18p-21, -- 0x1.05c803e4831c1p-21, -- 0x1.ed22548cffd35p-22, -- 0x1.d06ad6ecdf971p-22, -- 0x1.b551c847fbc96p-22, -- 0x1.9bc09f112b494p-22, -- 0x1.83a1ff0aa239dp-22, -- 0x1.6ce1aa3fd7bddp-22, -- 0x1.576c72b514859p-22, -- 0x1.43302cc4a0da8p-22, -- 0x1.301ba221dc9bbp-22, -- 0x1.1e1e857adc568p-22, -- 0x1.0d2966b1746f7p-22, -- 0x1.fa5b4f49cc6b2p-23, -- 0x1.dc3ae30b55c16p-23, -- 0x1.bfd7555a3bd68p-23, -- 0x1.a517d9e61628ap-23, -- 0x1.8be4f8f6c951fp-23, -- 0x1.74287ded49339p-23, -- 0x1.5dcd669f2cd34p-23, -- 0x1.48bfd38302870p-23, -- 0x1.34ecf8a3c124ap-23, -- 0x1.22430f521cbcfp-23, -- 0x1.10b1488aeb235p-23, -- 0x1.0027c00a263a6p-23, -- 0x1.e12ee004efc37p-24, -- 0x1.c3e44ae32b16bp-24, -- 0x1.a854ea14102a8p-24, -- 0x1.8e6761569f45dp-24, -- 0x1.7603bac345f65p-24, -- 0x1.5f1353cdad001p-24, -- 0x1.4980cb3c80949p-24, -- 0x1.3537f00b6ad4dp-24, -- 0x1.2225b12bffc68p-24, -- 0x1.10380e1adb7e9p-24, -- 0x1.febc107d5efaap-25, -- 0x1.df0f2a0ee6946p-25, -- 0x1.c14b2188bcee4p-25, -- 0x1.a553644f7f07dp-25, -- 0x1.8b0cfce0579dfp-25, -- 0x1.725e7c5dd20f7p-25, -- 0x1.5b2fe547a1340p-25, -- 0x1.456a974e92e93p-25, -- 0x1.30f93c3699078p-25, -- 0x1.1dc7b5b978cf8p-25, -- 0x1.0bc30c5d52f15p-25, -- 0x1.f5b2be65a0c7fp-26, -- 0x1.d5f3a8dea7357p-26, -- 0x1.b82915b03515bp-26, -- 0x1.9c3517e789488p-26, -- 0x1.81fb7df06136ep-26, -- 0x1.6961b8d641d06p-26, -- 0x1.524ec4d916caep-26, -- 0x1.3cab1343d18d1p-26, -- 0x1.2860757487a01p-26, -- 0x1.155a09065d4f7p-26, -- 0x1.0384250e4c9fcp-26, -- 0x1.e59890b926c78p-27, -- 0x1.c642116a8a9e3p-27, -- 0x1.a8e405e651ab6p-27, -- 0x1.8d5f98114f872p-27, -- 0x1.7397c5a66e307p-27, -- 0x1.5b71456c5a4c4p-27, -- 0x1.44d26de513197p-27, -- 0x1.2fa31d6371537p-27, -- 0x1.1bcca373b7b43p-27, -- 0x1.0939ab853339fp-27, -- 0x1.efac5187b2863p-28, -- 0x1.cf1e86235d0e6p-28, -- 0x1.b0a68a2128babp-28, -- 0x1.9423165bc4444p-28, -- 0x1.7974e743dea3cp-28, -- 0x1.607e9eacd1050p-28, -- 0x1.4924a74dec728p-28, -- 0x1.334d19e0c2160p-28, -- 0x1.1edfa3c5f5ccap-28, -- 0x1.0bc56f1b54701p-28, -- 0x1.f3d2185e047d9p-29, -- 0x1.d26cb87945e87p-29, -- 0x1.b334fac4b9f99p-29, -- 0x1.96076f7918d1cp-29, -- 0x1.7ac2d72fc2c63p-29, -- 0x1.614801550319ep-29, -- 0x1.4979ac8b28926p-29, -- 0x1.333c68e2d0548p-29, -- 0x1.1e767bce37dd7p-29, -- 0x1.0b0fc5b6d05a0p-29, -- 0x1.f1e3523b41d7dp-30, -- 0x1.d00de6608effep-30, -- 0x1.b0778b7b3301ap-30, -- 0x1.92fb04ec0f6cfp-30, -- 0x1.77756ec9f78fap-30, -- 0x1.5dc61922d5a06p-30, -- 0x1.45ce65699ff6dp-30, -- 0x1.2f71a5f159970p-30, -- 0x1.1a94ff571654fp-30, -- 0x1.071f4bbea09ecp-30, -- 0x1.e9f1ff8ddd774p-31, -- 0x1.c818223a202c7p-31, -- 0x1.a887bd2b4404dp-31, -- 0x1.8b1a336c5eb6bp-31, -- 0x1.6fab63324088ap-31, -- 0x1.56197e30205bap-31, -- 0x1.3e44e45301b92p-31, -- 0x1.281000bfe4c3fp-31, -- 0x1.135f28f2d50b4p-31, -- 0x1.00187dded5975p-31, -- 0x1.dc479de0ef001p-32, -- 0x1.bad4fdad3caa1p-32, -- 0x1.9baed3ed27ab8p-32, -- 0x1.7ead9ce4285bbp-32, -- 0x1.63ac6b4edc88ep-32, -- 0x1.4a88be2a6390cp-32, -- 0x1.332259185f1a0p-32, -- 0x1.1d5b1f3793044p-32, -- 0x1.0916f04b6e18bp-32, -- 0x1.ec77101de6926p-33, -- 0x1.c960bf23153e0p-33, -- 0x1.a8bd20fc65ef7p-33, -- 0x1.8a61745ec7d1dp-33, -- 0x1.6e25d0e756261p-33, -- 0x1.53e4f7d1666cbp-33, -- 0x1.3b7c27a7ddb0ep-33, -- 0x1.24caf2c32af14p-33, -- 0x1.0fb3186804d0fp-33, -- 0x1.f830c0bb41fd7p-34, -- 0x1.d3c0f1a91c846p-34, -- 0x1.b1e5acf351d87p-34, -- 0x1.92712d259ce66p-34, -- 0x1.7538c60a04476p-34, -- 0x1.5a14b04b47879p-34, -- 0x1.40dfd87456f4cp-34, -- 0x1.2977b1172b9d5p-34, -- 0x1.13bc07e891491p-34, -- 0x1.ff1dbb4300811p-35, -- 0x1.d9a880f306bd8p-35, -- 0x1.b6e45220b55e0p-35, -- 0x1.96a0b33f2c4dap-35, -- 0x1.78b07e9e924acp-35, -- 0x1.5ce9ab1670dd2p-35, -- 0x1.4325167006bb0p-35, -- 0x1.2b3e53538ff3fp-35, -- 0x1.15137a7f44864p-35, -- 0x1.0084ff125639dp-35, -- 0x1.daeb0b7311ec7p-36, -- 0x1.b7937d1c40c52p-36, -- 0x1.96d082f59ab06p-36, -- 0x1.7872d9fa10aadp-36, -- 0x1.5c4e8e37bc7d0p-36, -- 0x1.423ac0df49a40p-36, -- 0x1.2a117230ad284p-36, -- 0x1.13af4f04f9998p-36, -- 0x1.fde703724e560p-37, -- 0x1.d77f0c82e7641p-37, -- 0x1.b3ee02611d7ddp-37, -- 0x1.92ff33023d5bdp-37, -- 0x1.7481a9e69f53fp-37, -- 0x1.5847eda620959p-37, -- 0x1.3e27c1fcc74bdp-37, -- 0x1.25f9ee0b923dcp-37, -- 0x1.0f9a0686531ffp-37, -- 0x1.f5cc7718082afp-38, -- 0x1.cf7e53d6a2ca5p-38, -- 0x1.ac0f5f3229372p-38, -- 0x1.8b498644847eap-38, -- 0x1.6cfa9bcca59dcp-38, -- 0x1.50f411d4fd2cdp-38, -- 0x1.370ab8327af5ep-38, -- 0x1.1f167f88c6b6ep-38, -- 0x1.08f24085d4597p-38, -- 0x1.e8f70e181d619p-39, -- 0x1.c324c20e337dcp-39, -- 0x1.a03261574b54ep-39, -- 0x1.7fe903cdf5855p-39, -- 0x1.6215c58da3450p-39, -- 0x1.46897d4b69fc6p-39, -- 0x1.2d1877d731b7bp-39, -- 0x1.159a386b11517p-39, -- 0x1.ffd27ae9393cep-40, -- 0x1.d7c593130dd0bp-40, -- 0x1.b2cd607c79bcfp-40, -- 0x1.90ae4d3405651p-40, -- 0x1.71312dd1759e2p-40, -- 0x1.5422ef5d8949dp-40, -- 0x1.39544b0ecc957p-40, -- 0x1.20997f73e73ddp-40, -- 0x1.09ca0eaacd277p-40, -- 0x1.e9810295890ecp-41, -- 0x1.c2b45b5aa4a1dp-41, -- 0x1.9eee068fa7596p-41, -- 0x1.7df2b399c10a8p-41, -- 0x1.5f8b87a31bd85p-41, -- 0x1.4385c96e9a2d9p-41, -- 0x1.29b2933ef4cbcp-41, -- 0x1.11e68a6378f8ap-41, -- 0x1.f7f338086a86bp-42, -- 0x1.cf8d7d9ce040ap-42, -- 0x1.aa577251ae484p-42, -- 0x1.8811d739efb5ep-42, -- 0x1.68823e52970bep-42, -- 0x1.4b72ae68e8b4cp-42, -- 0x1.30b14dbe876bcp-42, -- 0x1.181012ef86610p-42, -- 0x1.01647ba798744p-42, -- 0x1.d90e917701675p-43, -- 0x1.b2a87e86d0c8ap-43, -- 0x1.8f53dcb377293p-43, -- 0x1.6ed2f2515e933p-43, -- 0x1.50ecc9ed47f19p-43, -- 0x1.356cd5ce7799ep-43, -- 0x1.1c229a587ab78p-43, -- 0x1.04e15ecc7f3f6p-43, -- 0x1.deffc7e6a6017p-44, -- 0x1.b7b040832f310p-44, -- 0x1.938e021f36d76p-44, -- 0x1.7258610b3b233p-44, -- 0x1.53d3bfc82a909p-44, -- 0x1.37c92babdc2fdp-44, -- 0x1.1e06010120f6ap-44, -- 0x1.065b9616170d4p-44, -- 0x1.e13dd96b3753ap-45, -- 0x1.b950d32467392p-45, -- 0x1.94a72263259a5p-45, -- 0x1.72fd93e036cdcp-45, -- 0x1.54164576929abp-45, -- 0x1.37b83c521fe96p-45, -- 0x1.1daf033182e96p-45, -- 0x1.05ca50205d26ap-45, -- 0x1.dfbb6235639fap-46, -- 0x1.b7807e294781fp-46, -- 0x1.9298add70a734p-46, -- 0x1.70beaf9c7ffb6p-46, -- 0x1.51b2cd6709222p-46, -- 0x1.353a6cf7f7fffp-46, -- 0x1.1b1fa8cbe84a7p-46, -- 0x1.0330f0fd69921p-46, -- 0x1.da81670f96f9bp-47, -- 0x1.b24a16b4d09aap-47, -- 0x1.8d6eeb6efdbd6p-47, -- 0x1.6ba91ac734785p-47, -- 0x1.4cb7966770ab5p-47, -- 0x1.305e9721d0981p-47, -- 0x1.1667311fff70ap-47, -- 0x1.fd3de10d62855p-48, -- 0x1.d1aefbcd48d0cp-48, -- 0x1.a9cc93c25aca9p-48, -- 0x1.85487ee3ea735p-48, -- 0x1.63daf8b4b1e0cp-48, -- 0x1.45421e69a6ca1p-48, -- 0x1.294175802d99ap-48, -- 0x1.0fa17bf41068fp-48, -- 0x1.f05e82aae2bb9p-49, -- 0x1.c578101b29058p-49, -- 0x1.9e39dc5dd2f7cp-49, -- 0x1.7a553a728bbf2p-49, -- 0x1.5982008db1304p-49, -- 0x1.3b7e00422e51bp-49, -- 0x1.200c898d9ee3ep-49, -- 0x1.06f5f7eb65a56p-49, -- 0x1.e00e9148a1d25p-50, -- 0x1.b623734024e92p-50, -- 0x1.8fd4e01891bf8p-50, -- 0x1.6cd44c7470d89p-50, -- 0x1.4cd9c04158cd7p-50, -- 0x1.2fa34bf5c8344p-50, -- 0x1.14f4890ff2461p-50, -- 0x1.f92c49dfa4df5p-51, -- 0x1.ccaaea71ab0dfp-51, -- 0x1.a40829f001197p-51, -- 0x1.7eef13b59e96cp-51, -- 0x1.5d11e1a252bf5p-51, -- 0x1.3e296303b2297p-51, -- 0x1.21f47009f43cep-51, -- 0x1.083768c5e4541p-51, -- 0x1.e1777d831265ep-52, -- 0x1.b69f10b0191b5p-52, -- 0x1.8f8a3a05b5b52p-52, -- 0x1.6be573c40c8e7p-52, -- 0x1.4b645ba991fdbp-52, -- 0x1.2dc119095729fp-52, -- }, --}; -diff --git a/sysdeps/aarch64/fpu/sv_erff_data.c b/sysdeps/aarch64/fpu/sv_erff_data.c -deleted file mode 100644 -index 6dcd72af69..0000000000 ---- a/sysdeps/aarch64/fpu/sv_erff_data.c -+++ /dev/null -@@ -1,1058 +0,0 @@ --/* Table for SVE erff approximation -- -- Copyright (C) 2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --#include "vecmath_config.h" -- --/* Lookup table used in SVE erff. -- For each possible rounded input r (multiples of 1/128), between -- r = 0.0 and r = 4.0 (513 values): -- - __erff_data.erf contains the values of erf(r), -- - __erff_data.scale contains the values of 2/sqrt(pi)*exp(-r^2). -- Note that indices 0 and 1 are never hit by the algorithm, since lookup is -- performed only for x >= 1/64-1/512. */ --const struct sv_erff_data __sv_erff_data = { -- .erf = { 0x0.000000p+0, -- 0x1.20dbf4p-7, -- 0x1.20d770p-6, -- 0x1.b137e0p-6, -- 0x1.20c564p-5, -- 0x1.68e5d4p-5, -- 0x1.b0fafep-5, -- 0x1.f902a8p-5, -- 0x1.207d48p-4, -- 0x1.44703ep-4, -- 0x1.68591ap-4, -- 0x1.8c36bep-4, -- 0x1.b00812p-4, -- 0x1.d3cbf8p-4, -- 0x1.f7815ap-4, -- 0x1.0d9390p-3, -- 0x1.1f5e1ap-3, -- 0x1.311fc2p-3, -- 0x1.42d7fcp-3, -- 0x1.548642p-3, -- 0x1.662a0cp-3, -- 0x1.77c2d2p-3, -- 0x1.895010p-3, -- 0x1.9ad142p-3, -- 0x1.ac45e4p-3, -- 0x1.bdad72p-3, -- 0x1.cf076ep-3, -- 0x1.e05354p-3, -- 0x1.f190aap-3, -- 0x1.015f78p-2, -- 0x1.09eed6p-2, -- 0x1.127632p-2, -- 0x1.1af54ep-2, -- 0x1.236bf0p-2, -- 0x1.2bd9dcp-2, -- 0x1.343ed6p-2, -- 0x1.3c9aa8p-2, -- 0x1.44ed18p-2, -- 0x1.4d35f0p-2, -- 0x1.5574f4p-2, -- 0x1.5da9f4p-2, -- 0x1.65d4b8p-2, -- 0x1.6df50ap-2, -- 0x1.760abap-2, -- 0x1.7e1594p-2, -- 0x1.861566p-2, -- 0x1.8e0a02p-2, -- 0x1.95f336p-2, -- 0x1.9dd0d2p-2, -- 0x1.a5a2acp-2, -- 0x1.ad6896p-2, -- 0x1.b52264p-2, -- 0x1.bccfecp-2, -- 0x1.c47104p-2, -- 0x1.cc0584p-2, -- 0x1.d38d44p-2, -- 0x1.db081cp-2, -- 0x1.e275eap-2, -- 0x1.e9d68ap-2, -- 0x1.f129d4p-2, -- 0x1.f86faap-2, -- 0x1.ffa7eap-2, -- 0x1.03693ap-1, -- 0x1.06f794p-1, -- 0x1.0a7ef6p-1, -- 0x1.0dff50p-1, -- 0x1.117894p-1, -- 0x1.14eab4p-1, -- 0x1.1855a6p-1, -- 0x1.1bb95cp-1, -- 0x1.1f15ccp-1, -- 0x1.226ae8p-1, -- 0x1.25b8a8p-1, -- 0x1.28ff02p-1, -- 0x1.2c3decp-1, -- 0x1.2f755cp-1, -- 0x1.32a54cp-1, -- 0x1.35cdb4p-1, -- 0x1.38ee8ap-1, -- 0x1.3c07cap-1, -- 0x1.3f196ep-1, -- 0x1.42236ep-1, -- 0x1.4525c8p-1, -- 0x1.482074p-1, -- 0x1.4b1372p-1, -- 0x1.4dfebap-1, -- 0x1.50e24cp-1, -- 0x1.53be26p-1, -- 0x1.569244p-1, -- 0x1.595ea6p-1, -- 0x1.5c2348p-1, -- 0x1.5ee02ep-1, -- 0x1.619556p-1, -- 0x1.6442c0p-1, -- 0x1.66e86ep-1, -- 0x1.69865ep-1, -- 0x1.6c1c98p-1, -- 0x1.6eab18p-1, -- 0x1.7131e6p-1, -- 0x1.73b102p-1, -- 0x1.762870p-1, -- 0x1.789836p-1, -- 0x1.7b0058p-1, -- 0x1.7d60d8p-1, -- 0x1.7fb9c0p-1, -- 0x1.820b12p-1, -- 0x1.8454d6p-1, -- 0x1.869712p-1, -- 0x1.88d1cep-1, -- 0x1.8b050ep-1, -- 0x1.8d30dep-1, -- 0x1.8f5544p-1, -- 0x1.91724ap-1, -- 0x1.9387f6p-1, -- 0x1.959652p-1, -- 0x1.979d68p-1, -- 0x1.999d42p-1, -- 0x1.9b95e8p-1, -- 0x1.9d8768p-1, -- 0x1.9f71cap-1, -- 0x1.a1551ap-1, -- 0x1.a33162p-1, -- 0x1.a506b0p-1, -- 0x1.a6d50cp-1, -- 0x1.a89c86p-1, -- 0x1.aa5d26p-1, -- 0x1.ac16fcp-1, -- 0x1.adca14p-1, -- 0x1.af767ap-1, -- 0x1.b11c3cp-1, -- 0x1.b2bb68p-1, -- 0x1.b4540ap-1, -- 0x1.b5e630p-1, -- 0x1.b771e8p-1, -- 0x1.b8f742p-1, -- 0x1.ba764ap-1, -- 0x1.bbef10p-1, -- 0x1.bd61a2p-1, -- 0x1.bece0ep-1, -- 0x1.c03464p-1, -- 0x1.c194b2p-1, -- 0x1.c2ef08p-1, -- 0x1.c44376p-1, -- 0x1.c5920ap-1, -- 0x1.c6dad2p-1, -- 0x1.c81de2p-1, -- 0x1.c95b46p-1, -- 0x1.ca930ep-1, -- 0x1.cbc54cp-1, -- 0x1.ccf20cp-1, -- 0x1.ce1962p-1, -- 0x1.cf3b5cp-1, -- 0x1.d0580cp-1, -- 0x1.d16f7ep-1, -- 0x1.d281c4p-1, -- 0x1.d38ef0p-1, -- 0x1.d49710p-1, -- 0x1.d59a34p-1, -- 0x1.d6986cp-1, -- 0x1.d791cap-1, -- 0x1.d8865ep-1, -- 0x1.d97636p-1, -- 0x1.da6162p-1, -- 0x1.db47f4p-1, -- 0x1.dc29fcp-1, -- 0x1.dd0788p-1, -- 0x1.dde0aap-1, -- 0x1.deb570p-1, -- 0x1.df85eap-1, -- 0x1.e0522ap-1, -- 0x1.e11a3ep-1, -- 0x1.e1de36p-1, -- 0x1.e29e22p-1, -- 0x1.e35a12p-1, -- 0x1.e41214p-1, -- 0x1.e4c638p-1, -- 0x1.e5768cp-1, -- 0x1.e62322p-1, -- 0x1.e6cc08p-1, -- 0x1.e7714ap-1, -- 0x1.e812fcp-1, -- 0x1.e8b12ap-1, -- 0x1.e94be4p-1, -- 0x1.e9e336p-1, -- 0x1.ea7730p-1, -- 0x1.eb07e2p-1, -- 0x1.eb9558p-1, -- 0x1.ec1fa2p-1, -- 0x1.eca6ccp-1, -- 0x1.ed2ae6p-1, -- 0x1.edabfcp-1, -- 0x1.ee2a1ep-1, -- 0x1.eea556p-1, -- 0x1.ef1db4p-1, -- 0x1.ef9344p-1, -- 0x1.f00614p-1, -- 0x1.f07630p-1, -- 0x1.f0e3a6p-1, -- 0x1.f14e82p-1, -- 0x1.f1b6d0p-1, -- 0x1.f21ca0p-1, -- 0x1.f27ff8p-1, -- 0x1.f2e0eap-1, -- 0x1.f33f7ep-1, -- 0x1.f39bc2p-1, -- 0x1.f3f5c2p-1, -- 0x1.f44d88p-1, -- 0x1.f4a31ep-1, -- 0x1.f4f694p-1, -- 0x1.f547f2p-1, -- 0x1.f59742p-1, -- 0x1.f5e490p-1, -- 0x1.f62fe8p-1, -- 0x1.f67952p-1, -- 0x1.f6c0dcp-1, -- 0x1.f7068cp-1, -- 0x1.f74a6ep-1, -- 0x1.f78c8cp-1, -- 0x1.f7cceep-1, -- 0x1.f80ba2p-1, -- 0x1.f848acp-1, -- 0x1.f8841ap-1, -- 0x1.f8bdf2p-1, -- 0x1.f8f63ep-1, -- 0x1.f92d08p-1, -- 0x1.f96256p-1, -- 0x1.f99634p-1, -- 0x1.f9c8a8p-1, -- 0x1.f9f9bap-1, -- 0x1.fa2974p-1, -- 0x1.fa57dep-1, -- 0x1.fa84fep-1, -- 0x1.fab0dep-1, -- 0x1.fadb84p-1, -- 0x1.fb04f6p-1, -- 0x1.fb2d40p-1, -- 0x1.fb5464p-1, -- 0x1.fb7a6cp-1, -- 0x1.fb9f60p-1, -- 0x1.fbc344p-1, -- 0x1.fbe61ep-1, -- 0x1.fc07fap-1, -- 0x1.fc28d8p-1, -- 0x1.fc48c2p-1, -- 0x1.fc67bcp-1, -- 0x1.fc85d0p-1, -- 0x1.fca2fep-1, -- 0x1.fcbf52p-1, -- 0x1.fcdaccp-1, -- 0x1.fcf576p-1, -- 0x1.fd0f54p-1, -- 0x1.fd286ap-1, -- 0x1.fd40bep-1, -- 0x1.fd5856p-1, -- 0x1.fd6f34p-1, -- 0x1.fd8562p-1, -- 0x1.fd9ae2p-1, -- 0x1.fdafb8p-1, -- 0x1.fdc3e8p-1, -- 0x1.fdd77ap-1, -- 0x1.fdea6ep-1, -- 0x1.fdfcccp-1, -- 0x1.fe0e96p-1, -- 0x1.fe1fd0p-1, -- 0x1.fe3080p-1, -- 0x1.fe40a6p-1, -- 0x1.fe504cp-1, -- 0x1.fe5f70p-1, -- 0x1.fe6e18p-1, -- 0x1.fe7c46p-1, -- 0x1.fe8a00p-1, -- 0x1.fe9748p-1, -- 0x1.fea422p-1, -- 0x1.feb090p-1, -- 0x1.febc96p-1, -- 0x1.fec836p-1, -- 0x1.fed374p-1, -- 0x1.fede52p-1, -- 0x1.fee8d4p-1, -- 0x1.fef2fep-1, -- 0x1.fefccep-1, -- 0x1.ff064cp-1, -- 0x1.ff0f76p-1, -- 0x1.ff1852p-1, -- 0x1.ff20e0p-1, -- 0x1.ff2924p-1, -- 0x1.ff3120p-1, -- 0x1.ff38d6p-1, -- 0x1.ff4048p-1, -- 0x1.ff4778p-1, -- 0x1.ff4e68p-1, -- 0x1.ff551ap-1, -- 0x1.ff5b90p-1, -- 0x1.ff61ccp-1, -- 0x1.ff67d0p-1, -- 0x1.ff6d9ep-1, -- 0x1.ff7338p-1, -- 0x1.ff789ep-1, -- 0x1.ff7dd4p-1, -- 0x1.ff82dap-1, -- 0x1.ff87b2p-1, -- 0x1.ff8c5cp-1, -- 0x1.ff90dcp-1, -- 0x1.ff9532p-1, -- 0x1.ff9960p-1, -- 0x1.ff9d68p-1, -- 0x1.ffa14ap-1, -- 0x1.ffa506p-1, -- 0x1.ffa8a0p-1, -- 0x1.ffac18p-1, -- 0x1.ffaf6ep-1, -- 0x1.ffb2a6p-1, -- 0x1.ffb5bep-1, -- 0x1.ffb8b8p-1, -- 0x1.ffbb98p-1, -- 0x1.ffbe5ap-1, -- 0x1.ffc102p-1, -- 0x1.ffc390p-1, -- 0x1.ffc606p-1, -- 0x1.ffc862p-1, -- 0x1.ffcaa8p-1, -- 0x1.ffccd8p-1, -- 0x1.ffcef4p-1, -- 0x1.ffd0fap-1, -- 0x1.ffd2eap-1, -- 0x1.ffd4cap-1, -- 0x1.ffd696p-1, -- 0x1.ffd84ep-1, -- 0x1.ffd9f8p-1, -- 0x1.ffdb90p-1, -- 0x1.ffdd18p-1, -- 0x1.ffde90p-1, -- 0x1.ffdffap-1, -- 0x1.ffe154p-1, -- 0x1.ffe2a2p-1, -- 0x1.ffe3e2p-1, -- 0x1.ffe514p-1, -- 0x1.ffe63cp-1, -- 0x1.ffe756p-1, -- 0x1.ffe866p-1, -- 0x1.ffe96ap-1, -- 0x1.ffea64p-1, -- 0x1.ffeb54p-1, -- 0x1.ffec3ap-1, -- 0x1.ffed16p-1, -- 0x1.ffedeap-1, -- 0x1.ffeeb4p-1, -- 0x1.ffef76p-1, -- 0x1.fff032p-1, -- 0x1.fff0e4p-1, -- 0x1.fff18ep-1, -- 0x1.fff232p-1, -- 0x1.fff2d0p-1, -- 0x1.fff366p-1, -- 0x1.fff3f6p-1, -- 0x1.fff480p-1, -- 0x1.fff504p-1, -- 0x1.fff582p-1, -- 0x1.fff5fcp-1, -- 0x1.fff670p-1, -- 0x1.fff6dep-1, -- 0x1.fff74ap-1, -- 0x1.fff7aep-1, -- 0x1.fff810p-1, -- 0x1.fff86cp-1, -- 0x1.fff8c6p-1, -- 0x1.fff91cp-1, -- 0x1.fff96cp-1, -- 0x1.fff9bap-1, -- 0x1.fffa04p-1, -- 0x1.fffa4cp-1, -- 0x1.fffa90p-1, -- 0x1.fffad0p-1, -- 0x1.fffb0ep-1, -- 0x1.fffb4ap-1, -- 0x1.fffb82p-1, -- 0x1.fffbb8p-1, -- 0x1.fffbecp-1, -- 0x1.fffc1ep-1, -- 0x1.fffc4ep-1, -- 0x1.fffc7ap-1, -- 0x1.fffca6p-1, -- 0x1.fffccep-1, -- 0x1.fffcf6p-1, -- 0x1.fffd1ap-1, -- 0x1.fffd3ep-1, -- 0x1.fffd60p-1, -- 0x1.fffd80p-1, -- 0x1.fffda0p-1, -- 0x1.fffdbep-1, -- 0x1.fffddap-1, -- 0x1.fffdf4p-1, -- 0x1.fffe0ep-1, -- 0x1.fffe26p-1, -- 0x1.fffe3ep-1, -- 0x1.fffe54p-1, -- 0x1.fffe68p-1, -- 0x1.fffe7ep-1, -- 0x1.fffe90p-1, -- 0x1.fffea2p-1, -- 0x1.fffeb4p-1, -- 0x1.fffec4p-1, -- 0x1.fffed4p-1, -- 0x1.fffee4p-1, -- 0x1.fffef2p-1, -- 0x1.ffff00p-1, -- 0x1.ffff0cp-1, -- 0x1.ffff18p-1, -- 0x1.ffff24p-1, -- 0x1.ffff30p-1, -- 0x1.ffff3ap-1, -- 0x1.ffff44p-1, -- 0x1.ffff4ep-1, -- 0x1.ffff56p-1, -- 0x1.ffff60p-1, -- 0x1.ffff68p-1, -- 0x1.ffff70p-1, -- 0x1.ffff78p-1, -- 0x1.ffff7ep-1, -- 0x1.ffff84p-1, -- 0x1.ffff8cp-1, -- 0x1.ffff92p-1, -- 0x1.ffff98p-1, -- 0x1.ffff9cp-1, -- 0x1.ffffa2p-1, -- 0x1.ffffa6p-1, -- 0x1.ffffacp-1, -- 0x1.ffffb0p-1, -- 0x1.ffffb4p-1, -- 0x1.ffffb8p-1, -- 0x1.ffffbcp-1, -- 0x1.ffffc0p-1, -- 0x1.ffffc4p-1, -- 0x1.ffffc6p-1, -- 0x1.ffffcap-1, -- 0x1.ffffccp-1, -- 0x1.ffffd0p-1, -- 0x1.ffffd2p-1, -- 0x1.ffffd4p-1, -- 0x1.ffffd6p-1, -- 0x1.ffffd8p-1, -- 0x1.ffffdcp-1, -- 0x1.ffffdep-1, -- 0x1.ffffdep-1, -- 0x1.ffffe0p-1, -- 0x1.ffffe2p-1, -- 0x1.ffffe4p-1, -- 0x1.ffffe6p-1, -- 0x1.ffffe8p-1, -- 0x1.ffffe8p-1, -- 0x1.ffffeap-1, -- 0x1.ffffeap-1, -- 0x1.ffffecp-1, -- 0x1.ffffeep-1, -- 0x1.ffffeep-1, -- 0x1.fffff0p-1, -- 0x1.fffff0p-1, -- 0x1.fffff2p-1, -- 0x1.fffff2p-1, -- 0x1.fffff2p-1, -- 0x1.fffff4p-1, -- 0x1.fffff4p-1, -- 0x1.fffff4p-1, -- 0x1.fffff6p-1, -- 0x1.fffff6p-1, -- 0x1.fffff6p-1, -- 0x1.fffff8p-1, -- 0x1.fffff8p-1, -- 0x1.fffff8p-1, -- 0x1.fffff8p-1, -- 0x1.fffffap-1, -- 0x1.fffffap-1, -- 0x1.fffffap-1, -- 0x1.fffffap-1, -- 0x1.fffffap-1, -- 0x1.fffffap-1, -- 0x1.fffffcp-1, -- 0x1.fffffcp-1, -- 0x1.fffffcp-1, -- 0x1.fffffcp-1, -- 0x1.fffffcp-1, -- 0x1.fffffcp-1, -- 0x1.fffffcp-1, -- 0x1.fffffcp-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.fffffep-1, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- 0x1.000000p+0, -- }, -- .scale = { 0x1.20dd76p+0, -- 0x1.20d8f2p+0, -- 0x1.20cb68p+0, -- 0x1.20b4d8p+0, -- 0x1.209546p+0, -- 0x1.206cb4p+0, -- 0x1.203b26p+0, -- 0x1.2000a0p+0, -- 0x1.1fbd28p+0, -- 0x1.1f70c4p+0, -- 0x1.1f1b7ap+0, -- 0x1.1ebd56p+0, -- 0x1.1e565cp+0, -- 0x1.1de698p+0, -- 0x1.1d6e14p+0, -- 0x1.1cecdcp+0, -- 0x1.1c62fap+0, -- 0x1.1bd07cp+0, -- 0x1.1b3572p+0, -- 0x1.1a91e6p+0, -- 0x1.19e5eap+0, -- 0x1.19318cp+0, -- 0x1.1874dep+0, -- 0x1.17aff0p+0, -- 0x1.16e2d8p+0, -- 0x1.160da4p+0, -- 0x1.153068p+0, -- 0x1.144b3cp+0, -- 0x1.135e30p+0, -- 0x1.12695ep+0, -- 0x1.116cd8p+0, -- 0x1.1068bap+0, -- 0x1.0f5d16p+0, -- 0x1.0e4a08p+0, -- 0x1.0d2fa6p+0, -- 0x1.0c0e0ap+0, -- 0x1.0ae550p+0, -- 0x1.09b590p+0, -- 0x1.087ee4p+0, -- 0x1.07416cp+0, -- 0x1.05fd3ep+0, -- 0x1.04b27cp+0, -- 0x1.036140p+0, -- 0x1.0209a6p+0, -- 0x1.00abd0p+0, -- 0x1.fe8fb0p-1, -- 0x1.fbbbbep-1, -- 0x1.f8dc0ap-1, -- 0x1.f5f0cep-1, -- 0x1.f2fa4cp-1, -- 0x1.eff8c4p-1, -- 0x1.ecec78p-1, -- 0x1.e9d5a8p-1, -- 0x1.e6b498p-1, -- 0x1.e38988p-1, -- 0x1.e054bep-1, -- 0x1.dd167cp-1, -- 0x1.d9cf06p-1, -- 0x1.d67ea2p-1, -- 0x1.d32592p-1, -- 0x1.cfc41ep-1, -- 0x1.cc5a8ap-1, -- 0x1.c8e91cp-1, -- 0x1.c5701ap-1, -- 0x1.c1efcap-1, -- 0x1.be6872p-1, -- 0x1.bada5ap-1, -- 0x1.b745c6p-1, -- 0x1.b3aafcp-1, -- 0x1.b00a46p-1, -- 0x1.ac63e8p-1, -- 0x1.a8b828p-1, -- 0x1.a5074ep-1, -- 0x1.a1519ep-1, -- 0x1.9d9762p-1, -- 0x1.99d8dap-1, -- 0x1.961650p-1, -- 0x1.925008p-1, -- 0x1.8e8646p-1, -- 0x1.8ab950p-1, -- 0x1.86e96ap-1, -- 0x1.8316d6p-1, -- 0x1.7f41dcp-1, -- 0x1.7b6abcp-1, -- 0x1.7791b8p-1, -- 0x1.73b714p-1, -- 0x1.6fdb12p-1, -- 0x1.6bfdf0p-1, -- 0x1.681ff2p-1, -- 0x1.644156p-1, -- 0x1.60625cp-1, -- 0x1.5c8342p-1, -- 0x1.58a446p-1, -- 0x1.54c5a6p-1, -- 0x1.50e79ep-1, -- 0x1.4d0a68p-1, -- 0x1.492e42p-1, -- 0x1.455366p-1, -- 0x1.417a0cp-1, -- 0x1.3da26ep-1, -- 0x1.39ccc2p-1, -- 0x1.35f940p-1, -- 0x1.32281ep-1, -- 0x1.2e5992p-1, -- 0x1.2a8dcep-1, -- 0x1.26c508p-1, -- 0x1.22ff72p-1, -- 0x1.1f3d3cp-1, -- 0x1.1b7e98p-1, -- 0x1.17c3b6p-1, -- 0x1.140cc4p-1, -- 0x1.1059eep-1, -- 0x1.0cab62p-1, -- 0x1.09014cp-1, -- 0x1.055bd6p-1, -- 0x1.01bb2cp-1, -- 0x1.fc3ee6p-2, -- 0x1.f511aap-2, -- 0x1.edeeeep-2, -- 0x1.e6d700p-2, -- 0x1.dfca26p-2, -- 0x1.d8c8aap-2, -- 0x1.d1d2d0p-2, -- 0x1.cae8dap-2, -- 0x1.c40b08p-2, -- 0x1.bd3998p-2, -- 0x1.b674c8p-2, -- 0x1.afbcd4p-2, -- 0x1.a911f0p-2, -- 0x1.a27456p-2, -- 0x1.9be438p-2, -- 0x1.9561c8p-2, -- 0x1.8eed36p-2, -- 0x1.8886b2p-2, -- 0x1.822e66p-2, -- 0x1.7be47ap-2, -- 0x1.75a91ap-2, -- 0x1.6f7c6ap-2, -- 0x1.695e8cp-2, -- 0x1.634fa6p-2, -- 0x1.5d4fd4p-2, -- 0x1.575f34p-2, -- 0x1.517de6p-2, -- 0x1.4bac00p-2, -- 0x1.45e99cp-2, -- 0x1.4036d0p-2, -- 0x1.3a93b2p-2, -- 0x1.350052p-2, -- 0x1.2f7cc4p-2, -- 0x1.2a0916p-2, -- 0x1.24a554p-2, -- 0x1.1f518ap-2, -- 0x1.1a0dc6p-2, -- 0x1.14da0ap-2, -- 0x1.0fb662p-2, -- 0x1.0aa2d0p-2, -- 0x1.059f5ap-2, -- 0x1.00ac00p-2, -- 0x1.f79184p-3, -- 0x1.edeb40p-3, -- 0x1.e46530p-3, -- 0x1.daff4ap-3, -- 0x1.d1b982p-3, -- 0x1.c893cep-3, -- 0x1.bf8e1cp-3, -- 0x1.b6a856p-3, -- 0x1.ade26cp-3, -- 0x1.a53c42p-3, -- 0x1.9cb5bep-3, -- 0x1.944ec2p-3, -- 0x1.8c0732p-3, -- 0x1.83deeap-3, -- 0x1.7bd5c8p-3, -- 0x1.73eba4p-3, -- 0x1.6c2056p-3, -- 0x1.6473b6p-3, -- 0x1.5ce596p-3, -- 0x1.5575c8p-3, -- 0x1.4e241ep-3, -- 0x1.46f066p-3, -- 0x1.3fda6cp-3, -- 0x1.38e1fap-3, -- 0x1.3206dcp-3, -- 0x1.2b48dap-3, -- 0x1.24a7b8p-3, -- 0x1.1e233ep-3, -- 0x1.17bb2cp-3, -- 0x1.116f48p-3, -- 0x1.0b3f52p-3, -- 0x1.052b0cp-3, -- 0x1.fe6460p-4, -- 0x1.f2a902p-4, -- 0x1.e72372p-4, -- 0x1.dbd32ap-4, -- 0x1.d0b7a0p-4, -- 0x1.c5d04ap-4, -- 0x1.bb1c98p-4, -- 0x1.b09bfcp-4, -- 0x1.a64de6p-4, -- 0x1.9c31c6p-4, -- 0x1.92470ap-4, -- 0x1.888d1ep-4, -- 0x1.7f036cp-4, -- 0x1.75a960p-4, -- 0x1.6c7e64p-4, -- 0x1.6381e2p-4, -- 0x1.5ab342p-4, -- 0x1.5211ecp-4, -- 0x1.499d48p-4, -- 0x1.4154bcp-4, -- 0x1.3937b2p-4, -- 0x1.31458ep-4, -- 0x1.297dbap-4, -- 0x1.21df9ap-4, -- 0x1.1a6a96p-4, -- 0x1.131e14p-4, -- 0x1.0bf97ep-4, -- 0x1.04fc3ap-4, -- 0x1.fc4b5ep-5, -- 0x1.eeea8cp-5, -- 0x1.e1d4d0p-5, -- 0x1.d508fap-5, -- 0x1.c885e0p-5, -- 0x1.bc4a54p-5, -- 0x1.b05530p-5, -- 0x1.a4a54ap-5, -- 0x1.99397ap-5, -- 0x1.8e109cp-5, -- 0x1.83298ep-5, -- 0x1.78832cp-5, -- 0x1.6e1c58p-5, -- 0x1.63f3f6p-5, -- 0x1.5a08e8p-5, -- 0x1.505a18p-5, -- 0x1.46e66cp-5, -- 0x1.3dacd2p-5, -- 0x1.34ac36p-5, -- 0x1.2be38cp-5, -- 0x1.2351c2p-5, -- 0x1.1af5d2p-5, -- 0x1.12ceb4p-5, -- 0x1.0adb60p-5, -- 0x1.031ad6p-5, -- 0x1.f7182ap-6, -- 0x1.e85c44p-6, -- 0x1.da0006p-6, -- 0x1.cc0180p-6, -- 0x1.be5ecep-6, -- 0x1.b1160ap-6, -- 0x1.a4255ap-6, -- 0x1.978ae8p-6, -- 0x1.8b44e6p-6, -- 0x1.7f5188p-6, -- 0x1.73af0cp-6, -- 0x1.685bb6p-6, -- 0x1.5d55ccp-6, -- 0x1.529b9ep-6, -- 0x1.482b84p-6, -- 0x1.3e03d8p-6, -- 0x1.3422fep-6, -- 0x1.2a875cp-6, -- 0x1.212f62p-6, -- 0x1.181984p-6, -- 0x1.0f443ep-6, -- 0x1.06ae14p-6, -- 0x1.fcab14p-7, -- 0x1.ec7262p-7, -- 0x1.dcaf36p-7, -- 0x1.cd5ecap-7, -- 0x1.be7e5ap-7, -- 0x1.b00b38p-7, -- 0x1.a202bep-7, -- 0x1.94624ep-7, -- 0x1.87275ep-7, -- 0x1.7a4f6ap-7, -- 0x1.6dd7fep-7, -- 0x1.61beaep-7, -- 0x1.56011cp-7, -- 0x1.4a9cf6p-7, -- 0x1.3f8ff6p-7, -- 0x1.34d7dcp-7, -- 0x1.2a727ap-7, -- 0x1.205dacp-7, -- 0x1.169756p-7, -- 0x1.0d1d6ap-7, -- 0x1.03ede2p-7, -- 0x1.f60d8ap-8, -- 0x1.e4cc4ap-8, -- 0x1.d4143ap-8, -- 0x1.c3e1a6p-8, -- 0x1.b430ecp-8, -- 0x1.a4fe84p-8, -- 0x1.9646f4p-8, -- 0x1.8806d8p-8, -- 0x1.7a3adep-8, -- 0x1.6cdfccp-8, -- 0x1.5ff276p-8, -- 0x1.536fc2p-8, -- 0x1.4754acp-8, -- 0x1.3b9e40p-8, -- 0x1.30499cp-8, -- 0x1.2553eep-8, -- 0x1.1aba78p-8, -- 0x1.107a8cp-8, -- 0x1.06918cp-8, -- 0x1.f9f9d0p-9, -- 0x1.e77448p-9, -- 0x1.d58da6p-9, -- 0x1.c4412cp-9, -- 0x1.b38a3ap-9, -- 0x1.a36454p-9, -- 0x1.93cb12p-9, -- 0x1.84ba30p-9, -- 0x1.762d84p-9, -- 0x1.682100p-9, -- 0x1.5a90b0p-9, -- 0x1.4d78bcp-9, -- 0x1.40d564p-9, -- 0x1.34a306p-9, -- 0x1.28de12p-9, -- 0x1.1d8318p-9, -- 0x1.128ebap-9, -- 0x1.07fdb4p-9, -- 0x1.fb99b8p-10, -- 0x1.e7f232p-10, -- 0x1.d4fed8p-10, -- 0x1.c2b9d0p-10, -- 0x1.b11d70p-10, -- 0x1.a02436p-10, -- 0x1.8fc8c8p-10, -- 0x1.8005f0p-10, -- 0x1.70d6a4p-10, -- 0x1.6235fcp-10, -- 0x1.541f34p-10, -- 0x1.468daep-10, -- 0x1.397ceep-10, -- 0x1.2ce898p-10, -- 0x1.20cc76p-10, -- 0x1.15246ep-10, -- 0x1.09ec86p-10, -- 0x1.fe41cep-11, -- 0x1.e97ba4p-11, -- 0x1.d57f52p-11, -- 0x1.c245d4p-11, -- 0x1.afc85ep-11, -- 0x1.9e0058p-11, -- 0x1.8ce75ep-11, -- 0x1.7c7744p-11, -- 0x1.6caa0ep-11, -- 0x1.5d79ecp-11, -- 0x1.4ee142p-11, -- 0x1.40daa4p-11, -- 0x1.3360ccp-11, -- 0x1.266ea8p-11, -- 0x1.19ff46p-11, -- 0x1.0e0de8p-11, -- 0x1.0295f0p-11, -- 0x1.ef25d4p-12, -- 0x1.da0110p-12, -- 0x1.c5b542p-12, -- 0x1.b23a5ap-12, -- 0x1.9f8894p-12, -- 0x1.8d986ap-12, -- 0x1.7c629ap-12, -- 0x1.6be022p-12, -- 0x1.5c0a38p-12, -- 0x1.4cda54p-12, -- 0x1.3e4a24p-12, -- 0x1.305390p-12, -- 0x1.22f0b4p-12, -- 0x1.161be4p-12, -- 0x1.09cfa4p-12, -- 0x1.fc0d56p-13, -- 0x1.e577bcp-13, -- 0x1.cfd4a6p-13, -- 0x1.bb1a96p-13, -- 0x1.a74068p-13, -- 0x1.943d4ap-13, -- 0x1.8208bcp-13, -- 0x1.709a8ep-13, -- 0x1.5feadap-13, -- 0x1.4ff208p-13, -- 0x1.40a8c2p-13, -- 0x1.3207fcp-13, -- 0x1.2408eap-13, -- 0x1.16a502p-13, -- 0x1.09d5f8p-13, -- 0x1.fb2b7ap-14, -- 0x1.e3bcf4p-14, -- 0x1.cd5528p-14, -- 0x1.b7e946p-14, -- 0x1.a36eecp-14, -- 0x1.8fdc1cp-14, -- 0x1.7d2738p-14, -- 0x1.6b4702p-14, -- 0x1.5a329cp-14, -- 0x1.49e178p-14, -- 0x1.3a4b60p-14, -- 0x1.2b6876p-14, -- 0x1.1d3120p-14, -- 0x1.0f9e1cp-14, -- 0x1.02a868p-14, -- 0x1.ec929ap-15, -- 0x1.d4f4b4p-15, -- 0x1.be6abcp-15, -- 0x1.a8e8ccp-15, -- 0x1.94637ep-15, -- 0x1.80cfdcp-15, -- 0x1.6e2368p-15, -- 0x1.5c540cp-15, -- 0x1.4b581cp-15, -- 0x1.3b2652p-15, -- 0x1.2bb5ccp-15, -- 0x1.1cfe02p-15, -- 0x1.0ef6c4p-15, -- 0x1.019842p-15, -- 0x1.e9b5e8p-16, -- 0x1.d16f58p-16, -- 0x1.ba4f04p-16, -- 0x1.a447b8p-16, -- 0x1.8f4cccp-16, -- 0x1.7b5224p-16, -- 0x1.684c22p-16, -- 0x1.562facp-16, -- 0x1.44f21ep-16, -- 0x1.34894ap-16, -- 0x1.24eb72p-16, -- 0x1.160f44p-16, -- 0x1.07ebd2p-16, -- 0x1.f4f12ep-17, -- 0x1.db5ad0p-17, -- 0x1.c304f0p-17, -- 0x1.abe09ep-17, -- 0x1.95df98p-17, -- 0x1.80f43ap-17, -- 0x1.6d1178p-17, -- 0x1.5a2ae0p-17, -- 0x1.483488p-17, -- 0x1.372310p-17, -- 0x1.26eb9ep-17, -- 0x1.1783cep-17, -- 0x1.08e1bap-17, -- 0x1.f5f7d8p-18, -- 0x1.db92b6p-18, -- 0x1.c282cep-18, -- 0x1.aab7acp-18, -- 0x1.94219cp-18, -- 0x1.7eb1a2p-18, -- 0x1.6a5972p-18, -- 0x1.570b6ap-18, -- 0x1.44ba86p-18, -- 0x1.335a62p-18, -- 0x1.22df2ap-18, -- 0x1.133d96p-18, -- 0x1.046aeap-18, -- 0x1.ecb9d0p-19, -- 0x1.d21398p-19, -- 0x1.b8d094p-19, -- 0x1.a0df10p-19, -- 0x1.8a2e26p-19, -- 0x1.74adc8p-19, -- 0x1.604ea8p-19, -- 0x1.4d0232p-19, -- 0x1.3aba86p-19, -- 0x1.296a70p-19, -- 0x1.190562p-19, -- 0x1.097f62p-19, -- 0x1.f59a20p-20, -- 0x1.d9c736p-20, -- 0x1.bf716cp-20, -- 0x1.a6852cp-20, -- 0x1.8eefd8p-20, -- 0x1.789fb8p-20, -- 0x1.6383f8p-20, -- 0x1.4f8c96p-20, -- 0x1.3caa62p-20, -- 0x1.2acee2p-20, -- 0x1.19ec60p-20, -- 0x1.09f5d0p-20, -- 0x1.f5bd96p-21, -- 0x1.d9371ep-21, -- 0x1.be41dep-21, -- 0x1.a4c89ep-21, -- 0x1.8cb738p-21, -- 0x1.75fa8ep-21, -- 0x1.608078p-21, -- 0x1.4c37c0p-21, -- 0x1.39100ep-21, -- 0x1.26f9e0p-21, -- 0x1.15e682p-21, -- 0x1.05c804p-21, -- 0x1.ed2254p-22, -- 0x1.d06ad6p-22, -- 0x1.b551c8p-22, -- 0x1.9bc0a0p-22, -- 0x1.83a200p-22, -- 0x1.6ce1aap-22, -- 0x1.576c72p-22, -- 0x1.43302cp-22, -- 0x1.301ba2p-22, -- 0x1.1e1e86p-22, -- 0x1.0d2966p-22, -- 0x1.fa5b50p-23, -- 0x1.dc3ae4p-23, -- 0x1.bfd756p-23, -- 0x1.a517dap-23, -- 0x1.8be4f8p-23, -- 0x1.74287ep-23, -- 0x1.5dcd66p-23, -- 0x1.48bfd4p-23, -- 0x1.34ecf8p-23, -- 0x1.224310p-23, -- 0x1.10b148p-23, -- }, --}; -diff --git a/sysdeps/aarch64/fpu/vecmath_config.h b/sysdeps/aarch64/fpu/vecmath_config.h -index 7f0a8aa5f2..862eefaf8f 100644 ---- a/sysdeps/aarch64/fpu/vecmath_config.h -+++ b/sysdeps/aarch64/fpu/vecmath_config.h -@@ -75,49 +75,37 @@ extern const struct v_log10_data - } table[1 << V_LOG10_TABLE_BITS]; - } __v_log10_data attribute_hidden; - --extern const struct erff_data -+extern const struct v_erff_data - { - struct - { - float erf, scale; - } tab[513]; --} __erff_data attribute_hidden; -+} __v_erff_data attribute_hidden; - --extern const struct sv_erff_data --{ -- float erf[513]; -- float scale[513]; --} __sv_erff_data attribute_hidden; -- --extern const struct erf_data -+extern const struct v_erf_data - { - struct - { - double erf, scale; - } tab[769]; --} __erf_data attribute_hidden; -- --extern const struct sv_erf_data --{ -- double erf[769]; -- double scale[769]; --} __sv_erf_data attribute_hidden; -+} __v_erf_data attribute_hidden; - --extern const struct erfc_data -+extern const struct v_erfc_data - { - struct - { - double erfc, scale; - } tab[3488]; --} __erfc_data attribute_hidden; -+} __v_erfc_data attribute_hidden; - --extern const struct erfcf_data -+extern const struct v_erfcf_data - { - struct - { - float erfc, scale; - } tab[645]; --} __erfcf_data attribute_hidden; -+} __v_erfcf_data attribute_hidden; - - /* Some data for AdvSIMD and SVE pow's internal exp and log. */ - #define V_POW_EXP_TABLE_BITS 8 - -commit 4148940836eee07d1138da6f1805280eeb8217e3 -Author: Pierre Blanchard -Date: Mon Dec 9 15:53:04 2024 +0000 - - AArch64: Improve codegen in AdvSIMD pow - - Remove spurious ADRP. Improve memory access by shuffling constants and - using more indexed MLAs. - - A few more optimisation with no impact on accuracy - - force fmas contraction - - switch from shift-aided rint to rint instruction - - Between 1 and 5% throughput improvement on Neoverse - V1 depending on benchmark. - - (cherry picked from commit 569cfaaf4984ae70b23c61ee28a609b5aef93fea) - -diff --git a/sysdeps/aarch64/fpu/pow_advsimd.c b/sysdeps/aarch64/fpu/pow_advsimd.c -index 3c91e3e183..81e134ac2f 100644 ---- a/sysdeps/aarch64/fpu/pow_advsimd.c -+++ b/sysdeps/aarch64/fpu/pow_advsimd.c -@@ -22,9 +22,6 @@ - /* Defines parameters of the approximation and scalar fallback. */ - #include "finite_pow.h" - --#define VecSmallExp v_u64 (SmallExp) --#define VecThresExp v_u64 (ThresExp) -- - #define VecSmallPowX v_u64 (SmallPowX) - #define VecThresPowX v_u64 (ThresPowX) - #define VecSmallPowY v_u64 (SmallPowY) -@@ -32,36 +29,48 @@ - - static const struct data - { -- float64x2_t log_poly[6]; -- float64x2_t exp_poly[3]; -- float64x2_t ln2_hi, ln2_lo; -- float64x2_t shift, inv_ln2_n, ln2_hi_n, ln2_lo_n, small_powx; - uint64x2_t inf; -+ float64x2_t small_powx; -+ uint64x2_t offset, mask; -+ uint64x2_t mask_sub_0, mask_sub_1; -+ float64x2_t log_c0, log_c2, log_c4, log_c5; -+ double log_c1, log_c3; -+ double ln2_lo, ln2_hi; -+ uint64x2_t small_exp, thres_exp; -+ double ln2_lo_n, ln2_hi_n; -+ double inv_ln2_n, exp_c2; -+ float64x2_t exp_c0, exp_c1; - } data = { -+ /* Power threshold. */ -+ .inf = V2 (0x7ff0000000000000), -+ .small_powx = V2 (0x1p-126), -+ .offset = V2 (Off), -+ .mask = V2 (0xfffULL << 52), -+ .mask_sub_0 = V2 (1ULL << 52), -+ .mask_sub_1 = V2 (52ULL << 52), - /* Coefficients copied from v_pow_log_data.c - relative error: 0x1.11922ap-70 in [-0x1.6bp-8, 0x1.6bp-8] - Coefficients are scaled to match the scaling during evaluation. */ -- .log_poly -- = { V2 (0x1.555555555556p-2 * -2), V2 (-0x1.0000000000006p-2 * -2), -- V2 (0x1.999999959554ep-3 * 4), V2 (-0x1.555555529a47ap-3 * 4), -- V2 (0x1.2495b9b4845e9p-3 * -8), V2 (-0x1.0002b8b263fc3p-3 * -8) }, -- .ln2_hi = V2 (0x1.62e42fefa3800p-1), -- .ln2_lo = V2 (0x1.ef35793c76730p-45), -+ .log_c0 = V2 (0x1.555555555556p-2 * -2), -+ .log_c1 = -0x1.0000000000006p-2 * -2, -+ .log_c2 = V2 (0x1.999999959554ep-3 * 4), -+ .log_c3 = -0x1.555555529a47ap-3 * 4, -+ .log_c4 = V2 (0x1.2495b9b4845e9p-3 * -8), -+ .log_c5 = V2 (-0x1.0002b8b263fc3p-3 * -8), -+ .ln2_hi = 0x1.62e42fefa3800p-1, -+ .ln2_lo = 0x1.ef35793c76730p-45, - /* Polynomial coefficients: abs error: 1.43*2^-58, ulp error: 0.549 - (0.550 without fma) if |x| < ln2/512. */ -- .exp_poly = { V2 (0x1.fffffffffffd4p-2), V2 (0x1.5555571d6ef9p-3), -- V2 (0x1.5555576a5adcep-5) }, -- .shift = V2 (0x1.8p52), /* round to nearest int. without intrinsics. */ -- .inv_ln2_n = V2 (0x1.71547652b82fep8), /* N/ln2. */ -- .ln2_hi_n = V2 (0x1.62e42fefc0000p-9), /* ln2/N. */ -- .ln2_lo_n = V2 (-0x1.c610ca86c3899p-45), -- .small_powx = V2 (0x1p-126), -- .inf = V2 (0x7ff0000000000000) -+ .exp_c0 = V2 (0x1.fffffffffffd4p-2), -+ .exp_c1 = V2 (0x1.5555571d6ef9p-3), -+ .exp_c2 = 0x1.5555576a5adcep-5, -+ .small_exp = V2 (0x3c90000000000000), -+ .thres_exp = V2 (0x03f0000000000000), -+ .inv_ln2_n = 0x1.71547652b82fep8, /* N/ln2. */ -+ .ln2_hi_n = 0x1.62e42fefc0000p-9, /* ln2/N. */ -+ .ln2_lo_n = -0x1.c610ca86c3899p-45, - }; - --#define A(i) data.log_poly[i] --#define C(i) data.exp_poly[i] -- - /* This version implements an algorithm close to scalar pow but - - does not implement the trick in the exp's specialcase subroutine to avoid - double-rounding, -@@ -91,10 +100,9 @@ v_log_inline (uint64x2_t ix, float64x2_t *tail, const struct data *d) - /* x = 2^k z; where z is in range [OFF,2*OFF) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- uint64x2_t tmp = vsubq_u64 (ix, v_u64 (Off)); -- int64x2_t k -- = vshrq_n_s64 (vreinterpretq_s64_u64 (tmp), 52); /* arithmetic shift. */ -- uint64x2_t iz = vsubq_u64 (ix, vandq_u64 (tmp, v_u64 (0xfffULL << 52))); -+ uint64x2_t tmp = vsubq_u64 (ix, d->offset); -+ int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (tmp), 52); -+ uint64x2_t iz = vsubq_u64 (ix, vandq_u64 (tmp, d->mask)); - float64x2_t z = vreinterpretq_f64_u64 (iz); - float64x2_t kd = vcvtq_f64_s64 (k); - /* log(x) = k*Ln2 + log(c) + log1p(z/c-1). */ -@@ -105,9 +113,10 @@ v_log_inline (uint64x2_t ix, float64x2_t *tail, const struct data *d) - |z/c - 1| < 1/N, so r = z/c - 1 is exactly representible. */ - float64x2_t r = vfmaq_f64 (v_f64 (-1.0), z, invc); - /* k*Ln2 + log(c) + r. */ -- float64x2_t t1 = vfmaq_f64 (logc, kd, d->ln2_hi); -+ float64x2_t ln2 = vld1q_f64 (&d->ln2_lo); -+ float64x2_t t1 = vfmaq_laneq_f64 (logc, kd, ln2, 1); - float64x2_t t2 = vaddq_f64 (t1, r); -- float64x2_t lo1 = vfmaq_f64 (logctail, kd, d->ln2_lo); -+ float64x2_t lo1 = vfmaq_laneq_f64 (logctail, kd, ln2, 0); - float64x2_t lo2 = vaddq_f64 (vsubq_f64 (t1, t2), r); - /* Evaluation is optimized assuming superscalar pipelined execution. */ - float64x2_t ar = vmulq_f64 (v_f64 (-0.5), r); -@@ -118,9 +127,10 @@ v_log_inline (uint64x2_t ix, float64x2_t *tail, const struct data *d) - float64x2_t lo3 = vfmaq_f64 (vnegq_f64 (ar2), ar, r); - float64x2_t lo4 = vaddq_f64 (vsubq_f64 (t2, hi), ar2); - /* p = log1p(r) - r - A[0]*r*r. */ -- float64x2_t a56 = vfmaq_f64 (A (4), r, A (5)); -- float64x2_t a34 = vfmaq_f64 (A (2), r, A (3)); -- float64x2_t a12 = vfmaq_f64 (A (0), r, A (1)); -+ float64x2_t odd_coeffs = vld1q_f64 (&d->log_c1); -+ float64x2_t a56 = vfmaq_f64 (d->log_c4, r, d->log_c5); -+ float64x2_t a34 = vfmaq_laneq_f64 (d->log_c2, r, odd_coeffs, 1); -+ float64x2_t a12 = vfmaq_laneq_f64 (d->log_c0, r, odd_coeffs, 0); - float64x2_t p = vfmaq_f64 (a34, ar2, a56); - p = vfmaq_f64 (a12, ar2, p); - p = vmulq_f64 (ar3, p); -@@ -140,28 +150,28 @@ exp_special_case (float64x2_t x, float64x2_t xtail) - - /* Computes sign*exp(x+xtail) where |xtail| < 2^-8/N and |xtail| <= |x|. */ - static inline float64x2_t --v_exp_inline (float64x2_t x, float64x2_t xtail, const struct data *d) -+v_exp_inline (float64x2_t x, float64x2_t neg_xtail, const struct data *d) - { - /* Fallback to scalar exp_inline for all lanes if any lane - contains value of x s.t. |x| <= 2^-54 or >= 512. */ -- uint64x2_t abstop -- = vshrq_n_u64 (vandq_u64 (vreinterpretq_u64_f64 (x), d->inf), 52); -- uint64x2_t uoflowx -- = vcgeq_u64 (vsubq_u64 (abstop, VecSmallExp), VecThresExp); -+ uint64x2_t uoflowx = vcgeq_u64 ( -+ vsubq_u64 (vreinterpretq_u64_f64 (vabsq_f64 (x)), d->small_exp), -+ d->thres_exp); - if (__glibc_unlikely (v_any_u64 (uoflowx))) -- return exp_special_case (x, xtail); -+ return exp_special_case (x, vnegq_f64 (neg_xtail)); - - /* exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)]. */ - /* x = ln2/N*k + r, with k integer and r in [-ln2/2N, ln2/2N]. */ -- float64x2_t z = vmulq_f64 (d->inv_ln2_n, x); - /* z - kd is in [-1, 1] in non-nearest rounding modes. */ -- float64x2_t kd = vaddq_f64 (z, d->shift); -- uint64x2_t ki = vreinterpretq_u64_f64 (kd); -- kd = vsubq_f64 (kd, d->shift); -- float64x2_t r = vfmsq_f64 (x, kd, d->ln2_hi_n); -- r = vfmsq_f64 (r, kd, d->ln2_lo_n); -+ float64x2_t exp_consts = vld1q_f64 (&d->inv_ln2_n); -+ float64x2_t z = vmulq_laneq_f64 (x, exp_consts, 0); -+ float64x2_t kd = vrndnq_f64 (z); -+ uint64x2_t ki = vreinterpretq_u64_s64 (vcvtaq_s64_f64 (z)); -+ float64x2_t ln2_n = vld1q_f64 (&d->ln2_lo_n); -+ float64x2_t r = vfmsq_laneq_f64 (x, kd, ln2_n, 1); -+ r = vfmsq_laneq_f64 (r, kd, ln2_n, 0); - /* The code assumes 2^-200 < |xtail| < 2^-8/N. */ -- r = vaddq_f64 (r, xtail); -+ r = vsubq_f64 (r, neg_xtail); - /* 2^(k/N) ~= scale. */ - uint64x2_t idx = vandq_u64 (ki, v_u64 (N_EXP - 1)); - uint64x2_t top = vshlq_n_u64 (ki, 52 - V_POW_EXP_TABLE_BITS); -@@ -170,8 +180,8 @@ v_exp_inline (float64x2_t x, float64x2_t xtail, const struct data *d) - sbits = vaddq_u64 (sbits, top); - /* exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (exp(r) - 1). */ - float64x2_t r2 = vmulq_f64 (r, r); -- float64x2_t tmp = vfmaq_f64 (C (1), r, C (2)); -- tmp = vfmaq_f64 (C (0), r, tmp); -+ float64x2_t tmp = vfmaq_laneq_f64 (d->exp_c1, r, exp_consts, 1); -+ tmp = vfmaq_f64 (d->exp_c0, r, tmp); - tmp = vfmaq_f64 (r, r2, tmp); - float64x2_t scale = vreinterpretq_f64_u64 (sbits); - /* Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there -@@ -230,8 +240,8 @@ float64x2_t VPCS_ATTR V_NAME_D2 (pow) (float64x2_t x, float64x2_t y) - { - /* Normalize subnormal x so exponent becomes negative. */ - uint64x2_t vix_norm = vreinterpretq_u64_f64 ( -- vabsq_f64 (vmulq_f64 (x, vcvtq_f64_u64 (v_u64 (1ULL << 52))))); -- vix_norm = vsubq_u64 (vix_norm, v_u64 (52ULL << 52)); -+ vabsq_f64 (vmulq_f64 (x, vcvtq_f64_u64 (d->mask_sub_0)))); -+ vix_norm = vsubq_u64 (vix_norm, d->mask_sub_1); - vix = vbslq_u64 (sub_x, vix_norm, vix); - } - } -@@ -242,8 +252,7 @@ float64x2_t VPCS_ATTR V_NAME_D2 (pow) (float64x2_t x, float64x2_t y) - - /* Vector Exp(y_loghi, y_loglo). */ - float64x2_t vehi = vmulq_f64 (y, vhi); -- float64x2_t velo = vmulq_f64 (y, vlo); - float64x2_t vemi = vfmsq_f64 (vehi, y, vhi); -- velo = vsubq_f64 (velo, vemi); -- return v_exp_inline (vehi, velo, d); -+ float64x2_t neg_velo = vfmsq_f64 (vemi, y, vlo); -+ return v_exp_inline (vehi, neg_velo, d); - } - -commit ae04f63087415eba9060143608b03db693854bb7 -Author: Pierre Blanchard -Date: Mon Dec 9 15:54:34 2024 +0000 - - AArch64: Improve codegen in AdvSIMD logs - - Remove spurious ADRP and a few MOVs. - Reduce memory access by using more indexed MLAs in polynomial. - Align notation so that algorithms are easier to compare. - Speedup on Neoverse V1 for log10 (8%), log (8.5%), and log2 (10%). - Update error threshold in AdvSIMD log (now matches SVE log). - - (cherry picked from commit 8eb5ad2ebc94cc5bedbac57c226c02ec254479c7) - -diff --git a/sysdeps/aarch64/fpu/log10_advsimd.c b/sysdeps/aarch64/fpu/log10_advsimd.c -index c065aaebae..f69ed21c39 100644 ---- a/sysdeps/aarch64/fpu/log10_advsimd.c -+++ b/sysdeps/aarch64/fpu/log10_advsimd.c -@@ -18,36 +18,36 @@ - . */ - - #include "v_math.h" --#include "poly_advsimd_f64.h" -- --#define N (1 << V_LOG10_TABLE_BITS) - - static const struct data - { -- uint64x2_t min_norm; -+ uint64x2_t off, sign_exp_mask, offset_lower_bound; - uint32x4_t special_bound; -- float64x2_t poly[5]; -- float64x2_t invln10, log10_2, ln2; -- uint64x2_t sign_exp_mask; -+ double invln10, log10_2; -+ double c1, c3; -+ float64x2_t c0, c2, c4; - } data = { - /* Computed from log coefficients divided by log(10) then rounded to double - precision. */ -- .poly = { V2 (-0x1.bcb7b1526e506p-3), V2 (0x1.287a7636be1d1p-3), -- V2 (-0x1.bcb7b158af938p-4), V2 (0x1.63c78734e6d07p-4), -- V2 (-0x1.287461742fee4p-4) }, -- .ln2 = V2 (0x1.62e42fefa39efp-1), -- .invln10 = V2 (0x1.bcb7b1526e50ep-2), -- .log10_2 = V2 (0x1.34413509f79ffp-2), -- .min_norm = V2 (0x0010000000000000), /* asuint64(0x1p-1022). */ -- .special_bound = V4 (0x7fe00000), /* asuint64(inf) - min_norm. */ -+ .c0 = V2 (-0x1.bcb7b1526e506p-3), -+ .c1 = 0x1.287a7636be1d1p-3, -+ .c2 = V2 (-0x1.bcb7b158af938p-4), -+ .c3 = 0x1.63c78734e6d07p-4, -+ .c4 = V2 (-0x1.287461742fee4p-4), -+ .invln10 = 0x1.bcb7b1526e50ep-2, -+ .log10_2 = 0x1.34413509f79ffp-2, -+ .off = V2 (0x3fe6900900000000), - .sign_exp_mask = V2 (0xfff0000000000000), -+ /* Lower bound is 0x0010000000000000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound - offset (which wraps around). */ -+ .offset_lower_bound = V2 (0x0010000000000000 - 0x3fe6900900000000), -+ .special_bound = V4 (0x7fe00000), /* asuint64(inf) - 0x0010000000000000. */ - }; - --#define Off v_u64 (0x3fe6900900000000) -+#define N (1 << V_LOG10_TABLE_BITS) - #define IndexMask (N - 1) - --#define T(s, i) __v_log10_data.s[i] -- - struct entry - { - float64x2_t invc; -@@ -70,10 +70,11 @@ lookup (uint64x2_t i) - } - - static float64x2_t VPCS_ATTR NOINLINE --special_case (float64x2_t x, float64x2_t y, float64x2_t hi, float64x2_t r2, -- uint32x2_t special) -+special_case (float64x2_t hi, uint64x2_t u_off, float64x2_t y, float64x2_t r2, -+ uint32x2_t special, const struct data *d) - { -- return v_call_f64 (log10, x, vfmaq_f64 (hi, r2, y), vmovl_u32 (special)); -+ float64x2_t x = vreinterpretq_f64_u64 (vaddq_u64 (u_off, d->off)); -+ return v_call_f64 (log10, x, vfmaq_f64 (hi, y, r2), vmovl_u32 (special)); - } - - /* Fast implementation of double-precision vector log10 -@@ -85,19 +86,24 @@ special_case (float64x2_t x, float64x2_t y, float64x2_t hi, float64x2_t r2, - float64x2_t VPCS_ATTR V_NAME_D1 (log10) (float64x2_t x) - { - const struct data *d = ptr_barrier (&data); -- uint64x2_t ix = vreinterpretq_u64_f64 (x); -- uint32x2_t special = vcge_u32 (vsubhn_u64 (ix, d->min_norm), -- vget_low_u32 (d->special_bound)); -+ -+ /* To avoid having to mov x out of the way, keep u after offset has been -+ applied, and recover x by adding the offset back in the special-case -+ handler. */ -+ uint64x2_t u = vreinterpretq_u64_f64 (x); -+ uint64x2_t u_off = vsubq_u64 (u, d->off); - - /* x = 2^k z; where z is in range [OFF,2*OFF) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- uint64x2_t tmp = vsubq_u64 (ix, Off); -- int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (tmp), 52); -- uint64x2_t iz = vsubq_u64 (ix, vandq_u64 (tmp, d->sign_exp_mask)); -+ int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (u_off), 52); -+ uint64x2_t iz = vsubq_u64 (u, vandq_u64 (u_off, d->sign_exp_mask)); - float64x2_t z = vreinterpretq_f64_u64 (iz); - -- struct entry e = lookup (tmp); -+ struct entry e = lookup (u_off); -+ -+ uint32x2_t special = vcge_u32 (vsubhn_u64 (u_off, d->offset_lower_bound), -+ vget_low_u32 (d->special_bound)); - - /* log10(x) = log1p(z/c-1)/log(10) + log10(c) + k*log10(2). */ - float64x2_t r = vfmaq_f64 (v_f64 (-1.0), z, e.invc); -@@ -105,17 +111,22 @@ float64x2_t VPCS_ATTR V_NAME_D1 (log10) (float64x2_t x) - - /* hi = r / log(10) + log10(c) + k*log10(2). - Constants in v_log10_data.c are computed (in extended precision) as -- e.log10c := e.logc * ivln10. */ -- float64x2_t w = vfmaq_f64 (e.log10c, r, d->invln10); -+ e.log10c := e.logc * invln10. */ -+ float64x2_t cte = vld1q_f64 (&d->invln10); -+ float64x2_t hi = vfmaq_laneq_f64 (e.log10c, r, cte, 0); - - /* y = log10(1+r) + n * log10(2). */ -- float64x2_t hi = vfmaq_f64 (w, kd, d->log10_2); -+ hi = vfmaq_laneq_f64 (hi, kd, cte, 1); - - /* y = r2*(A0 + r*A1 + r2*(A2 + r*A3 + r2*A4)) + hi. */ - float64x2_t r2 = vmulq_f64 (r, r); -- float64x2_t y = v_pw_horner_4_f64 (r, r2, d->poly); -+ float64x2_t odd_coeffs = vld1q_f64 (&d->c1); -+ float64x2_t y = vfmaq_laneq_f64 (d->c2, r, odd_coeffs, 1); -+ float64x2_t p = vfmaq_laneq_f64 (d->c0, r, odd_coeffs, 0); -+ y = vfmaq_f64 (y, d->c4, r2); -+ y = vfmaq_f64 (p, y, r2); - - if (__glibc_unlikely (v_any_u32h (special))) -- return special_case (x, y, hi, r2, special); -- return vfmaq_f64 (hi, r2, y); -+ return special_case (hi, u_off, y, r2, special, d); -+ return vfmaq_f64 (hi, y, r2); - } -diff --git a/sysdeps/aarch64/fpu/log2_advsimd.c b/sysdeps/aarch64/fpu/log2_advsimd.c -index 4057c552d8..1eea1f86eb 100644 ---- a/sysdeps/aarch64/fpu/log2_advsimd.c -+++ b/sysdeps/aarch64/fpu/log2_advsimd.c -@@ -18,31 +18,33 @@ - . */ - - #include "v_math.h" --#include "poly_advsimd_f64.h" -- --#define N (1 << V_LOG2_TABLE_BITS) - - static const struct data - { -- uint64x2_t min_norm; -+ uint64x2_t off, sign_exp_mask, offset_lower_bound; - uint32x4_t special_bound; -- float64x2_t poly[5]; -- float64x2_t invln2; -- uint64x2_t sign_exp_mask; -+ float64x2_t c0, c2; -+ double c1, c3, invln2, c4; - } data = { - /* Each coefficient was generated to approximate log(r) for |r| < 0x1.fp-9 - and N = 128, then scaled by log2(e) in extended precision and rounded back - to double precision. */ -- .poly = { V2 (-0x1.71547652b83p-1), V2 (0x1.ec709dc340953p-2), -- V2 (-0x1.71547651c8f35p-2), V2 (0x1.2777ebe12dda5p-2), -- V2 (-0x1.ec738d616fe26p-3) }, -- .invln2 = V2 (0x1.71547652b82fep0), -- .min_norm = V2 (0x0010000000000000), /* asuint64(0x1p-1022). */ -- .special_bound = V4 (0x7fe00000), /* asuint64(inf) - min_norm. */ -+ .c0 = V2 (-0x1.71547652b8300p-1), -+ .c1 = 0x1.ec709dc340953p-2, -+ .c2 = V2 (-0x1.71547651c8f35p-2), -+ .c3 = 0x1.2777ebe12dda5p-2, -+ .c4 = -0x1.ec738d616fe26p-3, -+ .invln2 = 0x1.71547652b82fep0, -+ .off = V2 (0x3fe6900900000000), - .sign_exp_mask = V2 (0xfff0000000000000), -+ /* Lower bound is 0x0010000000000000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound - offset (which wraps around). */ -+ .offset_lower_bound = V2 (0x0010000000000000 - 0x3fe6900900000000), -+ .special_bound = V4 (0x7fe00000), /* asuint64(inf) - asuint64(0x1p-1022). */ - }; - --#define Off v_u64 (0x3fe6900900000000) -+#define N (1 << V_LOG2_TABLE_BITS) - #define IndexMask (N - 1) - - struct entry -@@ -67,10 +69,11 @@ lookup (uint64x2_t i) - } - - static float64x2_t VPCS_ATTR NOINLINE --special_case (float64x2_t x, float64x2_t y, float64x2_t w, float64x2_t r2, -- uint32x2_t special) -+special_case (float64x2_t hi, uint64x2_t u_off, float64x2_t y, float64x2_t r2, -+ uint32x2_t special, const struct data *d) - { -- return v_call_f64 (log2, x, vfmaq_f64 (w, r2, y), vmovl_u32 (special)); -+ float64x2_t x = vreinterpretq_f64_u64 (vaddq_u64 (u_off, d->off)); -+ return v_call_f64 (log2, x, vfmaq_f64 (hi, y, r2), vmovl_u32 (special)); - } - - /* Double-precision vector log2 routine. Implements the same algorithm as -@@ -81,31 +84,41 @@ special_case (float64x2_t x, float64x2_t y, float64x2_t w, float64x2_t r2, - float64x2_t VPCS_ATTR V_NAME_D1 (log2) (float64x2_t x) - { - const struct data *d = ptr_barrier (&data); -- uint64x2_t ix = vreinterpretq_u64_f64 (x); -- uint32x2_t special = vcge_u32 (vsubhn_u64 (ix, d->min_norm), -- vget_low_u32 (d->special_bound)); -+ -+ /* To avoid having to mov x out of the way, keep u after offset has been -+ applied, and recover x by adding the offset back in the special-case -+ handler. */ -+ uint64x2_t u = vreinterpretq_u64_f64 (x); -+ uint64x2_t u_off = vsubq_u64 (u, d->off); - - /* x = 2^k z; where z is in range [Off,2*Off) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- uint64x2_t tmp = vsubq_u64 (ix, Off); -- int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (tmp), 52); -- uint64x2_t iz = vsubq_u64 (ix, vandq_u64 (tmp, d->sign_exp_mask)); -+ int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (u_off), 52); -+ uint64x2_t iz = vsubq_u64 (u, vandq_u64 (u_off, d->sign_exp_mask)); - float64x2_t z = vreinterpretq_f64_u64 (iz); - -- struct entry e = lookup (tmp); -+ struct entry e = lookup (u_off); - -- /* log2(x) = log1p(z/c-1)/log(2) + log2(c) + k. */ -+ uint32x2_t special = vcge_u32 (vsubhn_u64 (u_off, d->offset_lower_bound), -+ vget_low_u32 (d->special_bound)); - -+ /* log2(x) = log1p(z/c-1)/log(2) + log2(c) + k. */ - float64x2_t r = vfmaq_f64 (v_f64 (-1.0), z, e.invc); - float64x2_t kd = vcvtq_f64_s64 (k); -- float64x2_t w = vfmaq_f64 (e.log2c, r, d->invln2); -+ -+ float64x2_t invln2_and_c4 = vld1q_f64 (&d->invln2); -+ float64x2_t hi -+ = vfmaq_laneq_f64 (vaddq_f64 (e.log2c, kd), r, invln2_and_c4, 0); - - float64x2_t r2 = vmulq_f64 (r, r); -- float64x2_t y = v_pw_horner_4_f64 (r, r2, d->poly); -- w = vaddq_f64 (kd, w); -+ float64x2_t odd_coeffs = vld1q_f64 (&d->c1); -+ float64x2_t y = vfmaq_laneq_f64 (d->c2, r, odd_coeffs, 1); -+ float64x2_t p = vfmaq_laneq_f64 (d->c0, r, odd_coeffs, 0); -+ y = vfmaq_laneq_f64 (y, r2, invln2_and_c4, 1); -+ y = vfmaq_f64 (p, r2, y); - - if (__glibc_unlikely (v_any_u32h (special))) -- return special_case (x, y, w, r2, special); -- return vfmaq_f64 (w, r2, y); -+ return special_case (hi, u_off, y, r2, special, d); -+ return vfmaq_f64 (hi, y, r2); - } -diff --git a/sysdeps/aarch64/fpu/log_advsimd.c b/sysdeps/aarch64/fpu/log_advsimd.c -index 015a6da7d7..b1a27fbc29 100644 ---- a/sysdeps/aarch64/fpu/log_advsimd.c -+++ b/sysdeps/aarch64/fpu/log_advsimd.c -@@ -21,27 +21,29 @@ - - static const struct data - { -- uint64x2_t min_norm; -+ uint64x2_t off, sign_exp_mask, offset_lower_bound; - uint32x4_t special_bound; -- float64x2_t poly[5]; -- float64x2_t ln2; -- uint64x2_t sign_exp_mask; -+ float64x2_t c0, c2; -+ double c1, c3, ln2, c4; - } data = { -- /* Worst-case error: 1.17 + 0.5 ulp. -- Rel error: 0x1.6272e588p-56 in [ -0x1.fc1p-9 0x1.009p-8 ]. */ -- .poly = { V2 (-0x1.ffffffffffff7p-2), V2 (0x1.55555555170d4p-2), -- V2 (-0x1.0000000399c27p-2), V2 (0x1.999b2e90e94cap-3), -- V2 (-0x1.554e550bd501ep-3) }, -- .ln2 = V2 (0x1.62e42fefa39efp-1), -- .min_norm = V2 (0x0010000000000000), -- .special_bound = V4 (0x7fe00000), /* asuint64(inf) - min_norm. */ -- .sign_exp_mask = V2 (0xfff0000000000000) -+ /* Rel error: 0x1.6272e588p-56 in [ -0x1.fc1p-9 0x1.009p-8 ]. */ -+ .c0 = V2 (-0x1.ffffffffffff7p-2), -+ .c1 = 0x1.55555555170d4p-2, -+ .c2 = V2 (-0x1.0000000399c27p-2), -+ .c3 = 0x1.999b2e90e94cap-3, -+ .c4 = -0x1.554e550bd501ep-3, -+ .ln2 = 0x1.62e42fefa39efp-1, -+ .sign_exp_mask = V2 (0xfff0000000000000), -+ .off = V2 (0x3fe6900900000000), -+ /* Lower bound is 0x0010000000000000. For -+ optimised register use subnormals are detected after offset has been -+ subtracted, so lower bound - offset (which wraps around). */ -+ .offset_lower_bound = V2 (0x0010000000000000 - 0x3fe6900900000000), -+ .special_bound = V4 (0x7fe00000), /* asuint64(inf) - asuint64(0x1p-126). */ - }; - --#define A(i) d->poly[i] - #define N (1 << V_LOG_TABLE_BITS) - #define IndexMask (N - 1) --#define Off v_u64 (0x3fe6900900000000) - - struct entry - { -@@ -64,48 +66,56 @@ lookup (uint64x2_t i) - } - - static float64x2_t VPCS_ATTR NOINLINE --special_case (float64x2_t x, float64x2_t y, float64x2_t hi, float64x2_t r2, -- uint32x2_t cmp) -+special_case (float64x2_t hi, uint64x2_t u_off, float64x2_t y, float64x2_t r2, -+ uint32x2_t special, const struct data *d) - { -- return v_call_f64 (log, x, vfmaq_f64 (hi, y, r2), vmovl_u32 (cmp)); -+ float64x2_t x = vreinterpretq_f64_u64 (vaddq_u64 (u_off, d->off)); -+ return v_call_f64 (log, x, vfmaq_f64 (hi, y, r2), vmovl_u32 (special)); - } - -+/* Double-precision vector log routine. -+ The maximum observed error is 2.17 ULP: -+ _ZGVnN2v_log(0x1.a6129884398a3p+0) got 0x1.ffffff1cca043p-2 -+ want 0x1.ffffff1cca045p-2. */ - float64x2_t VPCS_ATTR V_NAME_D1 (log) (float64x2_t x) - { - const struct data *d = ptr_barrier (&data); -- float64x2_t z, r, r2, p, y, kd, hi; -- uint64x2_t ix, iz, tmp; -- uint32x2_t cmp; -- int64x2_t k; -- struct entry e; - -- ix = vreinterpretq_u64_f64 (x); -- cmp = vcge_u32 (vsubhn_u64 (ix, d->min_norm), -- vget_low_u32 (d->special_bound)); -+ /* To avoid having to mov x out of the way, keep u after offset has been -+ applied, and recover x by adding the offset back in the special-case -+ handler. */ -+ uint64x2_t u = vreinterpretq_u64_f64 (x); -+ uint64x2_t u_off = vsubq_u64 (u, d->off); - - /* x = 2^k z; where z is in range [Off,2*Off) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- tmp = vsubq_u64 (ix, Off); -- k = vshrq_n_s64 (vreinterpretq_s64_u64 (tmp), 52); /* arithmetic shift. */ -- iz = vsubq_u64 (ix, vandq_u64 (tmp, d->sign_exp_mask)); -- z = vreinterpretq_f64_u64 (iz); -- e = lookup (tmp); -+ int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (u_off), 52); -+ uint64x2_t iz = vsubq_u64 (u, vandq_u64 (u_off, d->sign_exp_mask)); -+ float64x2_t z = vreinterpretq_f64_u64 (iz); -+ -+ struct entry e = lookup (u_off); -+ -+ uint32x2_t special = vcge_u32 (vsubhn_u64 (u_off, d->offset_lower_bound), -+ vget_low_u32 (d->special_bound)); - - /* log(x) = log1p(z/c-1) + log(c) + k*Ln2. */ -- r = vfmaq_f64 (v_f64 (-1.0), z, e.invc); -- kd = vcvtq_f64_s64 (k); -+ float64x2_t r = vfmaq_f64 (v_f64 (-1.0), z, e.invc); -+ float64x2_t kd = vcvtq_f64_s64 (k); - - /* hi = r + log(c) + k*Ln2. */ -- hi = vfmaq_f64 (vaddq_f64 (e.logc, r), kd, d->ln2); -+ float64x2_t ln2_and_c4 = vld1q_f64 (&d->ln2); -+ float64x2_t hi = vfmaq_laneq_f64 (vaddq_f64 (e.logc, r), kd, ln2_and_c4, 0); -+ - /* y = r2*(A0 + r*A1 + r2*(A2 + r*A3 + r2*A4)) + hi. */ -- r2 = vmulq_f64 (r, r); -- y = vfmaq_f64 (A (2), A (3), r); -- p = vfmaq_f64 (A (0), A (1), r); -- y = vfmaq_f64 (y, A (4), r2); -- y = vfmaq_f64 (p, y, r2); -- -- if (__glibc_unlikely (v_any_u32h (cmp))) -- return special_case (x, y, hi, r2, cmp); -+ float64x2_t odd_coeffs = vld1q_f64 (&d->c1); -+ float64x2_t r2 = vmulq_f64 (r, r); -+ float64x2_t y = vfmaq_laneq_f64 (d->c2, r, odd_coeffs, 1); -+ float64x2_t p = vfmaq_laneq_f64 (d->c0, r, odd_coeffs, 0); -+ y = vfmaq_laneq_f64 (y, r2, ln2_and_c4, 1); -+ y = vfmaq_f64 (p, r2, y); -+ -+ if (__glibc_unlikely (v_any_u32h (special))) -+ return special_case (hi, u_off, y, r2, special, d); - return vfmaq_f64 (hi, y, r2); - } - -commit 2aed9796bfb17b257e63b12cefdb7ff60be09626 -Author: Pierre Blanchard -Date: Mon Dec 9 15:55:39 2024 +0000 - - AArch64: Improve codegen in users of ADVSIMD log1p helper - - Add inline helper for log1p and rearrange operations so MOV - is not necessary in reduction or around the special-case handler. - Reduce memory access by using more indexed MLAs in polynomial. - Speedup on Neoverse V1 for log1p (3.5%), acosh (7.5%) and atanh (10%). - - (cherry picked from commit ca0c0d0f26fbf75b9cacc65122b457e8fdec40b8) - -diff --git a/sysdeps/aarch64/fpu/acosh_advsimd.c b/sysdeps/aarch64/fpu/acosh_advsimd.c -index c88283cf11..a98f4a2e4d 100644 ---- a/sysdeps/aarch64/fpu/acosh_advsimd.c -+++ b/sysdeps/aarch64/fpu/acosh_advsimd.c -@@ -54,9 +54,8 @@ VPCS_ATTR float64x2_t V_NAME_D1 (acosh) (float64x2_t x) - x = vbslq_f64 (special, vreinterpretq_f64_u64 (d->one), x); - #endif - -- float64x2_t xm1 = vsubq_f64 (x, v_f64 (1)); -- float64x2_t y; -- y = vaddq_f64 (x, v_f64 (1)); -+ float64x2_t xm1 = vsubq_f64 (x, v_f64 (1.0)); -+ float64x2_t y = vaddq_f64 (x, v_f64 (1.0)); - y = vmulq_f64 (y, xm1); - y = vsqrtq_f64 (y); - y = vaddq_f64 (xm1, y); -diff --git a/sysdeps/aarch64/fpu/atanh_advsimd.c b/sysdeps/aarch64/fpu/atanh_advsimd.c -index 3c3d0bd6ad..eb9769aeac 100644 ---- a/sysdeps/aarch64/fpu/atanh_advsimd.c -+++ b/sysdeps/aarch64/fpu/atanh_advsimd.c -@@ -23,15 +23,19 @@ - const static struct data - { - struct v_log1p_data log1p_consts; -- uint64x2_t one, half; -+ uint64x2_t one; -+ uint64x2_t sign_mask; - } data = { .log1p_consts = V_LOG1P_CONSTANTS_TABLE, - .one = V2 (0x3ff0000000000000), -- .half = V2 (0x3fe0000000000000) }; -+ .sign_mask = V2 (0x8000000000000000) }; - - static float64x2_t VPCS_ATTR NOINLINE --special_case (float64x2_t x, float64x2_t y, uint64x2_t special) -+special_case (float64x2_t x, float64x2_t halfsign, float64x2_t y, -+ uint64x2_t special, const struct data *d) - { -- return v_call_f64 (atanh, x, y, special); -+ y = log1p_inline (y, &d->log1p_consts); -+ return v_call_f64 (atanh, vbslq_f64 (d->sign_mask, halfsign, x), -+ vmulq_f64 (halfsign, y), special); - } - - /* Approximation for vector double-precision atanh(x) using modified log1p. -@@ -43,11 +47,10 @@ float64x2_t V_NAME_D1 (atanh) (float64x2_t x) - { - const struct data *d = ptr_barrier (&data); - -+ float64x2_t halfsign = vbslq_f64 (d->sign_mask, x, v_f64 (0.5)); - float64x2_t ax = vabsq_f64 (x); - uint64x2_t ia = vreinterpretq_u64_f64 (ax); -- uint64x2_t sign = veorq_u64 (vreinterpretq_u64_f64 (x), ia); - uint64x2_t special = vcgeq_u64 (ia, d->one); -- float64x2_t halfsign = vreinterpretq_f64_u64 (vorrq_u64 (sign, d->half)); - - #if WANT_SIMD_EXCEPT - ax = v_zerofy_f64 (ax, special); -@@ -55,10 +58,15 @@ float64x2_t V_NAME_D1 (atanh) (float64x2_t x) - - float64x2_t y; - y = vaddq_f64 (ax, ax); -- y = vdivq_f64 (y, vsubq_f64 (v_f64 (1), ax)); -- y = log1p_inline (y, &d->log1p_consts); -+ y = vdivq_f64 (y, vsubq_f64 (vreinterpretq_f64_u64 (d->one), ax)); - - if (__glibc_unlikely (v_any_u64 (special))) -- return special_case (x, vmulq_f64 (y, halfsign), special); -+#if WANT_SIMD_EXCEPT -+ return special_case (x, halfsign, y, special, d); -+#else -+ return special_case (ax, halfsign, y, special, d); -+#endif -+ -+ y = log1p_inline (y, &d->log1p_consts); - return vmulq_f64 (y, halfsign); - } -diff --git a/sysdeps/aarch64/fpu/log1p_advsimd.c b/sysdeps/aarch64/fpu/log1p_advsimd.c -index 114064c696..1263587201 100644 ---- a/sysdeps/aarch64/fpu/log1p_advsimd.c -+++ b/sysdeps/aarch64/fpu/log1p_advsimd.c -@@ -17,43 +17,26 @@ - License along with the GNU C Library; if not, see - . */ - --#include "v_math.h" --#include "poly_advsimd_f64.h" -+#define WANT_V_LOG1P_K0_SHORTCUT 0 -+#include "v_log1p_inline.h" - - const static struct data - { -- float64x2_t poly[19], ln2[2]; -- uint64x2_t hf_rt2_top, one_m_hf_rt2_top, umask, inf, minus_one; -- int64x2_t one_top; --} data = { -- /* Generated using Remez, deg=20, in [sqrt(2)/2-1, sqrt(2)-1]. */ -- .poly = { V2 (-0x1.ffffffffffffbp-2), V2 (0x1.55555555551a9p-2), -- V2 (-0x1.00000000008e3p-2), V2 (0x1.9999999a32797p-3), -- V2 (-0x1.555555552fecfp-3), V2 (0x1.249248e071e5ap-3), -- V2 (-0x1.ffffff8bf8482p-4), V2 (0x1.c71c8f07da57ap-4), -- V2 (-0x1.9999ca4ccb617p-4), V2 (0x1.7459ad2e1dfa3p-4), -- V2 (-0x1.554d2680a3ff2p-4), V2 (0x1.3b4c54d487455p-4), -- V2 (-0x1.2548a9ffe80e6p-4), V2 (0x1.0f389a24b2e07p-4), -- V2 (-0x1.eee4db15db335p-5), V2 (0x1.e95b494d4a5ddp-5), -- V2 (-0x1.15fdf07cb7c73p-4), V2 (0x1.0310b70800fcfp-4), -- V2 (-0x1.cfa7385bdb37ep-6) }, -- .ln2 = { V2 (0x1.62e42fefa3800p-1), V2 (0x1.ef35793c76730p-45) }, -- /* top32(asuint64(sqrt(2)/2)) << 32. */ -- .hf_rt2_top = V2 (0x3fe6a09e00000000), -- /* (top32(asuint64(1)) - top32(asuint64(sqrt(2)/2))) << 32. */ -- .one_m_hf_rt2_top = V2 (0x00095f6200000000), -- .umask = V2 (0x000fffff00000000), -- .one_top = V2 (0x3ff), -- .inf = V2 (0x7ff0000000000000), -- .minus_one = V2 (0xbff0000000000000) --}; -+ struct v_log1p_data d; -+ uint64x2_t inf, minus_one; -+} data = { .d = V_LOG1P_CONSTANTS_TABLE, -+ .inf = V2 (0x7ff0000000000000), -+ .minus_one = V2 (0xbff0000000000000) }; - - #define BottomMask v_u64 (0xffffffff) - --static float64x2_t VPCS_ATTR NOINLINE --special_case (float64x2_t x, float64x2_t y, uint64x2_t special) -+static float64x2_t NOINLINE VPCS_ATTR -+special_case (float64x2_t x, uint64x2_t cmp, const struct data *d) - { -- return v_call_f64 (log1p, x, y, special); -+ /* Side-step special lanes so fenv exceptions are not triggered -+ inadvertently. */ -+ float64x2_t x_nospecial = v_zerofy_f64 (x, cmp); -+ return v_call_f64 (log1p, x, log1p_inline (x_nospecial, &d->d), cmp); - } - - /* Vector log1p approximation using polynomial on reduced interval. Routine is -@@ -66,66 +49,14 @@ VPCS_ATTR float64x2_t V_NAME_D1 (log1p) (float64x2_t x) - const struct data *d = ptr_barrier (&data); - uint64x2_t ix = vreinterpretq_u64_f64 (x); - uint64x2_t ia = vreinterpretq_u64_f64 (vabsq_f64 (x)); -- uint64x2_t special = vcgeq_u64 (ia, d->inf); - --#if WANT_SIMD_EXCEPT -- special = vorrq_u64 (special, -- vcgeq_u64 (ix, vreinterpretq_u64_f64 (v_f64 (-1)))); -- if (__glibc_unlikely (v_any_u64 (special))) -- x = v_zerofy_f64 (x, special); --#else -- special = vorrq_u64 (special, vcleq_f64 (x, v_f64 (-1))); --#endif -+ uint64x2_t special_cases -+ = vorrq_u64 (vcgeq_u64 (ia, d->inf), vcgeq_u64 (ix, d->minus_one)); - -- /* With x + 1 = t * 2^k (where t = f + 1 and k is chosen such that f -- is in [sqrt(2)/2, sqrt(2)]): -- log1p(x) = k*log(2) + log1p(f). -+ if (__glibc_unlikely (v_any_u64 (special_cases))) -+ return special_case (x, special_cases, d); - -- f may not be representable exactly, so we need a correction term: -- let m = round(1 + x), c = (1 + x) - m. -- c << m: at very small x, log1p(x) ~ x, hence: -- log(1+x) - log(m) ~ c/m. -- -- We therefore calculate log1p(x) by k*log2 + log1p(f) + c/m. */ -- -- /* Obtain correctly scaled k by manipulation in the exponent. -- The scalar algorithm casts down to 32-bit at this point to calculate k and -- u_red. We stay in double-width to obtain f and k, using the same constants -- as the scalar algorithm but shifted left by 32. */ -- float64x2_t m = vaddq_f64 (x, v_f64 (1)); -- uint64x2_t mi = vreinterpretq_u64_f64 (m); -- uint64x2_t u = vaddq_u64 (mi, d->one_m_hf_rt2_top); -- -- int64x2_t ki -- = vsubq_s64 (vreinterpretq_s64_u64 (vshrq_n_u64 (u, 52)), d->one_top); -- float64x2_t k = vcvtq_f64_s64 (ki); -- -- /* Reduce x to f in [sqrt(2)/2, sqrt(2)]. */ -- uint64x2_t utop = vaddq_u64 (vandq_u64 (u, d->umask), d->hf_rt2_top); -- uint64x2_t u_red = vorrq_u64 (utop, vandq_u64 (mi, BottomMask)); -- float64x2_t f = vsubq_f64 (vreinterpretq_f64_u64 (u_red), v_f64 (1)); -- -- /* Correction term c/m. */ -- float64x2_t cm = vdivq_f64 (vsubq_f64 (x, vsubq_f64 (m, v_f64 (1))), m); -- -- /* Approximate log1p(x) on the reduced input using a polynomial. Because -- log1p(0)=0 we choose an approximation of the form: -- x + C0*x^2 + C1*x^3 + C2x^4 + ... -- Hence approximation has the form f + f^2 * P(f) -- where P(x) = C0 + C1*x + C2x^2 + ... -- Assembling this all correctly is dealt with at the final step. */ -- float64x2_t f2 = vmulq_f64 (f, f); -- float64x2_t p = v_pw_horner_18_f64 (f, f2, d->poly); -- -- float64x2_t ylo = vfmaq_f64 (cm, k, d->ln2[1]); -- float64x2_t yhi = vfmaq_f64 (f, k, d->ln2[0]); -- float64x2_t y = vaddq_f64 (ylo, yhi); -- -- if (__glibc_unlikely (v_any_u64 (special))) -- return special_case (vreinterpretq_f64_u64 (ix), vfmaq_f64 (y, f2, p), -- special); -- -- return vfmaq_f64 (y, f2, p); -+ return log1p_inline (x, &d->d); - } - - strong_alias (V_NAME_D1 (log1p), V_NAME_D1 (logp1)) -diff --git a/sysdeps/aarch64/fpu/v_log1p_inline.h b/sysdeps/aarch64/fpu/v_log1p_inline.h -index 242e43b6ee..834ff65adf 100644 ---- a/sysdeps/aarch64/fpu/v_log1p_inline.h -+++ b/sysdeps/aarch64/fpu/v_log1p_inline.h -@@ -21,29 +21,30 @@ - #define AARCH64_FPU_V_LOG1P_INLINE_H - - #include "v_math.h" --#include "poly_advsimd_f64.h" - - struct v_log1p_data - { -- float64x2_t poly[19], ln2[2]; -+ float64x2_t c0, c2, c4, c6, c8, c10, c12, c14, c16; - uint64x2_t hf_rt2_top, one_m_hf_rt2_top, umask; - int64x2_t one_top; -+ double c1, c3, c5, c7, c9, c11, c13, c15, c17, c18; -+ double ln2[2]; - }; - - /* Coefficients generated using Remez, deg=20, in [sqrt(2)/2-1, sqrt(2)-1]. */ - #define V_LOG1P_CONSTANTS_TABLE \ - { \ -- .poly = { V2 (-0x1.ffffffffffffbp-2), V2 (0x1.55555555551a9p-2), \ -- V2 (-0x1.00000000008e3p-2), V2 (0x1.9999999a32797p-3), \ -- V2 (-0x1.555555552fecfp-3), V2 (0x1.249248e071e5ap-3), \ -- V2 (-0x1.ffffff8bf8482p-4), V2 (0x1.c71c8f07da57ap-4), \ -- V2 (-0x1.9999ca4ccb617p-4), V2 (0x1.7459ad2e1dfa3p-4), \ -- V2 (-0x1.554d2680a3ff2p-4), V2 (0x1.3b4c54d487455p-4), \ -- V2 (-0x1.2548a9ffe80e6p-4), V2 (0x1.0f389a24b2e07p-4), \ -- V2 (-0x1.eee4db15db335p-5), V2 (0x1.e95b494d4a5ddp-5), \ -- V2 (-0x1.15fdf07cb7c73p-4), V2 (0x1.0310b70800fcfp-4), \ -- V2 (-0x1.cfa7385bdb37ep-6) }, \ -- .ln2 = { V2 (0x1.62e42fefa3800p-1), V2 (0x1.ef35793c76730p-45) }, \ -+ .c0 = V2 (-0x1.ffffffffffffbp-2), .c1 = 0x1.55555555551a9p-2, \ -+ .c2 = V2 (-0x1.00000000008e3p-2), .c3 = 0x1.9999999a32797p-3, \ -+ .c4 = V2 (-0x1.555555552fecfp-3), .c5 = 0x1.249248e071e5ap-3, \ -+ .c6 = V2 (-0x1.ffffff8bf8482p-4), .c7 = 0x1.c71c8f07da57ap-4, \ -+ .c8 = V2 (-0x1.9999ca4ccb617p-4), .c9 = 0x1.7459ad2e1dfa3p-4, \ -+ .c10 = V2 (-0x1.554d2680a3ff2p-4), .c11 = 0x1.3b4c54d487455p-4, \ -+ .c12 = V2 (-0x1.2548a9ffe80e6p-4), .c13 = 0x1.0f389a24b2e07p-4, \ -+ .c14 = V2 (-0x1.eee4db15db335p-5), .c15 = 0x1.e95b494d4a5ddp-5, \ -+ .c16 = V2 (-0x1.15fdf07cb7c73p-4), .c17 = 0x1.0310b70800fcfp-4, \ -+ .c18 = -0x1.cfa7385bdb37ep-6, \ -+ .ln2 = { 0x1.62e42fefa3800p-1, 0x1.ef35793c76730p-45 }, \ - .hf_rt2_top = V2 (0x3fe6a09e00000000), \ - .one_m_hf_rt2_top = V2 (0x00095f6200000000), \ - .umask = V2 (0x000fffff00000000), .one_top = V2 (0x3ff) \ -@@ -51,19 +52,45 @@ struct v_log1p_data - - #define BottomMask v_u64 (0xffffffff) - -+static inline float64x2_t -+eval_poly (float64x2_t m, float64x2_t m2, const struct v_log1p_data *d) -+{ -+ /* Approximate log(1+m) on [-0.25, 0.5] using pairwise Horner. */ -+ float64x2_t c13 = vld1q_f64 (&d->c1); -+ float64x2_t c57 = vld1q_f64 (&d->c5); -+ float64x2_t c911 = vld1q_f64 (&d->c9); -+ float64x2_t c1315 = vld1q_f64 (&d->c13); -+ float64x2_t c1718 = vld1q_f64 (&d->c17); -+ float64x2_t p1617 = vfmaq_laneq_f64 (d->c16, m, c1718, 0); -+ float64x2_t p1415 = vfmaq_laneq_f64 (d->c14, m, c1315, 1); -+ float64x2_t p1213 = vfmaq_laneq_f64 (d->c12, m, c1315, 0); -+ float64x2_t p1011 = vfmaq_laneq_f64 (d->c10, m, c911, 1); -+ float64x2_t p89 = vfmaq_laneq_f64 (d->c8, m, c911, 0); -+ float64x2_t p67 = vfmaq_laneq_f64 (d->c6, m, c57, 1); -+ float64x2_t p45 = vfmaq_laneq_f64 (d->c4, m, c57, 0); -+ float64x2_t p23 = vfmaq_laneq_f64 (d->c2, m, c13, 1); -+ float64x2_t p01 = vfmaq_laneq_f64 (d->c0, m, c13, 0); -+ float64x2_t p = vfmaq_laneq_f64 (p1617, m2, c1718, 1); -+ p = vfmaq_f64 (p1415, m2, p); -+ p = vfmaq_f64 (p1213, m2, p); -+ p = vfmaq_f64 (p1011, m2, p); -+ p = vfmaq_f64 (p89, m2, p); -+ p = vfmaq_f64 (p67, m2, p); -+ p = vfmaq_f64 (p45, m2, p); -+ p = vfmaq_f64 (p23, m2, p); -+ return vfmaq_f64 (p01, m2, p); -+} -+ - static inline float64x2_t - log1p_inline (float64x2_t x, const struct v_log1p_data *d) - { -- /* Helper for calculating log(x + 1). Copied from v_log1p_2u5.c, with several -- modifications: -+ /* Helper for calculating log(x + 1): - - No special-case handling - this should be dealt with by the caller. -- - Pairwise Horner polynomial evaluation for improved accuracy. - - Optionally simulate the shortcut for k=0, used in the scalar routine, -- using v_sel, for improved accuracy when the argument to log1p is close to -- 0. This feature is enabled by defining WANT_V_LOG1P_K0_SHORTCUT as 1 in -- the source of the caller before including this file. -- See v_log1pf_2u1.c for details of the algorithm. */ -- float64x2_t m = vaddq_f64 (x, v_f64 (1)); -+ using v_sel, for improved accuracy when the argument to log1p is close -+ to 0. This feature is enabled by defining WANT_V_LOG1P_K0_SHORTCUT as 1 -+ in the source of the caller before including this file. */ -+ float64x2_t m = vaddq_f64 (x, v_f64 (1.0)); - uint64x2_t mi = vreinterpretq_u64_f64 (m); - uint64x2_t u = vaddq_u64 (mi, d->one_m_hf_rt2_top); - -@@ -74,14 +101,14 @@ log1p_inline (float64x2_t x, const struct v_log1p_data *d) - /* Reduce x to f in [sqrt(2)/2, sqrt(2)]. */ - uint64x2_t utop = vaddq_u64 (vandq_u64 (u, d->umask), d->hf_rt2_top); - uint64x2_t u_red = vorrq_u64 (utop, vandq_u64 (mi, BottomMask)); -- float64x2_t f = vsubq_f64 (vreinterpretq_f64_u64 (u_red), v_f64 (1)); -+ float64x2_t f = vsubq_f64 (vreinterpretq_f64_u64 (u_red), v_f64 (1.0)); - - /* Correction term c/m. */ -- float64x2_t cm = vdivq_f64 (vsubq_f64 (x, vsubq_f64 (m, v_f64 (1))), m); -+ float64x2_t cm = vdivq_f64 (vsubq_f64 (x, vsubq_f64 (m, v_f64 (1.0))), m); - - #ifndef WANT_V_LOG1P_K0_SHORTCUT --#error \ -- "Cannot use v_log1p_inline.h without specifying whether you need the k0 shortcut for greater accuracy close to 0" -+# error \ -+ "Cannot use v_log1p_inline.h without specifying whether you need the k0 shortcut for greater accuracy close to 0" - #elif WANT_V_LOG1P_K0_SHORTCUT - /* Shortcut if k is 0 - set correction term to 0 and f to x. The result is - that the approximation is solely the polynomial. */ -@@ -92,11 +119,12 @@ log1p_inline (float64x2_t x, const struct v_log1p_data *d) - - /* Approximate log1p(f) on the reduced input using a polynomial. */ - float64x2_t f2 = vmulq_f64 (f, f); -- float64x2_t p = v_pw_horner_18_f64 (f, f2, d->poly); -+ float64x2_t p = eval_poly (f, f2, d); - - /* Assemble log1p(x) = k * log2 + log1p(f) + c/m. */ -- float64x2_t ylo = vfmaq_f64 (cm, k, d->ln2[1]); -- float64x2_t yhi = vfmaq_f64 (f, k, d->ln2[0]); -+ float64x2_t ln2 = vld1q_f64 (&d->ln2[0]); -+ float64x2_t ylo = vfmaq_laneq_f64 (cm, k, ln2, 1); -+ float64x2_t yhi = vfmaq_laneq_f64 (f, k, ln2, 0); - return vfmaq_f64 (vaddq_f64 (ylo, yhi), f2, p); - } - - -commit 9170b921fa49d2ef37141506837baaae92c7d3f8 -Author: Joana Cruz -Date: Tue Dec 17 14:47:31 2024 +0000 - - AArch64: Improve codegen of AdvSIMD logf function family - - Load the polynomial evaluation coefficients into 2 vectors and use lanewise MLAs. - 8% improvement in throughput microbenchmark on Neoverse V1 for log2 and log, - and 2% for log10. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit d6e034f5b222a9ed1aeb5de0c0c7d0dda8b63da3) - -diff --git a/sysdeps/aarch64/fpu/log10f_advsimd.c b/sysdeps/aarch64/fpu/log10f_advsimd.c -index 82228b599a..0d792c3df9 100644 ---- a/sysdeps/aarch64/fpu/log10f_advsimd.c -+++ b/sysdeps/aarch64/fpu/log10f_advsimd.c -@@ -18,21 +18,25 @@ - . */ - - #include "v_math.h" --#include "poly_advsimd_f32.h" - - static const struct data - { -+ float32x4_t c0, c2, c4, c6, inv_ln10, ln2; - uint32x4_t off, offset_lower_bound; - uint16x8_t special_bound; - uint32x4_t mantissa_mask; -- float32x4_t poly[8]; -- float32x4_t inv_ln10, ln2; -+ float c1, c3, c5, c7; - } data = { - /* Use order 9 for log10(1+x), i.e. order 8 for log10(1+x)/x, with x in - [-1/3, 1/3] (offset=2/3). Max. relative error: 0x1.068ee468p-25. */ -- .poly = { V4 (-0x1.bcb79cp-3f), V4 (0x1.2879c8p-3f), V4 (-0x1.bcd472p-4f), -- V4 (0x1.6408f8p-4f), V4 (-0x1.246f8p-4f), V4 (0x1.f0e514p-5f), -- V4 (-0x1.0fc92cp-4f), V4 (0x1.f5f76ap-5f) }, -+ .c0 = V4 (-0x1.bcb79cp-3f), -+ .c1 = 0x1.2879c8p-3f, -+ .c2 = V4 (-0x1.bcd472p-4f), -+ .c3 = 0x1.6408f8p-4f, -+ .c4 = V4 (-0x1.246f8p-4f), -+ .c5 = 0x1.f0e514p-5f, -+ .c6 = V4 (-0x1.0fc92cp-4f), -+ .c7 = 0x1.f5f76ap-5f, - .ln2 = V4 (0x1.62e43p-1f), - .inv_ln10 = V4 (0x1.bcb7b2p-2f), - /* Lower bound is the smallest positive normal float 0x00800000. For -@@ -62,7 +66,7 @@ special_case (float32x4_t y, uint32x4_t u_off, float32x4_t p, float32x4_t r2, - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log10) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- -+ float32x4_t c1357 = vld1q_f32 (&d->c1); - /* To avoid having to mov x out of the way, keep u after offset has been - applied, and recover x by adding the offset back in the special-case - handler. */ -@@ -81,7 +85,16 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log10) (float32x4_t x) - - /* y = log10(1+r) + n * log10(2). */ - float32x4_t r2 = vmulq_f32 (r, r); -- float32x4_t poly = v_pw_horner_7_f32 (r, r2, d->poly); -+ -+ float32x4_t c01 = vfmaq_laneq_f32 (d->c0, r, c1357, 0); -+ float32x4_t c23 = vfmaq_laneq_f32 (d->c2, r, c1357, 1); -+ float32x4_t c45 = vfmaq_laneq_f32 (d->c4, r, c1357, 2); -+ float32x4_t c67 = vfmaq_laneq_f32 (d->c6, r, c1357, 3); -+ -+ float32x4_t p47 = vfmaq_f32 (c45, r2, c67); -+ float32x4_t p27 = vfmaq_f32 (c23, r2, p47); -+ float32x4_t poly = vfmaq_f32 (c01, r2, p27); -+ - /* y = Log10(2) * n + poly * InvLn(10). */ - float32x4_t y = vfmaq_f32 (r, d->ln2, n); - y = vmulq_f32 (y, d->inv_ln10); -diff --git a/sysdeps/aarch64/fpu/log2f_advsimd.c b/sysdeps/aarch64/fpu/log2f_advsimd.c -index 84effe4fe9..116c36c8e2 100644 ---- a/sysdeps/aarch64/fpu/log2f_advsimd.c -+++ b/sysdeps/aarch64/fpu/log2f_advsimd.c -@@ -18,22 +18,27 @@ - . */ - - #include "v_math.h" --#include "poly_advsimd_f32.h" - - static const struct data - { -+ float32x4_t c0, c2, c4, c6, c8; - uint32x4_t off, offset_lower_bound; - uint16x8_t special_bound; - uint32x4_t mantissa_mask; -- float32x4_t poly[9]; -+ float c1, c3, c5, c7; - } data = { - /* Coefficients generated using Remez algorithm approximate - log2(1+r)/r for r in [ -1/3, 1/3 ]. - rel error: 0x1.c4c4b0cp-26. */ -- .poly = { V4 (0x1.715476p0f), /* (float)(1 / ln(2)). */ -- V4 (-0x1.715458p-1f), V4 (0x1.ec701cp-2f), V4 (-0x1.7171a4p-2f), -- V4 (0x1.27a0b8p-2f), V4 (-0x1.e5143ep-3f), V4 (0x1.9d8ecap-3f), -- V4 (-0x1.c675bp-3f), V4 (0x1.9e495p-3f) }, -+ .c0 = V4 (0x1.715476p0f), /* (float)(1 / ln(2)). */ -+ .c1 = -0x1.715458p-1f, -+ .c2 = V4 (0x1.ec701cp-2f), -+ .c3 = -0x1.7171a4p-2f, -+ .c4 = V4 (0x1.27a0b8p-2f), -+ .c5 = -0x1.e5143ep-3f, -+ .c6 = V4 (0x1.9d8ecap-3f), -+ .c7 = -0x1.c675bp-3f, -+ .c8 = V4 (0x1.9e495p-3f), - /* Lower bound is the smallest positive normal float 0x00800000. For - optimised register use subnormals are detected after offset has been - subtracted, so lower bound is 0x0080000 - offset (which wraps around). */ -@@ -79,11 +84,21 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log2) (float32x4_t x) - - /* y = log2(1+r) + n. */ - float32x4_t r2 = vmulq_f32 (r, r); -- float32x4_t p = v_pw_horner_8_f32 (r, r2, d->poly); -+ -+ float32x4_t c1357 = vld1q_f32 (&d->c1); -+ float32x4_t c01 = vfmaq_laneq_f32 (d->c0, r, c1357, 0); -+ float32x4_t c23 = vfmaq_laneq_f32 (d->c2, r, c1357, 1); -+ float32x4_t c45 = vfmaq_laneq_f32 (d->c4, r, c1357, 2); -+ float32x4_t c67 = vfmaq_laneq_f32 (d->c6, r, c1357, 3); -+ float32x4_t p68 = vfmaq_f32 (c67, r2, d->c8); -+ float32x4_t p48 = vfmaq_f32 (c45, r2, p68); -+ float32x4_t p28 = vfmaq_f32 (c23, r2, p48); -+ float32x4_t p = vfmaq_f32 (c01, r2, p28); - - if (__glibc_unlikely (v_any_u16h (special))) - return special_case (n, u_off, p, r, special, d); - return vfmaq_f32 (n, p, r); - } -+ - libmvec_hidden_def (V_NAME_F1 (log2)) - HALF_WIDTH_ALIAS_F1 (log2) -diff --git a/sysdeps/aarch64/fpu/logf_advsimd.c b/sysdeps/aarch64/fpu/logf_advsimd.c -index c20dbfd6c0..d9e64c732d 100644 ---- a/sysdeps/aarch64/fpu/logf_advsimd.c -+++ b/sysdeps/aarch64/fpu/logf_advsimd.c -@@ -21,16 +21,19 @@ - - static const struct data - { -- uint32x4_t off, offset_lower_bound; -+ float32x4_t c2, c4, c6, ln2; -+ uint32x4_t off, offset_lower_bound, mantissa_mask; - uint16x8_t special_bound; -- uint32x4_t mantissa_mask; -- float32x4_t poly[7]; -- float32x4_t ln2; -+ float c1, c3, c5, c0; - } data = { - /* 3.34 ulp error. */ -- .poly = { V4 (-0x1.3e737cp-3f), V4 (0x1.5a9aa2p-3f), V4 (-0x1.4f9934p-3f), -- V4 (0x1.961348p-3f), V4 (-0x1.00187cp-2f), V4 (0x1.555d7cp-2f), -- V4 (-0x1.ffffc8p-2f) }, -+ .c0 = -0x1.3e737cp-3f, -+ .c1 = 0x1.5a9aa2p-3f, -+ .c2 = V4 (-0x1.4f9934p-3f), -+ .c3 = 0x1.961348p-3f, -+ .c4 = V4 (-0x1.00187cp-2f), -+ .c5 = 0x1.555d7cp-2f, -+ .c6 = V4 (-0x1.ffffc8p-2f), - .ln2 = V4 (0x1.62e43p-1f), - /* Lower bound is the smallest positive normal float 0x00800000. For - optimised register use subnormals are detected after offset has been -@@ -41,8 +44,6 @@ static const struct data - .mantissa_mask = V4 (0x007fffff) - }; - --#define P(i) d->poly[7 - i] -- - static float32x4_t VPCS_ATTR NOINLINE - special_case (float32x4_t p, uint32x4_t u_off, float32x4_t y, float32x4_t r2, - uint16x4_t cmp, const struct data *d) -@@ -55,33 +56,30 @@ special_case (float32x4_t p, uint32x4_t u_off, float32x4_t y, float32x4_t r2, - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (log) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- float32x4_t n, p, q, r, r2, y; -- uint32x4_t u, u_off; -- uint16x4_t cmp; -+ float32x4_t c1350 = vld1q_f32 (&d->c1); - - /* To avoid having to mov x out of the way, keep u after offset has been - applied, and recover x by adding the offset back in the special-case - handler. */ -- u_off = vreinterpretq_u32_f32 (x); -+ uint32x4_t u_off = vsubq_u32 (vreinterpretq_u32_f32 (x), d->off); - - /* x = 2^n * (1+r), where 2/3 < 1+r < 4/3. */ -- u_off = vsubq_u32 (u_off, d->off); -- n = vcvtq_f32_s32 ( -+ float32x4_t n = vcvtq_f32_s32 ( - vshrq_n_s32 (vreinterpretq_s32_u32 (u_off), 23)); /* signextend. */ -- u = vandq_u32 (u_off, d->mantissa_mask); -- u = vaddq_u32 (u, d->off); -- r = vsubq_f32 (vreinterpretq_f32_u32 (u), v_f32 (1.0f)); -+ uint16x4_t cmp = vcge_u16 (vsubhn_u32 (u_off, d->offset_lower_bound), -+ vget_low_u16 (d->special_bound)); - -- cmp = vcge_u16 (vsubhn_u32 (u_off, d->offset_lower_bound), -- vget_low_u16 (d->special_bound)); -+ uint32x4_t u = vaddq_u32 (vandq_u32 (u_off, d->mantissa_mask), d->off); -+ float32x4_t r = vsubq_f32 (vreinterpretq_f32_u32 (u), v_f32 (1.0f)); - - /* y = log(1+r) + n*ln2. */ -- r2 = vmulq_f32 (r, r); -+ float32x4_t r2 = vmulq_f32 (r, r); - /* n*ln2 + r + r2*(P1 + r*P2 + r2*(P3 + r*P4 + r2*(P5 + r*P6 + r2*P7))). */ -- p = vfmaq_f32 (P (5), P (6), r); -- q = vfmaq_f32 (P (3), P (4), r); -- y = vfmaq_f32 (P (1), P (2), r); -- p = vfmaq_f32 (p, P (7), r2); -+ float32x4_t p = vfmaq_laneq_f32 (d->c2, r, c1350, 0); -+ float32x4_t q = vfmaq_laneq_f32 (d->c4, r, c1350, 1); -+ float32x4_t y = vfmaq_laneq_f32 (d->c6, r, c1350, 2); -+ p = vfmaq_laneq_f32 (p, r2, c1350, 3); -+ - q = vfmaq_f32 (q, p, r2); - y = vfmaq_f32 (y, q, r2); - p = vfmaq_f32 (r, d->ln2, n); - -commit 41dc9e7c2d80bc5e886950b8a7bd21f77c9793b3 -Author: Joana Cruz -Date: Tue Dec 17 14:49:30 2024 +0000 - - AArch64: Improve codegen of AdvSIMD atan(2)(f) - - Load the polynomial evaluation coefficients into 2 vectors and use lanewise MLAs. - 8% improvement in throughput microbenchmark on Neoverse V1. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 6914774b9d3460876d9ad4482782213ec01a752e) - -diff --git a/sysdeps/aarch64/fpu/atan2_advsimd.c b/sysdeps/aarch64/fpu/atan2_advsimd.c -index b1e7a9b8fc..1a8f02109f 100644 ---- a/sysdeps/aarch64/fpu/atan2_advsimd.c -+++ b/sysdeps/aarch64/fpu/atan2_advsimd.c -@@ -23,40 +23,57 @@ - - static const struct data - { -+ float64x2_t c0, c2, c4, c6, c8, c10, c12, c14, c16, c18; - float64x2_t pi_over_2; -- float64x2_t poly[20]; -+ double c1, c3, c5, c7, c9, c11, c13, c15, c17, c19; -+ uint64x2_t zeroinfnan, minustwo; - } data = { - /* Coefficients of polynomial P such that atan(x)~x+x*P(x^2) on -- the interval [2**-1022, 1.0]. */ -- .poly = { V2 (-0x1.5555555555555p-2), V2 (0x1.99999999996c1p-3), -- V2 (-0x1.2492492478f88p-3), V2 (0x1.c71c71bc3951cp-4), -- V2 (-0x1.745d160a7e368p-4), V2 (0x1.3b139b6a88ba1p-4), -- V2 (-0x1.11100ee084227p-4), V2 (0x1.e1d0f9696f63bp-5), -- V2 (-0x1.aebfe7b418581p-5), V2 (0x1.842dbe9b0d916p-5), -- V2 (-0x1.5d30140ae5e99p-5), V2 (0x1.338e31eb2fbbcp-5), -- V2 (-0x1.00e6eece7de8p-5), V2 (0x1.860897b29e5efp-6), -- V2 (-0x1.0051381722a59p-6), V2 (0x1.14e9dc19a4a4ep-7), -- V2 (-0x1.d0062b42fe3bfp-9), V2 (0x1.17739e210171ap-10), -- V2 (-0x1.ab24da7be7402p-13), V2 (0x1.358851160a528p-16), }, -+ [2**-1022, 1.0]. */ -+ .c0 = V2 (-0x1.5555555555555p-2), -+ .c1 = 0x1.99999999996c1p-3, -+ .c2 = V2 (-0x1.2492492478f88p-3), -+ .c3 = 0x1.c71c71bc3951cp-4, -+ .c4 = V2 (-0x1.745d160a7e368p-4), -+ .c5 = 0x1.3b139b6a88ba1p-4, -+ .c6 = V2 (-0x1.11100ee084227p-4), -+ .c7 = 0x1.e1d0f9696f63bp-5, -+ .c8 = V2 (-0x1.aebfe7b418581p-5), -+ .c9 = 0x1.842dbe9b0d916p-5, -+ .c10 = V2 (-0x1.5d30140ae5e99p-5), -+ .c11 = 0x1.338e31eb2fbbcp-5, -+ .c12 = V2 (-0x1.00e6eece7de8p-5), -+ .c13 = 0x1.860897b29e5efp-6, -+ .c14 = V2 (-0x1.0051381722a59p-6), -+ .c15 = 0x1.14e9dc19a4a4ep-7, -+ .c16 = V2 (-0x1.d0062b42fe3bfp-9), -+ .c17 = 0x1.17739e210171ap-10, -+ .c18 = V2 (-0x1.ab24da7be7402p-13), -+ .c19 = 0x1.358851160a528p-16, - .pi_over_2 = V2 (0x1.921fb54442d18p+0), -+ .zeroinfnan = V2 (2 * 0x7ff0000000000000ul - 1), -+ .minustwo = V2 (0xc000000000000000), - }; - - #define SignMask v_u64 (0x8000000000000000) - - /* Special cases i.e. 0, infinity, NaN (fall back to scalar calls). */ - static float64x2_t VPCS_ATTR NOINLINE --special_case (float64x2_t y, float64x2_t x, float64x2_t ret, uint64x2_t cmp) -+special_case (float64x2_t y, float64x2_t x, float64x2_t ret, -+ uint64x2_t sign_xy, uint64x2_t cmp) - { -+ /* Account for the sign of x and y. */ -+ ret = vreinterpretq_f64_u64 ( -+ veorq_u64 (vreinterpretq_u64_f64 (ret), sign_xy)); - return v_call2_f64 (atan2, y, x, ret, cmp); - } - - /* Returns 1 if input is the bit representation of 0, infinity or nan. */ - static inline uint64x2_t --zeroinfnan (uint64x2_t i) -+zeroinfnan (uint64x2_t i, const struct data *d) - { - /* (2 * i - 1) >= (2 * asuint64 (INFINITY) - 1). */ -- return vcgeq_u64 (vsubq_u64 (vaddq_u64 (i, i), v_u64 (1)), -- v_u64 (2 * asuint64 (INFINITY) - 1)); -+ return vcgeq_u64 (vsubq_u64 (vaddq_u64 (i, i), v_u64 (1)), d->zeroinfnan); - } - - /* Fast implementation of vector atan2. -@@ -66,12 +83,13 @@ zeroinfnan (uint64x2_t i) - want 0x1.92d628ab678cfp-1. */ - float64x2_t VPCS_ATTR V_NAME_D2 (atan2) (float64x2_t y, float64x2_t x) - { -- const struct data *data_ptr = ptr_barrier (&data); -+ const struct data *d = ptr_barrier (&data); - - uint64x2_t ix = vreinterpretq_u64_f64 (x); - uint64x2_t iy = vreinterpretq_u64_f64 (y); - -- uint64x2_t special_cases = vorrq_u64 (zeroinfnan (ix), zeroinfnan (iy)); -+ uint64x2_t special_cases -+ = vorrq_u64 (zeroinfnan (ix, d), zeroinfnan (iy, d)); - - uint64x2_t sign_x = vandq_u64 (ix, SignMask); - uint64x2_t sign_y = vandq_u64 (iy, SignMask); -@@ -81,18 +99,18 @@ float64x2_t VPCS_ATTR V_NAME_D2 (atan2) (float64x2_t y, float64x2_t x) - float64x2_t ay = vabsq_f64 (y); - - uint64x2_t pred_xlt0 = vcltzq_f64 (x); -- uint64x2_t pred_aygtax = vcgtq_f64 (ay, ax); -+ uint64x2_t pred_aygtax = vcagtq_f64 (y, x); - - /* Set up z for call to atan. */ - float64x2_t n = vbslq_f64 (pred_aygtax, vnegq_f64 (ax), ay); -- float64x2_t d = vbslq_f64 (pred_aygtax, ay, ax); -- float64x2_t z = vdivq_f64 (n, d); -+ float64x2_t q = vbslq_f64 (pred_aygtax, ay, ax); -+ float64x2_t z = vdivq_f64 (n, q); - - /* Work out the correct shift. */ -- float64x2_t shift = vreinterpretq_f64_u64 ( -- vandq_u64 (pred_xlt0, vreinterpretq_u64_f64 (v_f64 (-2.0)))); -+ float64x2_t shift -+ = vreinterpretq_f64_u64 (vandq_u64 (pred_xlt0, d->minustwo)); - shift = vbslq_f64 (pred_aygtax, vaddq_f64 (shift, v_f64 (1.0)), shift); -- shift = vmulq_f64 (shift, data_ptr->pi_over_2); -+ shift = vmulq_f64 (shift, d->pi_over_2); - - /* Calculate the polynomial approximation. - Use split Estrin scheme for P(z^2) with deg(P)=19. Use split instead of -@@ -103,20 +121,52 @@ float64x2_t VPCS_ATTR V_NAME_D2 (atan2) (float64x2_t y, float64x2_t x) - float64x2_t x2 = vmulq_f64 (z2, z2); - float64x2_t x4 = vmulq_f64 (x2, x2); - float64x2_t x8 = vmulq_f64 (x4, x4); -- float64x2_t ret -- = vfmaq_f64 (v_estrin_7_f64 (z2, x2, x4, data_ptr->poly), -- v_estrin_11_f64 (z2, x2, x4, x8, data_ptr->poly + 8), x8); -+ -+ float64x2_t c13 = vld1q_f64 (&d->c1); -+ float64x2_t c57 = vld1q_f64 (&d->c5); -+ float64x2_t c911 = vld1q_f64 (&d->c9); -+ float64x2_t c1315 = vld1q_f64 (&d->c13); -+ float64x2_t c1719 = vld1q_f64 (&d->c17); -+ -+ /* estrin_7. */ -+ float64x2_t p01 = vfmaq_laneq_f64 (d->c0, z2, c13, 0); -+ float64x2_t p23 = vfmaq_laneq_f64 (d->c2, z2, c13, 1); -+ float64x2_t p03 = vfmaq_f64 (p01, x2, p23); -+ -+ float64x2_t p45 = vfmaq_laneq_f64 (d->c4, z2, c57, 0); -+ float64x2_t p67 = vfmaq_laneq_f64 (d->c6, z2, c57, 1); -+ float64x2_t p47 = vfmaq_f64 (p45, x2, p67); -+ -+ float64x2_t p07 = vfmaq_f64 (p03, x4, p47); -+ -+ /* estrin_11. */ -+ float64x2_t p89 = vfmaq_laneq_f64 (d->c8, z2, c911, 0); -+ float64x2_t p1011 = vfmaq_laneq_f64 (d->c10, z2, c911, 1); -+ float64x2_t p811 = vfmaq_f64 (p89, x2, p1011); -+ -+ float64x2_t p1213 = vfmaq_laneq_f64 (d->c12, z2, c1315, 0); -+ float64x2_t p1415 = vfmaq_laneq_f64 (d->c14, z2, c1315, 1); -+ float64x2_t p1215 = vfmaq_f64 (p1213, x2, p1415); -+ -+ float64x2_t p1617 = vfmaq_laneq_f64 (d->c16, z2, c1719, 0); -+ float64x2_t p1819 = vfmaq_laneq_f64 (d->c18, z2, c1719, 1); -+ float64x2_t p1619 = vfmaq_f64 (p1617, x2, p1819); -+ -+ float64x2_t p815 = vfmaq_f64 (p811, x4, p1215); -+ float64x2_t p819 = vfmaq_f64 (p815, x8, p1619); -+ -+ float64x2_t ret = vfmaq_f64 (p07, p819, x8); - - /* Finalize. y = shift + z + z^3 * P(z^2). */ - ret = vfmaq_f64 (z, ret, vmulq_f64 (z2, z)); - ret = vaddq_f64 (ret, shift); - -+ if (__glibc_unlikely (v_any_u64 (special_cases))) -+ return special_case (y, x, ret, sign_xy, special_cases); -+ - /* Account for the sign of x and y. */ - ret = vreinterpretq_f64_u64 ( - veorq_u64 (vreinterpretq_u64_f64 (ret), sign_xy)); - -- if (__glibc_unlikely (v_any_u64 (special_cases))) -- return special_case (y, x, ret, special_cases); -- - return ret; - } -diff --git a/sysdeps/aarch64/fpu/atan2f_advsimd.c b/sysdeps/aarch64/fpu/atan2f_advsimd.c -index 56e610caf1..88daacd76c 100644 ---- a/sysdeps/aarch64/fpu/atan2f_advsimd.c -+++ b/sysdeps/aarch64/fpu/atan2f_advsimd.c -@@ -22,34 +22,39 @@ - - static const struct data - { -- float32x4_t poly[8]; -- float32x4_t pi_over_2; -+ float32x4_t c0, pi_over_2, c4, c6, c2; -+ float c1, c3, c5, c7; -+ uint32x4_t comp_const; - } data = { - /* Coefficients of polynomial P such that atan(x)~x+x*P(x^2) on - [2**-128, 1.0]. - Generated using fpminimax between FLT_MIN and 1. */ -- .poly = { V4 (-0x1.55555p-2f), V4 (0x1.99935ep-3f), V4 (-0x1.24051ep-3f), -- V4 (0x1.bd7368p-4f), V4 (-0x1.491f0ep-4f), V4 (0x1.93a2c0p-5f), -- V4 (-0x1.4c3c60p-6f), V4 (0x1.01fd88p-8f) }, -- .pi_over_2 = V4 (0x1.921fb6p+0f), -+ .c0 = V4 (-0x1.55555p-2f), .c1 = 0x1.99935ep-3f, -+ .c2 = V4 (-0x1.24051ep-3f), .c3 = 0x1.bd7368p-4f, -+ .c4 = V4 (-0x1.491f0ep-4f), .c5 = 0x1.93a2c0p-5f, -+ .c6 = V4 (-0x1.4c3c60p-6f), .c7 = 0x1.01fd88p-8f, -+ .pi_over_2 = V4 (0x1.921fb6p+0f), .comp_const = V4 (2 * 0x7f800000lu - 1), - }; - - #define SignMask v_u32 (0x80000000) - - /* Special cases i.e. 0, infinity and nan (fall back to scalar calls). */ - static float32x4_t VPCS_ATTR NOINLINE --special_case (float32x4_t y, float32x4_t x, float32x4_t ret, uint32x4_t cmp) -+special_case (float32x4_t y, float32x4_t x, float32x4_t ret, -+ uint32x4_t sign_xy, uint32x4_t cmp) - { -+ /* Account for the sign of y. */ -+ ret = vreinterpretq_f32_u32 ( -+ veorq_u32 (vreinterpretq_u32_f32 (ret), sign_xy)); - return v_call2_f32 (atan2f, y, x, ret, cmp); - } - - /* Returns 1 if input is the bit representation of 0, infinity or nan. */ - static inline uint32x4_t --zeroinfnan (uint32x4_t i) -+zeroinfnan (uint32x4_t i, const struct data *d) - { - /* 2 * i - 1 >= 2 * 0x7f800000lu - 1. */ -- return vcgeq_u32 (vsubq_u32 (vmulq_n_u32 (i, 2), v_u32 (1)), -- v_u32 (2 * 0x7f800000lu - 1)); -+ return vcgeq_u32 (vsubq_u32 (vmulq_n_u32 (i, 2), v_u32 (1)), d->comp_const); - } - - /* Fast implementation of vector atan2f. Maximum observed error is -@@ -58,12 +63,13 @@ zeroinfnan (uint32x4_t i) - want 0x1.967f00p-1. */ - float32x4_t VPCS_ATTR NOINLINE V_NAME_F2 (atan2) (float32x4_t y, float32x4_t x) - { -- const struct data *data_ptr = ptr_barrier (&data); -+ const struct data *d = ptr_barrier (&data); - - uint32x4_t ix = vreinterpretq_u32_f32 (x); - uint32x4_t iy = vreinterpretq_u32_f32 (y); - -- uint32x4_t special_cases = vorrq_u32 (zeroinfnan (ix), zeroinfnan (iy)); -+ uint32x4_t special_cases -+ = vorrq_u32 (zeroinfnan (ix, d), zeroinfnan (iy, d)); - - uint32x4_t sign_x = vandq_u32 (ix, SignMask); - uint32x4_t sign_y = vandq_u32 (iy, SignMask); -@@ -77,14 +83,14 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F2 (atan2) (float32x4_t y, float32x4_t x) - - /* Set up z for call to atanf. */ - float32x4_t n = vbslq_f32 (pred_aygtax, vnegq_f32 (ax), ay); -- float32x4_t d = vbslq_f32 (pred_aygtax, ay, ax); -- float32x4_t z = vdivq_f32 (n, d); -+ float32x4_t q = vbslq_f32 (pred_aygtax, ay, ax); -+ float32x4_t z = vdivq_f32 (n, q); - - /* Work out the correct shift. */ - float32x4_t shift = vreinterpretq_f32_u32 ( - vandq_u32 (pred_xlt0, vreinterpretq_u32_f32 (v_f32 (-2.0f)))); - shift = vbslq_f32 (pred_aygtax, vaddq_f32 (shift, v_f32 (1.0f)), shift); -- shift = vmulq_f32 (shift, data_ptr->pi_over_2); -+ shift = vmulq_f32 (shift, d->pi_over_2); - - /* Calculate the polynomial approximation. - Use 2-level Estrin scheme for P(z^2) with deg(P)=7. However, -@@ -96,23 +102,27 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F2 (atan2) (float32x4_t y, float32x4_t x) - float32x4_t z2 = vmulq_f32 (z, z); - float32x4_t z4 = vmulq_f32 (z2, z2); - -- float32x4_t ret = vfmaq_f32 ( -- v_pairwise_poly_3_f32 (z2, z4, data_ptr->poly), z4, -- vmulq_f32 (z4, v_pairwise_poly_3_f32 (z2, z4, data_ptr->poly + 4))); -+ float32x4_t c1357 = vld1q_f32 (&d->c1); -+ float32x4_t p01 = vfmaq_laneq_f32 (d->c0, z2, c1357, 0); -+ float32x4_t p23 = vfmaq_laneq_f32 (d->c2, z2, c1357, 1); -+ float32x4_t p45 = vfmaq_laneq_f32 (d->c4, z2, c1357, 2); -+ float32x4_t p67 = vfmaq_laneq_f32 (d->c6, z2, c1357, 3); -+ float32x4_t p03 = vfmaq_f32 (p01, z4, p23); -+ float32x4_t p47 = vfmaq_f32 (p45, z4, p67); -+ -+ float32x4_t ret = vfmaq_f32 (p03, z4, vmulq_f32 (z4, p47)); - - /* y = shift + z * P(z^2). */ - ret = vaddq_f32 (vfmaq_f32 (z, ret, vmulq_f32 (z2, z)), shift); - -- /* Account for the sign of y. */ -- ret = vreinterpretq_f32_u32 ( -- veorq_u32 (vreinterpretq_u32_f32 (ret), sign_xy)); -- - if (__glibc_unlikely (v_any_u32 (special_cases))) - { -- return special_case (y, x, ret, special_cases); -+ return special_case (y, x, ret, sign_xy, special_cases); - } - -- return ret; -+ /* Account for the sign of y. */ -+ return vreinterpretq_f32_u32 ( -+ veorq_u32 (vreinterpretq_u32_f32 (ret), sign_xy)); - } - libmvec_hidden_def (V_NAME_F2 (atan2)) - HALF_WIDTH_ALIAS_F2(atan2) -diff --git a/sysdeps/aarch64/fpu/atan_advsimd.c b/sysdeps/aarch64/fpu/atan_advsimd.c -index a962be0f78..14f1809796 100644 ---- a/sysdeps/aarch64/fpu/atan_advsimd.c -+++ b/sysdeps/aarch64/fpu/atan_advsimd.c -@@ -22,21 +22,22 @@ - - static const struct data - { -+ float64x2_t c0, c2, c4, c6, c8, c10, c12, c14, c16, c18; - float64x2_t pi_over_2; -- float64x2_t poly[20]; -+ double c1, c3, c5, c7, c9, c11, c13, c15, c17, c19; - } data = { - /* Coefficients of polynomial P such that atan(x)~x+x*P(x^2) on - [2**-1022, 1.0]. */ -- .poly = { V2 (-0x1.5555555555555p-2), V2 (0x1.99999999996c1p-3), -- V2 (-0x1.2492492478f88p-3), V2 (0x1.c71c71bc3951cp-4), -- V2 (-0x1.745d160a7e368p-4), V2 (0x1.3b139b6a88ba1p-4), -- V2 (-0x1.11100ee084227p-4), V2 (0x1.e1d0f9696f63bp-5), -- V2 (-0x1.aebfe7b418581p-5), V2 (0x1.842dbe9b0d916p-5), -- V2 (-0x1.5d30140ae5e99p-5), V2 (0x1.338e31eb2fbbcp-5), -- V2 (-0x1.00e6eece7de8p-5), V2 (0x1.860897b29e5efp-6), -- V2 (-0x1.0051381722a59p-6), V2 (0x1.14e9dc19a4a4ep-7), -- V2 (-0x1.d0062b42fe3bfp-9), V2 (0x1.17739e210171ap-10), -- V2 (-0x1.ab24da7be7402p-13), V2 (0x1.358851160a528p-16), }, -+ .c0 = V2 (-0x1.5555555555555p-2), .c1 = 0x1.99999999996c1p-3, -+ .c2 = V2 (-0x1.2492492478f88p-3), .c3 = 0x1.c71c71bc3951cp-4, -+ .c4 = V2 (-0x1.745d160a7e368p-4), .c5 = 0x1.3b139b6a88ba1p-4, -+ .c6 = V2 (-0x1.11100ee084227p-4), .c7 = 0x1.e1d0f9696f63bp-5, -+ .c8 = V2 (-0x1.aebfe7b418581p-5), .c9 = 0x1.842dbe9b0d916p-5, -+ .c10 = V2 (-0x1.5d30140ae5e99p-5), .c11 = 0x1.338e31eb2fbbcp-5, -+ .c12 = V2 (-0x1.00e6eece7de8p-5), .c13 = 0x1.860897b29e5efp-6, -+ .c14 = V2 (-0x1.0051381722a59p-6), .c15 = 0x1.14e9dc19a4a4ep-7, -+ .c16 = V2 (-0x1.d0062b42fe3bfp-9), .c17 = 0x1.17739e210171ap-10, -+ .c18 = V2 (-0x1.ab24da7be7402p-13), .c19 = 0x1.358851160a528p-16, - .pi_over_2 = V2 (0x1.921fb54442d18p+0), - }; - -@@ -52,6 +53,11 @@ static const struct data - float64x2_t VPCS_ATTR V_NAME_D1 (atan) (float64x2_t x) - { - const struct data *d = ptr_barrier (&data); -+ float64x2_t c13 = vld1q_f64 (&d->c1); -+ float64x2_t c57 = vld1q_f64 (&d->c5); -+ float64x2_t c911 = vld1q_f64 (&d->c9); -+ float64x2_t c1315 = vld1q_f64 (&d->c13); -+ float64x2_t c1719 = vld1q_f64 (&d->c17); - - /* Small cases, infs and nans are supported by our approximation technique, - but do not set fenv flags correctly. Only trigger special case if we need -@@ -90,9 +96,35 @@ float64x2_t VPCS_ATTR V_NAME_D1 (atan) (float64x2_t x) - float64x2_t x2 = vmulq_f64 (z2, z2); - float64x2_t x4 = vmulq_f64 (x2, x2); - float64x2_t x8 = vmulq_f64 (x4, x4); -- float64x2_t y -- = vfmaq_f64 (v_estrin_7_f64 (z2, x2, x4, d->poly), -- v_estrin_11_f64 (z2, x2, x4, x8, d->poly + 8), x8); -+ -+ /* estrin_7. */ -+ float64x2_t p01 = vfmaq_laneq_f64 (d->c0, z2, c13, 0); -+ float64x2_t p23 = vfmaq_laneq_f64 (d->c2, z2, c13, 1); -+ float64x2_t p03 = vfmaq_f64 (p01, x2, p23); -+ -+ float64x2_t p45 = vfmaq_laneq_f64 (d->c4, z2, c57, 0); -+ float64x2_t p67 = vfmaq_laneq_f64 (d->c6, z2, c57, 1); -+ float64x2_t p47 = vfmaq_f64 (p45, x2, p67); -+ -+ float64x2_t p07 = vfmaq_f64 (p03, x4, p47); -+ -+ /* estrin_11. */ -+ float64x2_t p89 = vfmaq_laneq_f64 (d->c8, z2, c911, 0); -+ float64x2_t p1011 = vfmaq_laneq_f64 (d->c10, z2, c911, 1); -+ float64x2_t p811 = vfmaq_f64 (p89, x2, p1011); -+ -+ float64x2_t p1213 = vfmaq_laneq_f64 (d->c12, z2, c1315, 0); -+ float64x2_t p1415 = vfmaq_laneq_f64 (d->c14, z2, c1315, 1); -+ float64x2_t p1215 = vfmaq_f64 (p1213, x2, p1415); -+ -+ float64x2_t p1617 = vfmaq_laneq_f64 (d->c16, z2, c1719, 0); -+ float64x2_t p1819 = vfmaq_laneq_f64 (d->c18, z2, c1719, 1); -+ float64x2_t p1619 = vfmaq_f64 (p1617, x2, p1819); -+ -+ float64x2_t p815 = vfmaq_f64 (p811, x4, p1215); -+ float64x2_t p819 = vfmaq_f64 (p815, x8, p1619); -+ -+ float64x2_t y = vfmaq_f64 (p07, p819, x8); - - /* Finalize. y = shift + z + z^3 * P(z^2). */ - y = vfmaq_f64 (az, y, vmulq_f64 (z2, az)); - -commit bf2b60a56036c951a798845223a2e04cc48507e4 -Author: Joana Cruz -Date: Tue Dec 17 14:50:33 2024 +0000 - - AArch64: Improve codegen of AdvSIMD expf family - - Load the polynomial evaluation coefficients into 2 vectors and use lanewise MLAs. - Also use intrinsics instead of native operations. - expf: 3% improvement in throughput microbenchmark on Neoverse V1, exp2f: 5%, - exp10f: 13%, coshf: 14%. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit cff9648d0b50d19cdaf685f6767add040d4e1a8e) - -diff --git a/sysdeps/aarch64/fpu/coshf_advsimd.c b/sysdeps/aarch64/fpu/coshf_advsimd.c -index c1ab4923b8..cd5c866521 100644 ---- a/sysdeps/aarch64/fpu/coshf_advsimd.c -+++ b/sysdeps/aarch64/fpu/coshf_advsimd.c -@@ -23,19 +23,27 @@ - static const struct data - { - struct v_expf_data expf_consts; -- uint32x4_t tiny_bound, special_bound; -+ uint32x4_t tiny_bound; -+ float32x4_t bound; -+#if WANT_SIMD_EXCEPT -+ uint32x4_t special_bound; -+#endif - } data = { - .expf_consts = V_EXPF_DATA, - .tiny_bound = V4 (0x20000000), /* 0x1p-63: Round to 1 below this. */ - /* 0x1.5a92d8p+6: expf overflows above this, so have to use special case. */ -+ .bound = V4 (0x1.5a92d8p+6), -+#if WANT_SIMD_EXCEPT - .special_bound = V4 (0x42ad496c), -+#endif - }; - - #if !WANT_SIMD_EXCEPT - static float32x4_t NOINLINE VPCS_ATTR --special_case (float32x4_t x, float32x4_t y, uint32x4_t special) -+special_case (float32x4_t x, float32x4_t half_t, float32x4_t half_over_t, -+ uint32x4_t special) - { -- return v_call_f32 (coshf, x, y, special); -+ return v_call_f32 (coshf, x, vaddq_f32 (half_t, half_over_t), special); - } - #endif - -@@ -47,14 +55,13 @@ float32x4_t VPCS_ATTR V_NAME_F1 (cosh) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); - -- float32x4_t ax = vabsq_f32 (x); -- uint32x4_t iax = vreinterpretq_u32_f32 (ax); -- uint32x4_t special = vcgeq_u32 (iax, d->special_bound); -- - #if WANT_SIMD_EXCEPT - /* If fp exceptions are to be triggered correctly, fall back to the scalar - variant for all inputs if any input is a special value or above the bound - at which expf overflows. */ -+ float32x4_t ax = vabsq_f32 (x); -+ uint32x4_t iax = vreinterpretq_u32_f32 (ax); -+ uint32x4_t special = vcgeq_u32 (iax, d->special_bound); - if (__glibc_unlikely (v_any_u32 (special))) - return v_call_f32 (coshf, x, x, v_u32 (-1)); - -@@ -63,10 +70,13 @@ float32x4_t VPCS_ATTR V_NAME_F1 (cosh) (float32x4_t x) - input to 0, which will generate no exceptions. */ - if (__glibc_unlikely (v_any_u32 (tiny))) - ax = v_zerofy_f32 (ax, tiny); -+ float32x4_t t = v_expf_inline (ax, &d->expf_consts); -+#else -+ uint32x4_t special = vcageq_f32 (x, d->bound); -+ float32x4_t t = v_expf_inline (x, &d->expf_consts); - #endif - - /* Calculate cosh by exp(x) / 2 + exp(-x) / 2. */ -- float32x4_t t = v_expf_inline (ax, &d->expf_consts); - float32x4_t half_t = vmulq_n_f32 (t, 0.5); - float32x4_t half_over_t = vdivq_f32 (v_f32 (0.5), t); - -@@ -75,7 +85,7 @@ float32x4_t VPCS_ATTR V_NAME_F1 (cosh) (float32x4_t x) - return vbslq_f32 (tiny, v_f32 (1), vaddq_f32 (half_t, half_over_t)); - #else - if (__glibc_unlikely (v_any_u32 (special))) -- return special_case (x, vaddq_f32 (half_t, half_over_t), special); -+ return special_case (x, half_t, half_over_t, special); - #endif - - return vaddq_f32 (half_t, half_over_t); -diff --git a/sysdeps/aarch64/fpu/exp10f_advsimd.c b/sysdeps/aarch64/fpu/exp10f_advsimd.c -index cf53e73290..55d9cd83f2 100644 ---- a/sysdeps/aarch64/fpu/exp10f_advsimd.c -+++ b/sysdeps/aarch64/fpu/exp10f_advsimd.c -@@ -18,16 +18,15 @@ - . */ - - #include "v_math.h" --#include "poly_advsimd_f32.h" - - #define ScaleBound 192.0f - - static const struct data - { -- float32x4_t poly[5]; -- float log10_2_and_inv[4]; -- float32x4_t shift; -- -+ float32x4_t c0, c1, c3; -+ float log10_2_high, log10_2_low, c2, c4; -+ float32x4_t inv_log10_2, special_bound; -+ uint32x4_t exponent_bias, special_offset, special_bias; - #if !WANT_SIMD_EXCEPT - float32x4_t scale_thresh; - #endif -@@ -37,19 +36,24 @@ static const struct data - rel error: 0x1.89dafa3p-24 - abs error: 0x1.167d55p-23 in [-log10(2)/2, log10(2)/2] - maxerr: 1.85943 +0.5 ulp. */ -- .poly = { V4 (0x1.26bb16p+1f), V4 (0x1.5350d2p+1f), V4 (0x1.04744ap+1f), -- V4 (0x1.2d8176p+0f), V4 (0x1.12b41ap-1f) }, -- .shift = V4 (0x1.8p23f), -- -- /* Stores constants 1/log10(2), log10(2)_high, log10(2)_low, 0. */ -- .log10_2_and_inv = { 0x1.a934fp+1, 0x1.344136p-2, -0x1.ec10cp-27, 0 }, -+ .c0 = V4 (0x1.26bb16p+1f), -+ .c1 = V4 (0x1.5350d2p+1f), -+ .c2 = 0x1.04744ap+1f, -+ .c3 = V4 (0x1.2d8176p+0f), -+ .c4 = 0x1.12b41ap-1f, -+ .inv_log10_2 = V4 (0x1.a934fp+1), -+ .log10_2_high = 0x1.344136p-2, -+ .log10_2_low = 0x1.ec10cp-27, -+ /* rint (log2 (2^127 / (1 + sqrt (2)))). */ -+ .special_bound = V4 (126.0f), -+ .exponent_bias = V4 (0x3f800000), -+ .special_offset = V4 (0x82000000), -+ .special_bias = V4 (0x7f000000), - #if !WANT_SIMD_EXCEPT - .scale_thresh = V4 (ScaleBound) - #endif - }; - --#define ExponentBias v_u32 (0x3f800000) -- - #if WANT_SIMD_EXCEPT - - # define SpecialBound 38.0f /* rint(log10(2^127)). */ -@@ -67,17 +71,15 @@ special_case (float32x4_t x, float32x4_t y, uint32x4_t cmp) - - #else - --# define SpecialBound 126.0f /* rint (log2 (2^127 / (1 + sqrt (2)))). */ --# define SpecialOffset v_u32 (0x82000000) --# define SpecialBias v_u32 (0x7f000000) -+# define SpecialBound 126.0f - - static float32x4_t VPCS_ATTR NOINLINE - special_case (float32x4_t poly, float32x4_t n, uint32x4_t e, uint32x4_t cmp1, - float32x4_t scale, const struct data *d) - { - /* 2^n may overflow, break it up into s1*s2. */ -- uint32x4_t b = vandq_u32 (vclezq_f32 (n), SpecialOffset); -- float32x4_t s1 = vreinterpretq_f32_u32 (vaddq_u32 (b, SpecialBias)); -+ uint32x4_t b = vandq_u32 (vclezq_f32 (n), d->special_offset); -+ float32x4_t s1 = vreinterpretq_f32_u32 (vaddq_u32 (b, d->special_bias)); - float32x4_t s2 = vreinterpretq_f32_u32 (vsubq_u32 (e, b)); - uint32x4_t cmp2 = vcagtq_f32 (n, d->scale_thresh); - float32x4_t r2 = vmulq_f32 (s1, s1); -@@ -112,23 +114,23 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (exp10) (float32x4_t x) - /* exp10(x) = 2^n * 10^r = 2^n * (1 + poly (r)), - with poly(r) in [1/sqrt(2), sqrt(2)] and - x = r + n * log10 (2), with r in [-log10(2)/2, log10(2)/2]. */ -- float32x4_t log10_2_and_inv = vld1q_f32 (d->log10_2_and_inv); -- float32x4_t z = vfmaq_laneq_f32 (d->shift, x, log10_2_and_inv, 0); -- float32x4_t n = vsubq_f32 (z, d->shift); -- float32x4_t r = vfmsq_laneq_f32 (x, n, log10_2_and_inv, 1); -- r = vfmsq_laneq_f32 (r, n, log10_2_and_inv, 2); -- uint32x4_t e = vshlq_n_u32 (vreinterpretq_u32_f32 (z), 23); -+ float32x4_t log10_2_c24 = vld1q_f32 (&d->log10_2_high); -+ float32x4_t n = vrndaq_f32 (vmulq_f32 (x, d->inv_log10_2)); -+ float32x4_t r = vfmsq_laneq_f32 (x, n, log10_2_c24, 0); -+ r = vfmaq_laneq_f32 (r, n, log10_2_c24, 1); -+ uint32x4_t e = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtaq_s32_f32 (n)), 23); - -- float32x4_t scale = vreinterpretq_f32_u32 (vaddq_u32 (e, ExponentBias)); -+ float32x4_t scale = vreinterpretq_f32_u32 (vaddq_u32 (e, d->exponent_bias)); - - #if !WANT_SIMD_EXCEPT -- uint32x4_t cmp = vcagtq_f32 (n, v_f32 (SpecialBound)); -+ uint32x4_t cmp = vcagtq_f32 (n, d->special_bound); - #endif - - float32x4_t r2 = vmulq_f32 (r, r); -- float32x4_t poly -- = vfmaq_f32 (vmulq_f32 (r, d->poly[0]), -- v_pairwise_poly_3_f32 (r, r2, d->poly + 1), r2); -+ float32x4_t p12 = vfmaq_laneq_f32 (d->c1, r, log10_2_c24, 2); -+ float32x4_t p34 = vfmaq_laneq_f32 (d->c3, r, log10_2_c24, 3); -+ float32x4_t p14 = vfmaq_f32 (p12, r2, p34); -+ float32x4_t poly = vfmaq_f32 (vmulq_f32 (r, d->c0), p14, r2); - - if (__glibc_unlikely (v_any_u32 (cmp))) - #if WANT_SIMD_EXCEPT -diff --git a/sysdeps/aarch64/fpu/exp2f_advsimd.c b/sysdeps/aarch64/fpu/exp2f_advsimd.c -index 69e0b193a1..a4220da63c 100644 ---- a/sysdeps/aarch64/fpu/exp2f_advsimd.c -+++ b/sysdeps/aarch64/fpu/exp2f_advsimd.c -@@ -21,24 +21,28 @@ - - static const struct data - { -- float32x4_t poly[5]; -- uint32x4_t exponent_bias; -+ float32x4_t c1, c3; -+ uint32x4_t exponent_bias, special_offset, special_bias; - #if !WANT_SIMD_EXCEPT -- float32x4_t special_bound, scale_thresh; -+ float32x4_t scale_thresh, special_bound; - #endif -+ float c0, c2, c4, zero; - } data = { - /* maxerr: 1.962 ulp. */ -- .poly = { V4 (0x1.59977ap-10f), V4 (0x1.3ce9e4p-7f), V4 (0x1.c6bd32p-5f), -- V4 (0x1.ebf9bcp-3f), V4 (0x1.62e422p-1f) }, -+ .c0 = 0x1.59977ap-10f, -+ .c1 = V4 (0x1.3ce9e4p-7f), -+ .c2 = 0x1.c6bd32p-5f, -+ .c3 = V4 (0x1.ebf9bcp-3f), -+ .c4 = 0x1.62e422p-1f, - .exponent_bias = V4 (0x3f800000), -+ .special_offset = V4 (0x82000000), -+ .special_bias = V4 (0x7f000000), - #if !WANT_SIMD_EXCEPT - .special_bound = V4 (126.0f), - .scale_thresh = V4 (192.0f), - #endif - }; - --#define C(i) d->poly[i] -- - #if WANT_SIMD_EXCEPT - - # define TinyBound v_u32 (0x20000000) /* asuint (0x1p-63). */ -@@ -55,16 +59,13 @@ special_case (float32x4_t x, float32x4_t y, uint32x4_t cmp) - - #else - --# define SpecialOffset v_u32 (0x82000000) --# define SpecialBias v_u32 (0x7f000000) -- - static float32x4_t VPCS_ATTR NOINLINE - special_case (float32x4_t poly, float32x4_t n, uint32x4_t e, uint32x4_t cmp1, - float32x4_t scale, const struct data *d) - { - /* 2^n may overflow, break it up into s1*s2. */ -- uint32x4_t b = vandq_u32 (vclezq_f32 (n), SpecialOffset); -- float32x4_t s1 = vreinterpretq_f32_u32 (vaddq_u32 (b, SpecialBias)); -+ uint32x4_t b = vandq_u32 (vclezq_f32 (n), d->special_offset); -+ float32x4_t s1 = vreinterpretq_f32_u32 (vaddq_u32 (b, d->special_bias)); - float32x4_t s2 = vreinterpretq_f32_u32 (vsubq_u32 (e, b)); - uint32x4_t cmp2 = vcagtq_f32 (n, d->scale_thresh); - float32x4_t r2 = vmulq_f32 (s1, s1); -@@ -80,13 +81,11 @@ special_case (float32x4_t poly, float32x4_t n, uint32x4_t e, uint32x4_t cmp1, - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (exp2) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- float32x4_t n, r, r2, scale, p, q, poly; -- uint32x4_t cmp, e; - - #if WANT_SIMD_EXCEPT - /* asuint(|x|) - TinyBound >= BigBound - TinyBound. */ - uint32x4_t ia = vreinterpretq_u32_f32 (vabsq_f32 (x)); -- cmp = vcgeq_u32 (vsubq_u32 (ia, TinyBound), SpecialBound); -+ uint32x4_t cmp = vcgeq_u32 (vsubq_u32 (ia, TinyBound), SpecialBound); - float32x4_t xm = x; - /* If any lanes are special, mask them with 1 and retain a copy of x to allow - special_case to fix special lanes later. This is only necessary if fenv -@@ -95,23 +94,24 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (exp2) (float32x4_t x) - x = vbslq_f32 (cmp, v_f32 (1), x); - #endif - -- /* exp2(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] -- x = n + r, with r in [-1/2, 1/2]. */ -- n = vrndaq_f32 (x); -- r = vsubq_f32 (x, n); -- e = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtaq_s32_f32 (x)), 23); -- scale = vreinterpretq_f32_u32 (vaddq_u32 (e, d->exponent_bias)); -+ /* exp2(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] -+ x = n + r, with r in [-1/2, 1/2]. */ -+ float32x4_t n = vrndaq_f32 (x); -+ float32x4_t r = vsubq_f32 (x, n); -+ uint32x4_t e = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtaq_s32_f32 (x)), 23); -+ float32x4_t scale = vreinterpretq_f32_u32 (vaddq_u32 (e, d->exponent_bias)); - - #if !WANT_SIMD_EXCEPT -- cmp = vcagtq_f32 (n, d->special_bound); -+ uint32x4_t cmp = vcagtq_f32 (n, d->special_bound); - #endif - -- r2 = vmulq_f32 (r, r); -- p = vfmaq_f32 (C (1), C (0), r); -- q = vfmaq_f32 (C (3), C (2), r); -+ float32x4_t c024 = vld1q_f32 (&d->c0); -+ float32x4_t r2 = vmulq_f32 (r, r); -+ float32x4_t p = vfmaq_laneq_f32 (d->c1, r, c024, 0); -+ float32x4_t q = vfmaq_laneq_f32 (d->c3, r, c024, 1); - q = vfmaq_f32 (q, p, r2); -- p = vmulq_f32 (C (4), r); -- poly = vfmaq_f32 (p, q, r2); -+ p = vmulq_laneq_f32 (r, c024, 2); -+ float32x4_t poly = vfmaq_f32 (p, q, r2); - - if (__glibc_unlikely (v_any_u32 (cmp))) - #if WANT_SIMD_EXCEPT -diff --git a/sysdeps/aarch64/fpu/expf_advsimd.c b/sysdeps/aarch64/fpu/expf_advsimd.c -index 5c9cb72620..70f137e2e5 100644 ---- a/sysdeps/aarch64/fpu/expf_advsimd.c -+++ b/sysdeps/aarch64/fpu/expf_advsimd.c -@@ -21,20 +21,25 @@ - - static const struct data - { -- float32x4_t poly[5]; -- float32x4_t inv_ln2, ln2_hi, ln2_lo; -- uint32x4_t exponent_bias; -+ float32x4_t c1, c3, c4, inv_ln2; -+ float ln2_hi, ln2_lo, c0, c2; -+ uint32x4_t exponent_bias, special_offset, special_bias; - #if !WANT_SIMD_EXCEPT - float32x4_t special_bound, scale_thresh; - #endif - } data = { - /* maxerr: 1.45358 +0.5 ulp. */ -- .poly = { V4 (0x1.0e4020p-7f), V4 (0x1.573e2ep-5f), V4 (0x1.555e66p-3f), -- V4 (0x1.fffdb6p-2f), V4 (0x1.ffffecp-1f) }, -+ .c0 = 0x1.0e4020p-7f, -+ .c1 = V4 (0x1.573e2ep-5f), -+ .c2 = 0x1.555e66p-3f, -+ .c3 = V4 (0x1.fffdb6p-2f), -+ .c4 = V4 (0x1.ffffecp-1f), - .inv_ln2 = V4 (0x1.715476p+0f), -- .ln2_hi = V4 (0x1.62e4p-1f), -- .ln2_lo = V4 (0x1.7f7d1cp-20f), -+ .ln2_hi = 0x1.62e4p-1f, -+ .ln2_lo = 0x1.7f7d1cp-20f, - .exponent_bias = V4 (0x3f800000), -+ .special_offset = V4 (0x82000000), -+ .special_bias = V4 (0x7f000000), - #if !WANT_SIMD_EXCEPT - .special_bound = V4 (126.0f), - .scale_thresh = V4 (192.0f), -@@ -59,19 +64,17 @@ special_case (float32x4_t x, float32x4_t y, uint32x4_t cmp) - - #else - --# define SpecialOffset v_u32 (0x82000000) --# define SpecialBias v_u32 (0x7f000000) -- - static float32x4_t VPCS_ATTR NOINLINE - special_case (float32x4_t poly, float32x4_t n, uint32x4_t e, uint32x4_t cmp1, - float32x4_t scale, const struct data *d) - { - /* 2^n may overflow, break it up into s1*s2. */ -- uint32x4_t b = vandq_u32 (vclezq_f32 (n), SpecialOffset); -- float32x4_t s1 = vreinterpretq_f32_u32 (vaddq_u32 (b, SpecialBias)); -+ uint32x4_t b = vandq_u32 (vclezq_f32 (n), d->special_offset); -+ float32x4_t s1 = vreinterpretq_f32_u32 (vaddq_u32 (b, d->special_bias)); - float32x4_t s2 = vreinterpretq_f32_u32 (vsubq_u32 (e, b)); - uint32x4_t cmp2 = vcagtq_f32 (n, d->scale_thresh); - float32x4_t r2 = vmulq_f32 (s1, s1); -+ // (s2 + p*s2)*s1 = s2(p+1)s1 - float32x4_t r1 = vmulq_f32 (vfmaq_f32 (s2, poly, s2), s1); - /* Similar to r1 but avoids double rounding in the subnormal range. */ - float32x4_t r0 = vfmaq_f32 (scale, poly, scale); -@@ -84,12 +87,11 @@ special_case (float32x4_t poly, float32x4_t n, uint32x4_t e, uint32x4_t cmp1, - float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (exp) (float32x4_t x) - { - const struct data *d = ptr_barrier (&data); -- float32x4_t n, r, r2, scale, p, q, poly; -- uint32x4_t cmp, e; -+ float32x4_t ln2_c02 = vld1q_f32 (&d->ln2_hi); - - #if WANT_SIMD_EXCEPT - /* asuint(x) - TinyBound >= BigBound - TinyBound. */ -- cmp = vcgeq_u32 ( -+ uint32x4_t cmp = vcgeq_u32 ( - vsubq_u32 (vandq_u32 (vreinterpretq_u32_f32 (x), v_u32 (0x7fffffff)), - TinyBound), - SpecialBound); -@@ -103,22 +105,22 @@ float32x4_t VPCS_ATTR NOINLINE V_NAME_F1 (exp) (float32x4_t x) - - /* exp(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] - x = ln2*n + r, with r in [-ln2/2, ln2/2]. */ -- n = vrndaq_f32 (vmulq_f32 (x, d->inv_ln2)); -- r = vfmsq_f32 (x, n, d->ln2_hi); -- r = vfmsq_f32 (r, n, d->ln2_lo); -- e = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtq_s32_f32 (n)), 23); -- scale = vreinterpretq_f32_u32 (vaddq_u32 (e, d->exponent_bias)); -+ float32x4_t n = vrndaq_f32 (vmulq_f32 (x, d->inv_ln2)); -+ float32x4_t r = vfmsq_laneq_f32 (x, n, ln2_c02, 0); -+ r = vfmsq_laneq_f32 (r, n, ln2_c02, 1); -+ uint32x4_t e = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtq_s32_f32 (n)), 23); -+ float32x4_t scale = vreinterpretq_f32_u32 (vaddq_u32 (e, d->exponent_bias)); - - #if !WANT_SIMD_EXCEPT -- cmp = vcagtq_f32 (n, d->special_bound); -+ uint32x4_t cmp = vcagtq_f32 (n, d->special_bound); - #endif - -- r2 = vmulq_f32 (r, r); -- p = vfmaq_f32 (C (1), C (0), r); -- q = vfmaq_f32 (C (3), C (2), r); -+ float32x4_t r2 = vmulq_f32 (r, r); -+ float32x4_t p = vfmaq_laneq_f32 (d->c1, r, ln2_c02, 2); -+ float32x4_t q = vfmaq_laneq_f32 (d->c3, r, ln2_c02, 3); - q = vfmaq_f32 (q, p, r2); -- p = vmulq_f32 (C (4), r); -- poly = vfmaq_f32 (p, q, r2); -+ p = vmulq_f32 (d->c4, r); -+ float32x4_t poly = vfmaq_f32 (p, q, r2); - - if (__glibc_unlikely (v_any_u32 (cmp))) - #if WANT_SIMD_EXCEPT -diff --git a/sysdeps/aarch64/fpu/v_expf_inline.h b/sysdeps/aarch64/fpu/v_expf_inline.h -index 08b06e0a6b..eacd2af241 100644 ---- a/sysdeps/aarch64/fpu/v_expf_inline.h -+++ b/sysdeps/aarch64/fpu/v_expf_inline.h -@@ -24,50 +24,45 @@ - - struct v_expf_data - { -- float32x4_t poly[5]; -- float32x4_t shift; -- float invln2_and_ln2[4]; -+ float ln2_hi, ln2_lo, c0, c2; -+ float32x4_t inv_ln2, c1, c3, c4; -+ /* asuint(1.0f). */ -+ uint32x4_t exponent_bias; - }; - - /* maxerr: 1.45358 +0.5 ulp. */ - #define V_EXPF_DATA \ - { \ -- .poly = { V4 (0x1.0e4020p-7f), V4 (0x1.573e2ep-5f), V4 (0x1.555e66p-3f), \ -- V4 (0x1.fffdb6p-2f), V4 (0x1.ffffecp-1f) }, \ -- .shift = V4 (0x1.8p23f), \ -- .invln2_and_ln2 = { 0x1.715476p+0f, 0x1.62e4p-1f, 0x1.7f7d1cp-20f, 0 }, \ -+ .c0 = 0x1.0e4020p-7f, .c1 = V4 (0x1.573e2ep-5f), .c2 = 0x1.555e66p-3f, \ -+ .c3 = V4 (0x1.fffdb6p-2f), .c4 = V4 (0x1.ffffecp-1f), \ -+ .ln2_hi = 0x1.62e4p-1f, .ln2_lo = 0x1.7f7d1cp-20f, \ -+ .inv_ln2 = V4 (0x1.715476p+0f), .exponent_bias = V4 (0x3f800000), \ - } - --#define ExponentBias v_u32 (0x3f800000) /* asuint(1.0f). */ --#define C(i) d->poly[i] -- - static inline float32x4_t - v_expf_inline (float32x4_t x, const struct v_expf_data *d) - { -- /* Helper routine for calculating exp(x). -+ /* Helper routine for calculating exp(ax). - Copied from v_expf.c, with all special-case handling removed - the - calling routine should handle special values if required. */ - -- /* exp(x) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] -- x = ln2*n + r, with r in [-ln2/2, ln2/2]. */ -- float32x4_t n, r, z; -- float32x4_t invln2_and_ln2 = vld1q_f32 (d->invln2_and_ln2); -- z = vfmaq_laneq_f32 (d->shift, x, invln2_and_ln2, 0); -- n = vsubq_f32 (z, d->shift); -- r = vfmsq_laneq_f32 (x, n, invln2_and_ln2, 1); -- r = vfmsq_laneq_f32 (r, n, invln2_and_ln2, 2); -- uint32x4_t e = vshlq_n_u32 (vreinterpretq_u32_f32 (z), 23); -- float32x4_t scale = vreinterpretq_f32_u32 (vaddq_u32 (e, ExponentBias)); -+ /* exp(ax) = 2^n (1 + poly(r)), with 1 + poly(r) in [1/sqrt(2),sqrt(2)] -+ ax = ln2*n + r, with r in [-ln2/2, ln2/2]. */ -+ float32x4_t ax = vabsq_f32 (x); -+ float32x4_t ln2_c02 = vld1q_f32 (&d->ln2_hi); -+ float32x4_t n = vrndaq_f32 (vmulq_f32 (ax, d->inv_ln2)); -+ float32x4_t r = vfmsq_laneq_f32 (ax, n, ln2_c02, 0); -+ r = vfmsq_laneq_f32 (r, n, ln2_c02, 1); -+ uint32x4_t e = vshlq_n_u32 (vreinterpretq_u32_s32 (vcvtq_s32_f32 (n)), 23); -+ float32x4_t scale = vreinterpretq_f32_u32 (vaddq_u32 (e, d->exponent_bias)); - - /* Custom order-4 Estrin avoids building high order monomial. */ - float32x4_t r2 = vmulq_f32 (r, r); -- float32x4_t p, q, poly; -- p = vfmaq_f32 (C (1), C (0), r); -- q = vfmaq_f32 (C (3), C (2), r); -+ float32x4_t p = vfmaq_laneq_f32 (d->c1, r, ln2_c02, 2); -+ float32x4_t q = vfmaq_laneq_f32 (d->c3, r, ln2_c02, 3); - q = vfmaq_f32 (q, p, r2); -- p = vmulq_f32 (C (4), r); -- poly = vfmaq_f32 (p, q, r2); -+ p = vmulq_f32 (d->c4, r); -+ float32x4_t poly = vfmaq_f32 (p, q, r2); - return vfmaq_f32 (scale, poly, scale); - } -- - #endif - -commit abfd20ebbd2883f2c6e5f16709f7b9781c3c8068 -Author: Luna Lamb -Date: Fri Jan 3 19:00:12 2025 +0000 - - AArch64: Improve codegen in AdvSIMD asinh - - Improves memory access and removes spills. - Load the polynomial evaluation coefficients into 2 vectors and use lanewise - MLAs. Reduces MOVs 6->3 , LDR 11->5, STR/STP 2->0, ADRP 3->2. - - (cherry picked from commit 140b985e5a2071000122b3cb63ebfe88cf21dd29) - -diff --git a/sysdeps/aarch64/fpu/asinh_advsimd.c b/sysdeps/aarch64/fpu/asinh_advsimd.c -index 6207e7da95..2739f98b39 100644 ---- a/sysdeps/aarch64/fpu/asinh_advsimd.c -+++ b/sysdeps/aarch64/fpu/asinh_advsimd.c -@@ -20,41 +20,71 @@ - #include "v_math.h" - #include "poly_advsimd_f64.h" - --#define A(i) v_f64 (__v_log_data.poly[i]) --#define N (1 << V_LOG_TABLE_BITS) --#define IndexMask (N - 1) -- - const static struct data - { -- float64x2_t poly[18]; -- uint64x2_t off, huge_bound, abs_mask; -- float64x2_t ln2, tiny_bound; -+ uint64x2_t huge_bound, abs_mask, off, mask; -+#if WANT_SIMD_EXCEPT -+ float64x2_t tiny_bound; -+#endif -+ float64x2_t lc0, lc2; -+ double lc1, lc3, ln2, lc4; -+ -+ float64x2_t c0, c2, c4, c6, c8, c10, c12, c14, c16, c17; -+ double c1, c3, c5, c7, c9, c11, c13, c15; -+ - } data = { -- .off = V2 (0x3fe6900900000000), -- .ln2 = V2 (0x1.62e42fefa39efp-1), -- .huge_bound = V2 (0x5fe0000000000000), -+ -+#if WANT_SIMD_EXCEPT - .tiny_bound = V2 (0x1p-26), -- .abs_mask = V2 (0x7fffffffffffffff), -+#endif - /* Even terms of polynomial s.t. asinh(x) is approximated by - asinh(x) ~= x + x^3 * (C0 + C1 * x + C2 * x^2 + C3 * x^3 + ...). - Generated using Remez, f = (asinh(sqrt(x)) - sqrt(x))/x^(3/2). */ -- .poly = { V2 (-0x1.55555555554a7p-3), V2 (0x1.3333333326c7p-4), -- V2 (-0x1.6db6db68332e6p-5), V2 (0x1.f1c71b26fb40dp-6), -- V2 (-0x1.6e8b8b654a621p-6), V2 (0x1.1c4daa9e67871p-6), -- V2 (-0x1.c9871d10885afp-7), V2 (0x1.7a16e8d9d2ecfp-7), -- V2 (-0x1.3ddca533e9f54p-7), V2 (0x1.0becef748dafcp-7), -- V2 (-0x1.b90c7099dd397p-8), V2 (0x1.541f2bb1ffe51p-8), -- V2 (-0x1.d217026a669ecp-9), V2 (0x1.0b5c7977aaf7p-9), -- V2 (-0x1.e0f37daef9127p-11), V2 (0x1.388b5fe542a6p-12), -- V2 (-0x1.021a48685e287p-14), V2 (0x1.93d4ba83d34dap-18) }, -+ -+ .c0 = V2 (-0x1.55555555554a7p-3), -+ .c1 = 0x1.3333333326c7p-4, -+ .c2 = V2 (-0x1.6db6db68332e6p-5), -+ .c3 = 0x1.f1c71b26fb40dp-6, -+ .c4 = V2 (-0x1.6e8b8b654a621p-6), -+ .c5 = 0x1.1c4daa9e67871p-6, -+ .c6 = V2 (-0x1.c9871d10885afp-7), -+ .c7 = 0x1.7a16e8d9d2ecfp-7, -+ .c8 = V2 (-0x1.3ddca533e9f54p-7), -+ .c9 = 0x1.0becef748dafcp-7, -+ .c10 = V2 (-0x1.b90c7099dd397p-8), -+ .c11 = 0x1.541f2bb1ffe51p-8, -+ .c12 = V2 (-0x1.d217026a669ecp-9), -+ .c13 = 0x1.0b5c7977aaf7p-9, -+ .c14 = V2 (-0x1.e0f37daef9127p-11), -+ .c15 = 0x1.388b5fe542a6p-12, -+ .c16 = V2 (-0x1.021a48685e287p-14), -+ .c17 = V2 (0x1.93d4ba83d34dap-18), -+ -+ .lc0 = V2 (-0x1.ffffffffffff7p-2), -+ .lc1 = 0x1.55555555170d4p-2, -+ .lc2 = V2 (-0x1.0000000399c27p-2), -+ .lc3 = 0x1.999b2e90e94cap-3, -+ .lc4 = -0x1.554e550bd501ep-3, -+ .ln2 = 0x1.62e42fefa39efp-1, -+ -+ .off = V2 (0x3fe6900900000000), -+ .huge_bound = V2 (0x5fe0000000000000), -+ .abs_mask = V2 (0x7fffffffffffffff), -+ .mask = V2 (0xfffULL << 52), - }; - - static float64x2_t NOINLINE VPCS_ATTR --special_case (float64x2_t x, float64x2_t y, uint64x2_t special) -+special_case (float64x2_t x, float64x2_t y, uint64x2_t abs_mask, -+ uint64x2_t special) - { -+ /* Copy sign. */ -+ y = vbslq_f64 (abs_mask, y, x); - return v_call_f64 (asinh, x, y, special); - } - -+#define N (1 << V_LOG_TABLE_BITS) -+#define IndexMask (N - 1) -+ - struct entry - { - float64x2_t invc; -@@ -76,27 +106,34 @@ lookup (uint64x2_t i) - } - - static inline float64x2_t --log_inline (float64x2_t x, const struct data *d) -+log_inline (float64x2_t xm, const struct data *d) - { -- /* Double-precision vector log, copied from ordinary vector log with some -- cosmetic modification and special-cases removed. */ -- uint64x2_t ix = vreinterpretq_u64_f64 (x); -- uint64x2_t tmp = vsubq_u64 (ix, d->off); -- int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (tmp), 52); -- uint64x2_t iz -- = vsubq_u64 (ix, vandq_u64 (tmp, vdupq_n_u64 (0xfffULL << 52))); -+ -+ uint64x2_t u = vreinterpretq_u64_f64 (xm); -+ uint64x2_t u_off = vsubq_u64 (u, d->off); -+ -+ int64x2_t k = vshrq_n_s64 (vreinterpretq_s64_u64 (u_off), 52); -+ uint64x2_t iz = vsubq_u64 (u, vandq_u64 (u_off, d->mask)); - float64x2_t z = vreinterpretq_f64_u64 (iz); -- struct entry e = lookup (tmp); -+ -+ struct entry e = lookup (u_off); -+ -+ /* log(x) = log1p(z/c-1) + log(c) + k*Ln2. */ - float64x2_t r = vfmaq_f64 (v_f64 (-1.0), z, e.invc); - float64x2_t kd = vcvtq_f64_s64 (k); -- float64x2_t hi = vfmaq_f64 (vaddq_f64 (e.logc, r), kd, d->ln2); -+ -+ /* hi = r + log(c) + k*Ln2. */ -+ float64x2_t ln2_and_lc4 = vld1q_f64 (&d->ln2); -+ float64x2_t hi = vfmaq_laneq_f64 (vaddq_f64 (e.logc, r), kd, ln2_and_lc4, 0); -+ -+ /* y = r2*(A0 + r*A1 + r2*(A2 + r*A3 + r2*A4)) + hi. */ -+ float64x2_t odd_coeffs = vld1q_f64 (&d->lc1); - float64x2_t r2 = vmulq_f64 (r, r); -- float64x2_t y = vfmaq_f64 (A (2), A (3), r); -- float64x2_t p = vfmaq_f64 (A (0), A (1), r); -- y = vfmaq_f64 (y, A (4), r2); -- y = vfmaq_f64 (p, y, r2); -- y = vfmaq_f64 (hi, y, r2); -- return y; -+ float64x2_t y = vfmaq_laneq_f64 (d->lc2, r, odd_coeffs, 1); -+ float64x2_t p = vfmaq_laneq_f64 (d->lc0, r, odd_coeffs, 0); -+ y = vfmaq_laneq_f64 (y, r2, ln2_and_lc4, 1); -+ y = vfmaq_f64 (p, r2, y); -+ return vfmaq_f64 (hi, y, r2); - } - - /* Double-precision implementation of vector asinh(x). -@@ -106,23 +143,24 @@ log_inline (float64x2_t x, const struct data *d) - asinh(x) = sign(x) * log(|x| + sqrt(x^2 + 1) if |x| >= 1 - = sign(x) * (|x| + |x|^3 * P(x^2)) otherwise - where log(x) is an optimized log approximation, and P(x) is a polynomial -- shared with the scalar routine. The greatest observed error 3.29 ULP, in -+ shared with the scalar routine. The greatest observed error 2.79 ULP, in - |x| >= 1: -- __v_asinh(0x1.2cd9d717e2c9bp+0) got 0x1.ffffcfd0e234fp-1 -- want 0x1.ffffcfd0e2352p-1. */ -+ _ZGVnN2v_asinh(0x1.2cd9d73ea76a6p+0) got 0x1.ffffd003219dap-1 -+ want 0x1.ffffd003219ddp-1. */ - VPCS_ATTR float64x2_t V_NAME_D1 (asinh) (float64x2_t x) - { - const struct data *d = ptr_barrier (&data); -- - float64x2_t ax = vabsq_f64 (x); -- uint64x2_t iax = vreinterpretq_u64_f64 (ax); - - uint64x2_t gt1 = vcgeq_f64 (ax, v_f64 (1)); -- uint64x2_t special = vcgeq_u64 (iax, d->huge_bound); - - #if WANT_SIMD_EXCEPT -+ uint64x2_t iax = vreinterpretq_u64_f64 (ax); -+ uint64x2_t special = vcgeq_u64 (iax, (d->huge_bound)); - uint64x2_t tiny = vcltq_f64 (ax, d->tiny_bound); - special = vorrq_u64 (special, tiny); -+#else -+ uint64x2_t special = vcgeq_f64 (ax, vreinterpretq_f64_u64 (d->huge_bound)); - #endif - - /* Option 1: |x| >= 1. -@@ -147,19 +185,45 @@ VPCS_ATTR float64x2_t V_NAME_D1 (asinh) (float64x2_t x) - overflow, and tiny lanes, which will underflow, by setting them to 0. They - will be fixed later, either by selecting x or falling back to the scalar - special-case. The largest observed error in this region is 1.47 ULPs: -- __v_asinh(0x1.fdfcd00cc1e6ap-1) got 0x1.c1d6bf874019bp-1 -- want 0x1.c1d6bf874019cp-1. */ -+ _ZGVnN2v_asinh(0x1.fdfcd00cc1e6ap-1) got 0x1.c1d6bf874019bp-1 -+ want 0x1.c1d6bf874019cp-1. */ - float64x2_t option_2 = v_f64 (0); -+ - if (__glibc_likely (v_any_u64 (vceqzq_u64 (gt1)))) - { -+ - #if WANT_SIMD_EXCEPT - ax = v_zerofy_f64 (ax, vorrq_u64 (tiny, gt1)); - #endif -- float64x2_t x2 = vmulq_f64 (ax, ax), x3 = vmulq_f64 (ax, x2), -- z2 = vmulq_f64 (x2, x2), z4 = vmulq_f64 (z2, z2), -- z8 = vmulq_f64 (z4, z4), z16 = vmulq_f64 (z8, z8); -- float64x2_t p = v_estrin_17_f64 (x2, z2, z4, z8, z16, d->poly); -- option_2 = vfmaq_f64 (ax, p, x3); -+ float64x2_t x2 = vmulq_f64 (ax, ax), z2 = vmulq_f64 (x2, x2); -+ /* Order-17 Pairwise Horner scheme. */ -+ float64x2_t c13 = vld1q_f64 (&d->c1); -+ float64x2_t c57 = vld1q_f64 (&d->c5); -+ float64x2_t c911 = vld1q_f64 (&d->c9); -+ float64x2_t c1315 = vld1q_f64 (&d->c13); -+ -+ float64x2_t p01 = vfmaq_laneq_f64 (d->c0, x2, c13, 0); -+ float64x2_t p23 = vfmaq_laneq_f64 (d->c2, x2, c13, 1); -+ float64x2_t p45 = vfmaq_laneq_f64 (d->c4, x2, c57, 0); -+ float64x2_t p67 = vfmaq_laneq_f64 (d->c6, x2, c57, 1); -+ float64x2_t p89 = vfmaq_laneq_f64 (d->c8, x2, c911, 0); -+ float64x2_t p1011 = vfmaq_laneq_f64 (d->c10, x2, c911, 1); -+ float64x2_t p1213 = vfmaq_laneq_f64 (d->c12, x2, c1315, 0); -+ float64x2_t p1415 = vfmaq_laneq_f64 (d->c14, x2, c1315, 1); -+ float64x2_t p1617 = vfmaq_f64 (d->c16, x2, d->c17); -+ -+ float64x2_t p = vfmaq_f64 (p1415, z2, p1617); -+ p = vfmaq_f64 (p1213, z2, p); -+ p = vfmaq_f64 (p1011, z2, p); -+ p = vfmaq_f64 (p89, z2, p); -+ -+ p = vfmaq_f64 (p67, z2, p); -+ p = vfmaq_f64 (p45, z2, p); -+ -+ p = vfmaq_f64 (p23, z2, p); -+ -+ p = vfmaq_f64 (p01, z2, p); -+ option_2 = vfmaq_f64 (ax, p, vmulq_f64 (ax, x2)); - #if WANT_SIMD_EXCEPT - option_2 = vbslq_f64 (tiny, x, option_2); - #endif -@@ -167,10 +231,10 @@ VPCS_ATTR float64x2_t V_NAME_D1 (asinh) (float64x2_t x) - - /* Choose the right option for each lane. */ - float64x2_t y = vbslq_f64 (gt1, option_1, option_2); -- /* Copy sign. */ -- y = vbslq_f64 (d->abs_mask, y, x); -- - if (__glibc_unlikely (v_any_u64 (special))) -- return special_case (x, y, special); -- return y; -+ { -+ return special_case (x, y, d->abs_mask, special); -+ } -+ /* Copy sign. */ -+ return vbslq_f64 (d->abs_mask, y, x); - } - -commit 5f45c0f91eae99b7d49f5c63b900441eb3491213 -Author: Luna Lamb -Date: Fri Jan 3 19:02:52 2025 +0000 - - AArch64: Improve codegen in SVE tans - - Improves memory access. - Tan: MOVPRFX 7 -> 2, LD1RD 12 -> 5, move MOV away from return. - Tanf: MOV 2 -> 1, MOVPRFX 6 -> 3, LD1RW 5 -> 4, move mov away from return. - - (cherry picked from commit aa6609feb20ebf8653db639dabe2a6afc77b02cc) - -diff --git a/sysdeps/aarch64/fpu/tan_sve.c b/sysdeps/aarch64/fpu/tan_sve.c -index b2e4447316..a7318fd417 100644 ---- a/sysdeps/aarch64/fpu/tan_sve.c -+++ b/sysdeps/aarch64/fpu/tan_sve.c -@@ -22,24 +22,38 @@ - - static const struct data - { -- double poly[9]; -- double half_pi_hi, half_pi_lo, inv_half_pi, range_val, shift; -+ double c2, c4, c6, c8; -+ double poly_1357[4]; -+ double c0, inv_half_pi; -+ double half_pi_hi, half_pi_lo, range_val; - } data = { - /* Polynomial generated with FPMinimax. */ -- .poly = { 0x1.5555555555556p-2, 0x1.1111111110a63p-3, 0x1.ba1ba1bb46414p-5, -- 0x1.664f47e5b5445p-6, 0x1.226e5e5ecdfa3p-7, 0x1.d6c7ddbf87047p-9, -- 0x1.7ea75d05b583ep-10, 0x1.289f22964a03cp-11, -- 0x1.4e4fd14147622p-12, }, -+ .c2 = 0x1.ba1ba1bb46414p-5, -+ .c4 = 0x1.226e5e5ecdfa3p-7, -+ .c6 = 0x1.7ea75d05b583ep-10, -+ .c8 = 0x1.4e4fd14147622p-12, -+ .poly_1357 = { 0x1.1111111110a63p-3, 0x1.664f47e5b5445p-6, -+ 0x1.d6c7ddbf87047p-9, 0x1.289f22964a03cp-11 }, -+ .c0 = 0x1.5555555555556p-2, -+ .inv_half_pi = 0x1.45f306dc9c883p-1, - .half_pi_hi = 0x1.921fb54442d18p0, - .half_pi_lo = 0x1.1a62633145c07p-54, -- .inv_half_pi = 0x1.45f306dc9c883p-1, - .range_val = 0x1p23, -- .shift = 0x1.8p52, - }; - - static svfloat64_t NOINLINE --special_case (svfloat64_t x, svfloat64_t y, svbool_t special) -+special_case (svfloat64_t x, svfloat64_t p, svfloat64_t q, svbool_t pg, -+ svbool_t special) - { -+ svbool_t use_recip = svcmpeq ( -+ pg, svand_x (pg, svreinterpret_u64 (svcvt_s64_x (pg, q)), 1), 0); -+ -+ svfloat64_t n = svmad_x (pg, p, p, -1); -+ svfloat64_t d = svmul_x (svptrue_b64 (), p, 2); -+ svfloat64_t swap = n; -+ n = svneg_m (n, use_recip, d); -+ d = svsel (use_recip, swap, d); -+ svfloat64_t y = svdiv_x (svnot_z (pg, special), n, d); - return sv_call_f64 (tan, x, y, special); - } - -@@ -50,15 +64,10 @@ special_case (svfloat64_t x, svfloat64_t y, svbool_t special) - svfloat64_t SV_NAME_D1 (tan) (svfloat64_t x, svbool_t pg) - { - const struct data *dat = ptr_barrier (&data); -- -- /* Invert condition to catch NaNs and Infs as well as large values. */ -- svbool_t special = svnot_z (pg, svaclt (pg, x, dat->range_val)); -- -+ svfloat64_t half_pi_c0 = svld1rq (svptrue_b64 (), &dat->c0); - /* q = nearest integer to 2 * x / pi. */ -- svfloat64_t shift = sv_f64 (dat->shift); -- svfloat64_t q = svmla_x (pg, shift, x, dat->inv_half_pi); -- q = svsub_x (pg, q, shift); -- svint64_t qi = svcvt_s64_x (pg, q); -+ svfloat64_t q = svmul_lane (x, half_pi_c0, 1); -+ q = svrinta_x (pg, q); - - /* Use q to reduce x to r in [-pi/4, pi/4], by: - r = x - q * pi/2, in extended precision. */ -@@ -68,7 +77,7 @@ svfloat64_t SV_NAME_D1 (tan) (svfloat64_t x, svbool_t pg) - r = svmls_lane (r, q, half_pi, 1); - /* Further reduce r to [-pi/8, pi/8], to be reconstructed using double angle - formula. */ -- r = svmul_x (pg, r, 0.5); -+ r = svmul_x (svptrue_b64 (), r, 0.5); - - /* Approximate tan(r) using order 8 polynomial. - tan(x) is odd, so polynomial has the form: -@@ -76,29 +85,51 @@ svfloat64_t SV_NAME_D1 (tan) (svfloat64_t x, svbool_t pg) - Hence we first approximate P(r) = C1 + C2 * r^2 + C3 * r^4 + ... - Then compute the approximation by: - tan(r) ~= r + r^3 * (C0 + r^2 * P(r)). */ -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t r4 = svmul_x (pg, r2, r2); -- svfloat64_t r8 = svmul_x (pg, r4, r4); -+ -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ svfloat64_t r4 = svmul_x (svptrue_b64 (), r2, r2); -+ svfloat64_t r8 = svmul_x (svptrue_b64 (), r4, r4); - /* Use offset version coeff array by 1 to evaluate from C1 onwards. */ -- svfloat64_t p = sv_estrin_7_f64_x (pg, r2, r4, r8, dat->poly + 1); -- p = svmad_x (pg, p, r2, dat->poly[0]); -- p = svmla_x (pg, r, r2, svmul_x (pg, p, r)); -+ svfloat64_t C_24 = svld1rq (svptrue_b64 (), &dat->c2); -+ svfloat64_t C_68 = svld1rq (svptrue_b64 (), &dat->c6); -+ -+ /* Use offset version coeff array by 1 to evaluate from C1 onwards. */ -+ svfloat64_t p01 = svmla_lane (sv_f64 (dat->poly_1357[0]), r2, C_24, 0); -+ svfloat64_t p23 = svmla_lane_f64 (sv_f64 (dat->poly_1357[1]), r2, C_24, 1); -+ svfloat64_t p03 = svmla_x (pg, p01, p23, r4); -+ -+ svfloat64_t p45 = svmla_lane (sv_f64 (dat->poly_1357[2]), r2, C_68, 0); -+ svfloat64_t p67 = svmla_lane (sv_f64 (dat->poly_1357[3]), r2, C_68, 1); -+ svfloat64_t p47 = svmla_x (pg, p45, p67, r4); -+ -+ svfloat64_t p = svmla_x (pg, p03, p47, r8); -+ -+ svfloat64_t z = svmul_x (svptrue_b64 (), p, r); -+ z = svmul_x (svptrue_b64 (), r2, z); -+ z = svmla_lane (z, r, half_pi_c0, 0); -+ p = svmla_x (pg, r, r2, z); - - /* Recombination uses double-angle formula: - tan(2x) = 2 * tan(x) / (1 - (tan(x))^2) - and reciprocity around pi/2: - tan(x) = 1 / (tan(pi/2 - x)) - to assemble result using change-of-sign and conditional selection of -- numerator/denominator dependent on odd/even-ness of q (hence quadrant). */ -- svbool_t use_recip -- = svcmpeq (pg, svand_x (pg, svreinterpret_u64 (qi), 1), 0); -+ numerator/denominator dependent on odd/even-ness of q (quadrant). */ -+ -+ /* Invert condition to catch NaNs and Infs as well as large values. */ -+ svbool_t special = svnot_z (pg, svaclt (pg, x, dat->range_val)); -+ -+ if (__glibc_unlikely (svptest_any (pg, special))) -+ { -+ return special_case (x, p, q, pg, special); -+ } -+ svbool_t use_recip = svcmpeq ( -+ pg, svand_x (pg, svreinterpret_u64 (svcvt_s64_x (pg, q)), 1), 0); - - svfloat64_t n = svmad_x (pg, p, p, -1); -- svfloat64_t d = svmul_x (pg, p, 2); -+ svfloat64_t d = svmul_x (svptrue_b64 (), p, 2); - svfloat64_t swap = n; - n = svneg_m (n, use_recip, d); - d = svsel (use_recip, swap, d); -- if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svdiv_x (svnot_z (pg, special), n, d), special); - return svdiv_x (pg, n, d); - } -diff --git a/sysdeps/aarch64/fpu/tanf_sve.c b/sysdeps/aarch64/fpu/tanf_sve.c -index f342583241..e850fb4882 100644 ---- a/sysdeps/aarch64/fpu/tanf_sve.c -+++ b/sysdeps/aarch64/fpu/tanf_sve.c -@@ -60,21 +60,16 @@ svfloat32_t SV_NAME_F1 (tan) (svfloat32_t x, const svbool_t pg) - { - const struct data *d = ptr_barrier (&data); - -- /* Determine whether input is too large to perform fast regression. */ -- svbool_t cmp = svacge (pg, x, d->range_val); -- - svfloat32_t odd_coeffs = svld1rq (svptrue_b32 (), &d->c1); - svfloat32_t pi_vals = svld1rq (svptrue_b32 (), &d->pio2_1); - - /* n = rint(x/(pi/2)). */ -- svfloat32_t q = svmla_lane (sv_f32 (d->shift), x, pi_vals, 3); -- svfloat32_t n = svsub_x (pg, q, d->shift); -+ svfloat32_t n = svrintn_x (pg, svmul_lane (x, pi_vals, 3)); - /* n is already a signed integer, simply convert it. */ - svint32_t in = svcvt_s32_x (pg, n); - /* Determine if x lives in an interval, where |tan(x)| grows to infinity. */ - svint32_t alt = svand_x (pg, in, 1); - svbool_t pred_alt = svcmpne (pg, alt, 0); -- - /* r = x - n * (pi/2) (range reduction into 0 .. pi/4). */ - svfloat32_t r; - r = svmls_lane (x, n, pi_vals, 0); -@@ -93,7 +88,7 @@ svfloat32_t SV_NAME_F1 (tan) (svfloat32_t x, const svbool_t pg) - - /* Evaluate polynomial approximation of tangent on [-pi/4, pi/4], - using Estrin on z^2. */ -- svfloat32_t z2 = svmul_x (pg, z, z); -+ svfloat32_t z2 = svmul_x (svptrue_b32 (), r, r); - svfloat32_t p01 = svmla_lane (sv_f32 (d->c0), z2, odd_coeffs, 0); - svfloat32_t p23 = svmla_lane (sv_f32 (d->c2), z2, odd_coeffs, 1); - svfloat32_t p45 = svmla_lane (sv_f32 (d->c4), z2, odd_coeffs, 2); -@@ -106,13 +101,14 @@ svfloat32_t SV_NAME_F1 (tan) (svfloat32_t x, const svbool_t pg) - - svfloat32_t y = svmla_x (pg, z, p, svmul_x (pg, z, z2)); - -- /* Transform result back, if necessary. */ -- svfloat32_t inv_y = svdivr_x (pg, y, 1.0f); -- - /* No need to pass pg to specialcase here since cmp is a strict subset, - guaranteed by the cmpge above. */ -+ -+ /* Determine whether input is too large to perform fast regression. */ -+ svbool_t cmp = svacge (pg, x, d->range_val); - if (__glibc_unlikely (svptest_any (pg, cmp))) -- return special_case (x, svsel (pred_alt, inv_y, y), cmp); -+ return special_case (x, svdivr_x (pg, y, 1.0f), cmp); - -+ svfloat32_t inv_y = svdivr_x (pg, y, 1.0f); - return svsel (pred_alt, inv_y, y); - } - -commit ab5ba6c188159bb5e12be95cd90458924c2fe592 -Author: Yat Long Poon -Date: Fri Jan 3 19:07:30 2025 +0000 - - AArch64: Improve codegen for SVE logs - - Reduce memory access by using lanewise MLA and moving constants to struct - and reduce number of MOVPRFXs. - Update maximum ULP error for double log_sve from 1 to 2. - Speedup on Neoverse V1 for log (3%), log2 (5%), and log10 (4%). - - (cherry picked from commit 32d193a372feb28f9da247bb7283d404b84429c6) - -diff --git a/sysdeps/aarch64/fpu/log10_sve.c b/sysdeps/aarch64/fpu/log10_sve.c -index ab7362128d..f1cad2759a 100644 ---- a/sysdeps/aarch64/fpu/log10_sve.c -+++ b/sysdeps/aarch64/fpu/log10_sve.c -@@ -23,28 +23,49 @@ - #define Min 0x0010000000000000 - #define Max 0x7ff0000000000000 - #define Thres 0x7fe0000000000000 /* Max - Min. */ --#define Off 0x3fe6900900000000 - #define N (1 << V_LOG10_TABLE_BITS) - -+static const struct data -+{ -+ double c0, c2; -+ double c1, c3; -+ double invln10, log10_2; -+ double c4; -+ uint64_t off; -+} data = { -+ .c0 = -0x1.bcb7b1526e506p-3, -+ .c1 = 0x1.287a7636be1d1p-3, -+ .c2 = -0x1.bcb7b158af938p-4, -+ .c3 = 0x1.63c78734e6d07p-4, -+ .c4 = -0x1.287461742fee4p-4, -+ .invln10 = 0x1.bcb7b1526e50ep-2, -+ .log10_2 = 0x1.34413509f79ffp-2, -+ .off = 0x3fe6900900000000, -+}; -+ - static svfloat64_t NOINLINE --special_case (svfloat64_t x, svfloat64_t y, svbool_t special) -+special_case (svfloat64_t hi, svuint64_t tmp, svfloat64_t y, svfloat64_t r2, -+ svbool_t special, const struct data *d) - { -- return sv_call_f64 (log10, x, y, special); -+ svfloat64_t x = svreinterpret_f64 (svadd_x (svptrue_b64 (), tmp, d->off)); -+ return sv_call_f64 (log10, x, svmla_x (svptrue_b64 (), hi, r2, y), special); - } - --/* SVE log10 algorithm. -+/* Double-precision SVE log10 routine. - Maximum measured error is 2.46 ulps. - SV_NAME_D1 (log10)(0x1.131956cd4b627p+0) got 0x1.fffbdf6eaa669p-6 - want 0x1.fffbdf6eaa667p-6. */ - svfloat64_t SV_NAME_D1 (log10) (svfloat64_t x, const svbool_t pg) - { -+ const struct data *d = ptr_barrier (&data); -+ - svuint64_t ix = svreinterpret_u64 (x); - svbool_t special = svcmpge (pg, svsub_x (pg, ix, Min), Thres); - - /* x = 2^k z; where z is in range [Off,2*Off) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- svuint64_t tmp = svsub_x (pg, ix, Off); -+ svuint64_t tmp = svsub_x (pg, ix, d->off); - svuint64_t i = svlsr_x (pg, tmp, 51 - V_LOG10_TABLE_BITS); - i = svand_x (pg, i, (N - 1) << 1); - svfloat64_t k = svcvt_f64_x (pg, svasr_x (pg, svreinterpret_s64 (tmp), 52)); -@@ -62,15 +83,19 @@ svfloat64_t SV_NAME_D1 (log10) (svfloat64_t x, const svbool_t pg) - svfloat64_t r = svmad_x (pg, invc, z, -1.0); - - /* hi = log(c) + k*log(2). */ -- svfloat64_t w = svmla_x (pg, logc, r, __v_log10_data.invln10); -- svfloat64_t hi = svmla_x (pg, w, k, __v_log10_data.log10_2); -+ svfloat64_t invln10_log10_2 = svld1rq_f64 (svptrue_b64 (), &d->invln10); -+ svfloat64_t w = svmla_lane_f64 (logc, r, invln10_log10_2, 0); -+ svfloat64_t hi = svmla_lane_f64 (w, k, invln10_log10_2, 1); - - /* y = r2*(A0 + r*A1 + r2*(A2 + r*A3 + r2*A4)) + hi. */ -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t y = sv_pw_horner_4_f64_x (pg, r, r2, __v_log10_data.poly); -+ svfloat64_t odd_coeffs = svld1rq_f64 (svptrue_b64 (), &d->c1); -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ svfloat64_t y = svmla_lane_f64 (sv_f64 (d->c2), r, odd_coeffs, 1); -+ svfloat64_t p = svmla_lane_f64 (sv_f64 (d->c0), r, odd_coeffs, 0); -+ y = svmla_x (pg, y, r2, d->c4); -+ y = svmla_x (pg, p, r2, y); - - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svmla_x (svnot_z (pg, special), hi, r2, y), -- special); -+ return special_case (hi, tmp, y, r2, special, d); - return svmla_x (pg, hi, r2, y); - } -diff --git a/sysdeps/aarch64/fpu/log2_sve.c b/sysdeps/aarch64/fpu/log2_sve.c -index 743fa2a913..908e638246 100644 ---- a/sysdeps/aarch64/fpu/log2_sve.c -+++ b/sysdeps/aarch64/fpu/log2_sve.c -@@ -21,15 +21,32 @@ - #include "poly_sve_f64.h" - - #define N (1 << V_LOG2_TABLE_BITS) --#define Off 0x3fe6900900000000 - #define Max (0x7ff0000000000000) - #define Min (0x0010000000000000) - #define Thresh (0x7fe0000000000000) /* Max - Min. */ - -+static const struct data -+{ -+ double c0, c2; -+ double c1, c3; -+ double invln2, c4; -+ uint64_t off; -+} data = { -+ .c0 = -0x1.71547652b83p-1, -+ .c1 = 0x1.ec709dc340953p-2, -+ .c2 = -0x1.71547651c8f35p-2, -+ .c3 = 0x1.2777ebe12dda5p-2, -+ .c4 = -0x1.ec738d616fe26p-3, -+ .invln2 = 0x1.71547652b82fep0, -+ .off = 0x3fe6900900000000, -+}; -+ - static svfloat64_t NOINLINE --special_case (svfloat64_t x, svfloat64_t y, svbool_t cmp) -+special_case (svfloat64_t w, svuint64_t tmp, svfloat64_t y, svfloat64_t r2, -+ svbool_t special, const struct data *d) - { -- return sv_call_f64 (log2, x, y, cmp); -+ svfloat64_t x = svreinterpret_f64 (svadd_x (svptrue_b64 (), tmp, d->off)); -+ return sv_call_f64 (log2, x, svmla_x (svptrue_b64 (), w, r2, y), special); - } - - /* Double-precision SVE log2 routine. -@@ -40,13 +57,15 @@ special_case (svfloat64_t x, svfloat64_t y, svbool_t cmp) - want 0x1.fffb34198d9ddp-5. */ - svfloat64_t SV_NAME_D1 (log2) (svfloat64_t x, const svbool_t pg) - { -+ const struct data *d = ptr_barrier (&data); -+ - svuint64_t ix = svreinterpret_u64 (x); - svbool_t special = svcmpge (pg, svsub_x (pg, ix, Min), Thresh); - - /* x = 2^k z; where z is in range [Off,2*Off) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- svuint64_t tmp = svsub_x (pg, ix, Off); -+ svuint64_t tmp = svsub_x (pg, ix, d->off); - svuint64_t i = svlsr_x (pg, tmp, 51 - V_LOG2_TABLE_BITS); - i = svand_x (pg, i, (N - 1) << 1); - svfloat64_t k = svcvt_f64_x (pg, svasr_x (pg, svreinterpret_s64 (tmp), 52)); -@@ -59,15 +78,19 @@ svfloat64_t SV_NAME_D1 (log2) (svfloat64_t x, const svbool_t pg) - - /* log2(x) = log1p(z/c-1)/log(2) + log2(c) + k. */ - -+ svfloat64_t invln2_and_c4 = svld1rq_f64 (svptrue_b64 (), &d->invln2); - svfloat64_t r = svmad_x (pg, invc, z, -1.0); -- svfloat64_t w = svmla_x (pg, log2c, r, __v_log2_data.invln2); -- -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t y = sv_pw_horner_4_f64_x (pg, r, r2, __v_log2_data.poly); -+ svfloat64_t w = svmla_lane_f64 (log2c, r, invln2_and_c4, 0); - w = svadd_x (pg, k, w); - -+ svfloat64_t odd_coeffs = svld1rq_f64 (svptrue_b64 (), &d->c1); -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ svfloat64_t y = svmla_lane_f64 (sv_f64 (d->c2), r, odd_coeffs, 1); -+ svfloat64_t p = svmla_lane_f64 (sv_f64 (d->c0), r, odd_coeffs, 0); -+ y = svmla_lane_f64 (y, r2, invln2_and_c4, 1); -+ y = svmla_x (pg, p, r2, y); -+ - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svmla_x (svnot_z (pg, special), w, r2, y), -- special); -+ return special_case (w, tmp, y, r2, special, d); - return svmla_x (pg, w, r2, y); - } -diff --git a/sysdeps/aarch64/fpu/log_sve.c b/sysdeps/aarch64/fpu/log_sve.c -index 9b689f2ec7..044223400b 100644 ---- a/sysdeps/aarch64/fpu/log_sve.c -+++ b/sysdeps/aarch64/fpu/log_sve.c -@@ -19,39 +19,54 @@ - - #include "sv_math.h" - --#define P(i) sv_f64 (__v_log_data.poly[i]) - #define N (1 << V_LOG_TABLE_BITS) --#define Off (0x3fe6900900000000) --#define MaxTop (0x7ff) --#define MinTop (0x001) --#define ThreshTop (0x7fe) /* MaxTop - MinTop. */ -+#define Max (0x7ff0000000000000) -+#define Min (0x0010000000000000) -+#define Thresh (0x7fe0000000000000) /* Max - Min. */ -+ -+static const struct data -+{ -+ double c0, c2; -+ double c1, c3; -+ double ln2, c4; -+ uint64_t off; -+} data = { -+ .c0 = -0x1.ffffffffffff7p-2, -+ .c1 = 0x1.55555555170d4p-2, -+ .c2 = -0x1.0000000399c27p-2, -+ .c3 = 0x1.999b2e90e94cap-3, -+ .c4 = -0x1.554e550bd501ep-3, -+ .ln2 = 0x1.62e42fefa39efp-1, -+ .off = 0x3fe6900900000000, -+}; - - static svfloat64_t NOINLINE --special_case (svfloat64_t x, svfloat64_t y, svbool_t cmp) -+special_case (svfloat64_t hi, svuint64_t tmp, svfloat64_t y, svfloat64_t r2, -+ svbool_t special, const struct data *d) - { -- return sv_call_f64 (log, x, y, cmp); -+ svfloat64_t x = svreinterpret_f64 (svadd_x (svptrue_b64 (), tmp, d->off)); -+ return sv_call_f64 (log, x, svmla_x (svptrue_b64 (), hi, r2, y), special); - } - --/* SVE port of AdvSIMD log algorithm. -- Maximum measured error is 2.17 ulp: -- SV_NAME_D1 (log)(0x1.a6129884398a3p+0) got 0x1.ffffff1cca043p-2 -- want 0x1.ffffff1cca045p-2. */ -+/* Double-precision SVE log routine. -+ Maximum measured error is 2.64 ulp: -+ SV_NAME_D1 (log)(0x1.95e54bc91a5e2p+184) got 0x1.fffffffe88cacp+6 -+ want 0x1.fffffffe88cafp+6. */ - svfloat64_t SV_NAME_D1 (log) (svfloat64_t x, const svbool_t pg) - { -+ const struct data *d = ptr_barrier (&data); -+ - svuint64_t ix = svreinterpret_u64 (x); -- svuint64_t top = svlsr_x (pg, ix, 52); -- svbool_t cmp = svcmpge (pg, svsub_x (pg, top, MinTop), sv_u64 (ThreshTop)); -+ svbool_t special = svcmpge (pg, svsub_x (pg, ix, Min), Thresh); - - /* x = 2^k z; where z is in range [Off,2*Off) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- svuint64_t tmp = svsub_x (pg, ix, Off); -+ svuint64_t tmp = svsub_x (pg, ix, d->off); - /* Calculate table index = (tmp >> (52 - V_LOG_TABLE_BITS)) % N. - The actual value of i is double this due to table layout. */ - svuint64_t i - = svand_x (pg, svlsr_x (pg, tmp, (51 - V_LOG_TABLE_BITS)), (N - 1) << 1); -- svint64_t k -- = svasr_x (pg, svreinterpret_s64 (tmp), 52); /* Arithmetic shift. */ - svuint64_t iz = svsub_x (pg, ix, svand_x (pg, tmp, 0xfffULL << 52)); - svfloat64_t z = svreinterpret_f64 (iz); - /* Lookup in 2 global lists (length N). */ -@@ -59,18 +74,22 @@ svfloat64_t SV_NAME_D1 (log) (svfloat64_t x, const svbool_t pg) - svfloat64_t logc = svld1_gather_index (pg, &__v_log_data.table[0].logc, i); - - /* log(x) = log1p(z/c-1) + log(c) + k*Ln2. */ -- svfloat64_t r = svmad_x (pg, invc, z, -1); -- svfloat64_t kd = svcvt_f64_x (pg, k); -+ svfloat64_t kd = svcvt_f64_x (pg, svasr_x (pg, svreinterpret_s64 (tmp), 52)); - /* hi = r + log(c) + k*Ln2. */ -- svfloat64_t hi = svmla_x (pg, svadd_x (pg, logc, r), kd, __v_log_data.ln2); -+ svfloat64_t ln2_and_c4 = svld1rq_f64 (svptrue_b64 (), &d->ln2); -+ svfloat64_t r = svmad_x (pg, invc, z, -1); -+ svfloat64_t hi = svmla_lane_f64 (logc, kd, ln2_and_c4, 0); -+ hi = svadd_x (pg, r, hi); -+ - /* y = r2*(A0 + r*A1 + r2*(A2 + r*A3 + r2*A4)) + hi. */ -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t y = svmla_x (pg, P (2), r, P (3)); -- svfloat64_t p = svmla_x (pg, P (0), r, P (1)); -- y = svmla_x (pg, y, r2, P (4)); -+ svfloat64_t odd_coeffs = svld1rq_f64 (svptrue_b64 (), &d->c1); -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ svfloat64_t y = svmla_lane_f64 (sv_f64 (d->c2), r, odd_coeffs, 1); -+ svfloat64_t p = svmla_lane_f64 (sv_f64 (d->c0), r, odd_coeffs, 0); -+ y = svmla_lane_f64 (y, r2, ln2_and_c4, 1); - y = svmla_x (pg, p, r2, y); - -- if (__glibc_unlikely (svptest_any (pg, cmp))) -- return special_case (x, svmla_x (svnot_z (pg, cmp), hi, r2, y), cmp); -+ if (__glibc_unlikely (svptest_any (pg, special))) -+ return special_case (hi, tmp, y, r2, special, d); - return svmla_x (pg, hi, r2, y); - } -diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps -index 6c96304611..b76c38dac2 100644 ---- a/sysdeps/aarch64/libm-test-ulps -+++ b/sysdeps/aarch64/libm-test-ulps -@@ -1460,7 +1460,7 @@ float: 2 - ldouble: 1 - - Function: "log_sve": --double: 1 -+double: 2 - float: 3 - - Function: "log_towardzero": - -commit aa7c61ea15e27ae14717e065a5d4c50baa472851 -Author: Yat Long Poon -Date: Fri Jan 3 19:09:05 2025 +0000 - - AArch64: Improve codegen for SVE log1pf users - - Reduce memory access by using lanewise MLA and reduce number of MOVPRFXs. - Move log1pf implementation to inline helper function. - Speedup on Neoverse V1 for log1pf (10%), acoshf (-1%), atanhf (2%), asinhf (2%). - - (cherry picked from commit 91c1fadba338752bf514cd4cca057b27b1b10eed) - -diff --git a/sysdeps/aarch64/fpu/acoshf_sve.c b/sysdeps/aarch64/fpu/acoshf_sve.c -index 2110894e62..491365e24d 100644 ---- a/sysdeps/aarch64/fpu/acoshf_sve.c -+++ b/sysdeps/aarch64/fpu/acoshf_sve.c -@@ -17,23 +17,26 @@ - License along with the GNU C Library; if not, see - . */ - -+#include "sv_math.h" -+#include "sv_log1pf_inline.h" -+ - #define One 0x3f800000 - #define Thres 0x20000000 /* asuint(0x1p64) - One. */ - --#include "sv_log1pf_inline.h" -- - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+special_case (svfloat32_t xm1, svfloat32_t tmp, svbool_t special) - { -+ svfloat32_t x = svadd_x (svptrue_b32 (), xm1, 1.0f); -+ svfloat32_t y = sv_log1pf_inline (tmp, svptrue_b32 ()); - return sv_call_f32 (acoshf, x, y, special); - } - - /* Single-precision SVE acosh(x) routine. Implements the same algorithm as - vector acoshf and log1p. - -- Maximum error is 2.78 ULPs: -- SV_NAME_F1 (acosh) (0x1.01e996p+0) got 0x1.f45b42p-4 -- want 0x1.f45b3cp-4. */ -+ Maximum error is 2.47 ULPs: -+ SV_NAME_F1 (acosh) (0x1.01ca76p+0) got 0x1.e435a6p-4 -+ want 0x1.e435a2p-4. */ - svfloat32_t SV_NAME_F1 (acosh) (svfloat32_t x, const svbool_t pg) - { - svuint32_t ix = svreinterpret_u32 (x); -@@ -41,9 +44,9 @@ svfloat32_t SV_NAME_F1 (acosh) (svfloat32_t x, const svbool_t pg) - - svfloat32_t xm1 = svsub_x (pg, x, 1.0f); - svfloat32_t u = svmul_x (pg, xm1, svadd_x (pg, x, 1.0f)); -- svfloat32_t y = sv_log1pf_inline (svadd_x (pg, xm1, svsqrt_x (pg, u)), pg); -+ svfloat32_t tmp = svadd_x (pg, xm1, svsqrt_x (pg, u)); - - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, y, special); -- return y; -+ return special_case (xm1, tmp, special); -+ return sv_log1pf_inline (tmp, pg); - } -diff --git a/sysdeps/aarch64/fpu/asinhf_sve.c b/sysdeps/aarch64/fpu/asinhf_sve.c -index d85c3a685c..b7f253bf32 100644 ---- a/sysdeps/aarch64/fpu/asinhf_sve.c -+++ b/sysdeps/aarch64/fpu/asinhf_sve.c -@@ -20,20 +20,23 @@ - #include "sv_math.h" - #include "sv_log1pf_inline.h" - --#define BigBound (0x5f800000) /* asuint(0x1p64). */ -+#define BigBound 0x5f800000 /* asuint(0x1p64). */ - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+special_case (svuint32_t iax, svuint32_t sign, svfloat32_t y, svbool_t special) - { -+ svfloat32_t x = svreinterpret_f32 (sveor_x (svptrue_b32 (), iax, sign)); -+ y = svreinterpret_f32 ( -+ svorr_x (svptrue_b32 (), sign, svreinterpret_u32 (y))); - return sv_call_f32 (asinhf, x, y, special); - } - - /* Single-precision SVE asinh(x) routine. Implements the same algorithm as - vector asinhf and log1p. - -- Maximum error is 2.48 ULPs: -- SV_NAME_F1 (asinh) (0x1.008864p-3) got 0x1.ffbbbcp-4 -- want 0x1.ffbbb8p-4. */ -+ Maximum error is 1.92 ULPs: -+ SV_NAME_F1 (asinh) (-0x1.0922ecp-1) got -0x1.fd0bccp-2 -+ want -0x1.fd0bc8p-2. */ - svfloat32_t SV_NAME_F1 (asinh) (svfloat32_t x, const svbool_t pg) - { - svfloat32_t ax = svabs_x (pg, x); -@@ -49,8 +52,6 @@ svfloat32_t SV_NAME_F1 (asinh) (svfloat32_t x, const svbool_t pg) - = sv_log1pf_inline (svadd_x (pg, ax, svdiv_x (pg, ax2, d)), pg); - - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case ( -- x, svreinterpret_f32 (svorr_x (pg, sign, svreinterpret_u32 (y))), -- special); -+ return special_case (iax, sign, y, special); - return svreinterpret_f32 (svorr_x (pg, sign, svreinterpret_u32 (y))); - } -diff --git a/sysdeps/aarch64/fpu/atanhf_sve.c b/sysdeps/aarch64/fpu/atanhf_sve.c -index dae83041ef..2d3005bbc8 100644 ---- a/sysdeps/aarch64/fpu/atanhf_sve.c -+++ b/sysdeps/aarch64/fpu/atanhf_sve.c -@@ -17,21 +17,25 @@ - License along with the GNU C Library; if not, see - . */ - -+#include "sv_math.h" - #include "sv_log1pf_inline.h" - - #define One (0x3f800000) - #define Half (0x3f000000) - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+special_case (svuint32_t iax, svuint32_t sign, svfloat32_t halfsign, -+ svfloat32_t y, svbool_t special) - { -+ svfloat32_t x = svreinterpret_f32 (sveor_x (svptrue_b32 (), iax, sign)); -+ y = svmul_x (svptrue_b32 (), halfsign, y); - return sv_call_f32 (atanhf, x, y, special); - } - - /* Approximation for vector single-precision atanh(x) using modified log1p. -- The maximum error is 2.28 ULP: -- _ZGVsMxv_atanhf(0x1.ff1194p-5) got 0x1.ffbbbcp-5 -- want 0x1.ffbbb6p-5. */ -+ The maximum error is 1.99 ULP: -+ _ZGVsMxv_atanhf(0x1.f1583p-5) got 0x1.f1f4fap-5 -+ want 0x1.f1f4f6p-5. */ - svfloat32_t SV_NAME_F1 (atanh) (svfloat32_t x, const svbool_t pg) - { - svfloat32_t ax = svabs_x (pg, x); -@@ -48,7 +52,7 @@ svfloat32_t SV_NAME_F1 (atanh) (svfloat32_t x, const svbool_t pg) - y = sv_log1pf_inline (y, pg); - - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svmul_x (pg, halfsign, y), special); -+ return special_case (iax, sign, halfsign, y, special); - - return svmul_x (pg, halfsign, y); - } -diff --git a/sysdeps/aarch64/fpu/log1pf_sve.c b/sysdeps/aarch64/fpu/log1pf_sve.c -index 5256d5e94c..18a185c838 100644 ---- a/sysdeps/aarch64/fpu/log1pf_sve.c -+++ b/sysdeps/aarch64/fpu/log1pf_sve.c -@@ -18,30 +18,13 @@ - . */ - - #include "sv_math.h" --#include "poly_sve_f32.h" -- --static const struct data --{ -- float poly[8]; -- float ln2, exp_bias; -- uint32_t four, three_quarters; --} data = {.poly = {/* Do not store first term of polynomial, which is -0.5, as -- this can be fmov-ed directly instead of including it in -- the main load-and-mla polynomial schedule. */ -- 0x1.5555aap-2f, -0x1.000038p-2f, 0x1.99675cp-3f, -- -0x1.54ef78p-3f, 0x1.28a1f4p-3f, -0x1.0da91p-3f, -- 0x1.abcb6p-4f, -0x1.6f0d5ep-5f}, -- .ln2 = 0x1.62e43p-1f, -- .exp_bias = 0x1p-23f, -- .four = 0x40800000, -- .three_quarters = 0x3f400000}; -- --#define SignExponentMask 0xff800000 -+#include "sv_log1pf_inline.h" - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+special_case (svfloat32_t x, svbool_t special) - { -- return sv_call_f32 (log1pf, x, y, special); -+ return sv_call_f32 (log1pf, x, sv_log1pf_inline (x, svptrue_b32 ()), -+ special); - } - - /* Vector log1pf approximation using polynomial on reduced interval. Worst-case -@@ -50,53 +33,14 @@ special_case (svfloat32_t x, svfloat32_t y, svbool_t special) - want 0x1.9f323ep-2. */ - svfloat32_t SV_NAME_F1 (log1p) (svfloat32_t x, svbool_t pg) - { -- const struct data *d = ptr_barrier (&data); - /* x < -1, Inf/Nan. */ - svbool_t special = svcmpeq (pg, svreinterpret_u32 (x), 0x7f800000); - special = svorn_z (pg, special, svcmpge (pg, x, -1)); - -- /* With x + 1 = t * 2^k (where t = m + 1 and k is chosen such that m -- is in [-0.25, 0.5]): -- log1p(x) = log(t) + log(2^k) = log1p(m) + k*log(2). -- -- We approximate log1p(m) with a polynomial, then scale by -- k*log(2). Instead of doing this directly, we use an intermediate -- scale factor s = 4*k*log(2) to ensure the scale is representable -- as a normalised fp32 number. */ -- svfloat32_t m = svadd_x (pg, x, 1); -- -- /* Choose k to scale x to the range [-1/4, 1/2]. */ -- svint32_t k -- = svand_x (pg, svsub_x (pg, svreinterpret_s32 (m), d->three_quarters), -- sv_s32 (SignExponentMask)); -- -- /* Scale x by exponent manipulation. */ -- svfloat32_t m_scale = svreinterpret_f32 ( -- svsub_x (pg, svreinterpret_u32 (x), svreinterpret_u32 (k))); -- -- /* Scale up to ensure that the scale factor is representable as normalised -- fp32 number, and scale m down accordingly. */ -- svfloat32_t s = svreinterpret_f32 (svsubr_x (pg, k, d->four)); -- m_scale = svadd_x (pg, m_scale, svmla_x (pg, sv_f32 (-1), s, 0.25)); -- -- /* Evaluate polynomial on reduced interval. */ -- svfloat32_t ms2 = svmul_x (pg, m_scale, m_scale), -- ms4 = svmul_x (pg, ms2, ms2); -- svfloat32_t p = sv_estrin_7_f32_x (pg, m_scale, ms2, ms4, d->poly); -- p = svmad_x (pg, m_scale, p, -0.5); -- p = svmla_x (pg, m_scale, m_scale, svmul_x (pg, m_scale, p)); -- -- /* The scale factor to be applied back at the end - by multiplying float(k) -- by 2^-23 we get the unbiased exponent of k. */ -- svfloat32_t scale_back = svmul_x (pg, svcvt_f32_x (pg, k), d->exp_bias); -- -- /* Apply the scaling back. */ -- svfloat32_t y = svmla_x (pg, p, scale_back, d->ln2); -- - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, y, special); -+ return special_case (x, special); - -- return y; -+ return sv_log1pf_inline (x, pg); - } - - strong_alias (SV_NAME_F1 (log1p), SV_NAME_F1 (logp1)) -diff --git a/sysdeps/aarch64/fpu/sv_log1pf_inline.h b/sysdeps/aarch64/fpu/sv_log1pf_inline.h -index b94b2da055..850297d615 100644 ---- a/sysdeps/aarch64/fpu/sv_log1pf_inline.h -+++ b/sysdeps/aarch64/fpu/sv_log1pf_inline.h -@@ -22,55 +22,76 @@ - - #include "sv_math.h" - #include "vecmath_config.h" --#include "poly_sve_f32.h" -+ -+#define SignExponentMask 0xff800000 - - static const struct sv_log1pf_data - { -- float32_t poly[9]; -- float32_t ln2; -- float32_t scale_back; -+ float c0, c2, c4, c6; -+ float c1, c3, c5, c7; -+ float ln2, exp_bias, quarter; -+ uint32_t four, three_quarters; - } sv_log1pf_data = { -- /* Polynomial generated using FPMinimax in [-0.25, 0.5]. */ -- .poly = { -0x1p-1f, 0x1.5555aap-2f, -0x1.000038p-2f, 0x1.99675cp-3f, -- -0x1.54ef78p-3f, 0x1.28a1f4p-3f, -0x1.0da91p-3f, 0x1.abcb6p-4f, -- -0x1.6f0d5ep-5f }, -- .scale_back = 0x1.0p-23f, -- .ln2 = 0x1.62e43p-1f, -+ /* Do not store first term of polynomial, which is -0.5, as -+ this can be fmov-ed directly instead of including it in -+ the main load-and-mla polynomial schedule. */ -+ .c0 = 0x1.5555aap-2f, .c1 = -0x1.000038p-2f, .c2 = 0x1.99675cp-3f, -+ .c3 = -0x1.54ef78p-3f, .c4 = 0x1.28a1f4p-3f, .c5 = -0x1.0da91p-3f, -+ .c6 = 0x1.abcb6p-4f, .c7 = -0x1.6f0d5ep-5f, .ln2 = 0x1.62e43p-1f, -+ .exp_bias = 0x1p-23f, .quarter = 0x1p-2f, .four = 0x40800000, -+ .three_quarters = 0x3f400000, - }; - --static inline svfloat32_t --eval_poly (svfloat32_t m, const float32_t *c, svbool_t pg) --{ -- svfloat32_t p_12 = svmla_x (pg, sv_f32 (c[0]), m, sv_f32 (c[1])); -- svfloat32_t m2 = svmul_x (pg, m, m); -- svfloat32_t q = svmla_x (pg, m, m2, p_12); -- svfloat32_t p = sv_pw_horner_6_f32_x (pg, m, m2, c + 2); -- p = svmul_x (pg, m2, p); -- -- return svmla_x (pg, q, m2, p); --} -- - static inline svfloat32_t - sv_log1pf_inline (svfloat32_t x, svbool_t pg) - { - const struct sv_log1pf_data *d = ptr_barrier (&sv_log1pf_data); - -- svfloat32_t m = svadd_x (pg, x, 1.0f); -- -- svint32_t ks = svsub_x (pg, svreinterpret_s32 (m), -- svreinterpret_s32 (svdup_f32 (0.75f))); -- ks = svand_x (pg, ks, 0xff800000); -- svuint32_t k = svreinterpret_u32 (ks); -- svfloat32_t s = svreinterpret_f32 ( -- svsub_x (pg, svreinterpret_u32 (svdup_f32 (4.0f)), k)); -- -- svfloat32_t m_scale -- = svreinterpret_f32 (svsub_x (pg, svreinterpret_u32 (x), k)); -- m_scale -- = svadd_x (pg, m_scale, svmla_x (pg, sv_f32 (-1.0f), sv_f32 (0.25f), s)); -- svfloat32_t p = eval_poly (m_scale, d->poly, pg); -- svfloat32_t scale_back = svmul_x (pg, svcvt_f32_x (pg, k), d->scale_back); -- return svmla_x (pg, p, scale_back, d->ln2); -+ /* With x + 1 = t * 2^k (where t = m + 1 and k is chosen such that m -+ is in [-0.25, 0.5]): -+ log1p(x) = log(t) + log(2^k) = log1p(m) + k*log(2). -+ -+ We approximate log1p(m) with a polynomial, then scale by -+ k*log(2). Instead of doing this directly, we use an intermediate -+ scale factor s = 4*k*log(2) to ensure the scale is representable -+ as a normalised fp32 number. */ -+ svfloat32_t m = svadd_x (pg, x, 1); -+ -+ /* Choose k to scale x to the range [-1/4, 1/2]. */ -+ svint32_t k -+ = svand_x (pg, svsub_x (pg, svreinterpret_s32 (m), d->three_quarters), -+ sv_s32 (SignExponentMask)); -+ -+ /* Scale x by exponent manipulation. */ -+ svfloat32_t m_scale = svreinterpret_f32 ( -+ svsub_x (pg, svreinterpret_u32 (x), svreinterpret_u32 (k))); -+ -+ /* Scale up to ensure that the scale factor is representable as normalised -+ fp32 number, and scale m down accordingly. */ -+ svfloat32_t s = svreinterpret_f32 (svsubr_x (pg, k, d->four)); -+ svfloat32_t fconst = svld1rq_f32 (svptrue_b32 (), &d->ln2); -+ m_scale = svadd_x (pg, m_scale, svmla_lane_f32 (sv_f32 (-1), s, fconst, 2)); -+ -+ /* Evaluate polynomial on reduced interval. */ -+ svfloat32_t ms2 = svmul_x (svptrue_b32 (), m_scale, m_scale); -+ -+ svfloat32_t c1357 = svld1rq_f32 (svptrue_b32 (), &d->c1); -+ svfloat32_t p01 = svmla_lane_f32 (sv_f32 (d->c0), m_scale, c1357, 0); -+ svfloat32_t p23 = svmla_lane_f32 (sv_f32 (d->c2), m_scale, c1357, 1); -+ svfloat32_t p45 = svmla_lane_f32 (sv_f32 (d->c4), m_scale, c1357, 2); -+ svfloat32_t p67 = svmla_lane_f32 (sv_f32 (d->c6), m_scale, c1357, 3); -+ -+ svfloat32_t p = svmla_x (pg, p45, p67, ms2); -+ p = svmla_x (pg, p23, p, ms2); -+ p = svmla_x (pg, p01, p, ms2); -+ -+ p = svmad_x (pg, m_scale, p, -0.5); -+ p = svmla_x (pg, m_scale, m_scale, svmul_x (pg, m_scale, p)); -+ -+ /* The scale factor to be applied back at the end - by multiplying float(k) -+ by 2^-23 we get the unbiased exponent of k. */ -+ svfloat32_t scale_back = svmul_lane_f32 (svcvt_f32_x (pg, k), fconst, 1); -+ return svmla_lane_f32 (p, scale_back, fconst, 0); - } - - #endif - -commit d983f14c304df2d880c7b01e904e4a889064b9b3 -Author: Luna Lamb -Date: Fri Jan 3 20:15:17 2025 +0000 - - AArch64: Improve codegen in SVE expm1f and users - - Use unpredicated muls, use absolute compare and improve memory access. - Expm1f, sinhf and tanhf show 7%, 5% and 1% improvement in throughput - microbenchmark on Neoverse V1. - - (cherry picked from commit f86b4cf87581cf1e45702b07880679ffa0b1f47a) - -diff --git a/sysdeps/aarch64/fpu/expm1f_sve.c b/sysdeps/aarch64/fpu/expm1f_sve.c -index 7c852125cd..05a66400d4 100644 ---- a/sysdeps/aarch64/fpu/expm1f_sve.c -+++ b/sysdeps/aarch64/fpu/expm1f_sve.c -@@ -18,7 +18,6 @@ - . */ - - #include "sv_math.h" --#include "poly_sve_f32.h" - - /* Largest value of x for which expm1(x) should round to -1. */ - #define SpecialBound 0x1.5ebc4p+6f -@@ -28,20 +27,17 @@ static const struct data - /* These 4 are grouped together so they can be loaded as one quadword, then - used with _lane forms of svmla/svmls. */ - float c2, c4, ln2_hi, ln2_lo; -- float c0, c1, c3, inv_ln2, special_bound, shift; -+ float c0, inv_ln2, c1, c3, special_bound; - } data = { - /* Generated using fpminimax. */ - .c0 = 0x1.fffffep-2, .c1 = 0x1.5554aep-3, - .c2 = 0x1.555736p-5, .c3 = 0x1.12287cp-7, -- .c4 = 0x1.6b55a2p-10, -+ .c4 = 0x1.6b55a2p-10, .inv_ln2 = 0x1.715476p+0f, -+ .special_bound = SpecialBound, .ln2_lo = 0x1.7f7d1cp-20f, -+ .ln2_hi = 0x1.62e4p-1f, - -- .special_bound = SpecialBound, .shift = 0x1.8p23f, -- .inv_ln2 = 0x1.715476p+0f, .ln2_hi = 0x1.62e4p-1f, -- .ln2_lo = 0x1.7f7d1cp-20f, - }; - --#define C(i) sv_f32 (d->c##i) -- - static svfloat32_t NOINLINE - special_case (svfloat32_t x, svbool_t pg) - { -@@ -71,9 +67,8 @@ svfloat32_t SV_NAME_F1 (expm1) (svfloat32_t x, svbool_t pg) - and f = x - i * ln2, then f is in [-ln2/2, ln2/2]. - exp(x) - 1 = 2^i * (expm1(f) + 1) - 1 - where 2^i is exact because i is an integer. */ -- svfloat32_t j = svmla_x (pg, sv_f32 (d->shift), x, d->inv_ln2); -- j = svsub_x (pg, j, d->shift); -- svint32_t i = svcvt_s32_x (pg, j); -+ svfloat32_t j = svmul_x (svptrue_b32 (), x, d->inv_ln2); -+ j = svrinta_x (pg, j); - - svfloat32_t f = svmls_lane (x, j, lane_constants, 2); - f = svmls_lane (f, j, lane_constants, 3); -@@ -83,17 +78,17 @@ svfloat32_t SV_NAME_F1 (expm1) (svfloat32_t x, svbool_t pg) - x + ax^2 + bx^3 + cx^4 .... - So we calculate the polynomial P(f) = a + bf + cf^2 + ... - and assemble the approximation expm1(f) ~= f + f^2 * P(f). */ -- svfloat32_t p12 = svmla_lane (C (1), f, lane_constants, 0); -- svfloat32_t p34 = svmla_lane (C (3), f, lane_constants, 1); -- svfloat32_t f2 = svmul_x (pg, f, f); -+ svfloat32_t p12 = svmla_lane (sv_f32 (d->c1), f, lane_constants, 0); -+ svfloat32_t p34 = svmla_lane (sv_f32 (d->c3), f, lane_constants, 1); -+ svfloat32_t f2 = svmul_x (svptrue_b32 (), f, f); - svfloat32_t p = svmla_x (pg, p12, f2, p34); -- p = svmla_x (pg, C (0), f, p); -+ -+ p = svmla_x (pg, sv_f32 (d->c0), f, p); - p = svmla_x (pg, f, f2, p); - - /* Assemble the result. - expm1(x) ~= 2^i * (p + 1) - 1 - Let t = 2^i. */ -- svfloat32_t t = svreinterpret_f32 ( -- svadd_x (pg, svreinterpret_u32 (svlsl_x (pg, i, 23)), 0x3f800000)); -- return svmla_x (pg, svsub_x (pg, t, 1), p, t); -+ svfloat32_t t = svscale_x (pg, sv_f32 (1.0f), svcvt_s32_x (pg, j)); -+ return svmla_x (pg, svsub_x (pg, t, 1.0f), p, t); - } -diff --git a/sysdeps/aarch64/fpu/sinhf_sve.c b/sysdeps/aarch64/fpu/sinhf_sve.c -index 6c204b57a2..50dd386774 100644 ---- a/sysdeps/aarch64/fpu/sinhf_sve.c -+++ b/sysdeps/aarch64/fpu/sinhf_sve.c -@@ -63,5 +63,5 @@ svfloat32_t SV_NAME_F1 (sinh) (svfloat32_t x, const svbool_t pg) - if (__glibc_unlikely (svptest_any (pg, special))) - return special_case (x, svmul_x (pg, t, halfsign), special); - -- return svmul_x (pg, t, halfsign); -+ return svmul_x (svptrue_b32 (), t, halfsign); - } -diff --git a/sysdeps/aarch64/fpu/sv_expm1f_inline.h b/sysdeps/aarch64/fpu/sv_expm1f_inline.h -index 5b72451222..e46ddda543 100644 ---- a/sysdeps/aarch64/fpu/sv_expm1f_inline.h -+++ b/sysdeps/aarch64/fpu/sv_expm1f_inline.h -@@ -27,21 +27,18 @@ struct sv_expm1f_data - /* These 4 are grouped together so they can be loaded as one quadword, then - used with _lane forms of svmla/svmls. */ - float32_t c2, c4, ln2_hi, ln2_lo; -- float32_t c0, c1, c3, inv_ln2, shift; -+ float c0, inv_ln2, c1, c3, special_bound; - }; - - /* Coefficients generated using fpminimax. */ - #define SV_EXPM1F_DATA \ - { \ -- .c0 = 0x1.fffffep-2, .c1 = 0x1.5554aep-3, .c2 = 0x1.555736p-5, \ -- .c3 = 0x1.12287cp-7, .c4 = 0x1.6b55a2p-10, \ -+ .c0 = 0x1.fffffep-2, .c1 = 0x1.5554aep-3, .inv_ln2 = 0x1.715476p+0f, \ -+ .c2 = 0x1.555736p-5, .c3 = 0x1.12287cp-7, \ - \ -- .shift = 0x1.8p23f, .inv_ln2 = 0x1.715476p+0f, .ln2_hi = 0x1.62e4p-1f, \ -- .ln2_lo = 0x1.7f7d1cp-20f, \ -+ .c4 = 0x1.6b55a2p-10, .ln2_lo = 0x1.7f7d1cp-20f, .ln2_hi = 0x1.62e4p-1f, \ - } - --#define C(i) sv_f32 (d->c##i) -- - static inline svfloat32_t - expm1f_inline (svfloat32_t x, svbool_t pg, const struct sv_expm1f_data *d) - { -@@ -55,9 +52,8 @@ expm1f_inline (svfloat32_t x, svbool_t pg, const struct sv_expm1f_data *d) - and f = x - i * ln2, then f is in [-ln2/2, ln2/2]. - exp(x) - 1 = 2^i * (expm1(f) + 1) - 1 - where 2^i is exact because i is an integer. */ -- svfloat32_t j = svmla_x (pg, sv_f32 (d->shift), x, d->inv_ln2); -- j = svsub_x (pg, j, d->shift); -- svint32_t i = svcvt_s32_x (pg, j); -+ svfloat32_t j = svmul_x (svptrue_b32 (), x, d->inv_ln2); -+ j = svrinta_x (pg, j); - - svfloat32_t f = svmls_lane (x, j, lane_constants, 2); - f = svmls_lane (f, j, lane_constants, 3); -@@ -67,18 +63,18 @@ expm1f_inline (svfloat32_t x, svbool_t pg, const struct sv_expm1f_data *d) - x + ax^2 + bx^3 + cx^4 .... - So we calculate the polynomial P(f) = a + bf + cf^2 + ... - and assemble the approximation expm1(f) ~= f + f^2 * P(f). */ -- svfloat32_t p12 = svmla_lane (C (1), f, lane_constants, 0); -- svfloat32_t p34 = svmla_lane (C (3), f, lane_constants, 1); -- svfloat32_t f2 = svmul_x (pg, f, f); -+ svfloat32_t p12 = svmla_lane (sv_f32 (d->c1), f, lane_constants, 0); -+ svfloat32_t p34 = svmla_lane (sv_f32 (d->c3), f, lane_constants, 1); -+ svfloat32_t f2 = svmul_x (svptrue_b32 (), f, f); - svfloat32_t p = svmla_x (pg, p12, f2, p34); -- p = svmla_x (pg, C (0), f, p); -+ p = svmla_x (pg, sv_f32 (d->c0), f, p); - p = svmla_x (pg, f, f2, p); - - /* Assemble the result. - expm1(x) ~= 2^i * (p + 1) - 1 - Let t = 2^i. */ -- svfloat32_t t = svscale_x (pg, sv_f32 (1), i); -- return svmla_x (pg, svsub_x (pg, t, 1), p, t); -+ svfloat32_t t = svscale_x (pg, sv_f32 (1.0f), svcvt_s32_x (pg, j)); -+ return svmla_x (pg, svsub_x (pg, t, 1.0f), p, t); - } - - #endif -diff --git a/sysdeps/aarch64/fpu/tanhf_sve.c b/sysdeps/aarch64/fpu/tanhf_sve.c -index 0b94523cf5..80dd679346 100644 ---- a/sysdeps/aarch64/fpu/tanhf_sve.c -+++ b/sysdeps/aarch64/fpu/tanhf_sve.c -@@ -19,20 +19,27 @@ - - #include "sv_expm1f_inline.h" - -+/* Largest value of x for which tanhf(x) rounds to 1 (or -1 for negative). */ -+#define BoringBound 0x1.205966p+3f -+ - static const struct data - { - struct sv_expm1f_data expm1f_consts; -- uint32_t boring_bound, onef; -+ uint32_t onef, special_bound; -+ float boring_bound; - } data = { - .expm1f_consts = SV_EXPM1F_DATA, -- /* 0x1.205966p+3, above which tanhf rounds to 1 (or -1 for negative). */ -- .boring_bound = 0x41102cb3, - .onef = 0x3f800000, -+ .special_bound = 0x7f800000, -+ .boring_bound = BoringBound, - }; - - static svfloat32_t NOINLINE --special_case (svfloat32_t x, svfloat32_t y, svbool_t special) -+special_case (svfloat32_t x, svbool_t pg, svbool_t is_boring, -+ svfloat32_t boring, svfloat32_t q, svbool_t special) - { -+ svfloat32_t y -+ = svsel_f32 (is_boring, boring, svdiv_x (pg, q, svadd_x (pg, q, 2.0))); - return sv_call_f32 (tanhf, x, y, special); - } - -@@ -47,15 +54,16 @@ svfloat32_t SV_NAME_F1 (tanh) (svfloat32_t x, const svbool_t pg) - svfloat32_t ax = svabs_x (pg, x); - svuint32_t iax = svreinterpret_u32 (ax); - svuint32_t sign = sveor_x (pg, svreinterpret_u32 (x), iax); -- svbool_t is_boring = svcmpgt (pg, iax, d->boring_bound); - svfloat32_t boring = svreinterpret_f32 (svorr_x (pg, sign, d->onef)); -- -- svbool_t special = svcmpgt (pg, iax, 0x7f800000); -+ svbool_t special = svcmpgt (pg, iax, d->special_bound); -+ svbool_t is_boring = svacgt (pg, x, d->boring_bound); - - /* tanh(x) = (e^2x - 1) / (e^2x + 1). */ -- svfloat32_t q = expm1f_inline (svmul_x (pg, x, 2.0), pg, &d->expm1f_consts); -- svfloat32_t y = svdiv_x (pg, q, svadd_x (pg, q, 2.0)); -+ svfloat32_t q = expm1f_inline (svmul_x (svptrue_b32 (), x, 2.0), pg, -+ &d->expm1f_consts); -+ - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svsel_f32 (is_boring, boring, y), special); -+ return special_case (x, pg, is_boring, boring, q, special); -+ svfloat32_t y = svdiv_x (pg, q, svadd_x (pg, q, 2.0)); - return svsel_f32 (is_boring, boring, y); - } - -commit 0ff6a9ff79bca9384ce4ba20e8942d39cc377a14 -Author: Luna Lamb -Date: Thu Feb 13 17:52:09 2025 +0000 - - Aarch64: Improve codegen in SVE asinh - - Use unpredicated muls, use lanewise mla's and improve memory access. - 1% regression in throughput microbenchmark on Neoverse V1. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 8f0e7fe61e0a2ad5ed777933703ce09053810ec4) - -diff --git a/sysdeps/aarch64/fpu/asinh_sve.c b/sysdeps/aarch64/fpu/asinh_sve.c -index 28dc5c4587..fe8715e06c 100644 ---- a/sysdeps/aarch64/fpu/asinh_sve.c -+++ b/sysdeps/aarch64/fpu/asinh_sve.c -@@ -18,36 +18,49 @@ - . */ - - #include "sv_math.h" --#include "poly_sve_f64.h" - - #define SignMask (0x8000000000000000) - #define One (0x3ff0000000000000) - #define Thres (0x5fe0000000000000) /* asuint64 (0x1p511). */ -+#define IndexMask (((1 << V_LOG_TABLE_BITS) - 1) << 1) - - static const struct data - { -- double poly[18]; -- double ln2, p3, p1, p4, p0, p2; -- uint64_t n; -- uint64_t off; -+ double even_coeffs[9]; -+ double ln2, p3, p1, p4, p0, p2, c1, c3, c5, c7, c9, c11, c13, c15, c17; -+ uint64_t off, mask; - - } data = { -- /* Polynomial generated using Remez on [2^-26, 1]. */ -- .poly -- = { -0x1.55555555554a7p-3, 0x1.3333333326c7p-4, -0x1.6db6db68332e6p-5, -- 0x1.f1c71b26fb40dp-6, -0x1.6e8b8b654a621p-6, 0x1.1c4daa9e67871p-6, -- -0x1.c9871d10885afp-7, 0x1.7a16e8d9d2ecfp-7, -0x1.3ddca533e9f54p-7, -- 0x1.0becef748dafcp-7, -0x1.b90c7099dd397p-8, 0x1.541f2bb1ffe51p-8, -- -0x1.d217026a669ecp-9, 0x1.0b5c7977aaf7p-9, -0x1.e0f37daef9127p-11, -- 0x1.388b5fe542a6p-12, -0x1.021a48685e287p-14, 0x1.93d4ba83d34dap-18 }, -+ /* Polynomial generated using Remez on [2^-26, 1]. */ -+ .even_coeffs ={ -+ -0x1.55555555554a7p-3, -+ -0x1.6db6db68332e6p-5, -+ -0x1.6e8b8b654a621p-6, -+ -0x1.c9871d10885afp-7, -+ -0x1.3ddca533e9f54p-7, -+ -0x1.b90c7099dd397p-8, -+ -0x1.d217026a669ecp-9, -+ -0x1.e0f37daef9127p-11, -+ -0x1.021a48685e287p-14, }, -+ -+ .c1 = 0x1.3333333326c7p-4, -+ .c3 = 0x1.f1c71b26fb40dp-6, -+ .c5 = 0x1.1c4daa9e67871p-6, -+ .c7 = 0x1.7a16e8d9d2ecfp-7, -+ .c9 = 0x1.0becef748dafcp-7, -+ .c11 = 0x1.541f2bb1ffe51p-8, -+ .c13 = 0x1.0b5c7977aaf7p-9, -+ .c15 = 0x1.388b5fe542a6p-12, -+ .c17 = 0x1.93d4ba83d34dap-18, -+ - .ln2 = 0x1.62e42fefa39efp-1, - .p0 = -0x1.ffffffffffff7p-2, - .p1 = 0x1.55555555170d4p-2, - .p2 = -0x1.0000000399c27p-2, - .p3 = 0x1.999b2e90e94cap-3, - .p4 = -0x1.554e550bd501ep-3, -- .n = 1 << V_LOG_TABLE_BITS, -- .off = 0x3fe6900900000000 -+ .off = 0x3fe6900900000000, -+ .mask = 0xfffULL << 52, - }; - - static svfloat64_t NOINLINE -@@ -64,11 +77,10 @@ __sv_log_inline (svfloat64_t x, const struct data *d, const svbool_t pg) - of the algorithm used. */ - - svuint64_t ix = svreinterpret_u64 (x); -- svuint64_t tmp = svsub_x (pg, ix, d->off); -- svuint64_t i = svand_x (pg, svlsr_x (pg, tmp, (51 - V_LOG_TABLE_BITS)), -- (d->n - 1) << 1); -- svint64_t k = svasr_x (pg, svreinterpret_s64 (tmp), 52); -- svuint64_t iz = svsub_x (pg, ix, svand_x (pg, tmp, 0xfffULL << 52)); -+ svuint64_t i_off = svsub_x (pg, ix, d->off); -+ svuint64_t i -+ = svand_x (pg, svlsr_x (pg, i_off, (51 - V_LOG_TABLE_BITS)), IndexMask); -+ svuint64_t iz = svsub_x (pg, ix, svand_x (pg, i_off, d->mask)); - svfloat64_t z = svreinterpret_f64 (iz); - - svfloat64_t invc = svld1_gather_index (pg, &__v_log_data.table[0].invc, i); -@@ -78,14 +90,14 @@ __sv_log_inline (svfloat64_t x, const struct data *d, const svbool_t pg) - svfloat64_t p1_p4 = svld1rq (svptrue_b64 (), &d->p1); - - svfloat64_t r = svmla_x (pg, sv_f64 (-1.0), invc, z); -- svfloat64_t kd = svcvt_f64_x (pg, k); -+ svfloat64_t kd -+ = svcvt_f64_x (pg, svasr_x (pg, svreinterpret_s64 (i_off), 52)); - - svfloat64_t hi = svmla_lane (svadd_x (pg, logc, r), kd, ln2_p3, 0); -- svfloat64_t r2 = svmul_x (pg, r, r); -- -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); - svfloat64_t y = svmla_lane (sv_f64 (d->p2), r, ln2_p3, 1); -- - svfloat64_t p = svmla_lane (sv_f64 (d->p0), r, p1_p4, 0); -+ - y = svmla_lane (y, r2, p1_p4, 1); - y = svmla_x (pg, p, r2, y); - y = svmla_x (pg, hi, r2, y); -@@ -111,7 +123,6 @@ svfloat64_t SV_NAME_D1 (asinh) (svfloat64_t x, const svbool_t pg) - svuint64_t iax = svbic_x (pg, ix, SignMask); - svuint64_t sign = svand_x (pg, ix, SignMask); - svfloat64_t ax = svreinterpret_f64 (iax); -- - svbool_t ge1 = svcmpge (pg, iax, One); - svbool_t special = svcmpge (pg, iax, Thres); - -@@ -120,7 +131,7 @@ svfloat64_t SV_NAME_D1 (asinh) (svfloat64_t x, const svbool_t pg) - svfloat64_t option_1 = sv_f64 (0); - if (__glibc_likely (svptest_any (pg, ge1))) - { -- svfloat64_t x2 = svmul_x (pg, ax, ax); -+ svfloat64_t x2 = svmul_x (svptrue_b64 (), ax, ax); - option_1 = __sv_log_inline ( - svadd_x (pg, ax, svsqrt_x (pg, svadd_x (pg, x2, 1))), d, pg); - } -@@ -130,21 +141,53 @@ svfloat64_t SV_NAME_D1 (asinh) (svfloat64_t x, const svbool_t pg) - The largest observed error in this region is 1.51 ULPs: - _ZGVsMxv_asinh(0x1.fe12bf8c616a2p-1) got 0x1.c1e649ee2681bp-1 - want 0x1.c1e649ee2681dp-1. */ -+ - svfloat64_t option_2 = sv_f64 (0); - if (__glibc_likely (svptest_any (pg, svnot_z (pg, ge1)))) - { -- svfloat64_t x2 = svmul_x (pg, ax, ax); -- svfloat64_t x4 = svmul_x (pg, x2, x2); -- svfloat64_t p = sv_pw_horner_17_f64_x (pg, x2, x4, d->poly); -- option_2 = svmla_x (pg, ax, p, svmul_x (pg, x2, ax)); -+ svfloat64_t x2 = svmul_x (svptrue_b64 (), ax, ax); -+ svfloat64_t x4 = svmul_x (svptrue_b64 (), x2, x2); -+ /* Order-17 Pairwise Horner scheme. */ -+ svfloat64_t c13 = svld1rq (svptrue_b64 (), &d->c1); -+ svfloat64_t c57 = svld1rq (svptrue_b64 (), &d->c5); -+ svfloat64_t c911 = svld1rq (svptrue_b64 (), &d->c9); -+ svfloat64_t c1315 = svld1rq (svptrue_b64 (), &d->c13); -+ -+ svfloat64_t p01 = svmla_lane (sv_f64 (d->even_coeffs[0]), x2, c13, 0); -+ svfloat64_t p23 = svmla_lane (sv_f64 (d->even_coeffs[1]), x2, c13, 1); -+ svfloat64_t p45 = svmla_lane (sv_f64 (d->even_coeffs[2]), x2, c57, 0); -+ svfloat64_t p67 = svmla_lane (sv_f64 (d->even_coeffs[3]), x2, c57, 1); -+ svfloat64_t p89 = svmla_lane (sv_f64 (d->even_coeffs[4]), x2, c911, 0); -+ svfloat64_t p1011 = svmla_lane (sv_f64 (d->even_coeffs[5]), x2, c911, 1); -+ svfloat64_t p1213 -+ = svmla_lane (sv_f64 (d->even_coeffs[6]), x2, c1315, 0); -+ svfloat64_t p1415 -+ = svmla_lane (sv_f64 (d->even_coeffs[7]), x2, c1315, 1); -+ svfloat64_t p1617 = svmla_x (pg, sv_f64 (d->even_coeffs[8]), x2, d->c17); -+ -+ svfloat64_t p = svmla_x (pg, p1415, x4, p1617); -+ p = svmla_x (pg, p1213, x4, p); -+ p = svmla_x (pg, p1011, x4, p); -+ p = svmla_x (pg, p89, x4, p); -+ -+ p = svmla_x (pg, p67, x4, p); -+ p = svmla_x (pg, p45, x4, p); -+ -+ p = svmla_x (pg, p23, x4, p); -+ -+ p = svmla_x (pg, p01, x4, p); -+ -+ option_2 = svmla_x (pg, ax, p, svmul_x (svptrue_b64 (), x2, ax)); - } - -- /* Choose the right option for each lane. */ -- svfloat64_t y = svsel (ge1, option_1, option_2); -- - if (__glibc_unlikely (svptest_any (pg, special))) - return special_case ( -- x, svreinterpret_f64 (sveor_x (pg, svreinterpret_u64 (y), sign)), -+ x, -+ svreinterpret_f64 (sveor_x ( -+ pg, svreinterpret_u64 (svsel (ge1, option_1, option_2)), sign)), - special); -+ -+ /* Choose the right option for each lane. */ -+ svfloat64_t y = svsel (ge1, option_1, option_2); - return svreinterpret_f64 (sveor_x (pg, svreinterpret_u64 (y), sign)); - } - -commit 4b0bb84eb7e52a135c873fd9d0fc6c30599aedf4 -Author: Luna Lamb -Date: Thu Feb 13 17:54:46 2025 +0000 - - Aarch64: Improve codegen in SVE exp and users, and update expf_inline - - Use unpredicted muls, and improve memory access. - 7%, 3% and 1% improvement in throughput microbenchmark on Neoverse V1, - for exp, exp2 and cosh respectively. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit c0ff447edf19bd4630fe79adf5e8b896405b059f) - -diff --git a/sysdeps/aarch64/fpu/cosh_sve.c b/sysdeps/aarch64/fpu/cosh_sve.c -index 919f34604a..e375dd8a34 100644 ---- a/sysdeps/aarch64/fpu/cosh_sve.c -+++ b/sysdeps/aarch64/fpu/cosh_sve.c -@@ -23,7 +23,7 @@ static const struct data - { - float64_t poly[3]; - float64_t inv_ln2, ln2_hi, ln2_lo, shift, thres; -- uint64_t index_mask, special_bound; -+ uint64_t special_bound; - } data = { - .poly = { 0x1.fffffffffffd4p-2, 0x1.5555571d6b68cp-3, - 0x1.5555576a59599p-5, }, -@@ -35,14 +35,16 @@ static const struct data - .shift = 0x1.8p+52, - .thres = 704.0, - -- .index_mask = 0xff, - /* 0x1.6p9, above which exp overflows. */ - .special_bound = 0x4086000000000000, - }; - - static svfloat64_t NOINLINE --special_case (svfloat64_t x, svfloat64_t y, svbool_t special) -+special_case (svfloat64_t x, svbool_t pg, svfloat64_t t, svbool_t special) - { -+ svfloat64_t half_t = svmul_x (svptrue_b64 (), t, 0.5); -+ svfloat64_t half_over_t = svdivr_x (pg, t, 0.5); -+ svfloat64_t y = svadd_x (pg, half_t, half_over_t); - return sv_call_f64 (cosh, x, y, special); - } - -@@ -60,12 +62,12 @@ exp_inline (svfloat64_t x, const svbool_t pg, const struct data *d) - - svuint64_t u = svreinterpret_u64 (z); - svuint64_t e = svlsl_x (pg, u, 52 - V_EXP_TAIL_TABLE_BITS); -- svuint64_t i = svand_x (pg, u, d->index_mask); -+ svuint64_t i = svand_x (svptrue_b64 (), u, 0xff); - - svfloat64_t y = svmla_x (pg, sv_f64 (d->poly[1]), r, d->poly[2]); - y = svmla_x (pg, sv_f64 (d->poly[0]), r, y); - y = svmla_x (pg, sv_f64 (1.0), r, y); -- y = svmul_x (pg, r, y); -+ y = svmul_x (svptrue_b64 (), r, y); - - /* s = 2^(n/N). */ - u = svld1_gather_index (pg, __v_exp_tail_data, i); -@@ -94,12 +96,12 @@ svfloat64_t SV_NAME_D1 (cosh) (svfloat64_t x, const svbool_t pg) - /* Up to the point that exp overflows, we can use it to calculate cosh by - exp(|x|) / 2 + 1 / (2 * exp(|x|)). */ - svfloat64_t t = exp_inline (ax, pg, d); -- svfloat64_t half_t = svmul_x (pg, t, 0.5); -- svfloat64_t half_over_t = svdivr_x (pg, t, 0.5); - - /* Fall back to scalar for any special cases. */ - if (__glibc_unlikely (svptest_any (pg, special))) -- return special_case (x, svadd_x (pg, half_t, half_over_t), special); -+ return special_case (x, pg, t, special); - -+ svfloat64_t half_t = svmul_x (svptrue_b64 (), t, 0.5); -+ svfloat64_t half_over_t = svdivr_x (pg, t, 0.5); - return svadd_x (pg, half_t, half_over_t); - } -diff --git a/sysdeps/aarch64/fpu/exp10_sve.c b/sysdeps/aarch64/fpu/exp10_sve.c -index ddf64708cb..bfd3fb9e19 100644 ---- a/sysdeps/aarch64/fpu/exp10_sve.c -+++ b/sysdeps/aarch64/fpu/exp10_sve.c -@@ -18,21 +18,23 @@ - . */ - - #include "sv_math.h" --#include "poly_sve_f64.h" - - #define SpecialBound 307.0 /* floor (log10 (2^1023)). */ - - static const struct data - { -- double poly[5]; -+ double c1, c3, c2, c4, c0; - double shift, log10_2, log2_10_hi, log2_10_lo, scale_thres, special_bound; - } data = { - /* Coefficients generated using Remez algorithm. - rel error: 0x1.9fcb9b3p-60 - abs error: 0x1.a20d9598p-60 in [ -log10(2)/128, log10(2)/128 ] - max ulp err 0.52 +0.5. */ -- .poly = { 0x1.26bb1bbb55516p1, 0x1.53524c73cd32ap1, 0x1.0470591daeafbp1, -- 0x1.2bd77b1361ef6p0, 0x1.142b5d54e9621p-1 }, -+ .c0 = 0x1.26bb1bbb55516p1, -+ .c1 = 0x1.53524c73cd32ap1, -+ .c2 = 0x1.0470591daeafbp1, -+ .c3 = 0x1.2bd77b1361ef6p0, -+ .c4 = 0x1.142b5d54e9621p-1, - /* 1.5*2^46+1023. This value is further explained below. */ - .shift = 0x1.800000000ffc0p+46, - .log10_2 = 0x1.a934f0979a371p1, /* 1/log2(10). */ -@@ -70,9 +72,9 @@ special_case (svbool_t pg, svfloat64_t s, svfloat64_t y, svfloat64_t n, - /* |n| > 1280 => 2^(n) overflows. */ - svbool_t p_cmp = svacgt (pg, n, d->scale_thres); - -- svfloat64_t r1 = svmul_x (pg, s1, s1); -+ svfloat64_t r1 = svmul_x (svptrue_b64 (), s1, s1); - svfloat64_t r2 = svmla_x (pg, s2, s2, y); -- svfloat64_t r0 = svmul_x (pg, r2, s1); -+ svfloat64_t r0 = svmul_x (svptrue_b64 (), r2, s1); - - return svsel (p_cmp, r1, r0); - } -@@ -103,11 +105,14 @@ svfloat64_t SV_NAME_D1 (exp10) (svfloat64_t x, svbool_t pg) - comes at significant performance cost. */ - svuint64_t u = svreinterpret_u64 (z); - svfloat64_t scale = svexpa (u); -- -+ svfloat64_t c24 = svld1rq (svptrue_b64 (), &d->c2); - /* Approximate exp10(r) using polynomial. */ -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t y = svmla_x (pg, svmul_x (pg, r, d->poly[0]), r2, -- sv_pairwise_poly_3_f64_x (pg, r, r2, d->poly + 1)); -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ svfloat64_t p12 = svmla_lane (sv_f64 (d->c1), r, c24, 0); -+ svfloat64_t p34 = svmla_lane (sv_f64 (d->c3), r, c24, 1); -+ svfloat64_t p14 = svmla_x (pg, p12, p34, r2); -+ -+ svfloat64_t y = svmla_x (pg, svmul_x (svptrue_b64 (), r, d->c0), r2, p14); - - /* Assemble result as exp10(x) = 2^n * exp10(r). If |x| > SpecialBound - multiplication may overflow, so use special case routine. */ -diff --git a/sysdeps/aarch64/fpu/exp2_sve.c b/sysdeps/aarch64/fpu/exp2_sve.c -index 22848ebfa5..5dfb77cdbc 100644 ---- a/sysdeps/aarch64/fpu/exp2_sve.c -+++ b/sysdeps/aarch64/fpu/exp2_sve.c -@@ -18,7 +18,6 @@ - . */ - - #include "sv_math.h" --#include "poly_sve_f64.h" - - #define N (1 << V_EXP_TABLE_BITS) - -@@ -27,15 +26,15 @@ - - static const struct data - { -- double poly[4]; -+ double c0, c2; -+ double c1, c3; - double shift, big_bound, uoflow_bound; - } data = { - /* Coefficients are computed using Remez algorithm with - minimisation of the absolute error. */ -- .poly = { 0x1.62e42fefa3686p-1, 0x1.ebfbdff82c241p-3, 0x1.c6b09b16de99ap-5, -- 0x1.3b2abf5571ad8p-7 }, -- .shift = 0x1.8p52 / N, -- .uoflow_bound = UOFlowBound, -+ .c0 = 0x1.62e42fefa3686p-1, .c1 = 0x1.ebfbdff82c241p-3, -+ .c2 = 0x1.c6b09b16de99ap-5, .c3 = 0x1.3b2abf5571ad8p-7, -+ .shift = 0x1.8p52 / N, .uoflow_bound = UOFlowBound, - .big_bound = BigBound, - }; - -@@ -67,9 +66,9 @@ special_case (svbool_t pg, svfloat64_t s, svfloat64_t y, svfloat64_t n, - /* |n| > 1280 => 2^(n) overflows. */ - svbool_t p_cmp = svacgt (pg, n, d->uoflow_bound); - -- svfloat64_t r1 = svmul_x (pg, s1, s1); -+ svfloat64_t r1 = svmul_x (svptrue_b64 (), s1, s1); - svfloat64_t r2 = svmla_x (pg, s2, s2, y); -- svfloat64_t r0 = svmul_x (pg, r2, s1); -+ svfloat64_t r0 = svmul_x (svptrue_b64 (), r2, s1); - - return svsel (p_cmp, r1, r0); - } -@@ -99,11 +98,14 @@ svfloat64_t SV_NAME_D1 (exp2) (svfloat64_t x, svbool_t pg) - svuint64_t top = svlsl_x (pg, ki, 52 - V_EXP_TABLE_BITS); - svfloat64_t scale = svreinterpret_f64 (svadd_x (pg, sbits, top)); - -+ svfloat64_t c13 = svld1rq (svptrue_b64 (), &d->c1); - /* Approximate exp2(r) using polynomial. */ -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t p = sv_pairwise_poly_3_f64_x (pg, r, r2, d->poly); -- svfloat64_t y = svmul_x (pg, r, p); -- -+ /* y = exp2(r) - 1 ~= C0 r + C1 r^2 + C2 r^3 + C3 r^4. */ -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ svfloat64_t p01 = svmla_lane (sv_f64 (d->c0), r, c13, 0); -+ svfloat64_t p23 = svmla_lane (sv_f64 (d->c2), r, c13, 1); -+ svfloat64_t p = svmla_x (pg, p01, p23, r2); -+ svfloat64_t y = svmul_x (svptrue_b64 (), r, p); - /* Assemble exp2(x) = exp2(r) * scale. */ - if (__glibc_unlikely (svptest_any (pg, special))) - return special_case (pg, scale, y, kd, d); -diff --git a/sysdeps/aarch64/fpu/exp_sve.c b/sysdeps/aarch64/fpu/exp_sve.c -index aabaaa1d61..b2421d493f 100644 ---- a/sysdeps/aarch64/fpu/exp_sve.c -+++ b/sysdeps/aarch64/fpu/exp_sve.c -@@ -21,12 +21,15 @@ - - static const struct data - { -- double poly[4]; -+ double c0, c2; -+ double c1, c3; - double ln2_hi, ln2_lo, inv_ln2, shift, thres; -+ - } data = { -- .poly = { /* ulp error: 0.53. */ -- 0x1.fffffffffdbcdp-2, 0x1.555555555444cp-3, 0x1.555573c6a9f7dp-5, -- 0x1.1111266d28935p-7 }, -+ .c0 = 0x1.fffffffffdbcdp-2, -+ .c1 = 0x1.555555555444cp-3, -+ .c2 = 0x1.555573c6a9f7dp-5, -+ .c3 = 0x1.1111266d28935p-7, - .ln2_hi = 0x1.62e42fefa3800p-1, - .ln2_lo = 0x1.ef35793c76730p-45, - /* 1/ln2. */ -@@ -36,7 +39,6 @@ static const struct data - .thres = 704.0, - }; - --#define C(i) sv_f64 (d->poly[i]) - #define SpecialOffset 0x6000000000000000 /* 0x1p513. */ - /* SpecialBias1 + SpecialBias1 = asuint(1.0). */ - #define SpecialBias1 0x7000000000000000 /* 0x1p769. */ -@@ -56,20 +58,20 @@ special_case (svbool_t pg, svfloat64_t s, svfloat64_t y, svfloat64_t n) - svuint64_t b - = svdup_u64_z (p_sign, SpecialOffset); /* Inactive lanes set to 0. */ - -- /* Set s1 to generate overflow depending on sign of exponent n. */ -- svfloat64_t s1 = svreinterpret_f64 ( -- svsubr_x (pg, b, SpecialBias1)); /* 0x70...0 - b. */ -- /* Offset s to avoid overflow in final result if n is below threshold. */ -+ /* Set s1 to generate overflow depending on sign of exponent n, -+ ie. s1 = 0x70...0 - b. */ -+ svfloat64_t s1 = svreinterpret_f64 (svsubr_x (pg, b, SpecialBias1)); -+ /* Offset s to avoid overflow in final result if n is below threshold. -+ ie. s2 = as_u64 (s) - 0x3010...0 + b. */ - svfloat64_t s2 = svreinterpret_f64 ( -- svadd_x (pg, svsub_x (pg, svreinterpret_u64 (s), SpecialBias2), -- b)); /* as_u64 (s) - 0x3010...0 + b. */ -+ svadd_x (pg, svsub_x (pg, svreinterpret_u64 (s), SpecialBias2), b)); - - /* |n| > 1280 => 2^(n) overflows. */ - svbool_t p_cmp = svacgt (pg, n, 1280.0); - -- svfloat64_t r1 = svmul_x (pg, s1, s1); -+ svfloat64_t r1 = svmul_x (svptrue_b64 (), s1, s1); - svfloat64_t r2 = svmla_x (pg, s2, s2, y); -- svfloat64_t r0 = svmul_x (pg, r2, s1); -+ svfloat64_t r0 = svmul_x (svptrue_b64 (), r2, s1); - - return svsel (p_cmp, r1, r0); - } -@@ -103,16 +105,16 @@ svfloat64_t SV_NAME_D1 (exp) (svfloat64_t x, const svbool_t pg) - svfloat64_t z = svmla_x (pg, sv_f64 (d->shift), x, d->inv_ln2); - svuint64_t u = svreinterpret_u64 (z); - svfloat64_t n = svsub_x (pg, z, d->shift); -- -+ svfloat64_t c13 = svld1rq (svptrue_b64 (), &d->c1); - /* r = x - n * ln2, r is in [-ln2/(2N), ln2/(2N)]. */ - svfloat64_t ln2 = svld1rq (svptrue_b64 (), &d->ln2_hi); - svfloat64_t r = svmls_lane (x, n, ln2, 0); - r = svmls_lane (r, n, ln2, 1); - - /* y = exp(r) - 1 ~= r + C0 r^2 + C1 r^3 + C2 r^4 + C3 r^5. */ -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t p01 = svmla_x (pg, C (0), C (1), r); -- svfloat64_t p23 = svmla_x (pg, C (2), C (3), r); -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ svfloat64_t p01 = svmla_lane (sv_f64 (d->c0), r, c13, 0); -+ svfloat64_t p23 = svmla_lane (sv_f64 (d->c2), r, c13, 1); - svfloat64_t p04 = svmla_x (pg, p01, p23, r2); - svfloat64_t y = svmla_x (pg, r, p04, r2); - -diff --git a/sysdeps/aarch64/fpu/sv_expf_inline.h b/sysdeps/aarch64/fpu/sv_expf_inline.h -index 6166df6553..75781fb4dd 100644 ---- a/sysdeps/aarch64/fpu/sv_expf_inline.h -+++ b/sysdeps/aarch64/fpu/sv_expf_inline.h -@@ -61,7 +61,7 @@ expf_inline (svfloat32_t x, const svbool_t pg, const struct sv_expf_data *d) - /* scale = 2^(n/N). */ - svfloat32_t scale = svexpa (svreinterpret_u32 (z)); - -- /* y = exp(r) - 1 ~= r + C0 r^2 + C1 r^3 + C2 r^4 + C3 r^5 + C4 r^6. */ -+ /* poly(r) = exp(r) - 1 ~= C0 r + C1 r^2 + C2 r^3 + C3 r^4 + C4 r^5. */ - svfloat32_t p12 = svmla_lane (sv_f32 (d->c1), r, lane_consts, 2); - svfloat32_t p34 = svmla_lane (sv_f32 (d->c3), r, lane_consts, 3); - svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); -@@ -71,5 +71,4 @@ expf_inline (svfloat32_t x, const svbool_t pg, const struct sv_expf_data *d) - - return svmla_x (pg, scale, scale, poly); - } -- - #endif - -commit 194185c28954dfa11a6ded8b32f34fee680d3218 -Author: Yat Long Poon -Date: Thu Feb 13 18:00:50 2025 +0000 - - AArch64: Improve codegen for SVE erfcf - - Reduce number of MOV/MOVPRFXs and use unpredicated FMUL. - Replace MUL with LSL. Speedup on Neoverse V1: 6%. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit f5ff34cb3c75ec1061c75bb9188b3c1176426947) - -diff --git a/sysdeps/aarch64/fpu/erfcf_sve.c b/sysdeps/aarch64/fpu/erfcf_sve.c -index ecacb933ac..e4869263e3 100644 ---- a/sysdeps/aarch64/fpu/erfcf_sve.c -+++ b/sysdeps/aarch64/fpu/erfcf_sve.c -@@ -76,7 +76,7 @@ svfloat32_t SV_NAME_F1 (erfc) (svfloat32_t x, const svbool_t pg) - svuint32_t i = svqadd (svreinterpret_u32 (z), dat->off_idx); - - /* Lookup erfc(r) and 2/sqrt(pi)*exp(-r^2) in tables. */ -- i = svmul_x (pg, i, 2); -+ i = svlsl_x (svptrue_b32 (), i, 1); - const float32_t *p = &__v_erfcf_data.tab[0].erfc - 2 * dat->off_arr; - svfloat32_t erfcr = svld1_gather_index (pg, p, i); - svfloat32_t scale = svld1_gather_index (pg, p + 1, i); -@@ -84,15 +84,15 @@ svfloat32_t SV_NAME_F1 (erfc) (svfloat32_t x, const svbool_t pg) - /* erfc(x) ~ erfc(r) - scale * d * poly(r, d). */ - svfloat32_t r = svsub_x (pg, z, shift); - svfloat32_t d = svsub_x (pg, a, r); -- svfloat32_t d2 = svmul_x (pg, d, d); -- svfloat32_t r2 = svmul_x (pg, r, r); -+ svfloat32_t d2 = svmul_x (svptrue_b32 (), d, d); -+ svfloat32_t r2 = svmul_x (svptrue_b32 (), r, r); - - svfloat32_t coeffs = svld1rq (svptrue_b32 (), &dat->third); -- svfloat32_t third = svdup_lane (coeffs, 0); - - svfloat32_t p1 = r; -- svfloat32_t p2 = svmls_lane (third, r2, coeffs, 1); -- svfloat32_t p3 = svmul_x (pg, r, svmla_lane (sv_f32 (-0.5), r2, coeffs, 0)); -+ svfloat32_t p2 = svmls_lane (sv_f32 (dat->third), r2, coeffs, 1); -+ svfloat32_t p3 -+ = svmul_x (svptrue_b32 (), r, svmla_lane (sv_f32 (-0.5), r2, coeffs, 0)); - svfloat32_t p4 = svmla_lane (sv_f32 (dat->two_over_five), r2, coeffs, 2); - p4 = svmls_x (pg, sv_f32 (dat->tenth), r2, p4); - - -commit 7dc549c5a4af3c32689147550144397116404d22 -Author: Yat Long Poon -Date: Thu Feb 13 18:02:01 2025 +0000 - - AArch64: Improve codegen for SVE pow - - Move constants to struct. Improve memory access with indexed/unpredicated - instructions. Eliminate register spills. Speedup on Neoverse V1: 24%. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 0b195651db3ae793187c7dd6d78b5a7a8da9d5e6) - -diff --git a/sysdeps/aarch64/fpu/pow_sve.c b/sysdeps/aarch64/fpu/pow_sve.c -index 4c0bf8956c..4242d22a49 100644 ---- a/sysdeps/aarch64/fpu/pow_sve.c -+++ b/sysdeps/aarch64/fpu/pow_sve.c -@@ -44,19 +44,18 @@ - - /* Data is defined in v_pow_log_data.c. */ - #define N_LOG (1 << V_POW_LOG_TABLE_BITS) --#define A __v_pow_log_data.poly - #define Off 0x3fe6955500000000 - - /* Data is defined in v_pow_exp_data.c. */ - #define N_EXP (1 << V_POW_EXP_TABLE_BITS) - #define SignBias (0x800 << V_POW_EXP_TABLE_BITS) --#define C __v_pow_exp_data.poly - #define SmallExp 0x3c9 /* top12(0x1p-54). */ - #define BigExp 0x408 /* top12(512.). */ - #define ThresExp 0x03f /* BigExp - SmallExp. */ - #define HugeExp 0x409 /* top12(1024.). */ - - /* Constants associated with pow. */ -+#define SmallBoundX 0x1p-126 - #define SmallPowX 0x001 /* top12(0x1p-126). */ - #define BigPowX 0x7ff /* top12(INFINITY). */ - #define ThresPowX 0x7fe /* BigPowX - SmallPowX. */ -@@ -64,6 +63,31 @@ - #define BigPowY 0x43e /* top12(0x1.749p62). */ - #define ThresPowY 0x080 /* BigPowY - SmallPowY. */ - -+static const struct data -+{ -+ double log_c0, log_c2, log_c4, log_c6, ln2_hi, ln2_lo; -+ double log_c1, log_c3, log_c5, off; -+ double n_over_ln2, exp_c2, ln2_over_n_hi, ln2_over_n_lo; -+ double exp_c0, exp_c1; -+} data = { -+ .log_c0 = -0x1p-1, -+ .log_c1 = -0x1.555555555556p-1, -+ .log_c2 = 0x1.0000000000006p-1, -+ .log_c3 = 0x1.999999959554ep-1, -+ .log_c4 = -0x1.555555529a47ap-1, -+ .log_c5 = -0x1.2495b9b4845e9p0, -+ .log_c6 = 0x1.0002b8b263fc3p0, -+ .off = Off, -+ .exp_c0 = 0x1.fffffffffffd4p-2, -+ .exp_c1 = 0x1.5555571d6ef9p-3, -+ .exp_c2 = 0x1.5555576a5adcep-5, -+ .ln2_hi = 0x1.62e42fefa3800p-1, -+ .ln2_lo = 0x1.ef35793c76730p-45, -+ .n_over_ln2 = 0x1.71547652b82fep0 * N_EXP, -+ .ln2_over_n_hi = 0x1.62e42fefc0000p-9, -+ .ln2_over_n_lo = -0x1.c610ca86c3899p-45, -+}; -+ - /* Check if x is an integer. */ - static inline svbool_t - sv_isint (svbool_t pg, svfloat64_t x) -@@ -82,7 +106,7 @@ sv_isnotint (svbool_t pg, svfloat64_t x) - static inline svbool_t - sv_isodd (svbool_t pg, svfloat64_t x) - { -- svfloat64_t y = svmul_x (pg, x, 0.5); -+ svfloat64_t y = svmul_x (svptrue_b64 (), x, 0.5); - return sv_isnotint (pg, y); - } - -@@ -121,7 +145,7 @@ zeroinfnan (uint64_t i) - static inline svbool_t - sv_zeroinfnan (svbool_t pg, svuint64_t i) - { -- return svcmpge (pg, svsub_x (pg, svmul_x (pg, i, 2), 1), -+ return svcmpge (pg, svsub_x (pg, svadd_x (pg, i, i), 1), - 2 * asuint64 (INFINITY) - 1); - } - -@@ -174,16 +198,17 @@ sv_call_specialcase (svfloat64_t x1, svuint64_t u1, svuint64_t u2, - additional 15 bits precision. IX is the bit representation of x, but - normalized in the subnormal range using the sign bit for the exponent. */ - static inline svfloat64_t --sv_log_inline (svbool_t pg, svuint64_t ix, svfloat64_t *tail) -+sv_log_inline (svbool_t pg, svuint64_t ix, svfloat64_t *tail, -+ const struct data *d) - { - /* x = 2^k z; where z is in range [Off,2*Off) and exact. - The range is split into N subintervals. - The ith subinterval contains z and c is near its center. */ -- svuint64_t tmp = svsub_x (pg, ix, Off); -+ svuint64_t tmp = svsub_x (pg, ix, d->off); - svuint64_t i = svand_x (pg, svlsr_x (pg, tmp, 52 - V_POW_LOG_TABLE_BITS), - sv_u64 (N_LOG - 1)); - svint64_t k = svasr_x (pg, svreinterpret_s64 (tmp), 52); -- svuint64_t iz = svsub_x (pg, ix, svand_x (pg, tmp, sv_u64 (0xfffULL << 52))); -+ svuint64_t iz = svsub_x (pg, ix, svlsl_x (pg, svreinterpret_u64 (k), 52)); - svfloat64_t z = svreinterpret_f64 (iz); - svfloat64_t kd = svcvt_f64_x (pg, k); - -@@ -199,40 +224,85 @@ sv_log_inline (svbool_t pg, svuint64_t ix, svfloat64_t *tail) - |z/c - 1| < 1/N, so r = z/c - 1 is exactly representible. */ - svfloat64_t r = svmad_x (pg, z, invc, -1.0); - /* k*Ln2 + log(c) + r. */ -- svfloat64_t t1 = svmla_x (pg, logc, kd, __v_pow_log_data.ln2_hi); -+ -+ svfloat64_t ln2_hilo = svld1rq_f64 (svptrue_b64 (), &d->ln2_hi); -+ svfloat64_t t1 = svmla_lane_f64 (logc, kd, ln2_hilo, 0); - svfloat64_t t2 = svadd_x (pg, t1, r); -- svfloat64_t lo1 = svmla_x (pg, logctail, kd, __v_pow_log_data.ln2_lo); -+ svfloat64_t lo1 = svmla_lane_f64 (logctail, kd, ln2_hilo, 1); - svfloat64_t lo2 = svadd_x (pg, svsub_x (pg, t1, t2), r); - - /* Evaluation is optimized assuming superscalar pipelined execution. */ -- svfloat64_t ar = svmul_x (pg, r, -0.5); /* A[0] = -0.5. */ -- svfloat64_t ar2 = svmul_x (pg, r, ar); -- svfloat64_t ar3 = svmul_x (pg, r, ar2); -+ -+ svfloat64_t log_c02 = svld1rq_f64 (svptrue_b64 (), &d->log_c0); -+ svfloat64_t ar = svmul_lane_f64 (r, log_c02, 0); -+ svfloat64_t ar2 = svmul_x (svptrue_b64 (), r, ar); -+ svfloat64_t ar3 = svmul_x (svptrue_b64 (), r, ar2); - /* k*Ln2 + log(c) + r + A[0]*r*r. */ - svfloat64_t hi = svadd_x (pg, t2, ar2); -- svfloat64_t lo3 = svmla_x (pg, svneg_x (pg, ar2), ar, r); -+ svfloat64_t lo3 = svmls_x (pg, ar2, ar, r); - svfloat64_t lo4 = svadd_x (pg, svsub_x (pg, t2, hi), ar2); - /* p = log1p(r) - r - A[0]*r*r. */ - /* p = (ar3 * (A[1] + r * A[2] + ar2 * (A[3] + r * A[4] + ar2 * (A[5] + r * - A[6])))). */ -- svfloat64_t a56 = svmla_x (pg, sv_f64 (A[5]), r, A[6]); -- svfloat64_t a34 = svmla_x (pg, sv_f64 (A[3]), r, A[4]); -- svfloat64_t a12 = svmla_x (pg, sv_f64 (A[1]), r, A[2]); -+ -+ svfloat64_t log_c46 = svld1rq_f64 (svptrue_b64 (), &d->log_c4); -+ svfloat64_t a56 = svmla_lane_f64 (sv_f64 (d->log_c5), r, log_c46, 1); -+ svfloat64_t a34 = svmla_lane_f64 (sv_f64 (d->log_c3), r, log_c46, 0); -+ svfloat64_t a12 = svmla_lane_f64 (sv_f64 (d->log_c1), r, log_c02, 1); - svfloat64_t p = svmla_x (pg, a34, ar2, a56); - p = svmla_x (pg, a12, ar2, p); -- p = svmul_x (pg, ar3, p); -+ p = svmul_x (svptrue_b64 (), ar3, p); - svfloat64_t lo = svadd_x ( -- pg, svadd_x (pg, svadd_x (pg, svadd_x (pg, lo1, lo2), lo3), lo4), p); -+ pg, svadd_x (pg, svsub_x (pg, svadd_x (pg, lo1, lo2), lo3), lo4), p); - svfloat64_t y = svadd_x (pg, hi, lo); - *tail = svadd_x (pg, svsub_x (pg, hi, y), lo); - return y; - } - -+static inline svfloat64_t -+sv_exp_core (svbool_t pg, svfloat64_t x, svfloat64_t xtail, -+ svuint64_t sign_bias, svfloat64_t *tmp, svuint64_t *sbits, -+ svuint64_t *ki, const struct data *d) -+{ -+ /* exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)]. */ -+ /* x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N]. */ -+ svfloat64_t n_over_ln2_and_c2 = svld1rq_f64 (svptrue_b64 (), &d->n_over_ln2); -+ svfloat64_t z = svmul_lane_f64 (x, n_over_ln2_and_c2, 0); -+ /* z - kd is in [-1, 1] in non-nearest rounding modes. */ -+ svfloat64_t kd = svrinta_x (pg, z); -+ *ki = svreinterpret_u64 (svcvt_s64_x (pg, kd)); -+ -+ svfloat64_t ln2_over_n_hilo -+ = svld1rq_f64 (svptrue_b64 (), &d->ln2_over_n_hi); -+ svfloat64_t r = x; -+ r = svmls_lane_f64 (r, kd, ln2_over_n_hilo, 0); -+ r = svmls_lane_f64 (r, kd, ln2_over_n_hilo, 1); -+ /* The code assumes 2^-200 < |xtail| < 2^-8/N. */ -+ r = svadd_x (pg, r, xtail); -+ /* 2^(k/N) ~= scale. */ -+ svuint64_t idx = svand_x (pg, *ki, N_EXP - 1); -+ svuint64_t top -+ = svlsl_x (pg, svadd_x (pg, *ki, sign_bias), 52 - V_POW_EXP_TABLE_BITS); -+ /* This is only a valid scale when -1023*N < k < 1024*N. */ -+ *sbits = svld1_gather_index (pg, __v_pow_exp_data.sbits, idx); -+ *sbits = svadd_x (pg, *sbits, top); -+ /* exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (exp(r) - 1). */ -+ svfloat64_t r2 = svmul_x (svptrue_b64 (), r, r); -+ *tmp = svmla_lane_f64 (sv_f64 (d->exp_c1), r, n_over_ln2_and_c2, 1); -+ *tmp = svmla_x (pg, sv_f64 (d->exp_c0), r, *tmp); -+ *tmp = svmla_x (pg, r, r2, *tmp); -+ svfloat64_t scale = svreinterpret_f64 (*sbits); -+ /* Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there -+ is no spurious underflow here even without fma. */ -+ z = svmla_x (pg, scale, scale, *tmp); -+ return z; -+} -+ - /* Computes sign*exp(x+xtail) where |xtail| < 2^-8/N and |xtail| <= |x|. - The sign_bias argument is SignBias or 0 and sets the sign to -1 or 1. */ - static inline svfloat64_t - sv_exp_inline (svbool_t pg, svfloat64_t x, svfloat64_t xtail, -- svuint64_t sign_bias) -+ svuint64_t sign_bias, const struct data *d) - { - /* 3 types of special cases: tiny (uflow and spurious uflow), huge (oflow) - and other cases of large values of x (scale * (1 + TMP) oflow). */ -@@ -240,73 +310,46 @@ sv_exp_inline (svbool_t pg, svfloat64_t x, svfloat64_t xtail, - /* |x| is large (|x| >= 512) or tiny (|x| <= 0x1p-54). */ - svbool_t uoflow = svcmpge (pg, svsub_x (pg, abstop, SmallExp), ThresExp); - -- /* Conditions special, uflow and oflow are all expressed as uoflow && -- something, hence do not bother computing anything if no lane in uoflow is -- true. */ -- svbool_t special = svpfalse_b (); -- svbool_t uflow = svpfalse_b (); -- svbool_t oflow = svpfalse_b (); -+ svfloat64_t tmp; -+ svuint64_t sbits, ki; - if (__glibc_unlikely (svptest_any (pg, uoflow))) - { -+ svfloat64_t z -+ = sv_exp_core (pg, x, xtail, sign_bias, &tmp, &sbits, &ki, d); -+ - /* |x| is tiny (|x| <= 0x1p-54). */ -- uflow = svcmpge (pg, svsub_x (pg, abstop, SmallExp), 0x80000000); -+ svbool_t uflow -+ = svcmpge (pg, svsub_x (pg, abstop, SmallExp), 0x80000000); - uflow = svand_z (pg, uoflow, uflow); - /* |x| is huge (|x| >= 1024). */ -- oflow = svcmpge (pg, abstop, HugeExp); -+ svbool_t oflow = svcmpge (pg, abstop, HugeExp); - oflow = svand_z (pg, uoflow, svbic_z (pg, oflow, uflow)); -+ - /* For large |x| values (512 < |x| < 1024) scale * (1 + TMP) can overflow -- or underflow. */ -- special = svbic_z (pg, uoflow, svorr_z (pg, uflow, oflow)); -+ or underflow. */ -+ svbool_t special = svbic_z (pg, uoflow, svorr_z (pg, uflow, oflow)); -+ -+ /* Update result with special and large cases. */ -+ z = sv_call_specialcase (tmp, sbits, ki, z, special); -+ -+ /* Handle underflow and overflow. */ -+ svbool_t x_is_neg = svcmplt (pg, x, 0); -+ svuint64_t sign_mask -+ = svlsl_x (pg, sign_bias, 52 - V_POW_EXP_TABLE_BITS); -+ svfloat64_t res_uoflow -+ = svsel (x_is_neg, sv_f64 (0.0), sv_f64 (INFINITY)); -+ res_uoflow = svreinterpret_f64 ( -+ svorr_x (pg, svreinterpret_u64 (res_uoflow), sign_mask)); -+ /* Avoid spurious underflow for tiny x. */ -+ svfloat64_t res_spurious_uflow -+ = svreinterpret_f64 (svorr_x (pg, sign_mask, 0x3ff0000000000000)); -+ -+ z = svsel (oflow, res_uoflow, z); -+ z = svsel (uflow, res_spurious_uflow, z); -+ return z; - } - -- /* exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)]. */ -- /* x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N]. */ -- svfloat64_t z = svmul_x (pg, x, __v_pow_exp_data.n_over_ln2); -- /* z - kd is in [-1, 1] in non-nearest rounding modes. */ -- svfloat64_t shift = sv_f64 (__v_pow_exp_data.shift); -- svfloat64_t kd = svadd_x (pg, z, shift); -- svuint64_t ki = svreinterpret_u64 (kd); -- kd = svsub_x (pg, kd, shift); -- svfloat64_t r = x; -- r = svmls_x (pg, r, kd, __v_pow_exp_data.ln2_over_n_hi); -- r = svmls_x (pg, r, kd, __v_pow_exp_data.ln2_over_n_lo); -- /* The code assumes 2^-200 < |xtail| < 2^-8/N. */ -- r = svadd_x (pg, r, xtail); -- /* 2^(k/N) ~= scale. */ -- svuint64_t idx = svand_x (pg, ki, N_EXP - 1); -- svuint64_t top -- = svlsl_x (pg, svadd_x (pg, ki, sign_bias), 52 - V_POW_EXP_TABLE_BITS); -- /* This is only a valid scale when -1023*N < k < 1024*N. */ -- svuint64_t sbits = svld1_gather_index (pg, __v_pow_exp_data.sbits, idx); -- sbits = svadd_x (pg, sbits, top); -- /* exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (exp(r) - 1). */ -- svfloat64_t r2 = svmul_x (pg, r, r); -- svfloat64_t tmp = svmla_x (pg, sv_f64 (C[1]), r, C[2]); -- tmp = svmla_x (pg, sv_f64 (C[0]), r, tmp); -- tmp = svmla_x (pg, r, r2, tmp); -- svfloat64_t scale = svreinterpret_f64 (sbits); -- /* Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there -- is no spurious underflow here even without fma. */ -- z = svmla_x (pg, scale, scale, tmp); -- -- /* Update result with special and large cases. */ -- if (__glibc_unlikely (svptest_any (pg, special))) -- z = sv_call_specialcase (tmp, sbits, ki, z, special); -- -- /* Handle underflow and overflow. */ -- svuint64_t sign_bit = svlsr_x (pg, svreinterpret_u64 (x), 63); -- svbool_t x_is_neg = svcmpne (pg, sign_bit, 0); -- svuint64_t sign_mask = svlsl_x (pg, sign_bias, 52 - V_POW_EXP_TABLE_BITS); -- svfloat64_t res_uoflow = svsel (x_is_neg, sv_f64 (0.0), sv_f64 (INFINITY)); -- res_uoflow = svreinterpret_f64 ( -- svorr_x (pg, svreinterpret_u64 (res_uoflow), sign_mask)); -- z = svsel (oflow, res_uoflow, z); -- /* Avoid spurious underflow for tiny x. */ -- svfloat64_t res_spurious_uflow -- = svreinterpret_f64 (svorr_x (pg, sign_mask, 0x3ff0000000000000)); -- z = svsel (uflow, res_spurious_uflow, z); -- -- return z; -+ return sv_exp_core (pg, x, xtail, sign_bias, &tmp, &sbits, &ki, d); - } - - static inline double -@@ -341,47 +384,39 @@ pow_sc (double x, double y) - - svfloat64_t SV_NAME_D2 (pow) (svfloat64_t x, svfloat64_t y, const svbool_t pg) - { -+ const struct data *d = ptr_barrier (&data); -+ - /* This preamble handles special case conditions used in the final scalar - fallbacks. It also updates ix and sign_bias, that are used in the core - computation too, i.e., exp( y * log (x) ). */ - svuint64_t vix0 = svreinterpret_u64 (x); - svuint64_t viy0 = svreinterpret_u64 (y); -- svuint64_t vtopx0 = svlsr_x (svptrue_b64 (), vix0, 52); - - /* Negative x cases. */ -- svuint64_t sign_bit = svlsr_m (pg, vix0, 63); -- svbool_t xisneg = svcmpeq (pg, sign_bit, 1); -+ svbool_t xisneg = svcmplt (pg, x, 0); - - /* Set sign_bias and ix depending on sign of x and nature of y. */ -- svbool_t yisnotint_xisneg = svpfalse_b (); -+ svbool_t yint_or_xpos = pg; - svuint64_t sign_bias = sv_u64 (0); - svuint64_t vix = vix0; -- svuint64_t vtopx1 = vtopx0; - if (__glibc_unlikely (svptest_any (pg, xisneg))) - { - /* Determine nature of y. */ -- yisnotint_xisneg = sv_isnotint (xisneg, y); -- svbool_t yisint_xisneg = sv_isint (xisneg, y); -+ yint_or_xpos = sv_isint (xisneg, y); - svbool_t yisodd_xisneg = sv_isodd (xisneg, y); - /* ix set to abs(ix) if y is integer. */ -- vix = svand_m (yisint_xisneg, vix0, 0x7fffffffffffffff); -- vtopx1 = svand_m (yisint_xisneg, vtopx0, 0x7ff); -+ vix = svand_m (yint_or_xpos, vix0, 0x7fffffffffffffff); - /* Set to SignBias if x is negative and y is odd. */ - sign_bias = svsel (yisodd_xisneg, sv_u64 (SignBias), sv_u64 (0)); - } - -- /* Special cases of x or y: zero, inf and nan. */ -- svbool_t xspecial = sv_zeroinfnan (pg, vix0); -- svbool_t yspecial = sv_zeroinfnan (pg, viy0); -- svbool_t special = svorr_z (pg, xspecial, yspecial); -- - /* Small cases of x: |x| < 0x1p-126. */ -- svuint64_t vabstopx0 = svand_x (pg, vtopx0, 0x7ff); -- svbool_t xsmall = svcmplt (pg, vabstopx0, SmallPowX); -- if (__glibc_unlikely (svptest_any (pg, xsmall))) -+ svbool_t xsmall = svaclt (yint_or_xpos, x, SmallBoundX); -+ if (__glibc_unlikely (svptest_any (yint_or_xpos, xsmall))) - { - /* Normalize subnormal x so exponent becomes negative. */ -- svbool_t topx_is_null = svcmpeq (xsmall, vtopx1, 0); -+ svuint64_t vtopx = svlsr_x (svptrue_b64 (), vix, 52); -+ svbool_t topx_is_null = svcmpeq (xsmall, vtopx, 0); - - svuint64_t vix_norm = svreinterpret_u64 (svmul_m (xsmall, x, 0x1p52)); - vix_norm = svand_m (xsmall, vix_norm, 0x7fffffffffffffff); -@@ -391,20 +426,24 @@ svfloat64_t SV_NAME_D2 (pow) (svfloat64_t x, svfloat64_t y, const svbool_t pg) - - /* y_hi = log(ix, &y_lo). */ - svfloat64_t vlo; -- svfloat64_t vhi = sv_log_inline (pg, vix, &vlo); -+ svfloat64_t vhi = sv_log_inline (yint_or_xpos, vix, &vlo, d); - - /* z = exp(y_hi, y_lo, sign_bias). */ -- svfloat64_t vehi = svmul_x (pg, y, vhi); -- svfloat64_t velo = svmul_x (pg, y, vlo); -- svfloat64_t vemi = svmls_x (pg, vehi, y, vhi); -- velo = svsub_x (pg, velo, vemi); -- svfloat64_t vz = sv_exp_inline (pg, vehi, velo, sign_bias); -+ svfloat64_t vehi = svmul_x (svptrue_b64 (), y, vhi); -+ svfloat64_t vemi = svmls_x (yint_or_xpos, vehi, y, vhi); -+ svfloat64_t velo = svnmls_x (yint_or_xpos, vemi, y, vlo); -+ svfloat64_t vz = sv_exp_inline (yint_or_xpos, vehi, velo, sign_bias, d); - - /* Cases of finite y and finite negative x. */ -- vz = svsel (yisnotint_xisneg, sv_f64 (__builtin_nan ("")), vz); -+ vz = svsel (yint_or_xpos, vz, sv_f64 (__builtin_nan (""))); -+ -+ /* Special cases of x or y: zero, inf and nan. */ -+ svbool_t xspecial = sv_zeroinfnan (svptrue_b64 (), vix0); -+ svbool_t yspecial = sv_zeroinfnan (svptrue_b64 (), viy0); -+ svbool_t special = svorr_z (svptrue_b64 (), xspecial, yspecial); - - /* Cases of zero/inf/nan x or y. */ -- if (__glibc_unlikely (svptest_any (pg, special))) -+ if (__glibc_unlikely (svptest_any (svptrue_b64 (), special))) - vz = sv_call2_f64 (pow_sc, x, y, vz, special); - - return vz; - -commit 06fd8ad78f35a6cc65dc7c6c08ce55faf6ad079d -Author: Yat Long Poon -Date: Thu Feb 13 18:03:04 2025 +0000 - - AArch64: Improve codegen for SVE powf - - Improve memory access with indexed/unpredicated instructions. - Eliminate register spills. Speedup on Neoverse V1: 3%. - - Reviewed-by: Wilco Dijkstra - (cherry picked from commit 95e807209b680257a9afe81a507754f1565dbb4d) - -diff --git a/sysdeps/aarch64/fpu/powf_sve.c b/sysdeps/aarch64/fpu/powf_sve.c -index 4f6a142325..08d7019a18 100644 ---- a/sysdeps/aarch64/fpu/powf_sve.c -+++ b/sysdeps/aarch64/fpu/powf_sve.c -@@ -26,7 +26,6 @@ - #define Tlogc __v_powf_data.logc - #define Texp __v_powf_data.scale - #define SignBias (1 << (V_POWF_EXP2_TABLE_BITS + 11)) --#define Shift 0x1.8p52 - #define Norm 0x1p23f /* 0x4b000000. */ - - /* Overall ULP error bound for pow is 2.6 ulp -@@ -36,7 +35,7 @@ static const struct data - double log_poly[4]; - double exp_poly[3]; - float uflow_bound, oflow_bound, small_bound; -- uint32_t sign_bias, sign_mask, subnormal_bias, off; -+ uint32_t sign_bias, subnormal_bias, off; - } data = { - /* rel err: 1.5 * 2^-30. Each coefficients is multiplied the value of - V_POWF_EXP2_N. */ -@@ -53,7 +52,6 @@ static const struct data - .small_bound = 0x1p-126f, - .off = 0x3f35d000, - .sign_bias = SignBias, -- .sign_mask = 0x80000000, - .subnormal_bias = 0x0b800000, /* 23 << 23. */ - }; - -@@ -86,7 +84,7 @@ svisodd (svbool_t pg, svfloat32_t x) - static inline svbool_t - sv_zeroinfnan (svbool_t pg, svuint32_t i) - { -- return svcmpge (pg, svsub_x (pg, svmul_x (pg, i, 2u), 1), -+ return svcmpge (pg, svsub_x (pg, svadd_x (pg, i, i), 1), - 2u * 0x7f800000 - 1); - } - -@@ -150,9 +148,14 @@ powf_specialcase (float x, float y, float z) - } - - /* Scalar fallback for special case routines with custom signature. */ --static inline svfloat32_t --sv_call_powf_sc (svfloat32_t x1, svfloat32_t x2, svfloat32_t y, svbool_t cmp) -+static svfloat32_t NOINLINE -+sv_call_powf_sc (svfloat32_t x1, svfloat32_t x2, svfloat32_t y) - { -+ /* Special cases of x or y: zero, inf and nan. */ -+ svbool_t xspecial = sv_zeroinfnan (svptrue_b32 (), svreinterpret_u32 (x1)); -+ svbool_t yspecial = sv_zeroinfnan (svptrue_b32 (), svreinterpret_u32 (x2)); -+ svbool_t cmp = svorr_z (svptrue_b32 (), xspecial, yspecial); -+ - svbool_t p = svpfirst (cmp, svpfalse ()); - while (svptest_any (cmp, p)) - { -@@ -182,30 +185,30 @@ sv_powf_core_ext (const svbool_t pg, svuint64_t i, svfloat64_t z, svint64_t k, - - /* Polynomial to approximate log1p(r)/ln2. */ - svfloat64_t logx = A (0); -- logx = svmla_x (pg, A (1), r, logx); -- logx = svmla_x (pg, A (2), r, logx); -- logx = svmla_x (pg, A (3), r, logx); -- logx = svmla_x (pg, y0, r, logx); -+ logx = svmad_x (pg, r, logx, A (1)); -+ logx = svmad_x (pg, r, logx, A (2)); -+ logx = svmad_x (pg, r, logx, A (3)); -+ logx = svmad_x (pg, r, logx, y0); - *pylogx = svmul_x (pg, y, logx); - - /* z - kd is in [-1, 1] in non-nearest rounding modes. */ -- svfloat64_t kd = svadd_x (pg, *pylogx, Shift); -- svuint64_t ki = svreinterpret_u64 (kd); -- kd = svsub_x (pg, kd, Shift); -+ svfloat64_t kd = svrinta_x (svptrue_b64 (), *pylogx); -+ svuint64_t ki = svreinterpret_u64 (svcvt_s64_x (svptrue_b64 (), kd)); - - r = svsub_x (pg, *pylogx, kd); - - /* exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1). */ -- svuint64_t t -- = svld1_gather_index (pg, Texp, svand_x (pg, ki, V_POWF_EXP2_N - 1)); -- svuint64_t ski = svadd_x (pg, ki, sign_bias); -- t = svadd_x (pg, t, svlsl_x (pg, ski, 52 - V_POWF_EXP2_TABLE_BITS)); -+ svuint64_t t = svld1_gather_index ( -+ svptrue_b64 (), Texp, svand_x (svptrue_b64 (), ki, V_POWF_EXP2_N - 1)); -+ svuint64_t ski = svadd_x (svptrue_b64 (), ki, sign_bias); -+ t = svadd_x (svptrue_b64 (), t, -+ svlsl_x (svptrue_b64 (), ski, 52 - V_POWF_EXP2_TABLE_BITS)); - svfloat64_t s = svreinterpret_f64 (t); - - svfloat64_t p = C (0); - p = svmla_x (pg, C (1), p, r); - p = svmla_x (pg, C (2), p, r); -- p = svmla_x (pg, s, p, svmul_x (pg, s, r)); -+ p = svmla_x (pg, s, p, svmul_x (svptrue_b64 (), s, r)); - - return p; - } -@@ -219,19 +222,16 @@ sv_powf_core (const svbool_t pg, svuint32_t i, svuint32_t iz, svint32_t k, - { - const svbool_t ptrue = svptrue_b64 (); - -- /* Unpack and promote input vectors (pg, y, z, i, k and sign_bias) into two in -- order to perform core computation in double precision. */ -+ /* Unpack and promote input vectors (pg, y, z, i, k and sign_bias) into two -+ * in order to perform core computation in double precision. */ - const svbool_t pg_lo = svunpklo (pg); - const svbool_t pg_hi = svunpkhi (pg); -- svfloat64_t y_lo = svcvt_f64_x ( -- ptrue, svreinterpret_f32 (svunpklo (svreinterpret_u32 (y)))); -- svfloat64_t y_hi = svcvt_f64_x ( -- ptrue, svreinterpret_f32 (svunpkhi (svreinterpret_u32 (y)))); -- svfloat32_t z = svreinterpret_f32 (iz); -- svfloat64_t z_lo = svcvt_f64_x ( -- ptrue, svreinterpret_f32 (svunpklo (svreinterpret_u32 (z)))); -- svfloat64_t z_hi = svcvt_f64_x ( -- ptrue, svreinterpret_f32 (svunpkhi (svreinterpret_u32 (z)))); -+ svfloat64_t y_lo -+ = svcvt_f64_x (pg, svreinterpret_f32 (svunpklo (svreinterpret_u32 (y)))); -+ svfloat64_t y_hi -+ = svcvt_f64_x (pg, svreinterpret_f32 (svunpkhi (svreinterpret_u32 (y)))); -+ svfloat64_t z_lo = svcvt_f64_x (pg, svreinterpret_f32 (svunpklo (iz))); -+ svfloat64_t z_hi = svcvt_f64_x (pg, svreinterpret_f32 (svunpkhi (iz))); - svuint64_t i_lo = svunpklo (i); - svuint64_t i_hi = svunpkhi (i); - svint64_t k_lo = svunpklo (k); -@@ -258,9 +258,9 @@ sv_powf_core (const svbool_t pg, svuint32_t i, svuint32_t iz, svint32_t k, - /* Implementation of SVE powf. - Provides the same accuracy as AdvSIMD powf, since it relies on the same - algorithm. The theoretical maximum error is under 2.60 ULPs. -- Maximum measured error is 2.56 ULPs: -- SV_NAME_F2 (pow) (0x1.004118p+0, 0x1.5d14a4p+16) got 0x1.fd4bp+127 -- want 0x1.fd4b06p+127. */ -+ Maximum measured error is 2.57 ULPs: -+ SV_NAME_F2 (pow) (0x1.031706p+0, 0x1.ce2ec2p+12) got 0x1.fff868p+127 -+ want 0x1.fff862p+127. */ - svfloat32_t SV_NAME_F2 (pow) (svfloat32_t x, svfloat32_t y, const svbool_t pg) - { - const struct data *d = ptr_barrier (&data); -@@ -269,21 +269,19 @@ svfloat32_t SV_NAME_F2 (pow) (svfloat32_t x, svfloat32_t y, const svbool_t pg) - svuint32_t viy0 = svreinterpret_u32 (y); - - /* Negative x cases. */ -- svuint32_t sign_bit = svand_m (pg, vix0, d->sign_mask); -- svbool_t xisneg = svcmpeq (pg, sign_bit, d->sign_mask); -+ svbool_t xisneg = svcmplt (pg, x, sv_f32 (0)); - - /* Set sign_bias and ix depending on sign of x and nature of y. */ -- svbool_t yisnotint_xisneg = svpfalse_b (); -+ svbool_t yint_or_xpos = pg; - svuint32_t sign_bias = sv_u32 (0); - svuint32_t vix = vix0; - if (__glibc_unlikely (svptest_any (pg, xisneg))) - { - /* Determine nature of y. */ -- yisnotint_xisneg = svisnotint (xisneg, y); -- svbool_t yisint_xisneg = svisint (xisneg, y); -+ yint_or_xpos = svisint (xisneg, y); - svbool_t yisodd_xisneg = svisodd (xisneg, y); - /* ix set to abs(ix) if y is integer. */ -- vix = svand_m (yisint_xisneg, vix0, 0x7fffffff); -+ vix = svand_m (yint_or_xpos, vix0, 0x7fffffff); - /* Set to SignBias if x is negative and y is odd. */ - sign_bias = svsel (yisodd_xisneg, sv_u32 (d->sign_bias), sv_u32 (0)); - } -@@ -294,8 +292,8 @@ svfloat32_t SV_NAME_F2 (pow) (svfloat32_t x, svfloat32_t y, const svbool_t pg) - svbool_t cmp = svorr_z (pg, xspecial, yspecial); - - /* Small cases of x: |x| < 0x1p-126. */ -- svbool_t xsmall = svaclt (pg, x, d->small_bound); -- if (__glibc_unlikely (svptest_any (pg, xsmall))) -+ svbool_t xsmall = svaclt (yint_or_xpos, x, d->small_bound); -+ if (__glibc_unlikely (svptest_any (yint_or_xpos, xsmall))) - { - /* Normalize subnormal x so exponent becomes negative. */ - svuint32_t vix_norm = svreinterpret_u32 (svmul_x (xsmall, x, Norm)); -@@ -304,32 +302,35 @@ svfloat32_t SV_NAME_F2 (pow) (svfloat32_t x, svfloat32_t y, const svbool_t pg) - vix = svsel (xsmall, vix_norm, vix); - } - /* Part of core computation carried in working precision. */ -- svuint32_t tmp = svsub_x (pg, vix, d->off); -- svuint32_t i = svand_x (pg, svlsr_x (pg, tmp, (23 - V_POWF_LOG2_TABLE_BITS)), -- V_POWF_LOG2_N - 1); -- svuint32_t top = svand_x (pg, tmp, 0xff800000); -- svuint32_t iz = svsub_x (pg, vix, top); -- svint32_t k -- = svasr_x (pg, svreinterpret_s32 (top), (23 - V_POWF_EXP2_TABLE_BITS)); -- -- /* Compute core in extended precision and return intermediate ylogx results to -- handle cases of underflow and underflow in exp. */ -+ svuint32_t tmp = svsub_x (yint_or_xpos, vix, d->off); -+ svuint32_t i = svand_x ( -+ yint_or_xpos, svlsr_x (yint_or_xpos, tmp, (23 - V_POWF_LOG2_TABLE_BITS)), -+ V_POWF_LOG2_N - 1); -+ svuint32_t top = svand_x (yint_or_xpos, tmp, 0xff800000); -+ svuint32_t iz = svsub_x (yint_or_xpos, vix, top); -+ svint32_t k = svasr_x (yint_or_xpos, svreinterpret_s32 (top), -+ (23 - V_POWF_EXP2_TABLE_BITS)); -+ -+ /* Compute core in extended precision and return intermediate ylogx results -+ * to handle cases of underflow and underflow in exp. */ - svfloat32_t ylogx; -- svfloat32_t ret = sv_powf_core (pg, i, iz, k, y, sign_bias, &ylogx, d); -+ svfloat32_t ret -+ = sv_powf_core (yint_or_xpos, i, iz, k, y, sign_bias, &ylogx, d); - - /* Handle exp special cases of underflow and overflow. */ -- svuint32_t sign = svlsl_x (pg, sign_bias, 20 - V_POWF_EXP2_TABLE_BITS); -+ svuint32_t sign -+ = svlsl_x (yint_or_xpos, sign_bias, 20 - V_POWF_EXP2_TABLE_BITS); - svfloat32_t ret_oflow -- = svreinterpret_f32 (svorr_x (pg, sign, asuint (INFINITY))); -+ = svreinterpret_f32 (svorr_x (yint_or_xpos, sign, asuint (INFINITY))); - svfloat32_t ret_uflow = svreinterpret_f32 (sign); -- ret = svsel (svcmple (pg, ylogx, d->uflow_bound), ret_uflow, ret); -- ret = svsel (svcmpgt (pg, ylogx, d->oflow_bound), ret_oflow, ret); -+ ret = svsel (svcmple (yint_or_xpos, ylogx, d->uflow_bound), ret_uflow, ret); -+ ret = svsel (svcmpgt (yint_or_xpos, ylogx, d->oflow_bound), ret_oflow, ret); - - /* Cases of finite y and finite negative x. */ -- ret = svsel (yisnotint_xisneg, sv_f32 (__builtin_nanf ("")), ret); -+ ret = svsel (yint_or_xpos, ret, sv_f32 (__builtin_nanf (""))); - -- if (__glibc_unlikely (svptest_any (pg, cmp))) -- return sv_call_powf_sc (x, y, ret, cmp); -+ if (__glibc_unlikely (svptest_any (cmp, cmp))) -+ return sv_call_powf_sc (x, y, ret); - - return ret; - } - -commit fd9a3a36fdcf14d1678c469e8b9033a46aa6c6fb -Author: Wilco Dijkstra -Date: Thu Feb 27 20:34:34 2025 +0000 - - Revert "AArch64: Add vector logp1 alias for log1p" - - This reverts commit a991a0fc7c051d7ef2ea7778e0a699f22d4e53d7. - -diff --git a/bits/libm-simd-decl-stubs.h b/bits/libm-simd-decl-stubs.h -index 5019e8e25c..08a41c46ad 100644 ---- a/bits/libm-simd-decl-stubs.h -+++ b/bits/libm-simd-decl-stubs.h -@@ -253,17 +253,6 @@ - #define __DECL_SIMD_log1pf64x - #define __DECL_SIMD_log1pf128x - --#define __DECL_SIMD_logp1 --#define __DECL_SIMD_logp1f --#define __DECL_SIMD_logp1l --#define __DECL_SIMD_logp1f16 --#define __DECL_SIMD_logp1f32 --#define __DECL_SIMD_logp1f64 --#define __DECL_SIMD_logp1f128 --#define __DECL_SIMD_logp1f32x --#define __DECL_SIMD_logp1f64x --#define __DECL_SIMD_logp1f128x -- - #define __DECL_SIMD_atanh - #define __DECL_SIMD_atanhf - #define __DECL_SIMD_atanhl -diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h -index 92856becc4..6cb594b6ff 100644 ---- a/math/bits/mathcalls.h -+++ b/math/bits/mathcalls.h -@@ -126,7 +126,7 @@ __MATHCALL (log2p1,, (_Mdouble_ __x)); - __MATHCALL (log10p1,, (_Mdouble_ __x)); - - /* Return log(1 + X). */ --__MATHCALL_VEC (logp1,, (_Mdouble_ __x)); -+__MATHCALL (logp1,, (_Mdouble_ __x)); - #endif - - #if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 -diff --git a/sysdeps/aarch64/fpu/Versions b/sysdeps/aarch64/fpu/Versions -index 015211f5f4..cc15ce2d1e 100644 ---- a/sysdeps/aarch64/fpu/Versions -+++ b/sysdeps/aarch64/fpu/Versions -@@ -135,11 +135,4 @@ libmvec { - _ZGVsMxv_tanh; - _ZGVsMxv_tanhf; - } -- GLIBC_2.41 { -- _ZGVnN2v_logp1; -- _ZGVnN2v_logp1f; -- _ZGVnN4v_logp1f; -- _ZGVsMxv_logp1; -- _ZGVsMxv_logp1f; -- } - } -diff --git a/sysdeps/aarch64/fpu/advsimd_f32_protos.h b/sysdeps/aarch64/fpu/advsimd_f32_protos.h -index 5909bb4ce9..097d403ffe 100644 ---- a/sysdeps/aarch64/fpu/advsimd_f32_protos.h -+++ b/sysdeps/aarch64/fpu/advsimd_f32_protos.h -@@ -36,7 +36,6 @@ libmvec_hidden_proto (V_NAME_F2(hypot)); - libmvec_hidden_proto (V_NAME_F1(log10)); - libmvec_hidden_proto (V_NAME_F1(log1p)); - libmvec_hidden_proto (V_NAME_F1(log2)); --libmvec_hidden_proto (V_NAME_F1(logp1)); - libmvec_hidden_proto (V_NAME_F1(log)); - libmvec_hidden_proto (V_NAME_F2(pow)); - libmvec_hidden_proto (V_NAME_F1(sin)); -diff --git a/sysdeps/aarch64/fpu/bits/math-vector.h b/sysdeps/aarch64/fpu/bits/math-vector.h -index f295fe185d..7484150131 100644 ---- a/sysdeps/aarch64/fpu/bits/math-vector.h -+++ b/sysdeps/aarch64/fpu/bits/math-vector.h -@@ -113,10 +113,6 @@ - # define __DECL_SIMD_log2 __DECL_SIMD_aarch64 - # undef __DECL_SIMD_log2f - # define __DECL_SIMD_log2f __DECL_SIMD_aarch64 --# undef __DECL_SIMD_logp1 --# define __DECL_SIMD_logp1 __DECL_SIMD_aarch64 --# undef __DECL_SIMD_logp1f --# define __DECL_SIMD_logp1f __DECL_SIMD_aarch64 - # undef __DECL_SIMD_pow - # define __DECL_SIMD_pow __DECL_SIMD_aarch64 - # undef __DECL_SIMD_powf -@@ -184,7 +180,6 @@ __vpcs __f32x4_t _ZGVnN4v_logf (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_log10f (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_log1pf (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_log2f (__f32x4_t); --__vpcs __f32x4_t _ZGVnN4v_logp1f (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4vv_powf (__f32x4_t, __f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_sinf (__f32x4_t); - __vpcs __f32x4_t _ZGVnN4v_sinhf (__f32x4_t); -@@ -212,7 +207,6 @@ __vpcs __f64x2_t _ZGVnN2v_log (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_log10 (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_log1p (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_log2 (__f64x2_t); --__vpcs __f64x2_t _ZGVnN2v_logp1 (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2vv_pow (__f64x2_t, __f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_sin (__f64x2_t); - __vpcs __f64x2_t _ZGVnN2v_sinh (__f64x2_t); -@@ -245,7 +239,6 @@ __sv_f32_t _ZGVsMxv_logf (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_log10f (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_log1pf (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_log2f (__sv_f32_t, __sv_bool_t); --__sv_f32_t _ZGVsMxv_logp1f (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxvv_powf (__sv_f32_t, __sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_sinf (__sv_f32_t, __sv_bool_t); - __sv_f32_t _ZGVsMxv_sinhf (__sv_f32_t, __sv_bool_t); -@@ -273,7 +266,6 @@ __sv_f64_t _ZGVsMxv_log (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_log10 (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_log1p (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_log2 (__sv_f64_t, __sv_bool_t); --__sv_f64_t _ZGVsMxv_logp1 (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxvv_pow (__sv_f64_t, __sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_sin (__sv_f64_t, __sv_bool_t); - __sv_f64_t _ZGVsMxv_sinh (__sv_f64_t, __sv_bool_t); -diff --git a/sysdeps/aarch64/fpu/log1p_advsimd.c b/sysdeps/aarch64/fpu/log1p_advsimd.c -index 1263587201..9d18578ce6 100644 ---- a/sysdeps/aarch64/fpu/log1p_advsimd.c -+++ b/sysdeps/aarch64/fpu/log1p_advsimd.c -@@ -58,5 +58,3 @@ VPCS_ATTR float64x2_t V_NAME_D1 (log1p) (float64x2_t x) - - return log1p_inline (x, &d->d); - } -- --strong_alias (V_NAME_D1 (log1p), V_NAME_D1 (logp1)) -diff --git a/sysdeps/aarch64/fpu/log1p_sve.c b/sysdeps/aarch64/fpu/log1p_sve.c -index b21cfb2c90..04f7e5720e 100644 ---- a/sysdeps/aarch64/fpu/log1p_sve.c -+++ b/sysdeps/aarch64/fpu/log1p_sve.c -@@ -116,5 +116,3 @@ svfloat64_t SV_NAME_D1 (log1p) (svfloat64_t x, svbool_t pg) - - return y; - } -- --strong_alias (SV_NAME_D1 (log1p), SV_NAME_D1 (logp1)) -diff --git a/sysdeps/aarch64/fpu/log1pf_advsimd.c b/sysdeps/aarch64/fpu/log1pf_advsimd.c -index 00006fc703..f2d47962fe 100644 ---- a/sysdeps/aarch64/fpu/log1pf_advsimd.c -+++ b/sysdeps/aarch64/fpu/log1pf_advsimd.c -@@ -93,6 +93,3 @@ VPCS_ATTR float32x4_t V_NAME_F1 (log1p) (float32x4_t x) - - libmvec_hidden_def (V_NAME_F1 (log1p)) - HALF_WIDTH_ALIAS_F1 (log1p) --strong_alias (V_NAME_F1 (log1p), V_NAME_F1 (logp1)) --libmvec_hidden_def (V_NAME_F1 (logp1)) --HALF_WIDTH_ALIAS_F1 (logp1) -diff --git a/sysdeps/aarch64/fpu/log1pf_sve.c b/sysdeps/aarch64/fpu/log1pf_sve.c -index 18a185c838..4f17c44e2d 100644 ---- a/sysdeps/aarch64/fpu/log1pf_sve.c -+++ b/sysdeps/aarch64/fpu/log1pf_sve.c -@@ -42,5 +42,3 @@ svfloat32_t SV_NAME_F1 (log1p) (svfloat32_t x, svbool_t pg) - - return sv_log1pf_inline (x, pg); - } -- --strong_alias (SV_NAME_F1 (log1p), SV_NAME_F1 (logp1)) -diff --git a/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist b/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist -index 98687cae0d..b685106954 100644 ---- a/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist -+++ b/sysdeps/unix/sysv/linux/aarch64/libmvec.abilist -@@ -128,8 +128,3 @@ GLIBC_2.40 _ZGVsMxvv_hypot F - GLIBC_2.40 _ZGVsMxvv_hypotf F - GLIBC_2.40 _ZGVsMxvv_pow F - GLIBC_2.40 _ZGVsMxvv_powf F --GLIBC_2.41 _ZGVnN2v_logp1 F --GLIBC_2.41 _ZGVnN2v_logp1f F --GLIBC_2.41 _ZGVnN4v_logp1f F --GLIBC_2.41 _ZGVsMxv_logp1 F --GLIBC_2.41 _ZGVsMxv_logp1f F - -commit 64896b7d329809127035fde42768a6f7eeffed75 -Author: Wilco Dijkstra -Date: Wed Aug 7 14:43:47 2024 +0100 - - AArch64: Improve generic strlen - - Improve performance by handling another 16 bytes before entering the loop. - Use ADDHN in the loop to avoid SHRN+FMOV when it terminates. Change final - size computation to avoid increasing latency. On Neoverse V1 performance - of the random strlen benchmark improves by 4.6%. - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit 3dc426b642dcafdbc11a99f2767e081d086f5fc7) - -diff --git a/sysdeps/aarch64/strlen.S b/sysdeps/aarch64/strlen.S -index ab2a576cdb..352fb40d3a 100644 ---- a/sysdeps/aarch64/strlen.S -+++ b/sysdeps/aarch64/strlen.S -@@ -1,4 +1,5 @@ --/* Copyright (C) 2012-2024 Free Software Foundation, Inc. -+/* Generic optimized strlen using SIMD. -+ Copyright (C) 2012-2024 Free Software Foundation, Inc. - - This file is part of the GNU C Library. - -@@ -56,36 +57,50 @@ ENTRY (STRLEN) - shrn vend.8b, vhas_nul.8h, 4 /* 128->64 */ - fmov synd, dend - lsr synd, synd, shift -- cbz synd, L(loop) -+ cbz synd, L(next16) - - rbit synd, synd - clz result, synd - lsr result, result, 2 - ret - -+L(next16): -+ ldr data, [src, 16] -+ cmeq vhas_nul.16b, vdata.16b, 0 -+ shrn vend.8b, vhas_nul.8h, 4 /* 128->64 */ -+ fmov synd, dend -+ cbz synd, L(loop) -+ add src, src, 16 -+#ifndef __AARCH64EB__ -+ rbit synd, synd -+#endif -+ sub result, src, srcin -+ clz tmp, synd -+ add result, result, tmp, lsr 2 -+ ret -+ - .p2align 5 - L(loop): -- ldr data, [src, 16] -+ ldr data, [src, 32]! - cmeq vhas_nul.16b, vdata.16b, 0 -- umaxp vend.16b, vhas_nul.16b, vhas_nul.16b -+ addhn vend.8b, vhas_nul.8h, vhas_nul.8h - fmov synd, dend - cbnz synd, L(loop_end) -- ldr data, [src, 32]! -+ ldr data, [src, 16] - cmeq vhas_nul.16b, vdata.16b, 0 -- umaxp vend.16b, vhas_nul.16b, vhas_nul.16b -+ addhn vend.8b, vhas_nul.8h, vhas_nul.8h - fmov synd, dend - cbz synd, L(loop) -- sub src, src, 16 -+ add src, src, 16 - L(loop_end): -- shrn vend.8b, vhas_nul.8h, 4 /* 128->64 */ -- sub result, src, srcin -- fmov synd, dend -+ sub result, shift, src, lsl 2 /* (srcin - src) << 2. */ - #ifndef __AARCH64EB__ - rbit synd, synd -+ sub result, result, 3 - #endif -- add result, result, 16 - clz tmp, synd -- add result, result, tmp, lsr 2 -+ sub result, tmp, result -+ lsr result, result, 2 - ret - - END (STRLEN) - -commit 544fb349d35efd5f86ed7e482759ff21496a32fd -Author: Wilco Dijkstra -Date: Mon Sep 9 15:26:47 2024 +0100 - - AArch64: Optimize memset - - Improve small memsets by avoiding branches and use overlapping stores. - Use DC ZVA for copies over 128 bytes. Remove unnecessary code for ZVA sizes - other than 64 and 128. Performance of random memset benchmark improves by 24% - on Neoverse N1. - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit cec3aef32412779e207f825db0d057ebb4628ae8) - -diff --git a/sysdeps/aarch64/memset.S b/sysdeps/aarch64/memset.S -index 7ef77ee8c9..caafb019e2 100644 ---- a/sysdeps/aarch64/memset.S -+++ b/sysdeps/aarch64/memset.S -@@ -1,4 +1,5 @@ --/* Copyright (C) 2012-2024 Free Software Foundation, Inc. -+/* Generic optimized memset using SIMD. -+ Copyright (C) 2012-2024 Free Software Foundation, Inc. - - This file is part of the GNU C Library. - -@@ -17,7 +18,6 @@ - . */ - - #include --#include "memset-reg.h" - - #ifndef MEMSET - # define MEMSET memset -@@ -25,130 +25,132 @@ - - /* Assumptions: - * -- * ARMv8-a, AArch64, unaligned accesses -+ * ARMv8-a, AArch64, Advanced SIMD, unaligned accesses. - * - */ - --ENTRY (MEMSET) -+#define dstin x0 -+#define val x1 -+#define valw w1 -+#define count x2 -+#define dst x3 -+#define dstend x4 -+#define zva_val x5 -+#define off x3 -+#define dstend2 x5 - -+ENTRY (MEMSET) - PTR_ARG (0) - SIZE_ARG (2) - - dup v0.16B, valw -+ cmp count, 16 -+ b.lo L(set_small) -+ - add dstend, dstin, count -+ cmp count, 64 -+ b.hs L(set_128) - -- cmp count, 96 -- b.hi L(set_long) -- cmp count, 16 -- b.hs L(set_medium) -- mov val, v0.D[0] -+ /* Set 16..63 bytes. */ -+ mov off, 16 -+ and off, off, count, lsr 1 -+ sub dstend2, dstend, off -+ str q0, [dstin] -+ str q0, [dstin, off] -+ str q0, [dstend2, -16] -+ str q0, [dstend, -16] -+ ret - -+ .p2align 4 - /* Set 0..15 bytes. */ -- tbz count, 3, 1f -- str val, [dstin] -- str val, [dstend, -8] -- ret -- nop --1: tbz count, 2, 2f -- str valw, [dstin] -- str valw, [dstend, -4] -+L(set_small): -+ add dstend, dstin, count -+ cmp count, 4 -+ b.lo 2f -+ lsr off, count, 3 -+ sub dstend2, dstend, off, lsl 2 -+ str s0, [dstin] -+ str s0, [dstin, off, lsl 2] -+ str s0, [dstend2, -4] -+ str s0, [dstend, -4] - ret -+ -+ /* Set 0..3 bytes. */ - 2: cbz count, 3f -+ lsr off, count, 1 - strb valw, [dstin] -- tbz count, 1, 3f -- strh valw, [dstend, -2] -+ strb valw, [dstin, off] -+ strb valw, [dstend, -1] - 3: ret - -- /* Set 17..96 bytes. */ --L(set_medium): -- str q0, [dstin] -- tbnz count, 6, L(set96) -- str q0, [dstend, -16] -- tbz count, 5, 1f -- str q0, [dstin, 16] -- str q0, [dstend, -32] --1: ret -- - .p2align 4 -- /* Set 64..96 bytes. Write 64 bytes from the start and -- 32 bytes from the end. */ --L(set96): -- str q0, [dstin, 16] -+L(set_128): -+ bic dst, dstin, 15 -+ cmp count, 128 -+ b.hi L(set_long) -+ stp q0, q0, [dstin] - stp q0, q0, [dstin, 32] -+ stp q0, q0, [dstend, -64] - stp q0, q0, [dstend, -32] - ret - -- .p2align 3 -- nop -+ .p2align 4 - L(set_long): -- and valw, valw, 255 -- bic dst, dstin, 15 - str q0, [dstin] -- cmp count, 256 -- ccmp valw, 0, 0, cs -- b.eq L(try_zva) --L(no_zva): -- sub count, dstend, dst /* Count is 16 too large. */ -- sub dst, dst, 16 /* Dst is biased by -32. */ -- sub count, count, 64 + 16 /* Adjust count and bias for loop. */ --1: stp q0, q0, [dst, 32] -- stp q0, q0, [dst, 64]! --L(tail64): -- subs count, count, 64 -- b.hi 1b --2: stp q0, q0, [dstend, -64] -+ str q0, [dst, 16] -+ tst valw, 255 -+ b.ne L(no_zva) -+#ifndef ZVA64_ONLY -+ mrs zva_val, dczid_el0 -+ and zva_val, zva_val, 31 -+ cmp zva_val, 4 /* ZVA size is 64 bytes. */ -+ b.ne L(zva_128) -+#endif -+ stp q0, q0, [dst, 32] -+ bic dst, dstin, 63 -+ sub count, dstend, dst /* Count is now 64 too large. */ -+ sub count, count, 64 + 64 /* Adjust count and bias for loop. */ -+ -+ /* Write last bytes before ZVA loop. */ -+ stp q0, q0, [dstend, -64] - stp q0, q0, [dstend, -32] -+ -+ .p2align 4 -+L(zva64_loop): -+ add dst, dst, 64 -+ dc zva, dst -+ subs count, count, 64 -+ b.hi L(zva64_loop) - ret - --L(try_zva): --#ifndef ZVA64_ONLY - .p2align 3 -- mrs tmp1, dczid_el0 -- tbnz tmp1w, 4, L(no_zva) -- and tmp1w, tmp1w, 15 -- cmp tmp1w, 4 /* ZVA size is 64 bytes. */ -- b.ne L(zva_128) -- nop --#endif -- /* Write the first and last 64 byte aligned block using stp rather -- than using DC ZVA. This is faster on some cores. -- */ -- .p2align 4 --L(zva_64): -- str q0, [dst, 16] -+L(no_zva): -+ sub count, dstend, dst /* Count is 32 too large. */ -+ sub count, count, 64 + 32 /* Adjust count and bias for loop. */ -+L(no_zva_loop): - stp q0, q0, [dst, 32] -- bic dst, dst, 63 - stp q0, q0, [dst, 64] -- stp q0, q0, [dst, 96] -- sub count, dstend, dst /* Count is now 128 too large. */ -- sub count, count, 128+64+64 /* Adjust count and bias for loop. */ -- add dst, dst, 128 --1: dc zva, dst - add dst, dst, 64 - subs count, count, 64 -- b.hi 1b -- stp q0, q0, [dst, 0] -- stp q0, q0, [dst, 32] -+ b.hi L(no_zva_loop) - stp q0, q0, [dstend, -64] - stp q0, q0, [dstend, -32] - ret - - #ifndef ZVA64_ONLY -- .p2align 3 -+ .p2align 4 - L(zva_128): -- cmp tmp1w, 5 /* ZVA size is 128 bytes. */ -- b.ne L(zva_other) -+ cmp zva_val, 5 /* ZVA size is 128 bytes. */ -+ b.ne L(no_zva) - -- str q0, [dst, 16] - stp q0, q0, [dst, 32] - stp q0, q0, [dst, 64] - stp q0, q0, [dst, 96] - bic dst, dst, 127 - sub count, dstend, dst /* Count is now 128 too large. */ -- sub count, count, 128+128 /* Adjust count and bias for loop. */ -- add dst, dst, 128 --1: dc zva, dst -- add dst, dst, 128 -+ sub count, count, 128 + 128 /* Adjust count and bias for loop. */ -+1: add dst, dst, 128 -+ dc zva, dst - subs count, count, 128 - b.hi 1b - stp q0, q0, [dstend, -128] -@@ -156,35 +158,6 @@ L(zva_128): - stp q0, q0, [dstend, -64] - stp q0, q0, [dstend, -32] - ret -- --L(zva_other): -- mov tmp2w, 4 -- lsl zva_lenw, tmp2w, tmp1w -- add tmp1, zva_len, 64 /* Max alignment bytes written. */ -- cmp count, tmp1 -- blo L(no_zva) -- -- sub tmp2, zva_len, 1 -- add tmp1, dst, zva_len -- add dst, dst, 16 -- subs count, tmp1, dst /* Actual alignment bytes to write. */ -- bic tmp1, tmp1, tmp2 /* Aligned dc zva start address. */ -- beq 2f --1: stp q0, q0, [dst], 64 -- stp q0, q0, [dst, -32] -- subs count, count, 64 -- b.hi 1b --2: mov dst, tmp1 -- sub count, dstend, tmp1 /* Remaining bytes to write. */ -- subs count, count, zva_len -- b.lo 4f --3: dc zva, dst -- add dst, dst, zva_len -- subs count, count, zva_len -- b.hs 3b --4: add count, count, zva_len -- sub dst, dst, 32 /* Bias dst for tail loop. */ -- b L(tail64) - #endif - - END (MEMSET) - -commit 41eb2f8b5847079caca90a74659456adbb80ec29 -Author: Wilco Dijkstra -Date: Mon Nov 25 18:43:08 2024 +0000 - - AArch64: Remove zva_128 from memset - - Remove ZVA 128 support from memset - the new memset no longer - guarantees count >= 256, which can result in underflow and a - crash if ZVA size is 128 ([1]). Since only one CPU uses a ZVA - size of 128 and its memcpy implementation was removed in commit - e162ab2bf1b82c40f29e1925986582fa07568ce8, remove this special - case too. - - [1] https://sourceware.org/pipermail/libc-alpha/2024-November/161626.html - - Reviewed-by: Andrew Pinski - (cherry picked from commit a08d9a52f967531a77e1824c23b5368c6434a72d) - -diff --git a/sysdeps/aarch64/memset.S b/sysdeps/aarch64/memset.S -index caafb019e2..71814d0b2f 100644 ---- a/sysdeps/aarch64/memset.S -+++ b/sysdeps/aarch64/memset.S -@@ -104,7 +104,7 @@ L(set_long): - mrs zva_val, dczid_el0 - and zva_val, zva_val, 31 - cmp zva_val, 4 /* ZVA size is 64 bytes. */ -- b.ne L(zva_128) -+ b.ne L(no_zva) - #endif - stp q0, q0, [dst, 32] - bic dst, dstin, 63 -@@ -137,28 +137,5 @@ L(no_zva_loop): - stp q0, q0, [dstend, -32] - ret - --#ifndef ZVA64_ONLY -- .p2align 4 --L(zva_128): -- cmp zva_val, 5 /* ZVA size is 128 bytes. */ -- b.ne L(no_zva) -- -- stp q0, q0, [dst, 32] -- stp q0, q0, [dst, 64] -- stp q0, q0, [dst, 96] -- bic dst, dst, 127 -- sub count, dstend, dst /* Count is now 128 too large. */ -- sub count, count, 128 + 128 /* Adjust count and bias for loop. */ --1: add dst, dst, 128 -- dc zva, dst -- subs count, count, 128 -- b.hi 1b -- stp q0, q0, [dstend, -128] -- stp q0, q0, [dstend, -96] -- stp q0, q0, [dstend, -64] -- stp q0, q0, [dstend, -32] -- ret --#endif -- - END (MEMSET) - libc_hidden_builtin_def (MEMSET) - -commit 27fa0268ead054810a5e2669d0b5bb88ceb05b05 -Author: Wilco Dijkstra -Date: Wed Jul 24 15:17:47 2024 +0100 - - math: Improve layout of expf data - - GCC aligns global data to 16 bytes if their size is >= 16 bytes. This patch - changes the exp2f_data struct slightly so that the fields are better aligned. - As a result on targets that support them, load-pair instructions accessing - poly_scaled and invln2_scaled are now 16-byte aligned. - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit 44fa9c1080fe6a9539f0d2345b9d2ae37b8ee57a) - -diff --git a/sysdeps/ieee754/flt-32/math_config.h b/sysdeps/ieee754/flt-32/math_config.h -index 729f22cd4f..dc07ebd459 100644 ---- a/sysdeps/ieee754/flt-32/math_config.h -+++ b/sysdeps/ieee754/flt-32/math_config.h -@@ -166,9 +166,9 @@ extern const struct exp2f_data - uint64_t tab[1 << EXP2F_TABLE_BITS]; - double shift_scaled; - double poly[EXP2F_POLY_ORDER]; -- double shift; - double invln2_scaled; - double poly_scaled[EXP2F_POLY_ORDER]; -+ double shift; - } __exp2f_data attribute_hidden; - - #define LOGF_TABLE_BITS 4 - -commit 7038970f1f485fb660606f0c596f432fdef250f6 -Author: Wilco Dijkstra -Date: Tue Dec 24 18:01:59 2024 +0000 - - AArch64: Add SVE memset - - Add SVE memset based on the generic memset with predicated load for sizes < 16. - Unaligned memsets of 128-1024 are improved by ~20% on average by using aligned - stores for the last 64 bytes. Performance of random memset benchmark improves - by ~2% on Neoverse V1. - - Reviewed-by: Yury Khrustalev - (cherry picked from commit 163b1bbb76caba4d9673c07940c5930a1afa7548) - -diff --git a/sysdeps/aarch64/multiarch/Makefile b/sysdeps/aarch64/multiarch/Makefile -index 3e251cc234..6880ebc035 100644 ---- a/sysdeps/aarch64/multiarch/Makefile -+++ b/sysdeps/aarch64/multiarch/Makefile -@@ -16,6 +16,7 @@ sysdep_routines += \ - memset_kunpeng \ - memset_mops \ - memset_oryon1 \ -+ memset_sve_zva64 \ - memset_zva64 \ - strlen_asimd \ - strlen_generic \ -diff --git a/sysdeps/aarch64/multiarch/ifunc-impl-list.c b/sysdeps/aarch64/multiarch/ifunc-impl-list.c -index b2fda541f9..1f101a719b 100644 ---- a/sysdeps/aarch64/multiarch/ifunc-impl-list.c -+++ b/sysdeps/aarch64/multiarch/ifunc-impl-list.c -@@ -61,6 +61,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, - IFUNC_IMPL_ADD (array, i, memset, 1, __memset_kunpeng) - #if HAVE_AARCH64_SVE_ASM - IFUNC_IMPL_ADD (array, i, memset, sve && !bti && zva_size == 256, __memset_a64fx) -+ IFUNC_IMPL_ADD (array, i, memset, sve && zva_size == 64, __memset_sve_zva64) - #endif - IFUNC_IMPL_ADD (array, i, memset, mops, __memset_mops) - IFUNC_IMPL_ADD (array, i, memset, 1, __memset_generic)) -diff --git a/sysdeps/aarch64/multiarch/memset.c b/sysdeps/aarch64/multiarch/memset.c -index bd063c16c9..4f65295e77 100644 ---- a/sysdeps/aarch64/multiarch/memset.c -+++ b/sysdeps/aarch64/multiarch/memset.c -@@ -36,6 +36,7 @@ extern __typeof (__redirect_memset) __memset_a64fx attribute_hidden; - extern __typeof (__redirect_memset) __memset_generic attribute_hidden; - extern __typeof (__redirect_memset) __memset_mops attribute_hidden; - extern __typeof (__redirect_memset) __memset_oryon1 attribute_hidden; -+extern __typeof (__redirect_memset) __memset_sve_zva64 attribute_hidden; - - static inline __typeof (__redirect_memset) * - select_memset_ifunc (void) -@@ -49,6 +50,9 @@ select_memset_ifunc (void) - { - if (IS_A64FX (midr) && zva_size == 256) - return __memset_a64fx; -+ -+ if (zva_size == 64) -+ return __memset_sve_zva64; - } - - if (IS_ORYON1 (midr) && zva_size == 64) -diff --git a/sysdeps/aarch64/multiarch/memset_sve_zva64.S b/sysdeps/aarch64/multiarch/memset_sve_zva64.S -new file mode 100644 -index 0000000000..7fb40fdd9e ---- /dev/null -+++ b/sysdeps/aarch64/multiarch/memset_sve_zva64.S -@@ -0,0 +1,123 @@ -+/* Optimized memset for SVE. -+ Copyright (C) 2025 Free Software Foundation, Inc. -+ -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library. If not, see -+ . */ -+ -+#include -+ -+/* Assumptions: -+ * -+ * ARMv8-a, AArch64, Advanced SIMD, SVE, unaligned accesses. -+ * ZVA size is 64. -+ */ -+ -+#if HAVE_AARCH64_SVE_ASM -+ -+.arch armv8.2-a+sve -+ -+#define dstin x0 -+#define val x1 -+#define valw w1 -+#define count x2 -+#define dst x3 -+#define dstend x4 -+#define zva_val x5 -+#define vlen x5 -+#define off x3 -+#define dstend2 x5 -+ -+ENTRY (__memset_sve_zva64) -+ dup v0.16B, valw -+ cmp count, 16 -+ b.lo L(set_16) -+ -+ add dstend, dstin, count -+ cmp count, 64 -+ b.hs L(set_128) -+ -+ /* Set 16..63 bytes. */ -+ mov off, 16 -+ and off, off, count, lsr 1 -+ sub dstend2, dstend, off -+ str q0, [dstin] -+ str q0, [dstin, off] -+ str q0, [dstend2, -16] -+ str q0, [dstend, -16] -+ ret -+ -+ .p2align 4 -+L(set_16): -+ whilelo p0.b, xzr, count -+ st1b z0.b, p0, [dstin] -+ ret -+ -+ .p2align 4 -+L(set_128): -+ bic dst, dstin, 15 -+ cmp count, 128 -+ b.hi L(set_long) -+ stp q0, q0, [dstin] -+ stp q0, q0, [dstin, 32] -+ stp q0, q0, [dstend, -64] -+ stp q0, q0, [dstend, -32] -+ ret -+ -+ .p2align 4 -+L(set_long): -+ cmp count, 256 -+ b.lo L(no_zva) -+ tst valw, 255 -+ b.ne L(no_zva) -+ -+ str q0, [dstin] -+ str q0, [dst, 16] -+ bic dst, dstin, 31 -+ stp q0, q0, [dst, 32] -+ bic dst, dstin, 63 -+ sub count, dstend, dst /* Count is now 64 too large. */ -+ sub count, count, 128 /* Adjust count and bias for loop. */ -+ -+ sub x8, dstend, 1 /* Write last bytes before ZVA loop. */ -+ bic x8, x8, 15 -+ stp q0, q0, [x8, -48] -+ str q0, [x8, -16] -+ str q0, [dstend, -16] -+ -+ .p2align 4 -+L(zva64_loop): -+ add dst, dst, 64 -+ dc zva, dst -+ subs count, count, 64 -+ b.hi L(zva64_loop) -+ ret -+ -+L(no_zva): -+ str q0, [dstin] -+ sub count, dstend, dst /* Count is 16 too large. */ -+ sub count, count, 64 + 16 /* Adjust count and bias for loop. */ -+L(no_zva_loop): -+ stp q0, q0, [dst, 16] -+ stp q0, q0, [dst, 48] -+ add dst, dst, 64 -+ subs count, count, 64 -+ b.hi L(no_zva_loop) -+ stp q0, q0, [dstend, -64] -+ stp q0, q0, [dstend, -32] -+ ret -+ -+END (__memset_sve_zva64) -+#endif - -commit d6175a44e95fe443d0fbfed37a9ff7424f1e2661 -Author: Wilco Dijkstra -Date: Thu Feb 27 16:28:52 2025 +0000 - - AArch64: Use prefer_sve_ifuncs for SVE memset - - Use prefer_sve_ifuncs for SVE memset just like memcpy. - - Reviewed-by: Yury Khrustalev - (cherry picked from commit 0f044be1dae5169d0e57f8d487b427863aeadab4) - -diff --git a/sysdeps/aarch64/multiarch/memset.c b/sysdeps/aarch64/multiarch/memset.c -index 4f65295e77..bb1e865c97 100644 ---- a/sysdeps/aarch64/multiarch/memset.c -+++ b/sysdeps/aarch64/multiarch/memset.c -@@ -51,7 +51,7 @@ select_memset_ifunc (void) - if (IS_A64FX (midr) && zva_size == 256) - return __memset_a64fx; - -- if (zva_size == 64) -+ if (prefer_sve_ifuncs && zva_size == 64) - return __memset_sve_zva64; - } - - -commit d8e8342369831808b00324790c8809ba33408ee7 -Author: Wilco Dijkstra -Date: Fri Dec 13 15:43:07 2024 +0000 - - math: Improve layout of exp/exp10 data - - GCC aligns global data to 16 bytes if their size is >= 16 bytes. This patch - changes the exp_data struct slightly so that the fields are better aligned - and without gaps. As a result on targets that support them, more load-pair - instructions are used in exp. Exp10 is improved by moving invlog10_2N later - so that neglog10_2hiN and neglog10_2loN can be loaded using load-pair. - - The exp benchmark improves 2.5%, "144bits" by 7.2%, "768bits" by 12.7% on - Neoverse V2. Exp10 improves by 1.5%. - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit 5afaf99edb326fd9f36eb306a828d129a3a1d7f7) - -diff --git a/sysdeps/ieee754/dbl-64/math_config.h b/sysdeps/ieee754/dbl-64/math_config.h -index ef87cfa6be..05515fd95a 100644 ---- a/sysdeps/ieee754/dbl-64/math_config.h -+++ b/sysdeps/ieee754/dbl-64/math_config.h -@@ -195,16 +195,18 @@ check_uflow (double x) - extern const struct exp_data - { - double invln2N; -- double shift; - double negln2hiN; - double negln2loN; - double poly[4]; /* Last four coefficients. */ -+ double shift; -+ - double exp2_shift; - double exp2_poly[EXP2_POLY_ORDER]; -- double invlog10_2N; -+ - double neglog10_2hiN; - double neglog10_2loN; - double exp10_poly[5]; -+ double invlog10_2N; - uint64_t tab[2*(1 << EXP_TABLE_BITS)]; - } __exp_data attribute_hidden; - - -commit 3e820e17a8cef84645d83b67abcbc3f88c7fd268 -Author: Michael Jeanson -Date: Fri Feb 14 13:54:22 2025 -0500 - - nptl: clear the whole rseq area before registration - - Due to the extensible nature of the rseq area we can't explictly - initialize fields that are not part of the ABI yet. It was agreed with - upstream that all new fields will be documented as zero initialized by - userspace. Future kernels configured with CONFIG_DEBUG_RSEQ will - validate the content of all fields during registration. - - Replace the explicit field initialization with a memset of the whole - rseq area which will cover fields as they are added to future kernels. - - Signed-off-by: Michael Jeanson - Reviewed-by: Florian Weimer - (cherry picked from commit 689a62a4217fae78b9ce0db781dc2a421f2b1ab4) - -diff --git a/sysdeps/nptl/dl-tls_init_tp.c b/sysdeps/nptl/dl-tls_init_tp.c -index 7803e19fd1..ed10185e37 100644 ---- a/sysdeps/nptl/dl-tls_init_tp.c -+++ b/sysdeps/nptl/dl-tls_init_tp.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - - #define TUNABLE_NAMESPACE pthread - #include -diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h -index ef3eab1fef..76de2b7ff0 100644 ---- a/sysdeps/unix/sysv/linux/rseq-internal.h -+++ b/sysdeps/unix/sysv/linux/rseq-internal.h -@@ -52,13 +52,12 @@ rseq_register_current_thread (struct pthread *self, bool do_rseq) - but still expected size 32. */ - size = RSEQ_AREA_SIZE_INITIAL; - -- /* Initialize the rseq fields that are read by the kernel on -- registration, there is no guarantee that struct pthread is -- cleared on all architectures. */ -+ /* Initialize the whole rseq area to zero prior to registration. */ -+ memset (&self->rseq_area, 0, size); -+ -+ /* Set the cpu_id field to RSEQ_CPU_ID_UNINITIALIZED, this is checked by -+ the kernel at registration when CONFIG_DEBUG_RSEQ is enabled. */ - THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_UNINITIALIZED); -- THREAD_SETMEM (self, rseq_area.cpu_id_start, 0); -- THREAD_SETMEM (self, rseq_area.rseq_cs, 0); -- THREAD_SETMEM (self, rseq_area.flags, 0); - - int ret = INTERNAL_SYSCALL_CALL (rseq, &self->rseq_area, - size, 0, RSEQ_SIG); - -commit ee1ab9302363066b49cf8862b96664ed35eda81c -Author: Sunil K Pandey -Date: Mon Mar 10 10:24:07 2025 -0700 - - x86_64: Add tanh with FMA - - On Skylake, it improves tanh bench performance by: - - Before After Improvement - max 110.89 95.826 14% - min 20.966 20.157 4% - mean 30.9601 29.8431 4% - - Reviewed-by: H.J. Lu - (cherry picked from commit c6352111c72a20b3588ae304dd99b63e25dd6d85) - -diff --git a/sysdeps/ieee754/dbl-64/s_tanh.c b/sysdeps/ieee754/dbl-64/s_tanh.c -index 673a97102d..13063db04e 100644 ---- a/sysdeps/ieee754/dbl-64/s_tanh.c -+++ b/sysdeps/ieee754/dbl-64/s_tanh.c -@@ -46,6 +46,11 @@ static char rcsid[] = "$NetBSD: s_tanh.c,v 1.7 1995/05/10 20:48:22 jtc Exp $"; - - static const double one = 1.0, two = 2.0, tiny = 1.0e-300; - -+#ifndef SECTION -+# define SECTION -+#endif -+ -+SECTION - double - __tanh (double x) - { -diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile -index cbe09d49f4..0f69f7089c 100644 ---- a/sysdeps/x86_64/fpu/multiarch/Makefile -+++ b/sysdeps/x86_64/fpu/multiarch/Makefile -@@ -10,6 +10,7 @@ CFLAGS-s_expm1-fma.c = -mfma -mavx2 - CFLAGS-s_log1p-fma.c = -mfma -mavx2 - CFLAGS-s_sin-fma.c = -mfma -mavx2 - CFLAGS-s_tan-fma.c = -mfma -mavx2 -+CFLAGS-s_tanh-fma.c = -mfma -mavx2 - CFLAGS-s_sincos-fma.c = -mfma -mavx2 - - CFLAGS-e_exp2f-fma.c = -mfma -mavx2 -@@ -92,6 +93,7 @@ libm-sysdep_routines += \ - s_sinf-sse2 \ - s_tan-avx \ - s_tan-fma \ -+ s_tanh-fma \ - s_trunc-sse4_1 \ - s_truncf-sse4_1 \ - # libm-sysdep_routines -diff --git a/sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c b/sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c -new file mode 100644 -index 0000000000..1b808b1227 ---- /dev/null -+++ b/sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c -@@ -0,0 +1,11 @@ -+#define __tanh __tanh_fma -+#define __expm1 __expm1_fma -+ -+/* NB: __expm1 may be expanded to __expm1_fma in the following -+ prototypes. */ -+extern long double __expm1l (long double); -+extern long double __expm1f128 (long double); -+ -+#define SECTION __attribute__ ((section (".text.fma"))) -+ -+#include -diff --git a/sysdeps/x86_64/fpu/multiarch/s_tanh.c b/sysdeps/x86_64/fpu/multiarch/s_tanh.c -new file mode 100644 -index 0000000000..5539b6c61c ---- /dev/null -+++ b/sysdeps/x86_64/fpu/multiarch/s_tanh.c -@@ -0,0 +1,31 @@ -+/* Multiple versions of tanh. -+ Copyright (C) 2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL -+ -+extern double __redirect_tanh (double); -+ -+# define SYMBOL_NAME tanh -+# include "ifunc-fma.h" -+ -+libc_ifunc_redirected (__redirect_tanh, __tanh, IFUNC_SELECTOR ()); -+ -+# define __tanh __tanh_sse2 -+#endif -+#include - -commit e854f6d37cbeabb9130fed74b587befad8b4ba08 -Author: Sunil K Pandey -Date: Sat Mar 8 08:51:10 2025 -0800 - - x86_64: Add sinh with FMA - - On SPR, it improves sinh bench performance by: - - Before After Improvement - reciprocal-throughput 14.2017 11.815 17% - latency 36.4917 35.2114 4% - - Reviewed-by: H.J. Lu - (cherry picked from commit dded0d20f67ba1925ccbcb9cf28f0c75febe0dbe) - -diff --git a/benchtests/sinh-inputs b/benchtests/sinh-inputs -index 7b1ac46a39..2fcb2fabf8 100644 ---- a/benchtests/sinh-inputs -+++ b/benchtests/sinh-inputs -@@ -1,6 +1,7 @@ - ## args: double - ## ret: double - ## includes: math.h -+## name: workload-random - 0x1.bcb6129b5ff2bp8 - -0x1.63057386325ebp9 - 0x1.62f1d7dc4e8bfp9 -diff --git a/sysdeps/ieee754/dbl-64/e_sinh.c b/sysdeps/ieee754/dbl-64/e_sinh.c -index b4b5857ddd..3f787967f9 100644 ---- a/sysdeps/ieee754/dbl-64/e_sinh.c -+++ b/sysdeps/ieee754/dbl-64/e_sinh.c -@@ -41,6 +41,11 @@ static char rcsid[] = "$NetBSD: e_sinh.c,v 1.7 1995/05/10 20:46:13 jtc Exp $"; - - static const double one = 1.0, shuge = 1.0e307; - -+#ifndef SECTION -+# define SECTION -+#endif -+ -+SECTION - double - __ieee754_sinh (double x) - { -@@ -90,4 +95,7 @@ __ieee754_sinh (double x) - /* |x| > overflowthresold, sinh(x) overflow */ - return math_narrow_eval (x * shuge); - } -+ -+#ifndef __ieee754_sinh - libm_alias_finite (__ieee754_sinh, __sinh) -+#endif -diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile -index 0f69f7089c..b527cab8d1 100644 ---- a/sysdeps/x86_64/fpu/multiarch/Makefile -+++ b/sysdeps/x86_64/fpu/multiarch/Makefile -@@ -5,6 +5,7 @@ CFLAGS-e_exp-fma.c = -mfma -mavx2 - CFLAGS-e_log-fma.c = -mfma -mavx2 - CFLAGS-e_log2-fma.c = -mfma -mavx2 - CFLAGS-e_pow-fma.c = -mfma -mavx2 -+CFLAGS-e_sinh-fma.c = -mfma -mavx2 - CFLAGS-s_atan-fma.c = -mfma -mavx2 - CFLAGS-s_expm1-fma.c = -mfma -mavx2 - CFLAGS-s_log1p-fma.c = -mfma -mavx2 -@@ -67,6 +68,7 @@ libm-sysdep_routines += \ - e_logf-fma \ - e_pow-fma \ - e_powf-fma \ -+ e_sinh-fma \ - s_atan-avx \ - s_atan-fma \ - s_ceil-sse4_1 \ -diff --git a/sysdeps/x86_64/fpu/multiarch/e_sinh-fma.c b/sysdeps/x86_64/fpu/multiarch/e_sinh-fma.c -new file mode 100644 -index 0000000000..e0e1e39a7a ---- /dev/null -+++ b/sysdeps/x86_64/fpu/multiarch/e_sinh-fma.c -@@ -0,0 +1,12 @@ -+#define __ieee754_sinh __ieee754_sinh_fma -+#define __ieee754_exp __ieee754_exp_fma -+#define __expm1 __expm1_fma -+ -+/* NB: __expm1 may be expanded to __expm1_fma in the following -+ prototypes. */ -+extern long double __expm1l (long double); -+extern long double __expm1f128 (long double); -+ -+#define SECTION __attribute__ ((section (".text.fma"))) -+ -+#include -diff --git a/sysdeps/x86_64/fpu/multiarch/e_sinh.c b/sysdeps/x86_64/fpu/multiarch/e_sinh.c -new file mode 100644 -index 0000000000..3d3c18ccdf ---- /dev/null -+++ b/sysdeps/x86_64/fpu/multiarch/e_sinh.c -@@ -0,0 +1,35 @@ -+/* Multiple versions of sinh. -+ Copyright (C) 2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL -+# include -+ -+extern double __redirect_ieee754_sinh (double); -+ -+# define SYMBOL_NAME ieee754_sinh -+# include "ifunc-fma.h" -+ -+libc_ifunc_redirected (__redirect_ieee754_sinh, __ieee754_sinh, -+ IFUNC_SELECTOR ()); -+ -+libm_alias_finite (__ieee754_sinh, __sinh) -+ -+# define __ieee754_sinh __ieee754_sinh_sse2 -+#endif -+#include - -commit e5f5dfdda28def8362896bdb1748bb27dfc8be73 -Author: Sunil K Pandey -Date: Wed Mar 5 16:13:38 2025 -0800 - - x86_64: Add atanh with FMA - - On SPR, it improves atanh bench performance by: - - Before After Improvement - reciprocal-throughput 15.1715 14.8628 2% - latency 57.1941 56.1883 2% - - Reviewed-by: H.J. Lu - (cherry picked from commit c7c4a5906f326f1290b1c2413a83c530564ec4b8) - -diff --git a/benchtests/atanh-inputs b/benchtests/atanh-inputs -index 455aa65b65..4985293254 100644 ---- a/benchtests/atanh-inputs -+++ b/benchtests/atanh-inputs -@@ -1,6 +1,7 @@ - ## args: double - ## ret: double - ## includes: math.h -+## name: workload-random - 0x1.5a2730bacd94ap-1 - -0x1.b57eb40fc048ep-21 - -0x1.c0b185fb450e2p-17 -diff --git a/sysdeps/ieee754/dbl-64/e_atanh.c b/sysdeps/ieee754/dbl-64/e_atanh.c -index 11a2a45799..05ac0a1b30 100644 ---- a/sysdeps/ieee754/dbl-64/e_atanh.c -+++ b/sysdeps/ieee754/dbl-64/e_atanh.c -@@ -44,6 +44,11 @@ - - static const double huge = 1e300; - -+#ifndef SECTION -+# define SECTION -+#endif -+ -+SECTION - double - __ieee754_atanh (double x) - { -@@ -73,4 +78,7 @@ __ieee754_atanh (double x) - - return copysign (t, x); - } -+ -+#ifndef __ieee754_atanh - libm_alias_finite (__ieee754_atanh, __atanh) -+#endif -diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile -index b527cab8d1..bc479b42d2 100644 ---- a/sysdeps/x86_64/fpu/multiarch/Makefile -+++ b/sysdeps/x86_64/fpu/multiarch/Makefile -@@ -1,6 +1,7 @@ - ifeq ($(subdir),math) - CFLAGS-e_asin-fma.c = -mfma -mavx2 - CFLAGS-e_atan2-fma.c = -mfma -mavx2 -+CFLAGS-e_atanh-fma.c = -mfma -mavx2 - CFLAGS-e_exp-fma.c = -mfma -mavx2 - CFLAGS-e_log-fma.c = -mfma -mavx2 - CFLAGS-e_log2-fma.c = -mfma -mavx2 -@@ -57,6 +58,7 @@ libm-sysdep_routines += \ - e_asin-fma \ - e_atan2-avx \ - e_atan2-fma \ -+ e_atanh-fma \ - e_exp-avx \ - e_exp-fma \ - e_exp2f-fma \ -diff --git a/sysdeps/x86_64/fpu/multiarch/e_atanh-fma.c b/sysdeps/x86_64/fpu/multiarch/e_atanh-fma.c -new file mode 100644 -index 0000000000..c3f2f9e550 ---- /dev/null -+++ b/sysdeps/x86_64/fpu/multiarch/e_atanh-fma.c -@@ -0,0 +1,6 @@ -+#define __ieee754_atanh __ieee754_atanh_fma -+#define __log1p __log1p_fma -+ -+#define SECTION __attribute__ ((section (".text.fma"))) -+ -+#include -diff --git a/sysdeps/x86_64/fpu/multiarch/e_atanh.c b/sysdeps/x86_64/fpu/multiarch/e_atanh.c -new file mode 100644 -index 0000000000..d2b785dfc0 ---- /dev/null -+++ b/sysdeps/x86_64/fpu/multiarch/e_atanh.c -@@ -0,0 +1,34 @@ -+/* Multiple versions of atanh. -+ Copyright (C) 2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL -+# include -+ -+extern double __redirect_ieee754_atanh (double); -+ -+# define SYMBOL_NAME ieee754_atanh -+# include "ifunc-fma.h" -+ -+libc_ifunc_redirected (__redirect_ieee754_atanh, __ieee754_atanh, IFUNC_SELECTOR ()); -+ -+libm_alias_finite (__ieee754_atanh, __atanh) -+ -+# define __ieee754_atanh __ieee754_atanh_sse2 -+#endif -+#include - -commit 8fc492bb4234edc1a5e8c3b7f76ba345ea7109ec -Author: Florian Weimer -Date: Fri Mar 28 09:26:06 2025 +0100 - - x86: Skip XSAVE state size reset if ISA level requires XSAVE - - If we have to use XSAVE or XSAVEC trampolines, do not adjust the size - information they need. Technically, it is an operator error to try to - run with -XSAVE,-XSAVEC on such builds, but this change here disables - some unnecessary code with higher ISA levels and simplifies testing. - - Related to commit befe2d3c4dec8be2cdd01a47132e47bdb7020922 - ("x86-64: Don't use SSE resolvers for ISA level 3 or above"). - - Reviewed-by: H.J. Lu - (cherry picked from commit 59585ddaa2d44f22af04bb4b8bd4ad1e302c4c02) - -diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index c096dd390a..b5b264db7f 100644 ---- a/sysdeps/x86/cpu-features.c -+++ b/sysdeps/x86/cpu-features.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - - extern void TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *) - attribute_hidden; -@@ -1119,6 +1120,9 @@ no_cpuid: - TUNABLE_CALLBACK (set_prefer_map_32bit_exec)); - #endif - -+ /* Do not add the logic to disable XSAVE/XSAVEC if this glibc build -+ requires AVX and therefore XSAVE or XSAVEC support. */ -+#ifndef GCCMACRO__AVX__ - bool disable_xsave_features = false; - - if (!CPU_FEATURE_USABLE_P (cpu_features, OSXSAVE)) -@@ -1172,6 +1176,7 @@ no_cpuid: - - CPU_FEATURE_UNSET (cpu_features, FMA4); - } -+#endif - - #ifdef __x86_64__ - GLRO(dl_hwcap) = HWCAP_X86_64; - -commit df22af58f66e6815c054b1c56249356c2994935a -Author: Florian Weimer -Date: Fri Mar 28 09:26:59 2025 +0100 - - x86: Use separate variable for TLSDESC XSAVE/XSAVEC state size (bug 32810) - - Previously, the initialization code reused the xsave_state_full_size - member of struct cpu_features for the TLSDESC state size. However, - the tunable processing code assumes that this member has the - original XSAVE (non-compact) state size, so that it can use its - value if XSAVEC is disabled via tunable. - - This change uses a separate variable and not a struct member because - the value is only needed in ld.so and the static libc, but not in - libc.so. As a result, struct cpu_features layout does not change, - helping a future backport of this change. - - Fixes commit 9b7091415af47082664717210ac49d51551456ab ("x86-64: - Update _dl_tlsdesc_dynamic to preserve AMX registers"). - - Reviewed-by: H.J. Lu - (cherry picked from commit 145097dff170507fe73190e8e41194f5b5f7e6bf) - -diff --git a/NEWS b/NEWS -index 57feba81cd..7a6985f5dd 100644 ---- a/NEWS -+++ b/NEWS -@@ -22,6 +22,7 @@ The following bugs are resolved with this release: - [32231] elf: Change ldconfig auxcache magic number - [32245] glibc -Wstringop-overflow= build failure on hppa - [32470] x86: Avoid integer truncation with large cache sizes -+ [32810] Crash on x86-64 if XSAVEC disable via tunable - - Version 2.40 - -diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile -index 5311b594af..8819fba1b7 100644 ---- a/sysdeps/x86/Makefile -+++ b/sysdeps/x86/Makefile -@@ -21,6 +21,9 @@ tests += \ - tst-cpu-features-supports-static \ - tst-get-cpu-features \ - tst-get-cpu-features-static \ -+ tst-gnu2-tls2-x86-noxsave \ -+ tst-gnu2-tls2-x86-noxsavec \ -+ tst-gnu2-tls2-x86-noxsavexsavec \ - tst-hwcap-tunables \ - # tests - tests-static += \ -@@ -91,6 +94,22 @@ CFLAGS-tst-gnu2-tls2.c += -msse - CFLAGS-tst-gnu2-tls2mod0.c += -msse2 -mtune=haswell - CFLAGS-tst-gnu2-tls2mod1.c += -msse2 -mtune=haswell - CFLAGS-tst-gnu2-tls2mod2.c += -msse2 -mtune=haswell -+ -+LDFLAGS-tst-gnu2-tls2-x86-noxsave += -Wl,-z,lazy -+LDFLAGS-tst-gnu2-tls2-x86-noxsavec += -Wl,-z,lazy -+LDFLAGS-tst-gnu2-tls2-x86-noxsavexsavec += -Wl,-z,lazy -+ -+# Test for bug 32810: incorrect XSAVE state size if XSAVEC is disabled -+# via tunable. -+tst-gnu2-tls2-x86-noxsave-ENV = GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVE -+tst-gnu2-tls2-x86-noxsavec-ENV = GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVEC -+tst-gnu2-tls2-x86-noxsavexsavec-ENV = GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVE,-XSAVEC -+$(objpfx)tst-gnu2-tls2-x86-noxsave.out \ -+$(objpfx)tst-gnu2-tls2-x86-noxsavec.out \ -+$(objpfx)tst-gnu2-tls2-x86-noxsavexsavec.out: \ -+ $(objpfx)tst-gnu2-tls2mod0.so \ -+ $(objpfx)tst-gnu2-tls2mod1.so \ -+ $(objpfx)tst-gnu2-tls2mod2.so - endif - - ifeq ($(subdir),math) -diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index b5b264db7f..ec27337337 100644 ---- a/sysdeps/x86/cpu-features.c -+++ b/sysdeps/x86/cpu-features.c -@@ -84,6 +84,8 @@ extern void TUNABLE_CALLBACK (set_x86_shstk) (tunable_val_t *) - # include - #endif - -+unsigned long int _dl_x86_features_tlsdesc_state_size; -+ - static void - update_active (struct cpu_features *cpu_features) - { -@@ -318,6 +320,7 @@ update_active (struct cpu_features *cpu_features) - = xsave_state_full_size; - cpu_features->xsave_state_full_size - = xsave_state_full_size; -+ _dl_x86_features_tlsdesc_state_size = xsave_state_full_size; - - /* Check if XSAVEC is available. */ - if (CPU_FEATURES_CPU_P (cpu_features, XSAVEC)) -@@ -406,11 +409,9 @@ update_active (struct cpu_features *cpu_features) - = ALIGN_UP ((amx_size - + TLSDESC_CALL_REGISTER_SAVE_AREA), - 64); -- /* Set xsave_state_full_size to the compact AMX -- state size for XSAVEC. NB: xsave_state_full_size -- is only used in _dl_tlsdesc_dynamic_xsave and -- _dl_tlsdesc_dynamic_xsavec. */ -- cpu_features->xsave_state_full_size = amx_size; -+ /* Set TLSDESC state size to the compact AMX -+ state size for XSAVEC. */ -+ _dl_x86_features_tlsdesc_state_size = amx_size; - #endif - cpu_features->xsave_state_size - = ALIGN_UP (size + TLSDESC_CALL_REGISTER_SAVE_AREA, -diff --git a/sysdeps/x86/cpu-tunables.c b/sysdeps/x86/cpu-tunables.c -index ccc6b64dc2..a0b31d80f6 100644 ---- a/sysdeps/x86/cpu-tunables.c -+++ b/sysdeps/x86/cpu-tunables.c -@@ -164,6 +164,8 @@ TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *valp) - /* Update xsave_state_size to XSAVE state size. */ - cpu_features->xsave_state_size - = cpu_features->xsave_state_full_size; -+ _dl_x86_features_tlsdesc_state_size -+ = cpu_features->xsave_state_full_size; - CPU_FEATURE_UNSET (cpu_features, XSAVEC); - } - } -diff --git a/sysdeps/x86/dl-diagnostics-cpu.c b/sysdeps/x86/dl-diagnostics-cpu.c -index 49eeb5f70a..41100a908a 100644 ---- a/sysdeps/x86/dl-diagnostics-cpu.c -+++ b/sysdeps/x86/dl-diagnostics-cpu.c -@@ -89,6 +89,8 @@ _dl_diagnostics_cpu (void) - cpu_features->xsave_state_size); - print_cpu_features_value ("xsave_state_full_size", - cpu_features->xsave_state_full_size); -+ print_cpu_features_value ("tlsdesc_state_full_size", -+ _dl_x86_features_tlsdesc_state_size); - print_cpu_features_value ("data_cache_size", cpu_features->data_cache_size); - print_cpu_features_value ("shared_cache_size", - cpu_features->shared_cache_size); -diff --git a/sysdeps/x86/include/cpu-features.h b/sysdeps/x86/include/cpu-features.h -index aaae44f0e1..03c71387dd 100644 ---- a/sysdeps/x86/include/cpu-features.h -+++ b/sysdeps/x86/include/cpu-features.h -@@ -934,8 +934,6 @@ struct cpu_features - /* The full state size for XSAVE when XSAVEC is disabled by - - GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVEC -- -- and the AMX state size when XSAVEC is available. - */ - unsigned int xsave_state_full_size; - /* Data cache size for use in memory and string routines, typically -@@ -989,6 +987,13 @@ extern const struct cpu_features *_dl_x86_get_cpu_features (void) - - #define __get_cpu_features() _dl_x86_get_cpu_features() - -+#if IS_IN (rtld) || IS_IN (libc) -+/* XSAVE/XSAVEC state size used by TLS descriptors. Compared to -+ xsave_state_size from struct cpu_features, this includes additional -+ registers. */ -+extern unsigned long int _dl_x86_features_tlsdesc_state_size attribute_hidden; -+#endif -+ - #if defined (_LIBC) && !IS_IN (nonlib) - /* Unused for x86. */ - # define INIT_ARCH() -diff --git a/sysdeps/x86/tst-gnu2-tls2-x86-noxsave.c b/sysdeps/x86/tst-gnu2-tls2-x86-noxsave.c -new file mode 100644 -index 0000000000..f0024c143d ---- /dev/null -+++ b/sysdeps/x86/tst-gnu2-tls2-x86-noxsave.c -@@ -0,0 +1 @@ -+#include -diff --git a/sysdeps/x86/tst-gnu2-tls2-x86-noxsavec.c b/sysdeps/x86/tst-gnu2-tls2-x86-noxsavec.c -new file mode 100644 -index 0000000000..f0024c143d ---- /dev/null -+++ b/sysdeps/x86/tst-gnu2-tls2-x86-noxsavec.c -@@ -0,0 +1 @@ -+#include -diff --git a/sysdeps/x86/tst-gnu2-tls2-x86-noxsavexsavec.c b/sysdeps/x86/tst-gnu2-tls2-x86-noxsavexsavec.c -new file mode 100644 -index 0000000000..f0024c143d ---- /dev/null -+++ b/sysdeps/x86/tst-gnu2-tls2-x86-noxsavexsavec.c -@@ -0,0 +1 @@ -+#include -diff --git a/sysdeps/x86_64/dl-tlsdesc-dynamic.h b/sysdeps/x86_64/dl-tlsdesc-dynamic.h -index 9f02cfc3eb..44d948696f 100644 ---- a/sysdeps/x86_64/dl-tlsdesc-dynamic.h -+++ b/sysdeps/x86_64/dl-tlsdesc-dynamic.h -@@ -99,7 +99,7 @@ _dl_tlsdesc_dynamic: - # endif - #else - /* Allocate stack space of the required size to save the state. */ -- sub _rtld_local_ro+RTLD_GLOBAL_RO_DL_X86_CPU_FEATURES_OFFSET+XSAVE_STATE_FULL_SIZE_OFFSET(%rip), %RSP_LP -+ sub _dl_x86_features_tlsdesc_state_size(%rip), %RSP_LP - #endif - /* Besides rdi and rsi, saved above, save rcx, rdx, r8, r9, - r10 and r11. */ - -commit a87d9a2c2cc17a3b22fd3be8d106336f4dcf2042 -Author: Florian Weimer -Date: Mon Mar 31 21:33:18 2025 +0200 - - x86: Link tst-gnu2-tls2-x86-noxsave{,c,xsavec} with libpthread - - This fixes a test build failure on Hurd. - - Fixes commit 145097dff170507fe73190e8e41194f5b5f7e6bf ("x86: Use separate - variable for TLSDESC XSAVE/XSAVEC state size (bug 32810)"). - - Reviewed-by: Adhemerval Zanella - (cherry picked from commit c6e2895695118ab59c7b17feb0fcb75a53e3478c) - -diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile -index 8819fba1b7..01b0192ddf 100644 ---- a/sysdeps/x86/Makefile -+++ b/sysdeps/x86/Makefile -@@ -104,6 +104,9 @@ LDFLAGS-tst-gnu2-tls2-x86-noxsavexsavec += -Wl,-z,lazy - tst-gnu2-tls2-x86-noxsave-ENV = GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVE - tst-gnu2-tls2-x86-noxsavec-ENV = GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVEC - tst-gnu2-tls2-x86-noxsavexsavec-ENV = GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVE,-XSAVEC -+$(objpfx)tst-gnu2-tls2-x86-noxsave: $(shared-thread-library) -+$(objpfx)tst-gnu2-tls2-x86-noxsavec: $(shared-thread-library) -+$(objpfx)tst-gnu2-tls2-x86-noxsavexsavec: $(shared-thread-library) - $(objpfx)tst-gnu2-tls2-x86-noxsave.out \ - $(objpfx)tst-gnu2-tls2-x86-noxsavec.out \ - $(objpfx)tst-gnu2-tls2-x86-noxsavexsavec.out: \ - -commit 8fe27af20c8b25b84e12bcd52353862a95044aa2 -Author: Noah Goldstein -Date: Wed Aug 14 14:37:30 2024 +0800 - - x86: Use `Avoid_Non_Temporal_Memset` to control non-temporal path - - This is just a refactor and there should be no behavioral change from - this commit. - - The goal is to make `Avoid_Non_Temporal_Memset` a more universal knob - for controlling whether we use non-temporal memset rather than having - extra logic based on vendor. - Reviewed-by: H.J. Lu - - (cherry picked from commit b93dddfaf440aa12f45d7c356f6ffe9f27d35577) - -diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index ec27337337..8841020b36 100644 ---- a/sysdeps/x86/cpu-features.c -+++ b/sysdeps/x86/cpu-features.c -@@ -758,6 +758,12 @@ init_cpu_features (struct cpu_features *cpu_features) - unsigned int stepping = 0; - enum cpu_features_kind kind; - -+ /* Default is avoid non-temporal memset for non Intel/AMD hardware. This is, -+ as of writing this, we only have benchmarks indicatings it profitability -+ on Intel/AMD. */ -+ cpu_features->preferred[index_arch_Avoid_Non_Temporal_Memset] -+ |= bit_arch_Avoid_Non_Temporal_Memset; -+ - cpu_features->cachesize_non_temporal_divisor = 4; - #if !HAS_CPUID - if (__get_cpuid_max (0, 0) == 0) -@@ -783,6 +789,11 @@ init_cpu_features (struct cpu_features *cpu_features) - - update_active (cpu_features); - -+ /* Benchmarks indicate non-temporal memset can be profitable on Intel -+ hardware. */ -+ cpu_features->preferred[index_arch_Avoid_Non_Temporal_Memset] -+ &= ~bit_arch_Avoid_Non_Temporal_Memset; -+ - if (family == 0x06) - { - model += extended_model; -@@ -993,6 +1004,11 @@ https://www.intel.com/content/www/us/en/support/articles/000059422/processors.ht - - ecx = cpu_features->features[CPUID_INDEX_1].cpuid.ecx; - -+ /* Benchmarks indicate non-temporal memset can be profitable on AMD -+ hardware. */ -+ cpu_features->preferred[index_arch_Avoid_Non_Temporal_Memset] -+ &= ~bit_arch_Avoid_Non_Temporal_Memset; -+ - if (CPU_FEATURE_USABLE_P (cpu_features, AVX)) - { - /* Since the FMA4 bit is in CPUID_INDEX_80000001 and -diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h -index ac97414b5b..7b1b61c096 100644 ---- a/sysdeps/x86/dl-cacheinfo.h -+++ b/sysdeps/x86/dl-cacheinfo.h -@@ -988,14 +988,6 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) - if (CPU_FEATURE_USABLE_P (cpu_features, FSRM)) - rep_movsb_threshold = 2112; - -- /* Non-temporal stores are more performant on Intel and AMD hardware above -- non_temporal_threshold. Enable this for both Intel and AMD hardware. */ -- unsigned long int memset_non_temporal_threshold = SIZE_MAX; -- if (!CPU_FEATURES_ARCH_P (cpu_features, Avoid_Non_Temporal_Memset) -- && (cpu_features->basic.kind == arch_kind_intel -- || cpu_features->basic.kind == arch_kind_amd)) -- memset_non_temporal_threshold = non_temporal_threshold; -- - /* For AMD CPUs that support ERMS (Zen3+), REP MOVSB is in a lot of - cases slower than the vectorized path (and for some alignments, - it is really slow, check BZ #30994). */ -@@ -1017,6 +1009,13 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) - if (tunable_size != 0) - shared = tunable_size; - -+ /* Non-temporal stores are more performant on some hardware above -+ non_temporal_threshold. Currently Prefer_Non_Temporal is set for for both -+ Intel and AMD hardware. */ -+ unsigned long int memset_non_temporal_threshold = SIZE_MAX; -+ if (!CPU_FEATURES_ARCH_P (cpu_features, Avoid_Non_Temporal_Memset)) -+ memset_non_temporal_threshold = non_temporal_threshold; -+ - tunable_size = TUNABLE_GET (x86_non_temporal_threshold, long int, NULL); - if (tunable_size > minimum_non_temporal_threshold - && tunable_size <= maximum_non_temporal_threshold) - -commit 7c6bd71b4dbdadab34e4fd21ec09b86b32daf443 -Author: Sunil K Pandey -Date: Thu Apr 3 13:00:45 2025 -0700 - - x86: Optimize xstate size calculation - - Scan xstate IDs up to the maximum supported xstate ID. Remove the - separate AMX xstate calculation. Instead, exclude the AMX space from - the start of TILECFG to the end of TILEDATA in xsave_state_size. - - Completed validation on SKL/SKX/SPR/SDE and compared xsave state size - with "ld.so --list-diagnostics" option, no regression. - - Co-Authored-By: H.J. Lu - Reviewed-by: Sunil K Pandey - (cherry picked from commit 70b648855185e967e54668b101d24704c3fb869d) - -diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index 8841020b36..1d5e2a0072 100644 ---- a/sysdeps/x86/cpu-features.c -+++ b/sysdeps/x86/cpu-features.c -@@ -325,13 +325,8 @@ update_active (struct cpu_features *cpu_features) - /* Check if XSAVEC is available. */ - if (CPU_FEATURES_CPU_P (cpu_features, XSAVEC)) - { -- unsigned int xstate_comp_offsets[32]; -- unsigned int xstate_comp_sizes[32]; --#ifdef __x86_64__ -- unsigned int xstate_amx_comp_offsets[32]; -- unsigned int xstate_amx_comp_sizes[32]; -- unsigned int amx_ecx; --#endif -+ unsigned int xstate_comp_offsets[X86_XSTATE_MAX_ID + 1]; -+ unsigned int xstate_comp_sizes[X86_XSTATE_MAX_ID + 1]; - unsigned int i; - - xstate_comp_offsets[0] = 0; -@@ -339,39 +334,16 @@ update_active (struct cpu_features *cpu_features) - xstate_comp_offsets[2] = 576; - xstate_comp_sizes[0] = 160; - xstate_comp_sizes[1] = 256; --#ifdef __x86_64__ -- xstate_amx_comp_offsets[0] = 0; -- xstate_amx_comp_offsets[1] = 160; -- xstate_amx_comp_offsets[2] = 576; -- xstate_amx_comp_sizes[0] = 160; -- xstate_amx_comp_sizes[1] = 256; --#endif - -- for (i = 2; i < 32; i++) -+ for (i = 2; i <= X86_XSTATE_MAX_ID; i++) - { - if ((FULL_STATE_SAVE_MASK & (1 << i)) != 0) - { - __cpuid_count (0xd, i, eax, ebx, ecx, edx); --#ifdef __x86_64__ -- /* Include this in xsave_state_full_size. */ -- amx_ecx = ecx; -- xstate_amx_comp_sizes[i] = eax; -- if ((AMX_STATE_SAVE_MASK & (1 << i)) != 0) -- { -- /* Exclude this from xsave_state_size. */ -- ecx = 0; -- xstate_comp_sizes[i] = 0; -- } -- else --#endif -- xstate_comp_sizes[i] = eax; -+ xstate_comp_sizes[i] = eax; - } - else - { --#ifdef __x86_64__ -- amx_ecx = 0; -- xstate_amx_comp_sizes[i] = 0; --#endif - ecx = 0; - xstate_comp_sizes[i] = 0; - } -@@ -380,42 +352,32 @@ update_active (struct cpu_features *cpu_features) - { - xstate_comp_offsets[i] - = (xstate_comp_offsets[i - 1] -- + xstate_comp_sizes[i -1]); -+ + xstate_comp_sizes[i - 1]); - if ((ecx & (1 << 1)) != 0) - xstate_comp_offsets[i] - = ALIGN_UP (xstate_comp_offsets[i], 64); --#ifdef __x86_64__ -- xstate_amx_comp_offsets[i] -- = (xstate_amx_comp_offsets[i - 1] -- + xstate_amx_comp_sizes[i - 1]); -- if ((amx_ecx & (1 << 1)) != 0) -- xstate_amx_comp_offsets[i] -- = ALIGN_UP (xstate_amx_comp_offsets[i], -- 64); --#endif - } - } - - /* Use XSAVEC. */ - unsigned int size -- = xstate_comp_offsets[31] + xstate_comp_sizes[31]; -+ = (xstate_comp_offsets[X86_XSTATE_MAX_ID] -+ + xstate_comp_sizes[X86_XSTATE_MAX_ID]); - if (size) - { -+ size = ALIGN_UP (size + TLSDESC_CALL_REGISTER_SAVE_AREA, -+ 64); - #ifdef __x86_64__ -- unsigned int amx_size -- = (xstate_amx_comp_offsets[31] -- + xstate_amx_comp_sizes[31]); -- amx_size -- = ALIGN_UP ((amx_size -- + TLSDESC_CALL_REGISTER_SAVE_AREA), -- 64); -- /* Set TLSDESC state size to the compact AMX -- state size for XSAVEC. */ -- _dl_x86_features_tlsdesc_state_size = amx_size; -+ _dl_x86_features_tlsdesc_state_size = size; -+ /* Exclude the AMX space from the start of TILECFG -+ space to the end of TILEDATA space. If CPU -+ doesn't support AMX, TILECFG offset is the same -+ as TILEDATA + 1 offset. Otherwise, they are -+ multiples of 64. */ -+ size -= (xstate_comp_offsets[X86_XSTATE_TILEDATA_ID + 1] -+ - xstate_comp_offsets[X86_XSTATE_TILECFG_ID]); - #endif -- cpu_features->xsave_state_size -- = ALIGN_UP (size + TLSDESC_CALL_REGISTER_SAVE_AREA, -- 64); -+ cpu_features->xsave_state_size = size; - CPU_FEATURE_SET (cpu_features, XSAVEC); - } - } -diff --git a/sysdeps/x86/sysdep.h b/sysdeps/x86/sysdep.h -index 7359149e17..1d6cabd816 100644 ---- a/sysdeps/x86/sysdep.h -+++ b/sysdeps/x86/sysdep.h -@@ -102,6 +102,9 @@ - | (1 << X86_XSTATE_ZMM_ID) \ - | (1 << X86_XSTATE_APX_F_ID)) - -+/* The maximum supported xstate ID. */ -+# define X86_XSTATE_MAX_ID X86_XSTATE_APX_F_ID -+ - /* AMX state mask. */ - # define AMX_STATE_SAVE_MASK \ - ((1 << X86_XSTATE_TILECFG_ID) | (1 << X86_XSTATE_TILEDATA_ID)) -@@ -123,6 +126,9 @@ - | (1 << X86_XSTATE_K_ID) \ - | (1 << X86_XSTATE_ZMM_H_ID)) - -+/* The maximum supported xstate ID. */ -+# define X86_XSTATE_MAX_ID X86_XSTATE_ZMM_H_ID -+ - /* States to be included in xsave_state_size. */ - # define FULL_STATE_SAVE_MASK STATE_SAVE_MASK - #endif - -commit 44f92df8007d57f82b1518e219a0dbb60389ef2c -Author: Sunil K Pandey -Date: Thu Apr 3 18:14:20 2025 -0700 - - x86: Add ARL/PTL/CWF model detection support - - - Add ARROWLAKE model detection. - - Add PANTHERLAKE model detection. - - Add CLEARWATERFOREST model detection. - - Intel® Architecture Instruction Set Extensions Programming Reference - https://cdrdv2.intel.com/v1/dl/getContent/671368 Section 1.2. - - No regression, validated model detection on SDE. - - Reviewed-by: H.J. Lu - (cherry picked from commit e53eb952b970ac94c97d74fb447418fb327ca096) - -diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index 1d5e2a0072..7f21a8227e 100644 ---- a/sysdeps/x86/cpu-features.c -+++ b/sysdeps/x86/cpu-features.c -@@ -512,6 +512,7 @@ enum - INTEL_ATOM_GOLDMONT, - INTEL_ATOM_GOLDMONT_PLUS, - INTEL_ATOM_SIERRAFOREST, -+ INTEL_ATOM_CLEARWATERFOREST, - INTEL_ATOM_GRANDRIDGE, - INTEL_ATOM_TREMONT, - -@@ -539,6 +540,7 @@ enum - INTEL_BIGCORE_METEORLAKE, - INTEL_BIGCORE_LUNARLAKE, - INTEL_BIGCORE_ARROWLAKE, -+ INTEL_BIGCORE_PANTHERLAKE, - INTEL_BIGCORE_GRANITERAPIDS, - - /* Mixed (bigcore + atom SOC). */ -@@ -584,6 +586,8 @@ intel_get_fam6_microarch (unsigned int model, - return INTEL_ATOM_GOLDMONT_PLUS; - case 0xAF: - return INTEL_ATOM_SIERRAFOREST; -+ case 0xDD: -+ return INTEL_ATOM_CLEARWATERFOREST; - case 0xB6: - return INTEL_ATOM_GRANDRIDGE; - case 0x86: -@@ -691,8 +695,12 @@ intel_get_fam6_microarch (unsigned int model, - return INTEL_BIGCORE_METEORLAKE; - case 0xbd: - return INTEL_BIGCORE_LUNARLAKE; -+ case 0xb5: -+ case 0xc5: - case 0xc6: - return INTEL_BIGCORE_ARROWLAKE; -+ case 0xCC: -+ return INTEL_BIGCORE_PANTHERLAKE; - case 0xAD: - case 0xAE: - return INTEL_BIGCORE_GRANITERAPIDS; -@@ -808,6 +816,7 @@ init_cpu_features (struct cpu_features *cpu_features) - Default tuned atom microarch. - case INTEL_ATOM_SIERRAFOREST: - case INTEL_ATOM_GRANDRIDGE: -+ case INTEL_ATOM_CLEARWATERFOREST: - */ - - /* Bigcore/Default Tuning. */ -@@ -864,6 +873,7 @@ init_cpu_features (struct cpu_features *cpu_features) - case INTEL_BIGCORE_METEORLAKE: - case INTEL_BIGCORE_LUNARLAKE: - case INTEL_BIGCORE_ARROWLAKE: -+ case INTEL_BIGCORE_PANTHERLAKE: - case INTEL_BIGCORE_SAPPHIRERAPIDS: - case INTEL_BIGCORE_EMERALDRAPIDS: - case INTEL_BIGCORE_GRANITERAPIDS: - -commit 9ee8083c4edbe5e92af7aabb23261309f03ef05c -Author: Sunil K Pandey -Date: Fri Apr 11 08:52:52 2025 -0700 - - x86: Handle unknown Intel processor with default tuning - - Enable default tuning for unknown Intel processor. - - Tested on x86, no regression. - - Co-Authored-By: H.J. Lu - Reviewed-by: H.J. Lu - (cherry picked from commit 9f0deff558d1d6b08c425c157f50de85013ada9c) - -diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index 7f21a8227e..1a6e694abf 100644 ---- a/sysdeps/x86/cpu-features.c -+++ b/sysdeps/x86/cpu-features.c -@@ -502,8 +502,8 @@ _Static_assert (((index_arch_Fast_Unaligned_Load - "Incorrect index_arch_Fast_Unaligned_Load"); - - --/* Intel Family-6 microarch list. */ --enum -+/* Intel microarch list. */ -+enum intel_microarch - { - /* Atom processors. */ - INTEL_ATOM_BONNELL, -@@ -555,7 +555,7 @@ enum - INTEL_UNKNOWN, - }; - --static unsigned int -+static enum intel_microarch - intel_get_fam6_microarch (unsigned int model, - __attribute__ ((unused)) unsigned int stepping) - { -@@ -764,134 +764,20 @@ init_cpu_features (struct cpu_features *cpu_features) - cpu_features->preferred[index_arch_Avoid_Non_Temporal_Memset] - &= ~bit_arch_Avoid_Non_Temporal_Memset; - -+ enum intel_microarch microarch = INTEL_UNKNOWN; - if (family == 0x06) - { - model += extended_model; -- unsigned int microarch -- = intel_get_fam6_microarch (model, stepping); -+ microarch = intel_get_fam6_microarch (model, stepping); - -+ /* Disable TSX on some processors to avoid TSX on kernels that -+ weren't updated with the latest microcode package (which -+ disables broken feature by default). */ - switch (microarch) - { -- /* Atom / KNL tuning. */ -- case INTEL_ATOM_BONNELL: -- /* BSF is slow on Bonnell. */ -- cpu_features->preferred[index_arch_Slow_BSF] -- |= bit_arch_Slow_BSF; -- break; -- -- /* Unaligned load versions are faster than SSSE3 -- on Airmont, Silvermont, Goldmont, and Goldmont Plus. */ -- case INTEL_ATOM_AIRMONT: -- case INTEL_ATOM_SILVERMONT: -- case INTEL_ATOM_GOLDMONT: -- case INTEL_ATOM_GOLDMONT_PLUS: -- -- /* Knights Landing. Enable Silvermont optimizations. */ -- case INTEL_KNIGHTS_LANDING: -- -- cpu_features->preferred[index_arch_Fast_Unaligned_Load] -- |= (bit_arch_Fast_Unaligned_Load -- | bit_arch_Fast_Unaligned_Copy -- | bit_arch_Prefer_PMINUB_for_stringop -- | bit_arch_Slow_SSE4_2); -- break; -- -- case INTEL_ATOM_TREMONT: -- /* Enable rep string instructions, unaligned load, unaligned -- copy, pminub and avoid SSE 4.2 on Tremont. */ -- cpu_features->preferred[index_arch_Fast_Rep_String] -- |= (bit_arch_Fast_Rep_String -- | bit_arch_Fast_Unaligned_Load -- | bit_arch_Fast_Unaligned_Copy -- | bit_arch_Prefer_PMINUB_for_stringop -- | bit_arch_Slow_SSE4_2); -- break; -- -- /* -- Default tuned Knights microarch. -- case INTEL_KNIGHTS_MILL: -- */ -- -- /* -- Default tuned atom microarch. -- case INTEL_ATOM_SIERRAFOREST: -- case INTEL_ATOM_GRANDRIDGE: -- case INTEL_ATOM_CLEARWATERFOREST: -- */ -- -- /* Bigcore/Default Tuning. */ - default: -- default_tuning: -- /* Unknown family 0x06 processors. Assuming this is one -- of Core i3/i5/i7 processors if AVX is available. */ -- if (!CPU_FEATURES_CPU_P (cpu_features, AVX)) -- break; -- -- enable_modern_features: -- /* Rep string instructions, unaligned load, unaligned copy, -- and pminub are fast on Intel Core i3, i5 and i7. */ -- cpu_features->preferred[index_arch_Fast_Rep_String] -- |= (bit_arch_Fast_Rep_String -- | bit_arch_Fast_Unaligned_Load -- | bit_arch_Fast_Unaligned_Copy -- | bit_arch_Prefer_PMINUB_for_stringop); - break; - -- case INTEL_BIGCORE_NEHALEM: -- case INTEL_BIGCORE_WESTMERE: -- /* Older CPUs prefer non-temporal stores at lower threshold. */ -- cpu_features->cachesize_non_temporal_divisor = 8; -- goto enable_modern_features; -- -- /* Older Bigcore microarch (smaller non-temporal store -- threshold). */ -- case INTEL_BIGCORE_SANDYBRIDGE: -- case INTEL_BIGCORE_IVYBRIDGE: -- case INTEL_BIGCORE_HASWELL: -- case INTEL_BIGCORE_BROADWELL: -- cpu_features->cachesize_non_temporal_divisor = 8; -- goto default_tuning; -- -- /* Newer Bigcore microarch (larger non-temporal store -- threshold). */ -- case INTEL_BIGCORE_SKYLAKE_AVX512: -- case INTEL_BIGCORE_CANNONLAKE: -- /* Benchmarks indicate non-temporal memset is not -- necessarily profitable on SKX (and in some cases much -- worse). This is likely unique to SKX due its it unique -- mesh interconnect (not present on ICX or BWD). Disable -- non-temporal on all Skylake servers. */ -- cpu_features->preferred[index_arch_Avoid_Non_Temporal_Memset] -- |= bit_arch_Avoid_Non_Temporal_Memset; -- case INTEL_BIGCORE_COMETLAKE: -- case INTEL_BIGCORE_SKYLAKE: -- case INTEL_BIGCORE_KABYLAKE: -- case INTEL_BIGCORE_ICELAKE: -- case INTEL_BIGCORE_TIGERLAKE: -- case INTEL_BIGCORE_ROCKETLAKE: -- case INTEL_BIGCORE_RAPTORLAKE: -- case INTEL_BIGCORE_METEORLAKE: -- case INTEL_BIGCORE_LUNARLAKE: -- case INTEL_BIGCORE_ARROWLAKE: -- case INTEL_BIGCORE_PANTHERLAKE: -- case INTEL_BIGCORE_SAPPHIRERAPIDS: -- case INTEL_BIGCORE_EMERALDRAPIDS: -- case INTEL_BIGCORE_GRANITERAPIDS: -- cpu_features->cachesize_non_temporal_divisor = 2; -- goto default_tuning; -- -- /* Default tuned Mixed (bigcore + atom SOC). */ -- case INTEL_MIXED_LAKEFIELD: -- case INTEL_MIXED_ALDERLAKE: -- cpu_features->cachesize_non_temporal_divisor = 2; -- goto default_tuning; -- } -- -- /* Disable TSX on some processors to avoid TSX on kernels that -- weren't updated with the latest microcode package (which -- disables broken feature by default). */ -- switch (microarch) -- { - case INTEL_BIGCORE_SKYLAKE_AVX512: - /* 0x55 (Skylake-avx512) && stepping <= 5 disable TSX. */ - if (stepping <= 5) -@@ -900,38 +786,152 @@ init_cpu_features (struct cpu_features *cpu_features) - - case INTEL_BIGCORE_KABYLAKE: - /* NB: Although the errata documents that for model == 0x8e -- (kabylake skylake client), only 0xb stepping or lower are -- impacted, the intention of the errata was to disable TSX on -- all client processors on all steppings. Include 0xc -- stepping which is an Intel Core i7-8665U, a client mobile -- processor. */ -+ (kabylake skylake client), only 0xb stepping or lower are -+ impacted, the intention of the errata was to disable TSX on -+ all client processors on all steppings. Include 0xc -+ stepping which is an Intel Core i7-8665U, a client mobile -+ processor. */ - if (stepping > 0xc) - break; - /* Fall through. */ - case INTEL_BIGCORE_SKYLAKE: -- /* Disable Intel TSX and enable RTM_ALWAYS_ABORT for -- processors listed in: -- --https://www.intel.com/content/www/us/en/support/articles/000059422/processors.html -- */ -- disable_tsx: -- CPU_FEATURE_UNSET (cpu_features, HLE); -- CPU_FEATURE_UNSET (cpu_features, RTM); -- CPU_FEATURE_SET (cpu_features, RTM_ALWAYS_ABORT); -- break; -+ /* Disable Intel TSX and enable RTM_ALWAYS_ABORT for -+ processors listed in: -+ -+ https://www.intel.com/content/www/us/en/support/articles/000059422/processors.html -+ */ -+disable_tsx: -+ CPU_FEATURE_UNSET (cpu_features, HLE); -+ CPU_FEATURE_UNSET (cpu_features, RTM); -+ CPU_FEATURE_SET (cpu_features, RTM_ALWAYS_ABORT); -+ break; - - case INTEL_BIGCORE_HASWELL: -- /* Xeon E7 v3 (model == 0x3f) with stepping >= 4 has working -- TSX. Haswell also include other model numbers that have -- working TSX. */ -- if (model == 0x3f && stepping >= 4) -+ /* Xeon E7 v3 (model == 0x3f) with stepping >= 4 has working -+ TSX. Haswell also includes other model numbers that have -+ working TSX. */ -+ if (model == 0x3f && stepping >= 4) - break; - -- CPU_FEATURE_UNSET (cpu_features, RTM); -- break; -+ CPU_FEATURE_UNSET (cpu_features, RTM); -+ break; - } - } - -+ switch (microarch) -+ { -+ /* Atom / KNL tuning. */ -+ case INTEL_ATOM_BONNELL: -+ /* BSF is slow on Bonnell. */ -+ cpu_features->preferred[index_arch_Slow_BSF] -+ |= bit_arch_Slow_BSF; -+ break; -+ -+ /* Unaligned load versions are faster than SSSE3 -+ on Airmont, Silvermont, Goldmont, and Goldmont Plus. */ -+ case INTEL_ATOM_AIRMONT: -+ case INTEL_ATOM_SILVERMONT: -+ case INTEL_ATOM_GOLDMONT: -+ case INTEL_ATOM_GOLDMONT_PLUS: -+ -+ /* Knights Landing. Enable Silvermont optimizations. */ -+ case INTEL_KNIGHTS_LANDING: -+ -+ cpu_features->preferred[index_arch_Fast_Unaligned_Load] -+ |= (bit_arch_Fast_Unaligned_Load -+ | bit_arch_Fast_Unaligned_Copy -+ | bit_arch_Prefer_PMINUB_for_stringop -+ | bit_arch_Slow_SSE4_2); -+ break; -+ -+ case INTEL_ATOM_TREMONT: -+ /* Enable rep string instructions, unaligned load, unaligned -+ copy, pminub and avoid SSE 4.2 on Tremont. */ -+ cpu_features->preferred[index_arch_Fast_Rep_String] -+ |= (bit_arch_Fast_Rep_String -+ | bit_arch_Fast_Unaligned_Load -+ | bit_arch_Fast_Unaligned_Copy -+ | bit_arch_Prefer_PMINUB_for_stringop -+ | bit_arch_Slow_SSE4_2); -+ break; -+ -+ /* -+ Default tuned Knights microarch. -+ case INTEL_KNIGHTS_MILL: -+ */ -+ -+ /* -+ Default tuned atom microarch. -+ case INTEL_ATOM_SIERRAFOREST: -+ case INTEL_ATOM_GRANDRIDGE: -+ case INTEL_ATOM_CLEARWATERFOREST: -+ */ -+ -+ /* Bigcore/Default Tuning. */ -+ default: -+ default_tuning: -+ /* Unknown Intel processors. Assuming this is one of Core -+ i3/i5/i7 processors if AVX is available. */ -+ if (!CPU_FEATURES_CPU_P (cpu_features, AVX)) -+ break; -+ -+ enable_modern_features: -+ /* Rep string instructions, unaligned load, unaligned copy, -+ and pminub are fast on Intel Core i3, i5 and i7. */ -+ cpu_features->preferred[index_arch_Fast_Rep_String] -+ |= (bit_arch_Fast_Rep_String -+ | bit_arch_Fast_Unaligned_Load -+ | bit_arch_Fast_Unaligned_Copy -+ | bit_arch_Prefer_PMINUB_for_stringop); -+ break; -+ -+ case INTEL_BIGCORE_NEHALEM: -+ case INTEL_BIGCORE_WESTMERE: -+ /* Older CPUs prefer non-temporal stores at lower threshold. */ -+ cpu_features->cachesize_non_temporal_divisor = 8; -+ goto enable_modern_features; -+ -+ /* Older Bigcore microarch (smaller non-temporal store -+ threshold). */ -+ case INTEL_BIGCORE_SANDYBRIDGE: -+ case INTEL_BIGCORE_IVYBRIDGE: -+ case INTEL_BIGCORE_HASWELL: -+ case INTEL_BIGCORE_BROADWELL: -+ cpu_features->cachesize_non_temporal_divisor = 8; -+ goto default_tuning; -+ -+ /* Newer Bigcore microarch (larger non-temporal store -+ threshold). */ -+ case INTEL_BIGCORE_SKYLAKE_AVX512: -+ case INTEL_BIGCORE_CANNONLAKE: -+ /* Benchmarks indicate non-temporal memset is not -+ necessarily profitable on SKX (and in some cases much -+ worse). This is likely unique to SKX due to its unique -+ mesh interconnect (not present on ICX or BWD). Disable -+ non-temporal on all Skylake servers. */ -+ cpu_features->preferred[index_arch_Avoid_Non_Temporal_Memset] -+ |= bit_arch_Avoid_Non_Temporal_Memset; -+ /* fallthrough */ -+ case INTEL_BIGCORE_COMETLAKE: -+ case INTEL_BIGCORE_SKYLAKE: -+ case INTEL_BIGCORE_KABYLAKE: -+ case INTEL_BIGCORE_ICELAKE: -+ case INTEL_BIGCORE_TIGERLAKE: -+ case INTEL_BIGCORE_ROCKETLAKE: -+ case INTEL_BIGCORE_RAPTORLAKE: -+ case INTEL_BIGCORE_METEORLAKE: -+ case INTEL_BIGCORE_LUNARLAKE: -+ case INTEL_BIGCORE_ARROWLAKE: -+ case INTEL_BIGCORE_PANTHERLAKE: -+ case INTEL_BIGCORE_SAPPHIRERAPIDS: -+ case INTEL_BIGCORE_EMERALDRAPIDS: -+ case INTEL_BIGCORE_GRANITERAPIDS: -+ /* Default tuned Mixed (bigcore + atom SOC). */ -+ case INTEL_MIXED_LAKEFIELD: -+ case INTEL_MIXED_ALDERLAKE: -+ cpu_features->cachesize_non_temporal_divisor = 2; -+ goto default_tuning; -+ } - - /* Since AVX512ER is unique to Xeon Phi, set Prefer_No_VZEROUPPER - if AVX512ER is available. Don't use AVX512 to avoid lower CPU - -commit d8a1a1aef7a58b991505b9a1349a40736dec3abf -Author: H.J. Lu -Date: Sat Apr 12 08:37:29 2025 -0700 - - x86: Detect Intel Diamond Rapids - - Detect Intel Diamond Rapids and tune it similar to Intel Granite Rapids. - - Signed-off-by: H.J. Lu - Reviewed-by: Sunil K Pandey - (cherry picked from commit de14f1959ee5f9b845a7cae43bee03068b8136f0) - -diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index 1a6e694abf..52a2f03bdd 100644 ---- a/sysdeps/x86/cpu-features.c -+++ b/sysdeps/x86/cpu-features.c -@@ -542,6 +542,7 @@ enum intel_microarch - INTEL_BIGCORE_ARROWLAKE, - INTEL_BIGCORE_PANTHERLAKE, - INTEL_BIGCORE_GRANITERAPIDS, -+ INTEL_BIGCORE_DIAMONDRAPIDS, - - /* Mixed (bigcore + atom SOC). */ - INTEL_MIXED_LAKEFIELD, -@@ -817,6 +818,16 @@ disable_tsx: - break; - } - } -+ else if (family == 19) -+ switch (model) -+ { -+ case 0x01: -+ microarch = INTEL_BIGCORE_DIAMONDRAPIDS; -+ break; -+ -+ default: -+ break; -+ } - - switch (microarch) - { -@@ -926,6 +937,7 @@ disable_tsx: - case INTEL_BIGCORE_SAPPHIRERAPIDS: - case INTEL_BIGCORE_EMERALDRAPIDS: - case INTEL_BIGCORE_GRANITERAPIDS: -+ case INTEL_BIGCORE_DIAMONDRAPIDS: - /* Default tuned Mixed (bigcore + atom SOC). */ - case INTEL_MIXED_LAKEFIELD: - case INTEL_MIXED_ALDERLAKE: - -commit 736e6735053f12181d3d287898dd5fdb9e8baf59 -Author: Frank Barrus -Date: Wed Dec 4 07:55:02 2024 -0500 - - pthreads NPTL: lost wakeup fix 2 - - This fixes the lost wakeup (from a bug in signal stealing) with a change - in the usage of g_signals[] in the condition variable internal state. - It also completely eliminates the concept and handling of signal stealing, - as well as the need for signalers to block to wait for waiters to wake - up every time there is a G1/G2 switch. This greatly reduces the average - and maximum latency for pthread_cond_signal. - - The g_signals[] field now contains a signal count that is relative to - the current g1_start value. Since it is a 32-bit field, and the LSB is - still reserved (though not currently used anymore), it has a 31-bit value - that corresponds to the low 31 bits of the sequence number in g1_start. - (since g1_start also has an LSB flag, this means bits 31:1 in g_signals - correspond to bits 31:1 in g1_start, plus the current signal count) - - By making the signal count relative to g1_start, there is no longer - any ambiguity or A/B/A issue, and thus any checks before blocking, - including the futex call itself, are guaranteed not to block if the G1/G2 - switch occurs, even if the signal count remains the same. This allows - initially safely blocking in G2 until the switch to G1 occurs, and - then transitioning from G1 to a new G1 or G2, and always being able to - distinguish the state change. This removes the race condition and A/B/A - problems that otherwise ocurred if a late (pre-empted) waiter were to - resume just as the futex call attempted to block on g_signal since - otherwise there was no last opportunity to re-check things like whether - the current G1 group was already closed. - - By fixing these issues, the signal stealing code can be eliminated, - since there is no concept of signal stealing anymore. The code to block - for all waiters to exit g_refs can also be removed, since any waiters - that are still in the g_refs region can be guaranteed to safely wake - up and exit. If there are still any left at this time, they are all - sent one final futex wakeup to ensure that they are not blocked any - longer, but there is no need for the signaller to block and wait for - them to wake up and exit the g_refs region. - - The signal count is then effectively "zeroed" but since it is now - relative to g1_start, this is done by advancing it to a new value that - can be observed by any pending blocking waiters. Any late waiters can - always tell the difference, and can thus just cleanly exit if they are - in a stale G1 or G2. They can never steal a signal from the current - G1 if they are not in the current G1, since the signal value that has - to match in the cmpxchg has the low 31 bits of the g1_start value - contained in it, and that's first checked, and then it won't match if - there's a G1/G2 change. - - Note: the 31-bit sequence number used in g_signals is designed to - handle wrap-around when checking the signal count, but if the entire - 31-bit wraparound (2 billion signals) occurs while there is still a - late waiter that has not yet resumed, and it happens to then match - the current g1_start low bits, and the pre-emption occurs after the - normal "closed group" checks (which are 64-bit) but then hits the - futex syscall and signal consuming code, then an A/B/A issue could - still result and cause an incorrect assumption about whether it - should block. This particular scenario seems unlikely in practice. - Note that once awake from the futex, the waiter would notice the - closed group before consuming the signal (since that's still a 64-bit - check that would not be aliased in the wrap-around in g_signals), - so the biggest impact would be blocking on the futex until the next - full wakeup from a G1/G2 switch. - - Signed-off-by: Frank Barrus - Reviewed-by: Carlos O'Donell - (cherry picked from commit 1db84775f831a1494993ce9c118deaf9537cc50a) - -diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c -index 3487557bb8..4855b8899f 100644 ---- a/nptl/pthread_cond_common.c -+++ b/nptl/pthread_cond_common.c -@@ -201,7 +201,6 @@ static bool __attribute__ ((unused)) - __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - unsigned int *g1index, int private) - { -- const unsigned int maxspin = 0; - unsigned int g1 = *g1index; - - /* If there is no waiter in G2, we don't do anything. The expression may -@@ -222,84 +221,46 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - * New waiters arriving concurrently with the group switching will all go - into G2 until we atomically make the switch. Waiters existing in G2 - are not affected. -- * Waiters in G1 will be closed out immediately by setting a flag in -- __g_signals, which will prevent waiters from blocking using a futex on -- __g_signals and also notifies them that the group is closed. As a -- result, they will eventually remove their group reference, allowing us -- to close switch group roles. */ -- -- /* First, set the closed flag on __g_signals. This tells waiters that are -- about to wait that they shouldn't do that anymore. This basically -- serves as an advance notification of the upcoming change to __g1_start; -- waiters interpret it as if __g1_start was larger than their waiter -- sequence position. This allows us to change __g1_start after waiting -- for all existing waiters with group references to leave, which in turn -- makes recovery after stealing a signal simpler because it then can be -- skipped if __g1_start indicates that the group is closed (otherwise, -- we would have to recover always because waiters don't know how big their -- groups are). Relaxed MO is fine. */ -- atomic_fetch_or_relaxed (cond->__data.__g_signals + g1, 1); -- -- /* Wait until there are no group references anymore. The fetch-or operation -- injects us into the modification order of __g_refs; release MO ensures -- that waiters incrementing __g_refs after our fetch-or see the previous -- changes to __g_signals and to __g1_start that had to happen before we can -- switch this G1 and alias with an older group (we have two groups, so -- aliasing requires switching group roles twice). Note that nobody else -- can have set the wake-request flag, so we do not have to act upon it. -- -- Also note that it is harmless if older waiters or waiters from this G1 -- get a group reference after we have quiesced the group because it will -- remain closed for them either because of the closed flag in __g_signals -- or the later update to __g1_start. New waiters will never arrive here -- but instead continue to go into the still current G2. */ -- unsigned r = atomic_fetch_or_release (cond->__data.__g_refs + g1, 0); -- while ((r >> 1) > 0) -- { -- for (unsigned int spin = maxspin; ((r >> 1) > 0) && (spin > 0); spin--) -- { -- /* TODO Back off. */ -- r = atomic_load_relaxed (cond->__data.__g_refs + g1); -- } -- if ((r >> 1) > 0) -- { -- /* There is still a waiter after spinning. Set the wake-request -- flag and block. Relaxed MO is fine because this is just about -- this futex word. -- -- Update r to include the set wake-request flag so that the upcoming -- futex_wait only blocks if the flag is still set (otherwise, we'd -- violate the basic client-side futex protocol). */ -- r = atomic_fetch_or_relaxed (cond->__data.__g_refs + g1, 1) | 1; -- -- if ((r >> 1) > 0) -- futex_wait_simple (cond->__data.__g_refs + g1, r, private); -- /* Reload here so we eventually see the most recent value even if we -- do not spin. */ -- r = atomic_load_relaxed (cond->__data.__g_refs + g1); -- } -- } -- /* Acquire MO so that we synchronize with the release operation that waiters -- use to decrement __g_refs and thus happen after the waiters we waited -- for. */ -- atomic_thread_fence_acquire (); -+ * Waiters in G1 will be closed out immediately by the advancing of -+ __g_signals to the next "lowseq" (low 31 bits of the new g1_start), -+ which will prevent waiters from blocking using a futex on -+ __g_signals since it provides enough signals for all possible -+ remaining waiters. As a result, they can each consume a signal -+ and they will eventually remove their group reference. */ - - /* Update __g1_start, which finishes closing this group. The value we add - will never be negative because old_orig_size can only be zero when we - switch groups the first time after a condvar was initialized, in which -- case G1 will be at index 1 and we will add a value of 1. See above for -- why this takes place after waiting for quiescence of the group. -+ case G1 will be at index 1 and we will add a value of 1. - Relaxed MO is fine because the change comes with no additional - constraints that others would have to observe. */ - __condvar_add_g1_start_relaxed (cond, - (old_orig_size << 1) + (g1 == 1 ? 1 : - 1)); - -- /* Now reopen the group, thus enabling waiters to again block using the -- futex controlled by __g_signals. Release MO so that observers that see -- no signals (and thus can block) also see the write __g1_start and thus -- that this is now a new group (see __pthread_cond_wait_common for the -- matching acquire MO loads). */ -- atomic_store_release (cond->__data.__g_signals + g1, 0); -+ unsigned int lowseq = ((old_g1_start + old_orig_size) << 1) & ~1U; -+ -+ /* If any waiters still hold group references (and thus could be blocked), -+ then wake them all up now and prevent any running ones from blocking. -+ This is effectively a catch-all for any possible current or future -+ bugs that can allow the group size to reach 0 before all G1 waiters -+ have been awakened or at least given signals to consume, or any -+ other case that can leave blocked (or about to block) older waiters.. */ -+ if ((atomic_fetch_or_release (cond->__data.__g_refs + g1, 0) >> 1) > 0) -+ { -+ /* First advance signals to the end of the group (i.e. enough signals -+ for the entire G1 group) to ensure that waiters which have not -+ yet blocked in the futex will not block. -+ Note that in the vast majority of cases, this should never -+ actually be necessary, since __g_signals will have enough -+ signals for the remaining g_refs waiters. As an optimization, -+ we could check this first before proceeding, although that -+ could still leave the potential for futex lost wakeup bugs -+ if the signal count was non-zero but the futex wakeup -+ was somehow lost. */ -+ atomic_store_release (cond->__data.__g_signals + g1, lowseq); -+ -+ futex_wake (cond->__data.__g_signals + g1, INT_MAX, private); -+ } - - /* At this point, the old G1 is now a valid new G2 (but not in use yet). - No old waiter can neither grab a signal nor acquire a reference without -@@ -311,6 +272,10 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - g1 ^= 1; - *g1index ^= 1; - -+ /* Now advance the new G1 g_signals to the new lowseq, giving it -+ an effective signal count of 0 to start. */ -+ atomic_store_release (cond->__data.__g_signals + g1, lowseq); -+ - /* These values are just observed by signalers, and thus protected by the - lock. */ - unsigned int orig_size = wseq - (old_g1_start + old_orig_size); -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index 66786c7b90..3d290e39c8 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -238,9 +238,7 @@ __condvar_cleanup_waiting (void *arg) - signaled), and a reference count. - - The group reference count is used to maintain the number of waiters that -- are using the group's futex. Before a group can change its role, the -- reference count must show that no waiters are using the futex anymore; this -- prevents ABA issues on the futex word. -+ are using the group's futex. - - To represent which intervals in the waiter sequence the groups cover (and - thus also which group slot contains G1 or G2), we use a 64b counter to -@@ -300,11 +298,12 @@ __condvar_cleanup_waiting (void *arg) - last reference. - * Reference count used by waiters concurrently with signalers that have - acquired the condvar-internal lock. -- __g_signals: The number of signals that can still be consumed. -+ __g_signals: The number of signals that can still be consumed, relative to -+ the current g1_start. (i.e. bits 31 to 1 of __g_signals are bits -+ 31 to 1 of g1_start with the signal count added) - * Used as a futex word by waiters. Used concurrently by waiters and - signalers. -- * LSB is true iff this group has been completely signaled (i.e., it is -- closed). -+ * LSB is currently reserved and 0. - __g_size: Waiters remaining in this group (i.e., which have not been - signaled yet. - * Accessed by signalers and waiters that cancel waiting (both do so only -@@ -328,18 +327,6 @@ __condvar_cleanup_waiting (void *arg) - sufficient because if a waiter can see a sufficiently large value, it could - have also consume a signal in the waiters group. - -- Waiters try to grab a signal from __g_signals without holding a reference -- count, which can lead to stealing a signal from a more recent group after -- their own group was already closed. They cannot always detect whether they -- in fact did because they do not know when they stole, but they can -- conservatively add a signal back to the group they stole from; if they -- did so unnecessarily, all that happens is a spurious wake-up. To make this -- even less likely, __g1_start contains the index of the current g2 too, -- which allows waiters to check if there aliasing on the group slots; if -- there wasn't, they didn't steal from the current G1, which means that the -- G1 they stole from must have been already closed and they do not need to -- fix anything. -- - It is essential that the last field in pthread_cond_t is __g_signals[1]: - The previous condvar used a pointer-sized field in pthread_cond_t, so a - PTHREAD_COND_INITIALIZER from that condvar implementation might only -@@ -435,6 +422,9 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - { - while (1) - { -+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); -+ unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -+ - /* Spin-wait first. - Note that spinning first without checking whether a timeout - passed might lead to what looks like a spurious wake-up even -@@ -446,35 +436,45 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - having to compare against the current time seems to be the right - choice from a performance perspective for most use cases. */ - unsigned int spin = maxspin; -- while (signals == 0 && spin > 0) -+ while (spin > 0 && ((int)(signals - lowseq) < 2)) - { - /* Check that we are not spinning on a group that's already - closed. */ -- if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1)) -- goto done; -+ if (seq < (g1_start >> 1)) -+ break; - - /* TODO Back off. */ - - /* Reload signals. See above for MO. */ - signals = atomic_load_acquire (cond->__data.__g_signals + g); -+ g1_start = __condvar_load_g1_start_relaxed (cond); -+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - spin--; - } - -- /* If our group will be closed as indicated by the flag on signals, -- don't bother grabbing a signal. */ -- if (signals & 1) -- goto done; -- -- /* If there is an available signal, don't block. */ -- if (signals != 0) -+ if (seq < (g1_start >> 1)) -+ { -+ /* If the group is closed already, -+ then this waiter originally had enough extra signals to -+ consume, up until the time its group was closed. */ -+ goto done; -+ } -+ -+ /* If there is an available signal, don't block. -+ If __g1_start has advanced at all, then we must be in G1 -+ by now, perhaps in the process of switching back to an older -+ G2, but in either case we're allowed to consume the available -+ signal and should not block anymore. */ -+ if ((int)(signals - lowseq) >= 2) - break; - - /* No signals available after spinning, so prepare to block. - We first acquire a group reference and use acquire MO for that so - that we synchronize with the dummy read-modify-write in - __condvar_quiesce_and_switch_g1 if we read from that. In turn, -- in this case this will make us see the closed flag on __g_signals -- that designates a concurrent attempt to reuse the group's slot. -+ in this case this will make us see the advancement of __g_signals -+ to the upcoming new g1_start that occurs with a concurrent -+ attempt to reuse the group's slot. - We use acquire MO for the __g_signals check to make the - __g1_start check work (see spinning above). - Note that the group reference acquisition will not mask the -@@ -482,15 +482,24 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - an atomic read-modify-write operation and thus extend the release - sequence. */ - atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2); -- if (((atomic_load_acquire (cond->__data.__g_signals + g) & 1) != 0) -- || (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))) -+ signals = atomic_load_acquire (cond->__data.__g_signals + g); -+ g1_start = __condvar_load_g1_start_relaxed (cond); -+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -+ -+ if (seq < (g1_start >> 1)) - { -- /* Our group is closed. Wake up any signalers that might be -- waiting. */ -+ /* group is closed already, so don't block */ - __condvar_dec_grefs (cond, g, private); - goto done; - } - -+ if ((int)(signals - lowseq) >= 2) -+ { -+ /* a signal showed up or G1/G2 switched after we grabbed the refcount */ -+ __condvar_dec_grefs (cond, g, private); -+ break; -+ } -+ - // Now block. - struct _pthread_cleanup_buffer buffer; - struct _condvar_cleanup_buffer cbuffer; -@@ -501,7 +510,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer); - - err = __futex_abstimed_wait_cancelable64 ( -- cond->__data.__g_signals + g, 0, clockid, abstime, private); -+ cond->__data.__g_signals + g, signals, clockid, abstime, private); - - __pthread_cleanup_pop (&buffer, 0); - -@@ -524,6 +533,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - signals = atomic_load_acquire (cond->__data.__g_signals + g); - } - -+ if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1)) -+ goto done; - } - /* Try to grab a signal. Use acquire MO so that we see an up-to-date value - of __g1_start below (see spinning above for a similar case). In -@@ -532,69 +543,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g, - &signals, signals - 2)); - -- /* We consumed a signal but we could have consumed from a more recent group -- that aliased with ours due to being in the same group slot. If this -- might be the case our group must be closed as visible through -- __g1_start. */ -- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); -- if (seq < (g1_start >> 1)) -- { -- /* We potentially stole a signal from a more recent group but we do not -- know which group we really consumed from. -- We do not care about groups older than current G1 because they are -- closed; we could have stolen from these, but then we just add a -- spurious wake-up for the current groups. -- We will never steal a signal from current G2 that was really intended -- for G2 because G2 never receives signals (until it becomes G1). We -- could have stolen a signal from G2 that was conservatively added by a -- previous waiter that also thought it stole a signal -- but given that -- that signal was added unnecessarily, it's not a problem if we steal -- it. -- Thus, the remaining case is that we could have stolen from the current -- G1, where "current" means the __g1_start value we observed. However, -- if the current G1 does not have the same slot index as we do, we did -- not steal from it and do not need to undo that. This is the reason -- for putting a bit with G2's index into__g1_start as well. */ -- if (((g1_start & 1) ^ 1) == g) -- { -- /* We have to conservatively undo our potential mistake of stealing -- a signal. We can stop trying to do that when the current G1 -- changes because other spinning waiters will notice this too and -- __condvar_quiesce_and_switch_g1 has checked that there are no -- futex waiters anymore before switching G1. -- Relaxed MO is fine for the __g1_start load because we need to -- merely be able to observe this fact and not have to observe -- something else as well. -- ??? Would it help to spin for a little while to see whether the -- current G1 gets closed? This might be worthwhile if the group is -- small or close to being closed. */ -- unsigned int s = atomic_load_relaxed (cond->__data.__g_signals + g); -- while (__condvar_load_g1_start_relaxed (cond) == g1_start) -- { -- /* Try to add a signal. We don't need to acquire the lock -- because at worst we can cause a spurious wake-up. If the -- group is in the process of being closed (LSB is true), this -- has an effect similar to us adding a signal. */ -- if (((s & 1) != 0) -- || atomic_compare_exchange_weak_relaxed -- (cond->__data.__g_signals + g, &s, s + 2)) -- { -- /* If we added a signal, we also need to add a wake-up on -- the futex. We also need to do that if we skipped adding -- a signal because the group is being closed because -- while __condvar_quiesce_and_switch_g1 could have closed -- the group, it might still be waiting for futex waiters to -- leave (and one of those waiters might be the one we stole -- the signal from, which cause it to block using the -- futex). */ -- futex_wake (cond->__data.__g_signals + g, 1, private); -- break; -- } -- /* TODO Back off. */ -- } -- } -- } -- - done: - - /* Confirm that we have been woken. We do that before acquiring the mutex - -commit 88d999d840e77c9917f08870094a23ce42294848 -Author: Malte Skarupke -Date: Wed Dec 4 07:55:22 2024 -0500 - - nptl: Update comments and indentation for new condvar implementation - - Some comments were wrong after the most recent commit. This fixes that. - - Also fixing indentation where it was using spaces instead of tabs. - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit 0cc973160c23bb67f895bc887dd6942d29f8fee3) - -diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c -index 4855b8899f..3475d15123 100644 ---- a/nptl/pthread_cond_common.c -+++ b/nptl/pthread_cond_common.c -@@ -221,8 +221,9 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - * New waiters arriving concurrently with the group switching will all go - into G2 until we atomically make the switch. Waiters existing in G2 - are not affected. -- * Waiters in G1 will be closed out immediately by the advancing of -- __g_signals to the next "lowseq" (low 31 bits of the new g1_start), -+ * Waiters in G1 have already received a signal and been woken. If they -+ haven't woken yet, they will be closed out immediately by the advancing -+ of __g_signals to the next "lowseq" (low 31 bits of the new g1_start), - which will prevent waiters from blocking using a futex on - __g_signals since it provides enough signals for all possible - remaining waiters. As a result, they can each consume a signal -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index 3d290e39c8..ad2cee7d59 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -249,7 +249,7 @@ __condvar_cleanup_waiting (void *arg) - figure out whether they are in a group that has already been completely - signaled (i.e., if the current G1 starts at a later position that the - waiter's position). Waiters cannot determine whether they are currently -- in G2 or G1 -- but they do not have too because all they are interested in -+ in G2 or G1 -- but they do not have to because all they are interested in - is whether there are available signals, and they always start in G2 (whose - group slot they know because of the bit in the waiter sequence. Signalers - will simply fill the right group until it is completely signaled and can -@@ -412,7 +412,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - } - - /* Now wait until a signal is available in our group or it is closed. -- Acquire MO so that if we observe a value of zero written after group -+ Acquire MO so that if we observe (signals == lowseq) after group - switching in __condvar_quiesce_and_switch_g1, we synchronize with that - store and will see the prior update of __g1_start done while switching - groups too. */ -@@ -422,8 +422,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - { - while (1) - { -- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); -- unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); -+ unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - - /* Spin-wait first. - Note that spinning first without checking whether a timeout -@@ -447,21 +447,21 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - - /* Reload signals. See above for MO. */ - signals = atomic_load_acquire (cond->__data.__g_signals + g); -- g1_start = __condvar_load_g1_start_relaxed (cond); -- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -+ g1_start = __condvar_load_g1_start_relaxed (cond); -+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - spin--; - } - -- if (seq < (g1_start >> 1)) -+ if (seq < (g1_start >> 1)) - { -- /* If the group is closed already, -+ /* If the group is closed already, - then this waiter originally had enough extra signals to - consume, up until the time its group was closed. */ - goto done; -- } -+ } - - /* If there is an available signal, don't block. -- If __g1_start has advanced at all, then we must be in G1 -+ If __g1_start has advanced at all, then we must be in G1 - by now, perhaps in the process of switching back to an older - G2, but in either case we're allowed to consume the available - signal and should not block anymore. */ -@@ -483,22 +483,23 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - sequence. */ - atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2); - signals = atomic_load_acquire (cond->__data.__g_signals + g); -- g1_start = __condvar_load_g1_start_relaxed (cond); -- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -+ g1_start = __condvar_load_g1_start_relaxed (cond); -+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - -- if (seq < (g1_start >> 1)) -+ if (seq < (g1_start >> 1)) - { -- /* group is closed already, so don't block */ -+ /* group is closed already, so don't block */ - __condvar_dec_grefs (cond, g, private); - goto done; - } - - if ((int)(signals - lowseq) >= 2) - { -- /* a signal showed up or G1/G2 switched after we grabbed the refcount */ -+ /* a signal showed up or G1/G2 switched after we grabbed the -+ refcount */ - __condvar_dec_grefs (cond, g, private); - break; -- } -+ } - - // Now block. - struct _pthread_cleanup_buffer buffer; -@@ -536,10 +537,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1)) - goto done; - } -- /* Try to grab a signal. Use acquire MO so that we see an up-to-date value -- of __g1_start below (see spinning above for a similar case). In -- particular, if we steal from a more recent group, we will also see a -- more recent __g1_start below. */ -+ /* Try to grab a signal. See above for MO. (if we do another loop -+ iteration we need to see the correct value of g1_start) */ - while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g, - &signals, signals - 2)); - - -commit 136a29f9d0a3924828d5a16be82d054637517c95 -Author: Malte Skarupke -Date: Wed Dec 4 07:55:50 2024 -0500 - - nptl: Remove unnecessary catch-all-wake in condvar group switch - - This wake is unnecessary. We only switch groups after every sleeper in a group - has been woken. Sure, they may take a while to actually wake up and may still - hold a reference, but waking them a second time doesn't speed that up. Instead - this just makes the code more complicated and may hide problems. - - In particular this safety wake wouldn't even have helped with the bug that was - fixed by Barrus' patch: The bug there was that pthread_cond_signal would not - switch g1 when it should, so we wouldn't even have entered this code path. - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit b42cc6af11062c260c7dfa91f1c89891366fed3e) - -diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c -index 3475d15123..30b8eee149 100644 ---- a/nptl/pthread_cond_common.c -+++ b/nptl/pthread_cond_common.c -@@ -221,13 +221,7 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - * New waiters arriving concurrently with the group switching will all go - into G2 until we atomically make the switch. Waiters existing in G2 - are not affected. -- * Waiters in G1 have already received a signal and been woken. If they -- haven't woken yet, they will be closed out immediately by the advancing -- of __g_signals to the next "lowseq" (low 31 bits of the new g1_start), -- which will prevent waiters from blocking using a futex on -- __g_signals since it provides enough signals for all possible -- remaining waiters. As a result, they can each consume a signal -- and they will eventually remove their group reference. */ -+ * Waiters in G1 have already received a signal and been woken. */ - - /* Update __g1_start, which finishes closing this group. The value we add - will never be negative because old_orig_size can only be zero when we -@@ -240,29 +234,6 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - - unsigned int lowseq = ((old_g1_start + old_orig_size) << 1) & ~1U; - -- /* If any waiters still hold group references (and thus could be blocked), -- then wake them all up now and prevent any running ones from blocking. -- This is effectively a catch-all for any possible current or future -- bugs that can allow the group size to reach 0 before all G1 waiters -- have been awakened or at least given signals to consume, or any -- other case that can leave blocked (or about to block) older waiters.. */ -- if ((atomic_fetch_or_release (cond->__data.__g_refs + g1, 0) >> 1) > 0) -- { -- /* First advance signals to the end of the group (i.e. enough signals -- for the entire G1 group) to ensure that waiters which have not -- yet blocked in the futex will not block. -- Note that in the vast majority of cases, this should never -- actually be necessary, since __g_signals will have enough -- signals for the remaining g_refs waiters. As an optimization, -- we could check this first before proceeding, although that -- could still leave the potential for futex lost wakeup bugs -- if the signal count was non-zero but the futex wakeup -- was somehow lost. */ -- atomic_store_release (cond->__data.__g_signals + g1, lowseq); -- -- futex_wake (cond->__data.__g_signals + g1, INT_MAX, private); -- } -- - /* At this point, the old G1 is now a valid new G2 (but not in use yet). - No old waiter can neither grab a signal nor acquire a reference without - noticing that __g1_start is larger. - -commit 2a259b6d77dc5bdab5c8f4ee0e69572d5699d4bf -Author: Malte Skarupke -Date: Wed Dec 4 07:56:13 2024 -0500 - - nptl: Remove unnecessary quadruple check in pthread_cond_wait - - pthread_cond_wait was checking whether it was in a closed group no less than - four times. Checking once is enough. Here are the four checks: - - 1. While spin-waiting. This was dead code: maxspin is set to 0 and has been - for years. - 2. Before deciding to go to sleep, and before incrementing grefs: I kept this - 3. After incrementing grefs. There is no reason to think that the group would - close while we do an atomic increment. Obviously it could close at any - point, but that doesn't mean we have to recheck after every step. This - check was equally good as check 2, except it has to do more work. - 4. When we find ourselves in a group that has a signal. We only get here after - we check that we're not in a closed group. There is no need to check again. - The check would only have helped in cases where the compare_exchange in the - next line would also have failed. Relying on the compare_exchange is fine. - - Removing the duplicate checks clarifies the code. - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit 4f7b051f8ee3feff1b53b27a906f245afaa9cee1) - -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index ad2cee7d59..cfdd13bb87 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -366,7 +366,6 @@ static __always_inline int - __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - clockid_t clockid, const struct __timespec64 *abstime) - { -- const int maxspin = 0; - int err; - int result = 0; - -@@ -425,33 +424,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); - unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - -- /* Spin-wait first. -- Note that spinning first without checking whether a timeout -- passed might lead to what looks like a spurious wake-up even -- though we should return ETIMEDOUT (e.g., if the caller provides -- an absolute timeout that is clearly in the past). However, -- (1) spurious wake-ups are allowed, (2) it seems unlikely that a -- user will (ab)use pthread_cond_wait as a check for whether a -- point in time is in the past, and (3) spinning first without -- having to compare against the current time seems to be the right -- choice from a performance perspective for most use cases. */ -- unsigned int spin = maxspin; -- while (spin > 0 && ((int)(signals - lowseq) < 2)) -- { -- /* Check that we are not spinning on a group that's already -- closed. */ -- if (seq < (g1_start >> 1)) -- break; -- -- /* TODO Back off. */ -- -- /* Reload signals. See above for MO. */ -- signals = atomic_load_acquire (cond->__data.__g_signals + g); -- g1_start = __condvar_load_g1_start_relaxed (cond); -- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -- spin--; -- } -- - if (seq < (g1_start >> 1)) - { - /* If the group is closed already, -@@ -482,24 +454,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - an atomic read-modify-write operation and thus extend the release - sequence. */ - atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2); -- signals = atomic_load_acquire (cond->__data.__g_signals + g); -- g1_start = __condvar_load_g1_start_relaxed (cond); -- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -- -- if (seq < (g1_start >> 1)) -- { -- /* group is closed already, so don't block */ -- __condvar_dec_grefs (cond, g, private); -- goto done; -- } -- -- if ((int)(signals - lowseq) >= 2) -- { -- /* a signal showed up or G1/G2 switched after we grabbed the -- refcount */ -- __condvar_dec_grefs (cond, g, private); -- break; -- } - - // Now block. - struct _pthread_cleanup_buffer buffer; -@@ -533,9 +487,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - /* Reload signals. See above for MO. */ - signals = atomic_load_acquire (cond->__data.__g_signals + g); - } -- -- if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1)) -- goto done; - } - /* Try to grab a signal. See above for MO. (if we do another loop - iteration we need to see the correct value of g1_start) */ - -commit a2465f4293ecc37ac4650fbd02e517bc6fd801c6 -Author: Malte Skarupke -Date: Wed Dec 4 07:56:38 2024 -0500 - - nptl: Remove g_refs from condition variables - - This variable used to be needed to wait in group switching until all sleepers - have confirmed that they have woken. This is no longer needed. Nothing waits - on this variable so there is no need to track how many threads are currently - asleep in each group. - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit c36fc50781995e6758cae2b6927839d0157f213c) - -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index cfdd13bb87..411fc0380b 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -143,23 +143,6 @@ __condvar_cancel_waiting (pthread_cond_t *cond, uint64_t seq, unsigned int g, - } - } - --/* Wake up any signalers that might be waiting. */ --static void --__condvar_dec_grefs (pthread_cond_t *cond, unsigned int g, int private) --{ -- /* Release MO to synchronize-with the acquire load in -- __condvar_quiesce_and_switch_g1. */ -- if (atomic_fetch_add_release (cond->__data.__g_refs + g, -2) == 3) -- { -- /* Clear the wake-up request flag before waking up. We do not need more -- than relaxed MO and it doesn't matter if we apply this for an aliased -- group because we wake all futex waiters right after clearing the -- flag. */ -- atomic_fetch_and_relaxed (cond->__data.__g_refs + g, ~(unsigned int) 1); -- futex_wake (cond->__data.__g_refs + g, INT_MAX, private); -- } --} -- - /* Clean-up for cancellation of waiters waiting for normal signals. We cancel - our registration as a waiter, confirm we have woken up, and re-acquire the - mutex. */ -@@ -171,8 +154,6 @@ __condvar_cleanup_waiting (void *arg) - pthread_cond_t *cond = cbuffer->cond; - unsigned g = cbuffer->wseq & 1; - -- __condvar_dec_grefs (cond, g, cbuffer->private); -- - __condvar_cancel_waiting (cond, cbuffer->wseq >> 1, g, cbuffer->private); - /* FIXME With the current cancellation implementation, it is possible that - a thread is cancelled after it has returned from a syscall. This could -@@ -327,15 +308,6 @@ __condvar_cleanup_waiting (void *arg) - sufficient because if a waiter can see a sufficiently large value, it could - have also consume a signal in the waiters group. - -- It is essential that the last field in pthread_cond_t is __g_signals[1]: -- The previous condvar used a pointer-sized field in pthread_cond_t, so a -- PTHREAD_COND_INITIALIZER from that condvar implementation might only -- initialize 4 bytes to zero instead of the 8 bytes we need (i.e., 44 bytes -- in total instead of the 48 we need). __g_signals[1] is not accessed before -- the first group switch (G2 starts at index 0), which will set its value to -- zero after a harmless fetch-or whose return value is ignored. This -- effectively completes initialization. -- - - Limitations: - * This condvar isn't designed to allow for more than -@@ -440,21 +412,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - if ((int)(signals - lowseq) >= 2) - break; - -- /* No signals available after spinning, so prepare to block. -- We first acquire a group reference and use acquire MO for that so -- that we synchronize with the dummy read-modify-write in -- __condvar_quiesce_and_switch_g1 if we read from that. In turn, -- in this case this will make us see the advancement of __g_signals -- to the upcoming new g1_start that occurs with a concurrent -- attempt to reuse the group's slot. -- We use acquire MO for the __g_signals check to make the -- __g1_start check work (see spinning above). -- Note that the group reference acquisition will not mask the -- release MO when decrementing the reference count because we use -- an atomic read-modify-write operation and thus extend the release -- sequence. */ -- atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2); -- - // Now block. - struct _pthread_cleanup_buffer buffer; - struct _condvar_cleanup_buffer cbuffer; -@@ -471,18 +428,11 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - - if (__glibc_unlikely (err == ETIMEDOUT || err == EOVERFLOW)) - { -- __condvar_dec_grefs (cond, g, private); -- /* If we timed out, we effectively cancel waiting. Note that -- we have decremented __g_refs before cancellation, so that a -- deadlock between waiting for quiescence of our group in -- __condvar_quiesce_and_switch_g1 and us trying to acquire -- the lock during cancellation is not possible. */ -+ /* If we timed out, we effectively cancel waiting. */ - __condvar_cancel_waiting (cond, seq, g, private); - result = err; - goto done; - } -- else -- __condvar_dec_grefs (cond, g, private); - - /* Reload signals. See above for MO. */ - signals = atomic_load_acquire (cond->__data.__g_signals + g); -diff --git a/nptl/tst-cond22.c b/nptl/tst-cond22.c -index 1336e9c79d..bdcb45c536 100644 ---- a/nptl/tst-cond22.c -+++ b/nptl/tst-cond22.c -@@ -106,13 +106,13 @@ do_test (void) - status = 1; - } - -- printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u/%u, %u/%u/%u, %u, %u }\n", -+ printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u, %u/%u, %u, %u }\n", - c.__data.__wseq.__value32.__high, - c.__data.__wseq.__value32.__low, - c.__data.__g1_start.__value32.__high, - c.__data.__g1_start.__value32.__low, -- c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0], -- c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1], -+ c.__data.__g_signals[0], c.__data.__g_size[0], -+ c.__data.__g_signals[1], c.__data.__g_size[1], - c.__data.__g1_orig_size, c.__data.__wrefs); - - if (pthread_create (&th, NULL, tf, (void *) 1l) != 0) -@@ -152,13 +152,13 @@ do_test (void) - status = 1; - } - -- printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u/%u, %u/%u/%u, %u, %u }\n", -+ printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u, %u/%u, %u, %u }\n", - c.__data.__wseq.__value32.__high, - c.__data.__wseq.__value32.__low, - c.__data.__g1_start.__value32.__high, - c.__data.__g1_start.__value32.__low, -- c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0], -- c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1], -+ c.__data.__g_signals[0], c.__data.__g_size[0], -+ c.__data.__g_signals[1], c.__data.__g_size[1], - c.__data.__g1_orig_size, c.__data.__wrefs); - - return status; -diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h -index df54eef6f7..a3d482f80f 100644 ---- a/sysdeps/nptl/bits/thread-shared-types.h -+++ b/sysdeps/nptl/bits/thread-shared-types.h -@@ -95,8 +95,7 @@ struct __pthread_cond_s - { - __atomic_wide_counter __wseq; - __atomic_wide_counter __g1_start; -- unsigned int __g_refs[2] __LOCK_ALIGNMENT; -- unsigned int __g_size[2]; -+ unsigned int __g_size[2] __LOCK_ALIGNMENT; - unsigned int __g1_orig_size; - unsigned int __wrefs; - unsigned int __g_signals[2]; -diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h -index 3d4f4a756c..9af75d6eae 100644 ---- a/sysdeps/nptl/pthread.h -+++ b/sysdeps/nptl/pthread.h -@@ -152,7 +152,7 @@ enum - - - /* Conditional variable handling. */ --#define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, {0, 0}, 0, 0, {0, 0} } } -+#define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, 0, 0, {0, 0} } } - - - /* Cleanup buffers */ - -commit fa110993a6390ae5c97dff613ef02b59ec78c5da -Author: Malte Skarupke -Date: Wed Dec 4 08:03:44 2024 -0500 - - nptl: Use a single loop in pthread_cond_wait instaed of a nested loop - - The loop was a little more complicated than necessary. There was only one - break statement out of the inner loop, and the outer loop was nearly empty. - So just remove the outer loop, moving its code to the one break statement in - the inner loop. This allows us to replace all gotos with break statements. - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit 929a4764ac90382616b6a21f099192b2475da674) - -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index 411fc0380b..683cb2b133 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -382,17 +382,15 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - return err; - } - -- /* Now wait until a signal is available in our group or it is closed. -- Acquire MO so that if we observe (signals == lowseq) after group -- switching in __condvar_quiesce_and_switch_g1, we synchronize with that -- store and will see the prior update of __g1_start done while switching -- groups too. */ -- unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); -- -- do -- { -+ - while (1) - { -+ /* Now wait until a signal is available in our group or it is closed. -+ Acquire MO so that if we observe (signals == lowseq) after group -+ switching in __condvar_quiesce_and_switch_g1, we synchronize with that -+ store and will see the prior update of __g1_start done while switching -+ groups too. */ -+ unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); - uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); - unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - -@@ -401,7 +399,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - /* If the group is closed already, - then this waiter originally had enough extra signals to - consume, up until the time its group was closed. */ -- goto done; -+ break; - } - - /* If there is an available signal, don't block. -@@ -410,7 +408,16 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - G2, but in either case we're allowed to consume the available - signal and should not block anymore. */ - if ((int)(signals - lowseq) >= 2) -- break; -+ { -+ /* Try to grab a signal. See above for MO. (if we do another loop -+ iteration we need to see the correct value of g1_start) */ -+ if (atomic_compare_exchange_weak_acquire ( -+ cond->__data.__g_signals + g, -+ &signals, signals - 2)) -+ break; -+ else -+ continue; -+ } - - // Now block. - struct _pthread_cleanup_buffer buffer; -@@ -431,19 +438,9 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - /* If we timed out, we effectively cancel waiting. */ - __condvar_cancel_waiting (cond, seq, g, private); - result = err; -- goto done; -+ break; - } -- -- /* Reload signals. See above for MO. */ -- signals = atomic_load_acquire (cond->__data.__g_signals + g); - } -- } -- /* Try to grab a signal. See above for MO. (if we do another loop -- iteration we need to see the correct value of g1_start) */ -- while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g, -- &signals, signals - 2)); -- -- done: - - /* Confirm that we have been woken. We do that before acquiring the mutex - to allow for execution of pthread_cond_destroy while having acquired the - -commit afbf0d46850dcd1b626d892ad8fde2162067ddc7 -Author: Malte Skarupke -Date: Wed Dec 4 08:04:10 2024 -0500 - - nptl: Fix indentation - - In my previous change I turned a nested loop into a simple loop. I'm doing - the resulting indentation changes in a separate commit to make the diff on - the previous commit easier to review. - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit ee6c14ed59d480720721aaacc5fb03213dc153da) - -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index 683cb2b133..7fc9dadf15 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -383,65 +383,65 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - } - - -- while (1) -- { -- /* Now wait until a signal is available in our group or it is closed. -- Acquire MO so that if we observe (signals == lowseq) after group -- switching in __condvar_quiesce_and_switch_g1, we synchronize with that -- store and will see the prior update of __g1_start done while switching -- groups too. */ -- unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); -- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); -- unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -- -- if (seq < (g1_start >> 1)) -- { -- /* If the group is closed already, -- then this waiter originally had enough extra signals to -- consume, up until the time its group was closed. */ -- break; -- } -- -- /* If there is an available signal, don't block. -- If __g1_start has advanced at all, then we must be in G1 -- by now, perhaps in the process of switching back to an older -- G2, but in either case we're allowed to consume the available -- signal and should not block anymore. */ -- if ((int)(signals - lowseq) >= 2) -- { -- /* Try to grab a signal. See above for MO. (if we do another loop -- iteration we need to see the correct value of g1_start) */ -- if (atomic_compare_exchange_weak_acquire ( -- cond->__data.__g_signals + g, -+ while (1) -+ { -+ /* Now wait until a signal is available in our group or it is closed. -+ Acquire MO so that if we observe (signals == lowseq) after group -+ switching in __condvar_quiesce_and_switch_g1, we synchronize with that -+ store and will see the prior update of __g1_start done while switching -+ groups too. */ -+ unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); -+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); -+ unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; -+ -+ if (seq < (g1_start >> 1)) -+ { -+ /* If the group is closed already, -+ then this waiter originally had enough extra signals to -+ consume, up until the time its group was closed. */ -+ break; -+ } -+ -+ /* If there is an available signal, don't block. -+ If __g1_start has advanced at all, then we must be in G1 -+ by now, perhaps in the process of switching back to an older -+ G2, but in either case we're allowed to consume the available -+ signal and should not block anymore. */ -+ if ((int)(signals - lowseq) >= 2) -+ { -+ /* Try to grab a signal. See above for MO. (if we do another loop -+ iteration we need to see the correct value of g1_start) */ -+ if (atomic_compare_exchange_weak_acquire ( -+ cond->__data.__g_signals + g, - &signals, signals - 2)) -- break; -- else -- continue; -- } -- -- // Now block. -- struct _pthread_cleanup_buffer buffer; -- struct _condvar_cleanup_buffer cbuffer; -- cbuffer.wseq = wseq; -- cbuffer.cond = cond; -- cbuffer.mutex = mutex; -- cbuffer.private = private; -- __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer); -- -- err = __futex_abstimed_wait_cancelable64 ( -- cond->__data.__g_signals + g, signals, clockid, abstime, private); -- -- __pthread_cleanup_pop (&buffer, 0); -- -- if (__glibc_unlikely (err == ETIMEDOUT || err == EOVERFLOW)) -- { -- /* If we timed out, we effectively cancel waiting. */ -- __condvar_cancel_waiting (cond, seq, g, private); -- result = err; - break; -- } -+ else -+ continue; - } - -+ // Now block. -+ struct _pthread_cleanup_buffer buffer; -+ struct _condvar_cleanup_buffer cbuffer; -+ cbuffer.wseq = wseq; -+ cbuffer.cond = cond; -+ cbuffer.mutex = mutex; -+ cbuffer.private = private; -+ __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer); -+ -+ err = __futex_abstimed_wait_cancelable64 ( -+ cond->__data.__g_signals + g, signals, clockid, abstime, private); -+ -+ __pthread_cleanup_pop (&buffer, 0); -+ -+ if (__glibc_unlikely (err == ETIMEDOUT || err == EOVERFLOW)) -+ { -+ /* If we timed out, we effectively cancel waiting. */ -+ __condvar_cancel_waiting (cond, seq, g, private); -+ result = err; -+ break; -+ } -+ } -+ - /* Confirm that we have been woken. We do that before acquiring the mutex - to allow for execution of pthread_cond_destroy while having acquired the - mutex. */ - -commit 2ad69497346cc20ef4d568108f1de49b2f451c55 -Author: Malte Skarupke -Date: Wed Dec 4 08:04:54 2024 -0500 - - nptl: rename __condvar_quiesce_and_switch_g1 - - This function no longer waits for threads to leave g1, so rename it to - __condvar_switch_g1 - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit 4b79e27a5073c02f6bff9aa8f4791230a0ab1867) - -diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c -index aada91639a..38bba17bfc 100644 ---- a/nptl/pthread_cond_broadcast.c -+++ b/nptl/pthread_cond_broadcast.c -@@ -60,7 +60,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond) - cond->__data.__g_size[g1] << 1); - cond->__data.__g_size[g1] = 0; - -- /* We need to wake G1 waiters before we quiesce G1 below. */ -+ /* We need to wake G1 waiters before we switch G1 below. */ - /* TODO Only set it if there are indeed futex waiters. We could - also try to move this out of the critical section in cases when - G2 is empty (and we don't need to quiesce). */ -@@ -69,7 +69,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond) - - /* G1 is complete. Step (2) is next unless there are no waiters in G2, in - which case we can stop. */ -- if (__condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private)) -+ if (__condvar_switch_g1 (cond, wseq, &g1, private)) - { - /* Step (3): Send signals to all waiters in the old G2 / new G1. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, -diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c -index 30b8eee149..5044273cc2 100644 ---- a/nptl/pthread_cond_common.c -+++ b/nptl/pthread_cond_common.c -@@ -189,16 +189,15 @@ __condvar_get_private (int flags) - return FUTEX_SHARED; - } - --/* This closes G1 (whose index is in G1INDEX), waits for all futex waiters to -- leave G1, converts G1 into a fresh G2, and then switches group roles so that -- the former G2 becomes the new G1 ending at the current __wseq value when we -- eventually make the switch (WSEQ is just an observation of __wseq by the -- signaler). -+/* This closes G1 (whose index is in G1INDEX), converts G1 into a fresh G2, -+ and then switches group roles so that the former G2 becomes the new G1 -+ ending at the current __wseq value when we eventually make the switch -+ (WSEQ is just an observation of __wseq by the signaler). - If G2 is empty, it will not switch groups because then it would create an - empty G1 which would require switching groups again on the next signal. - Returns false iff groups were not switched because G2 was empty. */ - static bool __attribute__ ((unused)) --__condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, -+__condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - unsigned int *g1index, int private) - { - unsigned int g1 = *g1index; -@@ -214,8 +213,7 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - + cond->__data.__g_size[g1 ^ 1]) == 0) - return false; - -- /* Now try to close and quiesce G1. We have to consider the following kinds -- of waiters: -+ /* We have to consider the following kinds of waiters: - * Waiters from less recent groups than G1 are not affected because - nothing will change for them apart from __g1_start getting larger. - * New waiters arriving concurrently with the group switching will all go -@@ -223,12 +221,12 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - are not affected. - * Waiters in G1 have already received a signal and been woken. */ - -- /* Update __g1_start, which finishes closing this group. The value we add -- will never be negative because old_orig_size can only be zero when we -- switch groups the first time after a condvar was initialized, in which -- case G1 will be at index 1 and we will add a value of 1. -- Relaxed MO is fine because the change comes with no additional -- constraints that others would have to observe. */ -+ /* Update __g1_start, which closes this group. The value we add will never -+ be negative because old_orig_size can only be zero when we switch groups -+ the first time after a condvar was initialized, in which case G1 will be -+ at index 1 and we will add a value of 1. Relaxed MO is fine because the -+ change comes with no additional constraints that others would have to -+ observe. */ - __condvar_add_g1_start_relaxed (cond, - (old_orig_size << 1) + (g1 == 1 ? 1 : - 1)); - -diff --git a/nptl/pthread_cond_signal.c b/nptl/pthread_cond_signal.c -index 43d6286ecd..f095497142 100644 ---- a/nptl/pthread_cond_signal.c -+++ b/nptl/pthread_cond_signal.c -@@ -69,18 +69,17 @@ ___pthread_cond_signal (pthread_cond_t *cond) - bool do_futex_wake = false; - - /* If G1 is still receiving signals, we put the signal there. If not, we -- check if G2 has waiters, and if so, quiesce and switch G1 to the former -- G2; if this results in a new G1 with waiters (G2 might have cancellations -- already, see __condvar_quiesce_and_switch_g1), we put the signal in the -- new G1. */ -+ check if G2 has waiters, and if so, switch G1 to the former G2; if this -+ results in a new G1 with waiters (G2 might have cancellations already, -+ see __condvar_switch_g1), we put the signal in the new G1. */ - if ((cond->__data.__g_size[g1] != 0) -- || __condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private)) -+ || __condvar_switch_g1 (cond, wseq, &g1, private)) - { - /* Add a signal. Relaxed MO is fine because signaling does not need to -- establish a happens-before relation (see above). We do not mask the -- release-MO store when initializing a group in -- __condvar_quiesce_and_switch_g1 because we use an atomic -- read-modify-write and thus extend that store's release sequence. */ -+ establish a happens-before relation (see above). We do not mask the -+ release-MO store when initializing a group in __condvar_switch_g1 -+ because we use an atomic read-modify-write and thus extend that -+ store's release sequence. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 2); - cond->__data.__g_size[g1]--; - /* TODO Only set it if there are indeed futex waiters. */ -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index 7fc9dadf15..80bb728211 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -354,8 +354,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - because we do not need to establish any happens-before relation with - signalers (see __pthread_cond_signal); modification order alone - establishes a total order of waiters/signals. We do need acquire MO -- to synchronize with group reinitialization in -- __condvar_quiesce_and_switch_g1. */ -+ to synchronize with group reinitialization in __condvar_switch_g1. */ - uint64_t wseq = __condvar_fetch_add_wseq_acquire (cond, 2); - /* Find our group's index. We always go into what was G2 when we acquired - our position. */ -@@ -387,9 +386,9 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - { - /* Now wait until a signal is available in our group or it is closed. - Acquire MO so that if we observe (signals == lowseq) after group -- switching in __condvar_quiesce_and_switch_g1, we synchronize with that -- store and will see the prior update of __g1_start done while switching -- groups too. */ -+ switching in __condvar_switch_g1, we synchronize with that store and -+ will see the prior update of __g1_start done while switching groups -+ too. */ - unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); - uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); - unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - -commit 7f71824b8039b8afc150dd5c881b61faf10675ef -Author: Malte Skarupke -Date: Wed Dec 4 08:05:40 2024 -0500 - - nptl: Use all of g1_start and g_signals - - The LSB of g_signals was unused. The LSB of g1_start was used to indicate - which group is G2. This was used to always go to sleep in pthread_cond_wait - if a waiter is in G2. A comment earlier in the file says that this is not - correct to do: - - "Waiters cannot determine whether they are currently in G2 or G1 -- but they - do not have to because all they are interested in is whether there are - available signals" - - I either would have had to update the comment, or get rid of the check. I - chose to get rid of the check. In fact I don't quite know why it was there. - There will never be available signals for group G2, so we didn't need the - special case. Even if there were, this would just be a spurious wake. This - might have caught some cases where the count has wrapped around, but it - wouldn't reliably do that, (and even if it did, why would you want to force a - sleep in that case?) and we don't support that many concurrent waiters - anyway. Getting rid of it allows us to use one more bit, making us more - robust to wraparound. - - Signed-off-by: Malte Skarupke - Reviewed-by: Carlos O'Donell - (cherry picked from commit 91bb902f58264a2fd50fbce8f39a9a290dd23706) - -diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c -index 38bba17bfc..51afa62adf 100644 ---- a/nptl/pthread_cond_broadcast.c -+++ b/nptl/pthread_cond_broadcast.c -@@ -57,7 +57,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond) - { - /* Add as many signals as the remaining size of the group. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, -- cond->__data.__g_size[g1] << 1); -+ cond->__data.__g_size[g1]); - cond->__data.__g_size[g1] = 0; - - /* We need to wake G1 waiters before we switch G1 below. */ -@@ -73,7 +73,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond) - { - /* Step (3): Send signals to all waiters in the old G2 / new G1. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, -- cond->__data.__g_size[g1] << 1); -+ cond->__data.__g_size[g1]); - cond->__data.__g_size[g1] = 0; - /* TODO Only set it if there are indeed futex waiters. */ - do_futex_wake = true; -diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c -index 5044273cc2..389402913c 100644 ---- a/nptl/pthread_cond_common.c -+++ b/nptl/pthread_cond_common.c -@@ -208,9 +208,9 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - behavior. - Note that this works correctly for a zero-initialized condvar too. */ - unsigned int old_orig_size = __condvar_get_orig_size (cond); -- uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond) >> 1; -- if (((unsigned) (wseq - old_g1_start - old_orig_size) -- + cond->__data.__g_size[g1 ^ 1]) == 0) -+ uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond); -+ uint64_t new_g1_start = old_g1_start + old_orig_size; -+ if (((unsigned) (wseq - new_g1_start) + cond->__data.__g_size[g1 ^ 1]) == 0) - return false; - - /* We have to consider the following kinds of waiters: -@@ -221,16 +221,10 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - are not affected. - * Waiters in G1 have already received a signal and been woken. */ - -- /* Update __g1_start, which closes this group. The value we add will never -- be negative because old_orig_size can only be zero when we switch groups -- the first time after a condvar was initialized, in which case G1 will be -- at index 1 and we will add a value of 1. Relaxed MO is fine because the -- change comes with no additional constraints that others would have to -- observe. */ -- __condvar_add_g1_start_relaxed (cond, -- (old_orig_size << 1) + (g1 == 1 ? 1 : - 1)); -- -- unsigned int lowseq = ((old_g1_start + old_orig_size) << 1) & ~1U; -+ /* Update __g1_start, which closes this group. Relaxed MO is fine because -+ the change comes with no additional constraints that others would have -+ to observe. */ -+ __condvar_add_g1_start_relaxed (cond, old_orig_size); - - /* At this point, the old G1 is now a valid new G2 (but not in use yet). - No old waiter can neither grab a signal nor acquire a reference without -@@ -242,13 +236,13 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - g1 ^= 1; - *g1index ^= 1; - -- /* Now advance the new G1 g_signals to the new lowseq, giving it -+ /* Now advance the new G1 g_signals to the new g1_start, giving it - an effective signal count of 0 to start. */ -- atomic_store_release (cond->__data.__g_signals + g1, lowseq); -+ atomic_store_release (cond->__data.__g_signals + g1, (unsigned)new_g1_start); - - /* These values are just observed by signalers, and thus protected by the - lock. */ -- unsigned int orig_size = wseq - (old_g1_start + old_orig_size); -+ unsigned int orig_size = wseq - new_g1_start; - __condvar_set_orig_size (cond, orig_size); - /* Use and addition to not loose track of cancellations in what was - previously G2. */ -diff --git a/nptl/pthread_cond_signal.c b/nptl/pthread_cond_signal.c -index f095497142..fa3a5c3d8f 100644 ---- a/nptl/pthread_cond_signal.c -+++ b/nptl/pthread_cond_signal.c -@@ -80,7 +80,7 @@ ___pthread_cond_signal (pthread_cond_t *cond) - release-MO store when initializing a group in __condvar_switch_g1 - because we use an atomic read-modify-write and thus extend that - store's release sequence. */ -- atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 2); -+ atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 1); - cond->__data.__g_size[g1]--; - /* TODO Only set it if there are indeed futex waiters. */ - do_futex_wake = true; -diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c -index 80bb728211..0f1dfcb595 100644 ---- a/nptl/pthread_cond_wait.c -+++ b/nptl/pthread_cond_wait.c -@@ -84,7 +84,7 @@ __condvar_cancel_waiting (pthread_cond_t *cond, uint64_t seq, unsigned int g, - not hold a reference on the group. */ - __condvar_acquire_lock (cond, private); - -- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond) >> 1; -+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); - if (g1_start > seq) - { - /* Our group is closed, so someone provided enough signals for it. -@@ -259,7 +259,6 @@ __condvar_cleanup_waiting (void *arg) - * Waiters fetch-add while having acquire the mutex associated with the - condvar. Signalers load it and fetch-xor it concurrently. - __g1_start: Starting position of G1 (inclusive) -- * LSB is index of current G2. - * Modified by signalers while having acquired the condvar-internal lock - and observed concurrently by waiters. - __g1_orig_size: Initial size of G1 -@@ -280,11 +279,9 @@ __condvar_cleanup_waiting (void *arg) - * Reference count used by waiters concurrently with signalers that have - acquired the condvar-internal lock. - __g_signals: The number of signals that can still be consumed, relative to -- the current g1_start. (i.e. bits 31 to 1 of __g_signals are bits -- 31 to 1 of g1_start with the signal count added) -+ the current g1_start. (i.e. g1_start with the signal count added) - * Used as a futex word by waiters. Used concurrently by waiters and - signalers. -- * LSB is currently reserved and 0. - __g_size: Waiters remaining in this group (i.e., which have not been - signaled yet. - * Accessed by signalers and waiters that cancel waiting (both do so only -@@ -391,9 +388,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - too. */ - unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); - uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); -- unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U; - -- if (seq < (g1_start >> 1)) -+ if (seq < g1_start) - { - /* If the group is closed already, - then this waiter originally had enough extra signals to -@@ -406,13 +402,13 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - by now, perhaps in the process of switching back to an older - G2, but in either case we're allowed to consume the available - signal and should not block anymore. */ -- if ((int)(signals - lowseq) >= 2) -+ if ((int)(signals - (unsigned int)g1_start) > 0) - { - /* Try to grab a signal. See above for MO. (if we do another loop - iteration we need to see the correct value of g1_start) */ - if (atomic_compare_exchange_weak_acquire ( - cond->__data.__g_signals + g, -- &signals, signals - 2)) -+ &signals, signals - 1)) - break; - else - continue; - -commit 8d3dd23e3de8b4c6e4b94f8bbfab971c3b8a55be -Author: Florian Weimer -Date: Thu Mar 13 06:07:07 2025 +0100 - - nptl: PTHREAD_COND_INITIALIZER compatibility with pre-2.41 versions (bug 32786) - - The new initializer and struct layout does not initialize the - __g_signals field in the old struct layout before the change in - commit c36fc50781995e6758cae2b6927839d0157f213c ("nptl: Remove - g_refs from condition variables"). Bring back fields at the end - of struct __pthread_cond_s, so that they are again zero-initialized. - - Reviewed-by: Sam James - -diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h -index a3d482f80f..bccc2003ec 100644 ---- a/sysdeps/nptl/bits/thread-shared-types.h -+++ b/sysdeps/nptl/bits/thread-shared-types.h -@@ -99,6 +99,8 @@ struct __pthread_cond_s - unsigned int __g1_orig_size; - unsigned int __wrefs; - unsigned int __g_signals[2]; -+ unsigned int __unused_initialized_1; -+ unsigned int __unused_initialized_2; - }; - - typedef unsigned int __tss_t; -diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h -index 9af75d6eae..e0f24418fe 100644 ---- a/sysdeps/nptl/pthread.h -+++ b/sysdeps/nptl/pthread.h -@@ -152,7 +152,7 @@ enum - - - /* Conditional variable handling. */ --#define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, 0, 0, {0, 0} } } -+#define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, 0, 0, {0, 0}, 0, 0 } } - - - /* Cleanup buffers */ - -commit 33b33e9dd0ff26158b1b83cc4347a39c073e490e -Author: Arjun Shankar -Date: Fri Oct 18 16:03:25 2024 +0200 - - libio: Fix a deadlock after fork in popen - - popen modifies its file handler book-keeping under a lock that wasn't - being taken during fork. This meant that a concurrent popen and fork - could end up copying the lock in a "locked" state into the fork child, - where subsequently calling popen would lead to a deadlock due to the - already (spuriously) held lock. - - This commit fixes the deadlock by appropriately taking the lock before - fork, and releasing/resetting it in the parent/child after the fork. - - A new test for concurrent popen and fork is also added. It consistently - hangs (and therefore fails via timeout) without the fix applied. - Reviewed-by: Florian Weimer - - (cherry picked from commit 9f0d2c0ee6c728643fcf9a4879e9f20f5e45ce5f) - -diff --git a/libio/Makefile b/libio/Makefile -index 5292baa4e0..7faba230ac 100644 ---- a/libio/Makefile -+++ b/libio/Makefile -@@ -117,6 +117,7 @@ tests = \ - tst-mmap-offend \ - tst-mmap-setvbuf \ - tst-mmap2-eofsync \ -+ tst-popen-fork \ - tst-popen1 \ - tst-setvbuf1 \ - tst-sprintf-chk-ub \ -diff --git a/libio/iopopen.c b/libio/iopopen.c -index d01cb0648e..352513a291 100644 ---- a/libio/iopopen.c -+++ b/libio/iopopen.c -@@ -57,6 +57,26 @@ unlock (void *not_used) - } - #endif - -+/* These lock/unlock/resetlock functions are used during fork. */ -+ -+void -+_IO_proc_file_chain_lock (void) -+{ -+ _IO_lock_lock (proc_file_chain_lock); -+} -+ -+void -+_IO_proc_file_chain_unlock (void) -+{ -+ _IO_lock_unlock (proc_file_chain_lock); -+} -+ -+void -+_IO_proc_file_chain_resetlock (void) -+{ -+ _IO_lock_init (proc_file_chain_lock); -+} -+ - /* POSIX states popen shall ensure that any streams from previous popen() - calls that remain open in the parent process should be closed in the new - child process. -diff --git a/libio/libioP.h b/libio/libioP.h -index 616253fcd0..a83a411fdf 100644 ---- a/libio/libioP.h -+++ b/libio/libioP.h -@@ -429,6 +429,12 @@ libc_hidden_proto (_IO_list_resetlock) - extern void _IO_enable_locks (void) __THROW; - libc_hidden_proto (_IO_enable_locks) - -+/* Functions for operating popen's proc_file_chain_lock during fork. */ -+ -+extern void _IO_proc_file_chain_lock (void) __THROW attribute_hidden; -+extern void _IO_proc_file_chain_unlock (void) __THROW attribute_hidden; -+extern void _IO_proc_file_chain_resetlock (void) __THROW attribute_hidden; -+ - /* Default jumptable functions. */ - - extern int _IO_default_underflow (FILE *) __THROW; -diff --git a/libio/tst-popen-fork.c b/libio/tst-popen-fork.c -new file mode 100644 -index 0000000000..1df30fc6c0 ---- /dev/null -+++ b/libio/tst-popen-fork.c -@@ -0,0 +1,80 @@ -+/* Test concurrent popen and fork. -+ Copyright (C) 2024 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+static void -+popen_and_pclose (void) -+{ -+ FILE *f = popen ("true", "r"); -+ TEST_VERIFY_EXIT (f != NULL); -+ pclose (f); -+ return; -+} -+ -+static atomic_bool done = ATOMIC_VAR_INIT (0); -+ -+static void * -+popen_and_pclose_forever (__attribute__ ((unused)) -+ void *arg) -+{ -+ while (!atomic_load_explicit (&done, memory_order_acquire)) -+ popen_and_pclose (); -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ -+ /* Repeatedly call popen in a loop during the entire test. */ -+ pthread_t t = xpthread_create (NULL, popen_and_pclose_forever, NULL); -+ -+ /* Repeatedly fork off and reap child processes one-by-one. -+ Each child calls popen once, then exits, leading to the possibility -+ that a child forks *during* our own popen call, thus inheriting any -+ intermediate popen state, possibly including lock state(s). */ -+ for (int i = 0; i < 100; i++) -+ { -+ int cpid = xfork (); -+ -+ if (cpid == 0) -+ { -+ popen_and_pclose (); -+ _exit (0); -+ } -+ else -+ xwaitpid (cpid, NULL, 0); -+ } -+ -+ /* Stop calling popen. */ -+ atomic_store_explicit (&done, 1, memory_order_release); -+ xpthread_join (t); -+ -+ return 0; -+} -+ -+#include -diff --git a/posix/fork.c b/posix/fork.c -index 298765a1ff..cf9b80e7c0 100644 ---- a/posix/fork.c -+++ b/posix/fork.c -@@ -62,6 +62,7 @@ __libc_fork (void) - call_function_static_weak (__nss_database_fork_prepare_parent, - &nss_database_data); - -+ _IO_proc_file_chain_lock (); - _IO_list_lock (); - - /* Acquire malloc locks. This needs to come last because fork -@@ -92,6 +93,7 @@ __libc_fork (void) - - /* Reset locks in the I/O code. */ - _IO_list_resetlock (); -+ _IO_proc_file_chain_resetlock (); - - call_function_static_weak (__nss_database_fork_subprocess, - &nss_database_data); -@@ -121,6 +123,7 @@ __libc_fork (void) - - /* We execute this even if the 'fork' call failed. */ - _IO_list_unlock (); -+ _IO_proc_file_chain_unlock (); - } - - /* Run the handlers registered for the parent. */ - -commit 7c3c9ae28685a9142a8cfa3521bbca74c1007d0b -Author: Arjun Shankar -Date: Fri Oct 25 09:33:45 2024 +0200 - - libio: Correctly link tst-popen-fork against libpthread - - tst-popen-fork failed to build for Hurd due to not being linked with - libpthread. This commit fixes that. - - Tested with build-many-glibcs.py for i686-gnu. - - Reviewed-by: Florian Weimer - (cherry picked from commit 6a290b2895b77be839fcb7c44a6a9879560097ad) - -diff --git a/libio/Makefile b/libio/Makefile -index 7faba230ac..f2e98f96eb 100644 ---- a/libio/Makefile -+++ b/libio/Makefile -@@ -142,6 +142,8 @@ tests = \ - tst_wscanf \ - # tests - -+$(objpfx)tst-popen-fork: $(shared-thread-library) -+ - tests-internal = tst-vtables tst-vtables-interposed - - ifeq (yes,$(build-shared)) - -commit 8667345b83c8ca528a093d4db53f57a1bb1688e4 -Author: Florian Weimer -Date: Thu Feb 13 21:56:52 2025 +0100 - - elf: Keep using minimal malloc after early DTV resize (bug 32412) - - If an auditor loads many TLS-using modules during startup, it is - possible to trigger DTV resizing. Previously, the DTV was marked - as allocated by the main malloc afterwards, even if the minimal - malloc was still in use. With this change, _dl_resize_dtv marks - the resized DTV as allocated with the minimal malloc. - - The new test reuses TLS-using modules from other auditing tests. - - Reviewed-by: DJ Delorie - (cherry picked from commit aa3d7bd5299b33bffc118aa618b59bfa66059bcb) - -diff --git a/elf/Makefile b/elf/Makefile -index dc686c3bff..be64c59887 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -378,6 +378,7 @@ tests += \ - tst-align3 \ - tst-audit-tlsdesc \ - tst-audit-tlsdesc-dlopen \ -+ tst-audit-tlsdesc-dlopen2 \ - tst-audit1 \ - tst-audit2 \ - tst-audit8 \ -@@ -817,6 +818,7 @@ modules-names += \ - tst-auditmanymod8 \ - tst-auditmanymod9 \ - tst-auditmod-tlsdesc \ -+ tst-auditmod-tlsdesc2 \ - tst-auditmod1 \ - tst-auditmod11 \ - tst-auditmod12 \ -@@ -3040,6 +3042,9 @@ $(objpfx)tst-audit-tlsdesc.out: $(objpfx)tst-auditmod-tlsdesc.so - tst-audit-tlsdesc-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc.so - $(objpfx)tst-audit-tlsdesc-dlopen.out: $(objpfx)tst-auditmod-tlsdesc.so - tst-audit-tlsdesc-dlopen-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc.so -+$(objpfx)tst-audit-tlsdesc-dlopen2.out: $(objpfx)tst-auditmod-tlsdesc2.so \ -+ $(patsubst %, $(objpfx)%.so, $(tlsmod17a-modules)) -+tst-audit-tlsdesc-dlopen2-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc2.so - - $(objpfx)tst-dlmopen-twice.out: \ - $(objpfx)tst-dlmopen-twice-mod1.so \ -diff --git a/elf/dl-tls.c b/elf/dl-tls.c -index 3d529b722c..b13e752358 100644 ---- a/elf/dl-tls.c -+++ b/elf/dl-tls.c -@@ -528,6 +528,13 @@ _dl_resize_dtv (dtv_t *dtv, size_t max_modid) - if (newp == NULL) - oom (); - memcpy (newp, &dtv[-1], (2 + oldsize) * sizeof (dtv_t)); -+#ifdef SHARED -+ /* Auditors can trigger a DTV resize event while the full malloc -+ is not yet in use. Mark the new DTV allocation as the -+ initial allocation. */ -+ if (!__rtld_malloc_is_complete ()) -+ GL(dl_initial_dtv) = &newp[1]; -+#endif - } - else - { -diff --git a/elf/tst-audit-tlsdesc-dlopen2.c b/elf/tst-audit-tlsdesc-dlopen2.c -new file mode 100644 -index 0000000000..7ba2c4129a ---- /dev/null -+++ b/elf/tst-audit-tlsdesc-dlopen2.c -@@ -0,0 +1,46 @@ -+/* Loading TLS-using modules from auditors (bug 32412). Main program. -+ Copyright (C) 2021-2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+ -+static int -+do_test (void) -+{ -+ puts ("info: start of main program"); -+ -+ /* Load TLS-using modules, to trigger DTV resizing. The dynamic -+ linker will load them again (requiring their own TLS) because the -+ dlopen calls from the auditor were in the auditing namespace. */ -+ for (int i = 1; i <= 19; ++i) -+ { -+ char dso[30]; -+ snprintf (dso, sizeof (dso), "tst-tlsmod17a%d.so", i); -+ char sym[30]; -+ snprintf (sym, sizeof(sym), "tlsmod17a%d", i); -+ -+ void *handle = xdlopen (dso, RTLD_LAZY); -+ int (*func) (void) = xdlsym (handle, sym); -+ /* Trigger TLS allocation. */ -+ func (); -+ } -+ -+ return 0; -+} -+ -+#include -diff --git a/elf/tst-auditmod-tlsdesc2.c b/elf/tst-auditmod-tlsdesc2.c -new file mode 100644 -index 0000000000..50275cd34d ---- /dev/null -+++ b/elf/tst-auditmod-tlsdesc2.c -@@ -0,0 +1,59 @@ -+/* Loading TLS-using modules from auditors (bug 32412). Audit module. -+ Copyright (C) 2021-2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+unsigned int -+la_version (unsigned int version) -+{ -+ /* Open some modules, to trigger DTV resizing before the switch to -+ the main malloc. */ -+ for (int i = 1; i <= 19; ++i) -+ { -+ char dso[30]; -+ snprintf (dso, sizeof (dso), "tst-tlsmod17a%d.so", i); -+ char sym[30]; -+ snprintf (sym, sizeof(sym), "tlsmod17a%d", i); -+ -+ void *handle = dlopen (dso, RTLD_LAZY); -+ if (handle == NULL) -+ { -+ printf ("error: dlmopen from auditor: %s\n", dlerror ()); -+ fflush (stdout); -+ _exit (1); -+ } -+ int (*func) (void) = dlsym (handle, sym); -+ if (func == NULL) -+ { -+ printf ("error: dlsym from auditor: %s\n", dlerror ()); -+ fflush (stdout); -+ _exit (1); -+ } -+ /* Trigger TLS allocation. */ -+ func (); -+ } -+ -+ puts ("info: TLS-using modules loaded from auditor"); -+ fflush (stdout); -+ -+ return LAV_CURRENT; -+} - -commit b3002f303cedb8262cbc1ec22999ea36482efa0e -Author: Florian Weimer -Date: Tue May 20 19:36:02 2025 +0200 - - support: Use const char * argument in support_capture_subprogram_self_sgid - - The function does not modify the passed-in string, so make this clear - via the prototype. - - Reviewed-by: Carlos O'Donell - (cherry picked from commit f0c09fe61678df6f7f18fe1ebff074e62fa5ca7a) - -diff --git a/support/capture_subprocess.h b/support/capture_subprocess.h -index 93b7245d2a..5406d9f6c0 100644 ---- a/support/capture_subprocess.h -+++ b/support/capture_subprocess.h -@@ -45,8 +45,7 @@ struct support_capture_subprocess support_capture_subprogram - /* Copy the running program into a setgid binary and run it with CHILD_ID - argument. If execution is successful, return the exit status of the child - program, otherwise return a non-zero failure exit code. */ --int support_capture_subprogram_self_sgid -- (char *child_id); -+int support_capture_subprogram_self_sgid (const char *child_id); - - /* Deallocate the subprocess data captured by - support_capture_subprocess. */ -diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c -index 53847194cb..2383481911 100644 ---- a/support/support_capture_subprocess.c -+++ b/support/support_capture_subprocess.c -@@ -110,7 +110,7 @@ support_capture_subprogram (const char *file, char *const argv[], - safely make it SGID with the TARGET group ID. Then runs the - executable. */ - static int --copy_and_spawn_sgid (char *child_id, gid_t gid) -+copy_and_spawn_sgid (const char *child_id, gid_t gid) - { - char *dirname = xasprintf ("%s/tst-tunables-setuid.%jd", - test_dir, (intmax_t) getpid ()); -@@ -182,7 +182,7 @@ copy_and_spawn_sgid (char *child_id, gid_t gid) - ret = 0; - infd = outfd = -1; - -- char * const args[] = {execname, child_id, NULL}; -+ char * const args[] = {execname, (char *) child_id, NULL}; - - status = support_subprogram_wait (args[0], args); - -@@ -211,7 +211,7 @@ err: - } - - int --support_capture_subprogram_self_sgid (char *child_id) -+support_capture_subprogram_self_sgid (const char *child_id) - { - gid_t target = 0; - const int count = 64; - -commit 61dcce21e06834f7248a8d516c9ec20788fc728c -Author: Florian Weimer -Date: Mon Dec 23 13:57:55 2024 +0100 - - support: Add support_record_failure_barrier - - This can be used to stop execution after a TEST_COMPARE_BLOB - failure, for example. - - (cherry picked from commit d0b8aa6de4529231fadfe604ac2c434e559c2d9e) - -diff --git a/support/check.h b/support/check.h -index 7ea22c7a2c..8f41e5b99f 100644 ---- a/support/check.h -+++ b/support/check.h -@@ -207,6 +207,9 @@ void support_record_failure_reset (void); - failures or not. */ - int support_record_failure_is_failed (void); - -+/* Terminate the process if any failures have been encountered so far. */ -+void support_record_failure_barrier (void); -+ - __END_DECLS - - #endif /* SUPPORT_CHECK_H */ -diff --git a/support/support_record_failure.c b/support/support_record_failure.c -index 978123701d..72ee2b232f 100644 ---- a/support/support_record_failure.c -+++ b/support/support_record_failure.c -@@ -112,3 +112,13 @@ support_record_failure_is_failed (void) - synchronization for reliable test error reporting anyway. */ - return __atomic_load_n (&state->failed, __ATOMIC_RELAXED); - } -+ -+void -+support_record_failure_barrier (void) -+{ -+ if (__atomic_load_n (&state->failed, __ATOMIC_RELAXED)) -+ { -+ puts ("error: exiting due to previous errors"); -+ exit (1); -+ } -+} - -commit 079ac4a172a8f6ba37acf1e80e57f5042d2c7561 -Author: Florian Weimer -Date: Tue May 20 19:45:06 2025 +0200 - - elf: Test case for bug 32976 (CVE-2025-4802) - - Check that LD_LIBRARY_PATH is ignored for AT_SECURE statically - linked binaries, using support_capture_subprogram_self_sgid. - - Reviewed-by: Carlos O'Donell - (cherry picked from commit d8f7a79335b0d861c12c42aec94c04cd5bb181e2) - -diff --git a/elf/Makefile b/elf/Makefile -index be64c59887..afd4eb6fdd 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -266,6 +266,7 @@ tests-static-normal := \ - tst-array1-static \ - tst-array5-static \ - tst-dl-iter-static \ -+ tst-dlopen-sgid \ - tst-dst-static \ - tst-env-setuid-static \ - tst-getauxval-static \ -@@ -859,6 +860,7 @@ modules-names += \ - tst-dlmopen-twice-mod1 \ - tst-dlmopen-twice-mod2 \ - tst-dlmopen1mod \ -+ tst-dlopen-sgid-mod \ - tst-dlopen-tlsreinitmod1 \ - tst-dlopen-tlsreinitmod2 \ - tst-dlopen-tlsreinitmod3 \ -@@ -3153,3 +3155,5 @@ $(objpfx)tst-dlopen-tlsreinit3.out: $(objpfx)tst-auditmod1.so - tst-dlopen-tlsreinit3-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so - $(objpfx)tst-dlopen-tlsreinit4.out: $(objpfx)tst-auditmod1.so - tst-dlopen-tlsreinit4-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so -+ -+$(objpfx)tst-dlopen-sgid.out: $(objpfx)tst-dlopen-sgid-mod.so -diff --git a/elf/tst-dlopen-sgid-mod.c b/elf/tst-dlopen-sgid-mod.c -new file mode 100644 -index 0000000000..5eb79eef48 ---- /dev/null -+++ b/elf/tst-dlopen-sgid-mod.c -@@ -0,0 +1 @@ -+/* Opening this object should not succeed. */ -diff --git a/elf/tst-dlopen-sgid.c b/elf/tst-dlopen-sgid.c -new file mode 100644 -index 0000000000..47829a405e ---- /dev/null -+++ b/elf/tst-dlopen-sgid.c -@@ -0,0 +1,104 @@ -+/* Test case for ignored LD_LIBRARY_PATH in static startug (bug 32976). -+ Copyright (C) 2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* This is the name of our test object. Use a custom module for -+ testing, so that this object does not get picked up from the system -+ path. */ -+static const char dso_name[] = "tst-dlopen-sgid-mod.so"; -+ -+/* Used to mark the recursive invocation. */ -+static const char magic_argument[] = "run-actual-test"; -+ -+static int -+do_test (void) -+{ -+/* Pathname of the directory that receives the shared objects this -+ test attempts to load. */ -+ char *libdir = support_create_temp_directory ("tst-dlopen-sgid-"); -+ -+ /* This is supposed to be ignored and stripped. */ -+ TEST_COMPARE (setenv ("LD_LIBRARY_PATH", libdir, 1), 0); -+ -+ /* Copy of libc.so.6. */ -+ { -+ char *from = xasprintf ("%s/%s", support_objdir_root, LIBC_SO); -+ char *to = xasprintf ("%s/%s", libdir, LIBC_SO); -+ add_temp_file (to); -+ support_copy_file (from, to); -+ free (to); -+ free (from); -+ } -+ -+ /* Copy of the test object. */ -+ { -+ char *from = xasprintf ("%s/elf/%s", support_objdir_root, dso_name); -+ char *to = xasprintf ("%s/%s", libdir, dso_name); -+ add_temp_file (to); -+ support_copy_file (from, to); -+ free (to); -+ free (from); -+ } -+ -+ TEST_COMPARE (support_capture_subprogram_self_sgid (magic_argument), 0); -+ -+ free (libdir); -+ -+ return 0; -+} -+ -+static void -+alternative_main (int argc, char **argv) -+{ -+ if (argc == 2 && strcmp (argv[1], magic_argument) == 0) -+ { -+ if (getgid () == getegid ()) -+ /* This can happen if the file system is mounted nosuid. */ -+ FAIL_UNSUPPORTED ("SGID failed: GID and EGID match (%jd)\n", -+ (intmax_t) getgid ()); -+ -+ /* Should be removed due to SGID. */ -+ TEST_COMPARE_STRING (getenv ("LD_LIBRARY_PATH"), NULL); -+ -+ TEST_VERIFY (dlopen (dso_name, RTLD_NOW) == NULL); -+ { -+ const char *message = dlerror (); -+ TEST_COMPARE_STRING (message, -+ "tst-dlopen-sgid-mod.so:" -+ " cannot open shared object file:" -+ " No such file or directory"); -+ } -+ -+ support_record_failure_barrier (); -+ exit (EXIT_SUCCESS); -+ } -+} -+ -+#define PREPARE alternative_main -+#include - -commit 56e75b810ac39b0e390be5b66397dca0cdfa4d80 -Author: Sunil K Pandey -Date: Tue May 20 10:07:27 2025 -0700 - - x86_64: Fix typo in ifunc-impl-list.c. - - Fix wcsncpy and wcpncpy typo in ifunc-impl-list.c. - - Reviewed-by: H.J. Lu - (cherry picked from commit f2aeb6ff941dccc4c777b5621e77addea6cc076c) - -diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c -index 0bbb71bbbf..3db45db39b 100644 ---- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c -+++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c -@@ -922,7 +922,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, - (CPU_FEATURE_USABLE (AVX2) - && CPU_FEATURE_USABLE (BMI2)), - __wcsncpy_avx2) -- X86_IFUNC_IMPL_ADD_V2 (array, i, wcpncpy, -+ X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncpy, - 1, - __wcsncpy_generic)) - -@@ -952,7 +952,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, - (CPU_FEATURE_USABLE (AVX2) - && CPU_FEATURE_USABLE (BMI2)), - __wcpncpy_avx2) -- X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncpy, -+ X86_IFUNC_IMPL_ADD_V2 (array, i, wcpncpy, - 1, - __wcpncpy_generic)) - - -commit c8e10f14328518954072df64aafd574e67cfdde5 -Author: Florian Weimer -Date: Wed May 21 08:43:32 2025 +0200 - - elf: Fix subprocess status handling for tst-dlopen-sgid (bug 32987) - - This should really move into support_capture_subprogram_self_sgid. - - Reviewed-by: Sam James - (cherry picked from commit 35fc356fa3b4f485bd3ba3114c9f774e5df7d3c2) - -diff --git a/NEWS b/NEWS -index 7a6985f5dd..4b290ad4bf 100644 ---- a/NEWS -+++ b/NEWS -@@ -23,6 +23,7 @@ The following bugs are resolved with this release: - [32245] glibc -Wstringop-overflow= build failure on hppa - [32470] x86: Avoid integer truncation with large cache sizes - [32810] Crash on x86-64 if XSAVEC disable via tunable -+ [32987] elf: Fix subprocess status handling for tst-dlopen-sgid - - Version 2.40 - -diff --git a/elf/tst-dlopen-sgid.c b/elf/tst-dlopen-sgid.c -index 47829a405e..5688b79f2e 100644 ---- a/elf/tst-dlopen-sgid.c -+++ b/elf/tst-dlopen-sgid.c -@@ -26,6 +26,8 @@ - #include - #include - #include -+#include -+#include - #include - - /* This is the name of our test object. Use a custom module for -@@ -66,10 +68,16 @@ do_test (void) - free (from); - } - -- TEST_COMPARE (support_capture_subprogram_self_sgid (magic_argument), 0); -- - free (libdir); - -+ int status = support_capture_subprogram_self_sgid (magic_argument); -+ -+ if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) -+ return EXIT_UNSUPPORTED; -+ -+ if (!WIFEXITED (status)) -+ FAIL_EXIT1 ("Unexpected exit status %d from child process\n", status); -+ - return 0; - } - - -commit 42a5a940c974d02540c8da26d6374c744d148cb9 -Author: Carlos O'Donell -Date: Wed Jun 11 09:19:17 2025 -0400 - - ppc64le: Revert "powerpc: Optimized strncmp for power10" (CVE-2025-5745) - - This reverts commit 23f0d81608d0ca6379894ef81670cf30af7fd081 - - Reason for revert: Power10 strncmp clobbers non-volatile vector - registers (Bug 33060) - - Tested on ppc64le with no regressions. - - (cherry picked from commit 63c60101ce7c5eac42be90f698ba02099b41b965) - -diff --git a/sysdeps/powerpc/powerpc64/le/power10/strncmp.S b/sysdeps/powerpc/powerpc64/le/power10/strncmp.S -deleted file mode 100644 -index d4ba76acae..0000000000 ---- a/sysdeps/powerpc/powerpc64/le/power10/strncmp.S -+++ /dev/null -@@ -1,271 +0,0 @@ --/* Optimized strncmp implementation for PowerPC64/POWER10. -- Copyright (C) 2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --#include -- --/* Implements the function -- -- int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t [r5] n) -- -- The implementation uses unaligned doubleword access to avoid specialized -- code paths depending of data alignment for first 32 bytes and uses -- vectorised loops after that. */ -- --#ifndef STRNCMP --# define STRNCMP strncmp --#endif -- --/* TODO: Change this to actual instructions when minimum binutils is upgraded -- to 2.27. Macros are defined below for these newer instructions in order -- to maintain compatibility. */ -- --#define LXVP(xtp,dq,ra) \ -- .long(((6)<<(32-6)) \ -- | ((((xtp)-32)>>1)<<(32-10)) \ -- | ((1)<<(32-11)) \ -- | ((ra)<<(32-16)) \ -- | dq) -- --#define COMPARE_16(vreg1,vreg2,offset) \ -- lxv vreg1+32,offset(r3); \ -- lxv vreg2+32,offset(r4); \ -- vcmpnezb. v7,vreg1,vreg2; \ -- bne cr6,L(different); \ -- cmpldi cr7,r5,16; \ -- ble cr7,L(ret0); \ -- addi r5,r5,-16; -- --#define COMPARE_32(vreg1,vreg2,offset,label1,label2) \ -- LXVP(vreg1+32,offset,r3); \ -- LXVP(vreg2+32,offset,r4); \ -- vcmpnezb. v7,vreg1+1,vreg2+1; \ -- bne cr6,L(label1); \ -- vcmpnezb. v7,vreg1,vreg2; \ -- bne cr6,L(label2); \ -- cmpldi cr7,r5,32; \ -- ble cr7,L(ret0); \ -- addi r5,r5,-32; -- --#define TAIL_FIRST_16B(vreg1,vreg2) \ -- vctzlsbb r6,v7; \ -- cmpld cr7,r5,r6; \ -- ble cr7,L(ret0); \ -- vextubrx r5,r6,vreg1; \ -- vextubrx r4,r6,vreg2; \ -- subf r3,r4,r5; \ -- blr; -- --#define TAIL_SECOND_16B(vreg1,vreg2) \ -- vctzlsbb r6,v7; \ -- addi r0,r6,16; \ -- cmpld cr7,r5,r0; \ -- ble cr7,L(ret0); \ -- vextubrx r5,r6,vreg1; \ -- vextubrx r4,r6,vreg2; \ -- subf r3,r4,r5; \ -- blr; -- --#define CHECK_N_BYTES(reg1,reg2,len_reg) \ -- sldi r6,len_reg,56; \ -- lxvl 32+v4,reg1,r6; \ -- lxvl 32+v5,reg2,r6; \ -- add reg1,reg1,len_reg; \ -- add reg2,reg2,len_reg; \ -- vcmpnezb v7,v4,v5; \ -- vctzlsbb r6,v7; \ -- cmpld cr7,r6,len_reg; \ -- blt cr7,L(different); \ -- cmpld cr7,r5,len_reg; \ -- ble cr7,L(ret0); \ -- sub r5,r5,len_reg; \ -- -- /* TODO: change this to .machine power10 when the minimum required -- binutils allows it. */ -- .machine power9 --ENTRY_TOCLESS (STRNCMP, 4) -- /* Check if size is 0. */ -- cmpdi cr0,r5,0 -- beq cr0,L(ret0) -- andi. r7,r3,4095 -- andi. r8,r4,4095 -- cmpldi cr0,r7,4096-16 -- cmpldi cr1,r8,4096-16 -- bgt cr0,L(crosses) -- bgt cr1,L(crosses) -- COMPARE_16(v4,v5,0) -- addi r3,r3,16 -- addi r4,r4,16 -- --L(crosses): -- andi. r7,r3,15 -- subfic r7,r7,16 /* r7(nalign1) = 16 - (str1 & 15). */ -- andi. r9,r4,15 -- subfic r8,r9,16 /* r8(nalign2) = 16 - (str2 & 15). */ -- cmpld cr7,r7,r8 -- beq cr7,L(same_aligned) -- blt cr7,L(nalign1_min) -- -- /* nalign2 is minimum and s2 pointer is aligned. */ -- CHECK_N_BYTES(r3,r4,r8) -- /* Are we on the 64B hunk which crosses a page? */ -- andi. r10,r3,63 /* Determine offset into 64B hunk. */ -- andi. r8,r3,15 /* The offset into the 16B hunk. */ -- neg r7,r3 -- andi. r9,r7,15 /* Number of bytes after a 16B cross. */ -- rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */ -- beq L(compare_64_pagecross) -- mtctr r7 -- b L(compare_64B_unaligned) -- -- /* nalign1 is minimum and s1 pointer is aligned. */ --L(nalign1_min): -- CHECK_N_BYTES(r3,r4,r7) -- /* Are we on the 64B hunk which crosses a page? */ -- andi. r10,r4,63 /* Determine offset into 64B hunk. */ -- andi. r8,r4,15 /* The offset into the 16B hunk. */ -- neg r7,r4 -- andi. r9,r7,15 /* Number of bytes after a 16B cross. */ -- rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */ -- beq L(compare_64_pagecross) -- mtctr r7 -- -- .p2align 5 --L(compare_64B_unaligned): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- COMPARE_16(v4,v5,48) -- addi r3,r3,64 -- addi r4,r4,64 -- bdnz L(compare_64B_unaligned) -- -- /* Cross the page boundary of s2, carefully. Only for first -- iteration we have to get the count of 64B blocks to be checked. -- From second iteration and beyond, loop counter is always 63. */ --L(compare_64_pagecross): -- li r11, 63 -- mtctr r11 -- cmpldi r10,16 -- ble L(cross_4) -- cmpldi r10,32 -- ble L(cross_3) -- cmpldi r10,48 -- ble L(cross_2) --L(cross_1): -- CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- addi r3,r3,48 -- addi r4,r4,48 -- b L(compare_64B_unaligned) --L(cross_2): -- COMPARE_16(v4,v5,0) -- addi r3,r3,16 -- addi r4,r4,16 -- CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- addi r3,r3,32 -- addi r4,r4,32 -- b L(compare_64B_unaligned) --L(cross_3): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- addi r3,r3,32 -- addi r4,r4,32 -- CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- COMPARE_16(v4,v5,0) -- addi r3,r3,16 -- addi r4,r4,16 -- b L(compare_64B_unaligned) --L(cross_4): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- addi r3,r3,48 -- addi r4,r4,48 -- CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- b L(compare_64B_unaligned) -- --L(same_aligned): -- CHECK_N_BYTES(r3,r4,r7) -- /* Align s1 to 32B and adjust s2 address. -- Use lxvp only if both s1 and s2 are 32B aligned. */ -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- COMPARE_16(v4,v5,48) -- addi r3,r3,64 -- addi r4,r4,64 -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- addi r5,r5,32 -- -- clrldi r6,r3,59 -- subfic r7,r6,32 -- add r3,r3,r7 -- add r4,r4,r7 -- subf r5,r7,r5 -- andi. r7,r4,0x1F -- beq cr0,L(32B_aligned_loop) -- -- .p2align 5 --L(16B_aligned_loop): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- COMPARE_16(v4,v5,48) -- addi r3,r3,64 -- addi r4,r4,64 -- b L(16B_aligned_loop) -- -- /* Calculate and return the difference. */ --L(different): -- TAIL_FIRST_16B(v4,v5) -- -- .p2align 5 --L(32B_aligned_loop): -- COMPARE_32(v14,v16,0,tail1,tail2) -- COMPARE_32(v18,v20,32,tail3,tail4) -- COMPARE_32(v22,v24,64,tail5,tail6) -- COMPARE_32(v26,v28,96,tail7,tail8) -- addi r3,r3,128 -- addi r4,r4,128 -- b L(32B_aligned_loop) -- --L(tail1): TAIL_FIRST_16B(v15,v17) --L(tail2): TAIL_SECOND_16B(v14,v16) --L(tail3): TAIL_FIRST_16B(v19,v21) --L(tail4): TAIL_SECOND_16B(v18,v20) --L(tail5): TAIL_FIRST_16B(v23,v25) --L(tail6): TAIL_SECOND_16B(v22,v24) --L(tail7): TAIL_FIRST_16B(v27,v29) --L(tail8): TAIL_SECOND_16B(v26,v28) -- -- .p2align 5 --L(ret0): -- li r3,0 -- blr -- --END(STRNCMP) --libc_hidden_builtin_def(strncmp) -diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile -index b847c19049..a38ff46448 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/Makefile -+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile -@@ -34,7 +34,7 @@ ifneq (,$(filter %le,$(config-machine))) - sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \ - memmove-power10 memset-power10 rawmemchr-power9 \ - rawmemchr-power10 strcmp-power9 strcmp-power10 \ -- strncmp-power9 strncmp-power10 strcpy-power9 stpcpy-power9 \ -+ strncmp-power9 strcpy-power9 stpcpy-power9 \ - strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 - endif - CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops -diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -index 2bb47d3527..30fd89e109 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -+++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -@@ -164,9 +164,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, - /* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c. */ - IFUNC_IMPL (i, name, strncmp, - #ifdef __LITTLE_ENDIAN__ -- IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_1 -- && hwcap & PPC_FEATURE_HAS_VSX, -- __strncmp_power10) - IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00 - && hwcap & PPC_FEATURE_HAS_ALTIVEC, - __strncmp_power9) -diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S -deleted file mode 100644 -index d7026c12e2..0000000000 ---- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S -+++ /dev/null -@@ -1,25 +0,0 @@ --/* Copyright (C) 2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --#if defined __LITTLE_ENDIAN__ && IS_IN (libc) --#define STRNCMP __strncmp_power10 -- --#undef libc_hidden_builtin_def --#define libc_hidden_builtin_def(name) -- --#include --#endif -diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c -index a5ed67f766..6178f4a432 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c -+++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c -@@ -29,7 +29,6 @@ extern __typeof (strncmp) __strncmp_ppc attribute_hidden; - extern __typeof (strncmp) __strncmp_power8 attribute_hidden; - # ifdef __LITTLE_ENDIAN__ - extern __typeof (strncmp) __strncmp_power9 attribute_hidden; --extern __typeof (strncmp) __strncmp_power10 attribute_hidden; - # endif - # undef strncmp - -@@ -37,9 +36,6 @@ extern __typeof (strncmp) __strncmp_power10 attribute_hidden; - ifunc symbol properly. */ - libc_ifunc_redirected (__redirect_strncmp, strncmp, - # ifdef __LITTLE_ENDIAN__ -- (hwcap2 & PPC_FEATURE2_ARCH_3_1 -- && hwcap & PPC_FEATURE_HAS_VSX) -- ? __strncmp_power10 : - (hwcap2 & PPC_FEATURE2_ARCH_3_00 - && hwcap & PPC_FEATURE_HAS_ALTIVEC) - ? __strncmp_power9 : - -commit 2ad6e55ea5cb23af5af7af35d5f80cd93032f96a -Author: Carlos O'Donell -Date: Wed Jun 11 09:43:50 2025 -0400 - - ppc64le: Revert "powerpc: Fix performance issues of strcmp power10" (CVE-2025-5702) - - This reverts commit 90bcc8721ef82b7378d2b080141228660e862d56 - - This change is in the chain of the final revert that fixes the CVE - i.e. 3367d8e180848030d1646f088759f02b8dfe0d6f - - Reason for revert: Power10 strcmp clobbers non-volatile vector - registers (Bug 33056) - - Tested on ppc64le with no regressions. - - (cherry picked from commit c22de63588df7a8a0edceea9bb02534064c9d201) - -diff --git a/sysdeps/powerpc/powerpc64/le/power10/strcmp.S b/sysdeps/powerpc/powerpc64/le/power10/strcmp.S -index f0d6732a25..00f1e9c170 100644 ---- a/sysdeps/powerpc/powerpc64/le/power10/strcmp.S -+++ b/sysdeps/powerpc/powerpc64/le/power10/strcmp.S -@@ -62,7 +62,7 @@ - lxvl 32+v5,reg2,r0; \ - add reg1,reg1,len_reg; \ - add reg2,reg2,len_reg; \ -- vcmpnezb v7,v4,v5; \ -+ vcmpnezb. v7,v4,v5; \ - vctzlsbb r6,v7; \ - cmpld cr7,r6,len_reg; \ - blt cr7,L(different); \ -@@ -72,110 +72,70 @@ - - .machine power9 - ENTRY_TOCLESS (STRCMP, 4) -- andi. r7,r3,4095 -- andi. r8,r4,4095 -- cmpldi cr0,r7,4096-16 -- cmpldi cr1,r8,4096-16 -- bgt cr0,L(crosses) -- bgt cr1,L(crosses) -- COMPARE_16(v4,v5,0) -- --L(crosses): -- andi. r7,r3,15 -- subfic r7,r7,16 /* r7(nalign1) = 16 - (str1 & 15). */ -- andi. r9,r4,15 -- subfic r5,r9,16 /* r5(nalign2) = 16 - (str2 & 15). */ -- cmpld cr7,r7,r5 -- beq cr7,L(same_aligned) -- blt cr7,L(nalign1_min) -+ li r11,16 -+ /* eq bit of cr1 used as swap status flag to indicate if -+ source pointers were swapped. */ -+ crclr 4*cr1+eq -+ vspltisb v19,-1 -+ andi. r7,r3,15 -+ sub r7,r11,r7 /* r7(nalign1) = 16 - (str1 & 15). */ -+ andi. r9,r4,15 -+ sub r5,r11,r9 /* r5(nalign2) = 16 - (str2 & 15). */ -+ cmpld cr7,r7,r5 -+ beq cr7,L(same_aligned) -+ blt cr7,L(nalign1_min) -+ /* Swap r3 and r4, and r7 and r5 such that r3 and r7 hold the -+ pointer which is closer to the next 16B boundary so that only -+ one CHECK_N_BYTES is needed before entering the loop below. */ -+ mr r8,r4 -+ mr r4,r3 -+ mr r3,r8 -+ mr r12,r7 -+ mr r7,r5 -+ mr r5,r12 -+ crset 4*cr1+eq /* Set bit on swapping source pointers. */ - -- /* nalign2 is minimum and s2 pointer is aligned. */ -- CHECK_N_BYTES(r3,r4,r5) -- /* Are we on the 64B hunk which crosses a page? */ -- andi. r10,r3,63 /* Determine offset into 64B hunk. */ -- andi. r8,r3,15 /* The offset into the 16B hunk. */ -- neg r7,r3 -- andi. r9,r7,15 /* Number of bytes after a 16B cross. */ -- rlwinm. r7,r7,26,0x3F /* ((r3-4096))>>6&63. */ -- beq L(compare_64_pagecross) -- mtctr r7 -- b L(compare_64B_unaligned) -- -- /* nalign1 is minimum and s1 pointer is aligned. */ -+ .p2align 5 - L(nalign1_min): - CHECK_N_BYTES(r3,r4,r7) -- /* Are we on the 64B hunk which crosses a page? */ -- andi. r10,r4,63 /* Determine offset into 64B hunk. */ -- andi. r8,r4,15 /* The offset into the 16B hunk. */ -- neg r7,r4 -- andi. r9,r7,15 /* Number of bytes after a 16B cross. */ -- rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */ -- beq L(compare_64_pagecross) -- mtctr r7 - - .p2align 5 --L(compare_64B_unaligned): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- COMPARE_16(v4,v5,48) -- addi r3,r3,64 -- addi r4,r4,64 -- bdnz L(compare_64B_unaligned) -+L(s1_aligned): -+ /* r9 and r5 is number of bytes to be read after and before -+ page boundary correspondingly. */ -+ sub r5,r5,r7 -+ subfic r9,r5,16 -+ /* Now let r7 hold the count of quadwords which can be -+ checked without crossing a page boundary. quadword offset is -+ (str2>>4)&0xFF. */ -+ rlwinm r7,r4,28,0xFF -+ /* Below check is required only for first iteration. For second -+ iteration and beyond, the new loop counter is always 255. */ -+ cmpldi r7,255 -+ beq L(L3) -+ /* Get the initial loop count by 255-((str2>>4)&0xFF). */ -+ subfic r11,r7,255 - -- /* Cross the page boundary of s2, carefully. Only for first -- iteration we have to get the count of 64B blocks to be checked. -- From second iteration and beyond, loop counter is always 63. */ --L(compare_64_pagecross): -- li r11, 63 -+ .p2align 5 -+L(L1): - mtctr r11 -- cmpldi r10,16 -- ble L(cross_4) -- cmpldi r10,32 -- ble L(cross_3) -- cmpldi r10,48 -- ble L(cross_2) --L(cross_1): -- CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- addi r3,r3,48 -- addi r4,r4,48 -- b L(compare_64B_unaligned) --L(cross_2): -- COMPARE_16(v4,v5,0) -- addi r3,r3,16 -- addi r4,r4,16 -- CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- addi r3,r3,32 -- addi r4,r4,32 -- b L(compare_64B_unaligned) --L(cross_3): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- addi r3,r3,32 -- addi r4,r4,32 -- CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- COMPARE_16(v4,v5,0) -+ -+ .p2align 5 -+L(L2): -+ COMPARE_16(v4,v5,0) /* Load 16B blocks using lxv. */ - addi r3,r3,16 - addi r4,r4,16 -- b L(compare_64B_unaligned) --L(cross_4): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- addi r3,r3,48 -- addi r4,r4,48 -+ bdnz L(L2) -+ /* Cross the page boundary of s2, carefully. */ -+ -+ .p2align 5 -+L(L3): -+ CHECK_N_BYTES(r3,r4,r5) - CHECK_N_BYTES(r3,r4,r9) -- CHECK_N_BYTES(r3,r4,r8) -- b L(compare_64B_unaligned) -+ li r11,255 /* Load the new loop counter. */ -+ b L(L1) - -+ .p2align 5 - L(same_aligned): - CHECK_N_BYTES(r3,r4,r7) - /* Align s1 to 32B and adjust s2 address. -@@ -208,7 +168,18 @@ L(16B_aligned_loop): - - /* Calculate and return the difference. */ - L(different): -- TAIL(v4,v5) -+ vctzlsbb r6,v7 -+ vextubrx r5,r6,v4 -+ vextubrx r4,r6,v5 -+ bt 4*cr1+eq,L(swapped) -+ subf r3,r4,r5 -+ blr -+ -+ /* If src pointers were swapped, then swap the -+ indices and calculate the return value. */ -+L(swapped): -+ subf r3,r5,r4 -+ blr - - .p2align 5 - L(32B_aligned_loop): - -commit 672f31b90e501b4ba10ba12ab4c6051f77589912 -Author: Carlos O'Donell -Date: Wed Jun 11 09:33:45 2025 -0400 - - ppc64le: Revert "powerpc : Add optimized memchr for POWER10" (Bug 33059) - - This reverts commit b9182c793caa05df5d697427c0538936e6396d4b - - Reason for revert: Power10 memchr clobbers v20 vector register - (Bug 33059) - - This is not a security issue, unlike CVE-2025-5745 and - CVE-2025-5702. - - Tested on ppc64le without regression. - - (cherry picked from commit a7877bb6685300f159fa095c9f50b22b112cddb8) - -diff --git a/sysdeps/powerpc/powerpc64/le/power10/memchr.S b/sysdeps/powerpc/powerpc64/le/power10/memchr.S -deleted file mode 100644 -index 53e5716d72..0000000000 ---- a/sysdeps/powerpc/powerpc64/le/power10/memchr.S -+++ /dev/null -@@ -1,315 +0,0 @@ --/* Optimized memchr implementation for POWER10 LE. -- Copyright (C) 2021-2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --#include -- --# ifndef MEMCHR --# define MEMCHR __memchr --# endif --# define M_VREG_ZERO v20 --# define M_OFF_START_LOOP 256 --# define MEMCHR_SUBTRACT_VECTORS \ -- vsububm v4,v4,v18; \ -- vsububm v5,v5,v18; \ -- vsububm v6,v6,v18; \ -- vsububm v7,v7,v18; --# define M_TAIL(vreg,increment) \ -- vctzlsbb r4,vreg; \ -- cmpld r5,r4; \ -- ble L(null); \ -- addi r4,r4,increment; \ -- add r3,r6,r4; \ -- blr -- --/* TODO: Replace macros by the actual instructions when minimum binutils becomes -- >= 2.35. This is used to keep compatibility with older versions. */ --#define M_VEXTRACTBM(rt,vrb) \ -- .long(((4)<<(32-6)) \ -- | ((rt)<<(32-11)) \ -- | ((8)<<(32-16)) \ -- | ((vrb)<<(32-21)) \ -- | 1602) -- --#define M_LXVP(xtp,dq,ra) \ -- .long(((6)<<(32-6)) \ -- | ((((xtp)-32)>>1)<<(32-10)) \ -- | ((1)<<(32-11)) \ -- | ((ra)<<(32-16)) \ -- | dq) -- --#define CHECK16B(vreg,offset,addr,label) \ -- lxv vreg+32,offset(addr); \ -- vcmpequb. vreg,vreg,v18; \ -- bne cr6,L(label); \ -- cmpldi r5,16; \ -- ble L(null); \ -- addi r5,r5,-16; -- --/* Load 4 quadwords, merge into one VR for speed and check for NULLs. r6 has # -- of bytes already checked. */ --#define CHECK64B(offset,addr,label) \ -- M_LXVP(v4+32,offset,addr); \ -- M_LXVP(v6+32,offset+32,addr); \ -- MEMCHR_SUBTRACT_VECTORS; \ -- vminub v14,v4,v5; \ -- vminub v15,v6,v7; \ -- vminub v16,v14,v15; \ -- vcmpequb. v0,v16,M_VREG_ZERO; \ -- beq cr6,$+12; \ -- li r7,offset; \ -- b L(label); \ -- cmpldi r5,64; \ -- ble L(null); \ -- addi r5,r5,-64 -- --/* Implements the function -- void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5]). */ -- -- .machine power9 -- --ENTRY_TOCLESS (MEMCHR) -- CALL_MCOUNT 3 -- -- cmpldi r5,0 -- beq L(null) -- mr r0,r5 -- xori r6,r4,0xff -- -- mtvsrd v18+32,r4 /* matching char in v18 */ -- mtvsrd v19+32,r6 /* non matching char in v19 */ -- -- vspltb v18,v18,7 /* replicate */ -- vspltb v19,v19,7 /* replicate */ -- vspltisb M_VREG_ZERO,0 -- -- /* Next 16B-aligned address. Prepare address for L(aligned). */ -- addi r6,r3,16 -- clrrdi r6,r6,4 -- -- /* Align data and fill bytes not loaded with non matching char. */ -- lvx v0,0,r3 -- lvsr v1,0,r3 -- vperm v0,v19,v0,v1 -- -- vcmpequb. v6,v0,v18 -- bne cr6,L(found) -- sub r4,r6,r3 -- cmpld r5,r4 -- ble L(null) -- sub r5,r5,r4 -- -- /* Test up to OFF_START_LOOP-16 bytes in 16B chunks. The main loop is -- optimized for longer strings, so checking the first bytes in 16B -- chunks benefits a lot small strings. */ -- .p2align 5 --L(aligned): -- cmpldi r5,0 -- beq L(null) -- -- CHECK16B(v0,0,r6,tail1) -- CHECK16B(v1,16,r6,tail2) -- CHECK16B(v2,32,r6,tail3) -- CHECK16B(v3,48,r6,tail4) -- CHECK16B(v4,64,r6,tail5) -- CHECK16B(v5,80,r6,tail6) -- CHECK16B(v6,96,r6,tail7) -- CHECK16B(v7,112,r6,tail8) -- CHECK16B(v8,128,r6,tail9) -- CHECK16B(v9,144,r6,tail10) -- CHECK16B(v10,160,r6,tail11) -- CHECK16B(v0,176,r6,tail12) -- CHECK16B(v1,192,r6,tail13) -- CHECK16B(v2,208,r6,tail14) -- CHECK16B(v3,224,r6,tail15) -- -- cmpdi cr5,r4,0 /* Check if c == 0. This will be useful to -- choose how we will perform the main loop. */ -- -- /* Prepare address for the loop. */ -- addi r4,r3,M_OFF_START_LOOP -- clrrdi r4,r4,6 -- sub r6,r4,r3 -- sub r5,r0,r6 -- addi r6,r4,128 -- -- /* If c == 0, use the loop without the vsububm. */ -- beq cr5,L(loop) -- -- /* This is very similar to the block after L(loop), the difference is -- that here MEMCHR_SUBTRACT_VECTORS is not empty, and we subtract -- each byte loaded by the char we are looking for, this way we can keep -- using vminub to merge the results and checking for nulls. */ -- .p2align 5 --L(memchr_loop): -- CHECK64B(0,r4,pre_tail_64b) -- CHECK64B(64,r4,pre_tail_64b) -- addi r4,r4,256 -- -- CHECK64B(0,r6,tail_64b) -- CHECK64B(64,r6,tail_64b) -- addi r6,r6,256 -- -- CHECK64B(0,r4,pre_tail_64b) -- CHECK64B(64,r4,pre_tail_64b) -- addi r4,r4,256 -- -- CHECK64B(0,r6,tail_64b) -- CHECK64B(64,r6,tail_64b) -- addi r6,r6,256 -- -- b L(memchr_loop) -- /* Switch to a more aggressive approach checking 64B each time. Use 2 -- pointers 128B apart and unroll the loop once to make the pointer -- updates and usages separated enough to avoid stalls waiting for -- address calculation. */ -- .p2align 5 --L(loop): --#undef MEMCHR_SUBTRACT_VECTORS --#define MEMCHR_SUBTRACT_VECTORS /* nothing */ -- CHECK64B(0,r4,pre_tail_64b) -- CHECK64B(64,r4,pre_tail_64b) -- addi r4,r4,256 -- -- CHECK64B(0,r6,tail_64b) -- CHECK64B(64,r6,tail_64b) -- addi r6,r6,256 -- -- CHECK64B(0,r4,pre_tail_64b) -- CHECK64B(64,r4,pre_tail_64b) -- addi r4,r4,256 -- -- CHECK64B(0,r6,tail_64b) -- CHECK64B(64,r6,tail_64b) -- addi r6,r6,256 -- -- b L(loop) -- -- .p2align 5 --L(pre_tail_64b): -- mr r6,r4 --L(tail_64b): -- /* OK, we found a null byte. Let's look for it in the current 64-byte -- block and mark it in its corresponding VR. lxvp vx,0(ry) puts the -- low 16B bytes into vx+1, and the high into vx, so the order here is -- v5, v4, v7, v6. */ -- vcmpequb v1,v5,M_VREG_ZERO -- vcmpequb v2,v4,M_VREG_ZERO -- vcmpequb v3,v7,M_VREG_ZERO -- vcmpequb v4,v6,M_VREG_ZERO -- -- /* Take into account the other 64B blocks we had already checked. */ -- add r6,r6,r7 -- /* Extract first bit of each byte. */ -- M_VEXTRACTBM(r8,v1) -- M_VEXTRACTBM(r9,v2) -- M_VEXTRACTBM(r10,v3) -- M_VEXTRACTBM(r11,v4) -- -- /* Shift each value into their corresponding position. */ -- sldi r9,r9,16 -- sldi r10,r10,32 -- sldi r11,r11,48 -- -- /* Merge the results. */ -- or r8,r8,r9 -- or r9,r10,r11 -- or r11,r9,r8 -- -- cnttzd r0,r11 /* Count trailing zeros before the match. */ -- cmpld r5,r0 -- ble L(null) -- add r3,r6,r0 /* Compute final address. */ -- blr -- -- .p2align 5 --L(tail1): -- M_TAIL(v0,0) -- -- .p2align 5 --L(tail2): -- M_TAIL(v1,16) -- -- .p2align 5 --L(tail3): -- M_TAIL(v2,32) -- -- .p2align 5 --L(tail4): -- M_TAIL(v3,48) -- -- .p2align 5 --L(tail5): -- M_TAIL(v4,64) -- -- .p2align 5 --L(tail6): -- M_TAIL(v5,80) -- -- .p2align 5 --L(tail7): -- M_TAIL(v6,96) -- -- .p2align 5 --L(tail8): -- M_TAIL(v7,112) -- -- .p2align 5 --L(tail9): -- M_TAIL(v8,128) -- -- .p2align 5 --L(tail10): -- M_TAIL(v9,144) -- -- .p2align 5 --L(tail11): -- M_TAIL(v10,160) -- -- .p2align 5 --L(tail12): -- M_TAIL(v0,176) -- -- .p2align 5 --L(tail13): -- M_TAIL(v1,192) -- -- .p2align 5 --L(tail14): -- M_TAIL(v2,208) -- -- .p2align 5 --L(tail15): -- M_TAIL(v3,224) -- -- .p2align 5 --L(found): -- vctzlsbb r7,v6 -- cmpld r5,r7 -- ble L(null) -- add r3,r3,r7 -- blr -- -- .p2align 5 --L(null): -- li r3,0 -- blr -- --END (MEMCHR) -- --weak_alias (__memchr, memchr) --libc_hidden_builtin_def (memchr) -diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile -index a38ff46448..fa1107dfd9 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/Makefile -+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile -@@ -31,10 +31,10 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ - strncase-power8 - - ifneq (,$(filter %le,$(config-machine))) --sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \ -- memmove-power10 memset-power10 rawmemchr-power9 \ -- rawmemchr-power10 strcmp-power9 strcmp-power10 \ -- strncmp-power9 strcpy-power9 stpcpy-power9 \ -+sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \ -+ rawmemchr-power9 rawmemchr-power10 \ -+ strcmp-power9 strcmp-power10 strncmp-power9 \ -+ strcpy-power9 stpcpy-power9 \ - strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 - endif - CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops -diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -index 30fd89e109..9b3e617306 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -+++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -@@ -226,12 +226,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, - - /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */ - IFUNC_IMPL (i, name, memchr, --#ifdef __LITTLE_ENDIAN__ -- IFUNC_IMPL_ADD (array, i, memchr, -- hwcap2 & PPC_FEATURE2_ARCH_3_1 -- && hwcap & PPC_FEATURE_HAS_VSX, -- __memchr_power10) --#endif - IFUNC_IMPL_ADD (array, i, memchr, - hwcap2 & PPC_FEATURE2_ARCH_2_07 - && hwcap & PPC_FEATURE_HAS_ALTIVEC, -diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S -deleted file mode 100644 -index 7d35ef28a9..0000000000 ---- a/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S -+++ /dev/null -@@ -1,28 +0,0 @@ --/* Optimized memchr implementation for POWER10/PPC64. -- Copyright (C) 2016-2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --#if defined __LITTLE_ENDIAN__ && IS_IN (libc) --#define MEMCHR __memchr_power10 -- --#undef libc_hidden_builtin_def --#define libc_hidden_builtin_def(name) --#undef weak_alias --#define weak_alias(name,alias) -- --#include --#endif -diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c -index 57d23e7b18..b4655dfcaa 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c -+++ b/sysdeps/powerpc/powerpc64/multiarch/memchr.c -@@ -25,23 +25,15 @@ extern __typeof (__memchr) __memchr_ppc attribute_hidden; - extern __typeof (__memchr) __memchr_power7 attribute_hidden; - extern __typeof (__memchr) __memchr_power8 attribute_hidden; - --# ifdef __LITTLE_ENDIAN__ --extern __typeof (__memchr) __memchr_power10 attribute_hidden; --# endif - /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle - ifunc symbol properly. */ - libc_ifunc (__memchr, --# ifdef __LITTLE_ENDIAN__ -- (hwcap2 & PPC_FEATURE2_ARCH_3_1 -- && hwcap & PPC_FEATURE_HAS_VSX) -- ? __memchr_power10 : --# endif -- (hwcap2 & PPC_FEATURE2_ARCH_2_07 -- && hwcap & PPC_FEATURE_HAS_ALTIVEC) -- ? __memchr_power8 : -- (hwcap & PPC_FEATURE_ARCH_2_06) -- ? __memchr_power7 -- : __memchr_ppc); -+ (hwcap2 & PPC_FEATURE2_ARCH_2_07 -+ && hwcap & PPC_FEATURE_HAS_ALTIVEC) -+ ? __memchr_power8 : -+ (hwcap & PPC_FEATURE_ARCH_2_06) -+ ? __memchr_power7 -+ : __memchr_ppc); - - weak_alias (__memchr, memchr) - libc_hidden_builtin_def (memchr) - -commit 7e12550b8e3a11764a4a9090ce6bd3fc23fc8a8e -Author: Carlos O'Donell -Date: Mon Jun 16 13:09:57 2025 -0400 - - ppc64le: Revert "powerpc: Optimized strcmp for power10" (CVE-2025-5702) - - This reverts commit 3367d8e180848030d1646f088759f02b8dfe0d6f - - Reason for revert: Power10 strcmp clobbers non-volatile vector - registers (Bug 33056) - - Tested on ppc64le without regression. - - (cherry picked from commit 15808c77b35319e67ee0dc8f984a9a1a434701bc) - -diff --git a/sysdeps/powerpc/powerpc64/le/power10/strcmp.S b/sysdeps/powerpc/powerpc64/le/power10/strcmp.S -deleted file mode 100644 -index 00f1e9c170..0000000000 ---- a/sysdeps/powerpc/powerpc64/le/power10/strcmp.S -+++ /dev/null -@@ -1,204 +0,0 @@ --/* Optimized strcmp implementation for PowerPC64/POWER10. -- Copyright (C) 2021-2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ --#include -- --#ifndef STRCMP --# define STRCMP strcmp --#endif -- --/* Implements the function -- int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]). */ -- --/* TODO: Change this to actual instructions when minimum binutils is upgraded -- to 2.27. Macros are defined below for these newer instructions in order -- to maintain compatibility. */ -- --#define LXVP(xtp,dq,ra) \ -- .long(((6)<<(32-6)) \ -- | ((((xtp)-32)>>1)<<(32-10)) \ -- | ((1)<<(32-11)) \ -- | ((ra)<<(32-16)) \ -- | dq) -- --#define COMPARE_16(vreg1,vreg2,offset) \ -- lxv vreg1+32,offset(r3); \ -- lxv vreg2+32,offset(r4); \ -- vcmpnezb. v7,vreg1,vreg2; \ -- bne cr6,L(different); \ -- --#define COMPARE_32(vreg1,vreg2,offset,label1,label2) \ -- LXVP(vreg1+32,offset,r3); \ -- LXVP(vreg2+32,offset,r4); \ -- vcmpnezb. v7,vreg1+1,vreg2+1; \ -- bne cr6,L(label1); \ -- vcmpnezb. v7,vreg1,vreg2; \ -- bne cr6,L(label2); \ -- --#define TAIL(vreg1,vreg2) \ -- vctzlsbb r6,v7; \ -- vextubrx r5,r6,vreg1; \ -- vextubrx r4,r6,vreg2; \ -- subf r3,r4,r5; \ -- blr; \ -- --#define CHECK_N_BYTES(reg1,reg2,len_reg) \ -- sldi r0,len_reg,56; \ -- lxvl 32+v4,reg1,r0; \ -- lxvl 32+v5,reg2,r0; \ -- add reg1,reg1,len_reg; \ -- add reg2,reg2,len_reg; \ -- vcmpnezb. v7,v4,v5; \ -- vctzlsbb r6,v7; \ -- cmpld cr7,r6,len_reg; \ -- blt cr7,L(different); \ -- -- /* TODO: change this to .machine power10 when the minimum required -- binutils allows it. */ -- -- .machine power9 --ENTRY_TOCLESS (STRCMP, 4) -- li r11,16 -- /* eq bit of cr1 used as swap status flag to indicate if -- source pointers were swapped. */ -- crclr 4*cr1+eq -- vspltisb v19,-1 -- andi. r7,r3,15 -- sub r7,r11,r7 /* r7(nalign1) = 16 - (str1 & 15). */ -- andi. r9,r4,15 -- sub r5,r11,r9 /* r5(nalign2) = 16 - (str2 & 15). */ -- cmpld cr7,r7,r5 -- beq cr7,L(same_aligned) -- blt cr7,L(nalign1_min) -- /* Swap r3 and r4, and r7 and r5 such that r3 and r7 hold the -- pointer which is closer to the next 16B boundary so that only -- one CHECK_N_BYTES is needed before entering the loop below. */ -- mr r8,r4 -- mr r4,r3 -- mr r3,r8 -- mr r12,r7 -- mr r7,r5 -- mr r5,r12 -- crset 4*cr1+eq /* Set bit on swapping source pointers. */ -- -- .p2align 5 --L(nalign1_min): -- CHECK_N_BYTES(r3,r4,r7) -- -- .p2align 5 --L(s1_aligned): -- /* r9 and r5 is number of bytes to be read after and before -- page boundary correspondingly. */ -- sub r5,r5,r7 -- subfic r9,r5,16 -- /* Now let r7 hold the count of quadwords which can be -- checked without crossing a page boundary. quadword offset is -- (str2>>4)&0xFF. */ -- rlwinm r7,r4,28,0xFF -- /* Below check is required only for first iteration. For second -- iteration and beyond, the new loop counter is always 255. */ -- cmpldi r7,255 -- beq L(L3) -- /* Get the initial loop count by 255-((str2>>4)&0xFF). */ -- subfic r11,r7,255 -- -- .p2align 5 --L(L1): -- mtctr r11 -- -- .p2align 5 --L(L2): -- COMPARE_16(v4,v5,0) /* Load 16B blocks using lxv. */ -- addi r3,r3,16 -- addi r4,r4,16 -- bdnz L(L2) -- /* Cross the page boundary of s2, carefully. */ -- -- .p2align 5 --L(L3): -- CHECK_N_BYTES(r3,r4,r5) -- CHECK_N_BYTES(r3,r4,r9) -- li r11,255 /* Load the new loop counter. */ -- b L(L1) -- -- .p2align 5 --L(same_aligned): -- CHECK_N_BYTES(r3,r4,r7) -- /* Align s1 to 32B and adjust s2 address. -- Use lxvp only if both s1 and s2 are 32B aligned. */ -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- COMPARE_16(v4,v5,48) -- addi r3,r3,64 -- addi r4,r4,64 -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- -- clrldi r6,r3,59 -- subfic r5,r6,32 -- add r3,r3,r5 -- add r4,r4,r5 -- andi. r5,r4,0x1F -- beq cr0,L(32B_aligned_loop) -- -- .p2align 5 --L(16B_aligned_loop): -- COMPARE_16(v4,v5,0) -- COMPARE_16(v4,v5,16) -- COMPARE_16(v4,v5,32) -- COMPARE_16(v4,v5,48) -- addi r3,r3,64 -- addi r4,r4,64 -- b L(16B_aligned_loop) -- -- /* Calculate and return the difference. */ --L(different): -- vctzlsbb r6,v7 -- vextubrx r5,r6,v4 -- vextubrx r4,r6,v5 -- bt 4*cr1+eq,L(swapped) -- subf r3,r4,r5 -- blr -- -- /* If src pointers were swapped, then swap the -- indices and calculate the return value. */ --L(swapped): -- subf r3,r5,r4 -- blr -- -- .p2align 5 --L(32B_aligned_loop): -- COMPARE_32(v14,v16,0,tail1,tail2) -- COMPARE_32(v18,v20,32,tail3,tail4) -- COMPARE_32(v22,v24,64,tail5,tail6) -- COMPARE_32(v26,v28,96,tail7,tail8) -- addi r3,r3,128 -- addi r4,r4,128 -- b L(32B_aligned_loop) -- --L(tail1): TAIL(v15,v17) --L(tail2): TAIL(v14,v16) --L(tail3): TAIL(v19,v21) --L(tail4): TAIL(v18,v20) --L(tail5): TAIL(v23,v25) --L(tail6): TAIL(v22,v24) --L(tail7): TAIL(v27,v29) --L(tail8): TAIL(v26,v28) -- --END (STRCMP) --libc_hidden_builtin_def (strcmp) -diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile -index fa1107dfd9..9f15f3207f 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/Makefile -+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile -@@ -33,8 +33,7 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ - ifneq (,$(filter %le,$(config-machine))) - sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \ - rawmemchr-power9 rawmemchr-power10 \ -- strcmp-power9 strcmp-power10 strncmp-power9 \ -- strcpy-power9 stpcpy-power9 \ -+ strcmp-power9 strncmp-power9 strcpy-power9 stpcpy-power9 \ - strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 - endif - CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops -diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -index 9b3e617306..78443b7f34 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -+++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c -@@ -377,10 +377,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, - /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c. */ - IFUNC_IMPL (i, name, strcmp, - #ifdef __LITTLE_ENDIAN__ -- IFUNC_IMPL_ADD (array, i, strcmp, -- (hwcap2 & PPC_FEATURE2_ARCH_3_1) -- && (hwcap & PPC_FEATURE_HAS_VSX), -- __strcmp_power10) - IFUNC_IMPL_ADD (array, i, strcmp, - hwcap2 & PPC_FEATURE2_ARCH_3_00 - && hwcap & PPC_FEATURE_HAS_ALTIVEC, -diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S -deleted file mode 100644 -index 1a9f6069f5..0000000000 ---- a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S -+++ /dev/null -@@ -1,26 +0,0 @@ --/* Optimized strcmp implementation for POWER10/PPC64. -- Copyright (C) 2021-2024 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- -- The GNU C Library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- The GNU C Library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with the GNU C Library; if not, see -- . */ -- --#if defined __LITTLE_ENDIAN__ && IS_IN (libc) --#define STRCMP __strcmp_power10 -- --#undef libc_hidden_builtin_def --#define libc_hidden_builtin_def(name) -- --#include --#endif /* __LITTLE_ENDIAN__ && IS_IN (libc) */ -diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c -index ff32496fab..06b9b4090f 100644 ---- a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c -+++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c -@@ -29,16 +29,12 @@ extern __typeof (strcmp) __strcmp_power7 attribute_hidden; - extern __typeof (strcmp) __strcmp_power8 attribute_hidden; - # ifdef __LITTLE_ENDIAN__ - extern __typeof (strcmp) __strcmp_power9 attribute_hidden; --extern __typeof (strcmp) __strcmp_power10 attribute_hidden; - # endif - - # undef strcmp - - libc_ifunc_redirected (__redirect_strcmp, strcmp, - # ifdef __LITTLE_ENDIAN__ -- (hwcap2 & PPC_FEATURE2_ARCH_3_1 -- && hwcap & PPC_FEATURE_HAS_VSX) -- ? __strcmp_power10 : - (hwcap2 & PPC_FEATURE2_ARCH_3_00 - && hwcap & PPC_FEATURE_HAS_ALTIVEC) - ? __strcmp_power9 : - -commit 23a02e382c8ffebfed00a082d8898f1aa468b5da -Author: Florian Weimer -Date: Wed May 21 16:47:34 2025 +0200 - - support: Pick group in support_capture_subprogram_self_sgid if UID == 0 - - When running as root, it is likely that we can run under any group. - Pick a harmless group from /etc/group in this case. - - Reviewed-by: Carlos O'Donell - (cherry picked from commit 2f769cec448d84a62b7dd0d4ff56978fe22c0cd6) - -diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c -index 2383481911..1cb344eb04 100644 ---- a/support/support_capture_subprocess.c -+++ b/support/support_capture_subprocess.c -@@ -21,7 +21,11 @@ - - #include - #include -+#include -+#include -+#include - #include -+#include - #include - #include - #include -@@ -210,10 +214,48 @@ err: - return status; - } - -+/* Returns true if a group with NAME has been found, and writes its -+ GID to *TARGET. */ -+static bool -+find_sgid_group (gid_t *target, const char *name) -+{ -+ /* Do not use getgrname_r because it does not work in statically -+ linked binaries if the system libc is different. */ -+ FILE *fp = fopen ("/etc/group", "rce"); -+ if (fp == NULL) -+ return false; -+ __fsetlocking (fp, FSETLOCKING_BYCALLER); -+ -+ bool ok = false; -+ struct scratch_buffer buf; -+ scratch_buffer_init (&buf); -+ while (true) -+ { -+ struct group grp; -+ struct group *result = NULL; -+ int status = fgetgrent_r (fp, &grp, buf.data, buf.length, &result); -+ if (status == 0 && result != NULL) -+ { -+ if (strcmp (result->gr_name, name) == 0) -+ { -+ *target = result->gr_gid; -+ ok = true; -+ break; -+ } -+ } -+ else if (errno != ERANGE) -+ break; -+ else if (!scratch_buffer_grow (&buf)) -+ break; -+ } -+ scratch_buffer_free (&buf); -+ fclose (fp); -+ return ok; -+} -+ - int - support_capture_subprogram_self_sgid (const char *child_id) - { -- gid_t target = 0; - const int count = 64; - gid_t groups[count]; - -@@ -225,6 +267,7 @@ support_capture_subprogram_self_sgid (const char *child_id) - (intmax_t) getuid ()); - - gid_t current = getgid (); -+ gid_t target = current; - for (int i = 0; i < ret; ++i) - { - if (groups[i] != current) -@@ -234,9 +277,16 @@ support_capture_subprogram_self_sgid (const char *child_id) - } - } - -- if (target == 0) -- FAIL_UNSUPPORTED("Could not find a suitable GID for user %jd\n", -- (intmax_t) getuid ()); -+ if (target == current) -+ { -+ /* If running as root, try to find a harmless group for SGID. */ -+ if (getuid () != 0 -+ || (!find_sgid_group (&target, "nogroup") -+ && !find_sgid_group (&target, "bin") -+ && !find_sgid_group (&target, "daemon"))) -+ FAIL_UNSUPPORTED("Could not find a suitable GID for user %jd\n", -+ (intmax_t) getuid ()); -+ } - - return copy_and_spawn_sgid (child_id, target); - } - -commit dbc83657e290bdad3245259be80fb84cbe10304c -Author: Florian Weimer -Date: Thu May 22 14:36:37 2025 +0200 - - Fix error reporting (false negatives) in SGID tests - - And simplify the interface of support_capture_subprogram_self_sgid. - - Use the existing framework for temporary directories (now with - mode 0700) and directory/file deletion. Handle all execution - errors within support_capture_subprogram_self_sgid. In particular, - this includes test failures because the invoked program did not - exit with exit status zero. Existing tests that expect exit - status 42 are adjusted to use zero instead. - - In addition, fix callers not to call exit (0) with test failures - pending (which may mask them, especially when running with --direct). - - Fixes commit 35fc356fa3b4f485bd3ba3114c9f774e5df7d3c2 - ("elf: Fix subprocess status handling for tst-dlopen-sgid (bug 32987)"). - - Reviewed-by: Carlos O'Donell - (cherry picked from commit 3a3fb2ed83f79100c116c824454095ecfb335ad7) - -diff --git a/elf/tst-dlopen-sgid.c b/elf/tst-dlopen-sgid.c -index 5688b79f2e..8aec52e19f 100644 ---- a/elf/tst-dlopen-sgid.c -+++ b/elf/tst-dlopen-sgid.c -@@ -70,13 +70,7 @@ do_test (void) - - free (libdir); - -- int status = support_capture_subprogram_self_sgid (magic_argument); -- -- if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) -- return EXIT_UNSUPPORTED; -- -- if (!WIFEXITED (status)) -- FAIL_EXIT1 ("Unexpected exit status %d from child process\n", status); -+ support_capture_subprogram_self_sgid (magic_argument); - - return 0; - } -diff --git a/elf/tst-env-setuid-tunables.c b/elf/tst-env-setuid-tunables.c -index a47219047f..233eec7631 100644 ---- a/elf/tst-env-setuid-tunables.c -+++ b/elf/tst-env-setuid-tunables.c -@@ -105,10 +105,7 @@ do_test (int argc, char **argv) - - if (ret != 0) - exit (1); -- -- /* Special return code to make sure that the child executed all the way -- through. */ -- exit (42); -+ return 0; - } - else - { -@@ -127,18 +124,7 @@ do_test (int argc, char **argv) - continue; - } - -- int status = support_capture_subprogram_self_sgid (buf); -- -- /* Bail out early if unsupported. */ -- if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) -- return EXIT_UNSUPPORTED; -- -- if (WEXITSTATUS (status) != 42) -- { -- printf (" [%d] child failed with status %d\n", i, -- WEXITSTATUS (status)); -- support_record_failure (); -- } -+ support_capture_subprogram_self_sgid (buf); - } - return 0; - } -diff --git a/elf/tst-env-setuid.c b/elf/tst-env-setuid.c -index 59f2ffeb88..ee3f058468 100644 ---- a/elf/tst-env-setuid.c -+++ b/elf/tst-env-setuid.c -@@ -147,10 +147,7 @@ do_test (int argc, char **argv) - - if (ret != 0) - exit (1); -- -- /* Special return code to make sure that the child executed all the way -- through. */ -- exit (42); -+ return 0; - } - else - { -@@ -174,17 +171,7 @@ do_test (int argc, char **argv) - free (profilepath); - } - -- int status = support_capture_subprogram_self_sgid (SETGID_CHILD); -- -- if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) -- exit (EXIT_UNSUPPORTED); -- -- if (WEXITSTATUS (status) != 42) -- { -- printf (" child failed with status %d\n", -- WEXITSTATUS (status)); -- support_record_failure (); -- } -+ support_capture_subprogram_self_sgid (SETGID_CHILD); - - return 0; - } -diff --git a/stdlib/tst-secure-getenv.c b/stdlib/tst-secure-getenv.c -index cc26ed6d15..cefee58d46 100644 ---- a/stdlib/tst-secure-getenv.c -+++ b/stdlib/tst-secure-getenv.c -@@ -57,13 +57,7 @@ do_test (void) - exit (1); - } - -- int status = support_capture_subprogram_self_sgid (MAGIC_ARGUMENT); -- -- if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) -- return EXIT_UNSUPPORTED; -- -- if (!WIFEXITED (status)) -- FAIL_EXIT1 ("Unexpected exit status %d from child process\n", status); -+ support_capture_subprogram_self_sgid (MAGIC_ARGUMENT); - - return 0; - } -@@ -82,6 +76,7 @@ alternative_main (int argc, char **argv) - if (secure_getenv ("PATH") != NULL) - FAIL_EXIT (4, "PATH variable not filtered out\n"); - -+ support_record_failure_barrier (); - exit (EXIT_SUCCESS); - } - } -diff --git a/support/capture_subprocess.h b/support/capture_subprocess.h -index 5406d9f6c0..57bb941e7d 100644 ---- a/support/capture_subprocess.h -+++ b/support/capture_subprocess.h -@@ -42,10 +42,12 @@ struct support_capture_subprocess support_capture_subprocess - struct support_capture_subprocess support_capture_subprogram - (const char *file, char *const argv[], char *const envp[]); - --/* Copy the running program into a setgid binary and run it with CHILD_ID -- argument. If execution is successful, return the exit status of the child -- program, otherwise return a non-zero failure exit code. */ --int support_capture_subprogram_self_sgid (const char *child_id); -+/* Copy the running program into a setgid binary and run it with -+ CHILD_ID argument. If the program exits with a non-zero status, -+ exit with that exit status (or status 1 if the program did not exit -+ normally). If the test cannot be performed, exit with -+ EXIT_UNSUPPORTED. */ -+void support_capture_subprogram_self_sgid (const char *child_id); - - /* Deallocate the subprocess data captured by - support_capture_subprocess. */ -diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c -index 1cb344eb04..cbc6951064 100644 ---- a/support/support_capture_subprocess.c -+++ b/support/support_capture_subprocess.c -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - #include - - static void -@@ -113,105 +114,44 @@ support_capture_subprogram (const char *file, char *const argv[], - /* Copies the executable into a restricted directory, so that we can - safely make it SGID with the TARGET group ID. Then runs the - executable. */ --static int -+static void - copy_and_spawn_sgid (const char *child_id, gid_t gid) - { -- char *dirname = xasprintf ("%s/tst-tunables-setuid.%jd", -- test_dir, (intmax_t) getpid ()); -+ char *dirname = support_create_temp_directory ("tst-glibc-sgid-"); - char *execname = xasprintf ("%s/bin", dirname); -- int infd = -1; -- int outfd = -1; -- int ret = 1, status = 1; -- -- TEST_VERIFY (mkdir (dirname, 0700) == 0); -- if (support_record_failure_is_failed ()) -- goto err; -+ add_temp_file (execname); - -- infd = open ("/proc/self/exe", O_RDONLY); -- if (infd < 0) -+ if (access ("/proc/self/exe", R_OK) != 0) - FAIL_UNSUPPORTED ("unsupported: Cannot read binary from procfs\n"); - -- outfd = open (execname, O_WRONLY | O_CREAT | O_EXCL, 0700); -- TEST_VERIFY (outfd >= 0); -- if (support_record_failure_is_failed ()) -- goto err; -- -- char buf[4096]; -- for (;;) -- { -- ssize_t rdcount = read (infd, buf, sizeof (buf)); -- TEST_VERIFY (rdcount >= 0); -- if (support_record_failure_is_failed ()) -- goto err; -- if (rdcount == 0) -- break; -- char *p = buf; -- char *end = buf + rdcount; -- while (p != end) -- { -- ssize_t wrcount = write (outfd, buf, end - p); -- if (wrcount == 0) -- errno = ENOSPC; -- TEST_VERIFY (wrcount > 0); -- if (support_record_failure_is_failed ()) -- goto err; -- p += wrcount; -- } -- } -+ support_copy_file ("/proc/self/exe", execname); - -- bool chowned = false; -- TEST_VERIFY ((chowned = fchown (outfd, getuid (), gid) == 0) -- || errno == EPERM); -- if (support_record_failure_is_failed ()) -- goto err; -- else if (!chowned) -- { -- ret = 77; -- goto err; -- } -+ if (chown (execname, getuid (), gid) != 0) -+ FAIL_UNSUPPORTED ("cannot change group of \"%s\" to %jd: %m", -+ execname, (intmax_t) gid); - -- TEST_VERIFY (fchmod (outfd, 02750) == 0); -- if (support_record_failure_is_failed ()) -- goto err; -- TEST_VERIFY (close (outfd) == 0); -- if (support_record_failure_is_failed ()) -- goto err; -- TEST_VERIFY (close (infd) == 0); -- if (support_record_failure_is_failed ()) -- goto err; -+ if (chmod (execname, 02750) != 0) -+ FAIL_UNSUPPORTED ("cannot make \"%s\" SGID: %m ", execname); - - /* We have the binary, now spawn the subprocess. Avoid using - support_subprogram because we only want the program exit status, not the - contents. */ -- ret = 0; -- infd = outfd = -1; - - char * const args[] = {execname, (char *) child_id, NULL}; -+ int status = support_subprogram_wait (args[0], args); - -- status = support_subprogram_wait (args[0], args); -+ free (execname); -+ free (dirname); - --err: -- if (outfd >= 0) -- close (outfd); -- if (infd >= 0) -- close (infd); -- if (execname != NULL) -- { -- unlink (execname); -- free (execname); -- } -- if (dirname != NULL) -+ if (WIFEXITED (status)) - { -- rmdir (dirname); -- free (dirname); -+ if (WEXITSTATUS (status) == 0) -+ return; -+ else -+ exit (WEXITSTATUS (status)); - } -- -- if (ret == 77) -- FAIL_UNSUPPORTED ("Failed to make sgid executable for test\n"); -- if (ret != 0) -- FAIL_EXIT1 ("Failed to make sgid executable for test\n"); -- -- return status; -+ else -+ FAIL_EXIT1 ("subprogram failed with status %d", status); - } - - /* Returns true if a group with NAME has been found, and writes its -@@ -253,7 +193,7 @@ find_sgid_group (gid_t *target, const char *name) - return ok; - } - --int -+void - support_capture_subprogram_self_sgid (const char *child_id) - { - const int count = 64; -@@ -288,7 +228,7 @@ support_capture_subprogram_self_sgid (const char *child_id) - (intmax_t) getuid ()); - } - -- return copy_and_spawn_sgid (child_id, target); -+ copy_and_spawn_sgid (child_id, target); - } - - void - -commit 2eb180377b96771b8368b0915669c8c7b267e739 -Author: Florian Weimer -Date: Mon Jul 21 21:43:49 2025 +0200 - - posix: Fix double-free after allocation failure in regcomp (bug 33185) - - If a memory allocation failure occurs during bracket expression - parsing in regcomp, a double-free error may result. - - Reported-by: Anastasia Belova - Co-authored-by: Paul Eggert - Reviewed-by: Andreas K. Huettel - (cherry picked from commit 7ea06e994093fa0bcca0d0ee2c1db271d8d7885d) - -diff --git a/NEWS b/NEWS -index 4b290ad4bf..253b07ae99 100644 ---- a/NEWS -+++ b/NEWS -@@ -24,6 +24,7 @@ The following bugs are resolved with this release: - [32470] x86: Avoid integer truncation with large cache sizes - [32810] Crash on x86-64 if XSAVEC disable via tunable - [32987] elf: Fix subprocess status handling for tst-dlopen-sgid -+ [33185] Fix double-free after allocation failure in regcomp - - Version 2.40 - -diff --git a/posix/Makefile b/posix/Makefile -index 2c598cd20a..830278a423 100644 ---- a/posix/Makefile -+++ b/posix/Makefile -@@ -303,6 +303,7 @@ tests := \ - tst-posix_spawn-setsid \ - tst-preadwrite \ - tst-preadwrite64 \ -+ tst-regcomp-bracket-free \ - tst-regcomp-truncated \ - tst-regex \ - tst-regex2 \ -diff --git a/posix/regcomp.c b/posix/regcomp.c -index 5380d3c7b9..6595bb3c0d 100644 ---- a/posix/regcomp.c -+++ b/posix/regcomp.c -@@ -3384,6 +3384,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - { - #ifdef RE_ENABLE_I18N - free_charset (mbcset); -+ mbcset = NULL; - #endif - /* Build a tree for simple bracket. */ - br_token.type = SIMPLE_BRACKET; -@@ -3399,7 +3400,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - parse_bracket_exp_free_return: - re_free (sbcset); - #ifdef RE_ENABLE_I18N -- free_charset (mbcset); -+ if (__glibc_likely (mbcset != NULL)) -+ free_charset (mbcset); - #endif /* RE_ENABLE_I18N */ - return NULL; - } -diff --git a/posix/tst-regcomp-bracket-free.c b/posix/tst-regcomp-bracket-free.c -new file mode 100644 -index 0000000000..3c091d8c44 ---- /dev/null -+++ b/posix/tst-regcomp-bracket-free.c -@@ -0,0 +1,176 @@ -+/* Test regcomp bracket parsing with injected allocation failures (bug 33185). -+ Copyright (C) 2025 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* This test invokes regcomp multiple times, failing one memory -+ allocation in each call. The function call should fail with -+ REG_ESPACE (or succeed if it can recover from the allocation -+ failure). Previously, there was double-free bug. */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Data structure allocated via MAP_SHARED, so that writes from the -+ subprocess are visible. */ -+struct shared_data -+{ -+ /* Number of tracked allocations performed so far. */ -+ volatile unsigned int allocation_count; -+ -+ /* If this number is reached, one allocation fails. */ -+ volatile unsigned int failing_allocation; -+ -+ /* The subprocess stores the expected name here. */ -+ char name[100]; -+}; -+ -+/* Allocation count in shared mapping. */ -+static struct shared_data *shared; -+ -+/* Returns true if a failure should be injected for this allocation. */ -+static bool -+fail_this_allocation (void) -+{ -+ if (shared != NULL) -+ { -+ unsigned int count = shared->allocation_count; -+ shared->allocation_count = count + 1; -+ return count == shared->failing_allocation; -+ } -+ else -+ return false; -+} -+ -+/* Failure-injecting wrappers for allocation functions used by glibc. */ -+ -+void * -+malloc (size_t size) -+{ -+ if (fail_this_allocation ()) -+ { -+ errno = ENOMEM; -+ return NULL; -+ } -+ extern __typeof (malloc) __libc_malloc; -+ return __libc_malloc (size); -+} -+ -+void * -+calloc (size_t a, size_t b) -+{ -+ if (fail_this_allocation ()) -+ { -+ errno = ENOMEM; -+ return NULL; -+ } -+ extern __typeof (calloc) __libc_calloc; -+ return __libc_calloc (a, b); -+} -+ -+void * -+realloc (void *ptr, size_t size) -+{ -+ if (fail_this_allocation ()) -+ { -+ errno = ENOMEM; -+ return NULL; -+ } -+ extern __typeof (realloc) __libc_realloc; -+ return __libc_realloc (ptr, size); -+} -+ -+/* No-op subprocess to verify that support_isolate_in_subprocess does -+ not perform any heap allocations. */ -+static void -+no_op (void *ignored) -+{ -+} -+ -+/* Perform a regcomp call in a subprocess. Used to count its -+ allocations. */ -+static void -+initialize (void *regexp1) -+{ -+ const char *regexp = regexp1; -+ -+ shared->allocation_count = 0; -+ -+ regex_t reg; -+ TEST_COMPARE (regcomp (®, regexp, 0), 0); -+} -+ -+/* Perform regcomp in a subprocess with fault injection. */ -+static void -+test_in_subprocess (void *regexp1) -+{ -+ const char *regexp = regexp1; -+ unsigned int inject_at = shared->failing_allocation; -+ -+ regex_t reg; -+ int ret = regcomp (®, regexp, 0); -+ -+ if (ret != 0) -+ { -+ TEST_COMPARE (ret, REG_ESPACE); -+ printf ("info: allocation %u failure results in return value %d," -+ " error %s (%d)\n", -+ inject_at, ret, strerrorname_np (errno), errno); -+ } -+} -+ -+static int -+do_test (void) -+{ -+ char regexp[] = "[:alpha:]"; -+ -+ shared = support_shared_allocate (sizeof (*shared)); -+ -+ /* Disable fault injection. */ -+ shared->failing_allocation = ~0U; -+ -+ support_isolate_in_subprocess (no_op, NULL); -+ TEST_COMPARE (shared->allocation_count, 0); -+ -+ support_isolate_in_subprocess (initialize, regexp); -+ -+ /* The number of allocations in the successful case, plus some -+ slack. Once the number of expected allocations is exceeded, -+ injecting further failures does not make a difference. */ -+ unsigned int maximum_allocation_count = shared->allocation_count; -+ printf ("info: successful call performs %u allocations\n", -+ maximum_allocation_count); -+ maximum_allocation_count += 10; -+ -+ for (unsigned int inject_at = 0; inject_at <= maximum_allocation_count; -+ ++inject_at) -+ { -+ shared->allocation_count = 0; -+ shared->failing_allocation = inject_at; -+ support_isolate_in_subprocess (test_in_subprocess, regexp); -+ } -+ -+ support_shared_free (shared); -+ -+ return 0; -+} -+ -+#include diff --git a/pkgs/development/libraries/glibc/2.42-master.patch b/pkgs/development/libraries/glibc/2.42-master.patch new file mode 100644 index 000000000000..efed2a43b7e2 --- /dev/null +++ b/pkgs/development/libraries/glibc/2.42-master.patch @@ -0,0 +1,5372 @@ +commit bdea6c37197a3c9bd976911cce5f580dea1c28dd +Author: Andreas K. Hüttel +Date: Mon Jul 28 20:35:38 2025 +0200 + + Replace advisories directory with pointer file + + Signed-off-by: Andreas K. Hüttel + +diff --git a/advisories/GLIBC-SA-2023-0001 b/advisories/GLIBC-SA-2023-0001 +deleted file mode 100644 +index 3d19c91b6a..0000000000 +--- a/advisories/GLIBC-SA-2023-0001 ++++ /dev/null +@@ -1,14 +0,0 @@ +-printf: incorrect output for integers with thousands separator and width field +- +-When the printf family of functions is called with a format specifier +-that uses an (enable grouping) and a minimum width +-specifier, the resulting output could be larger than reasonably expected +-by a caller that computed a tight bound on the buffer size. The +-resulting larger than expected output could result in a buffer overflow +-in the printf family of functions. +- +-CVE-Id: CVE-2023-25139 +-Public-Date: 2023-02-02 +-Vulnerable-Commit: e88b9f0e5cc50cab57a299dc7efe1a4eb385161d (2.37) +-Fix-Commit: c980549cc6a1c03c23cc2fe3e7b0fe626a0364b0 (2.38) +-Fix-Commit: 07b9521fc6369d000216b96562ff7c0ed32a16c4 (2.37-4) +diff --git a/advisories/GLIBC-SA-2023-0002 b/advisories/GLIBC-SA-2023-0002 +deleted file mode 100644 +index 5122669a64..0000000000 +--- a/advisories/GLIBC-SA-2023-0002 ++++ /dev/null +@@ -1,15 +0,0 @@ +-getaddrinfo: Stack read overflow in no-aaaa mode +- +-If the system is configured in no-aaaa mode via /etc/resolv.conf, +-getaddrinfo is called for the AF_UNSPEC address family, and a DNS +-response is received over TCP that is larger than 2048 bytes, +-getaddrinfo may potentially disclose stack contents via the returned +-address data, or crash. +- +-CVE-Id: CVE-2023-4527 +-Public-Date: 2023-09-12 +-Vulnerable-Commit: f282cdbe7f436c75864e5640a409a10485e9abb2 (2.36) +-Fix-Commit: bd77dd7e73e3530203be1c52c8a29d08270cb25d (2.39) +-Fix-Commit: 4ea972b7edd7e36610e8cde18bf7a8149d7bac4f (2.36-113) +-Fix-Commit: b7529346025a130fee483d42178b5c118da971bb (2.37-38) +-Fix-Commit: b25508dd774b617f99419bdc3cf2ace4560cd2d6 (2.38-19) +diff --git a/advisories/GLIBC-SA-2023-0003 b/advisories/GLIBC-SA-2023-0003 +deleted file mode 100644 +index d3aef80348..0000000000 +--- a/advisories/GLIBC-SA-2023-0003 ++++ /dev/null +@@ -1,15 +0,0 @@ +-getaddrinfo: Potential use-after-free +- +-When an NSS plugin only implements the _gethostbyname2_r and +-_getcanonname_r callbacks, getaddrinfo could use memory that was freed +-during buffer resizing, potentially causing a crash or read or write to +-arbitrary memory. +- +-CVE-Id: CVE-2023-4806 +-Public-Date: 2023-09-12 +-Fix-Commit: 973fe93a5675c42798b2161c6f29c01b0e243994 (2.39) +-Fix-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) +-Fix-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) +-Fix-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) +-Fix-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) +-Fix-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) +diff --git a/advisories/GLIBC-SA-2023-0004 b/advisories/GLIBC-SA-2023-0004 +deleted file mode 100644 +index 5286a7aa54..0000000000 +--- a/advisories/GLIBC-SA-2023-0004 ++++ /dev/null +@@ -1,16 +0,0 @@ +-tunables: local privilege escalation through buffer overflow +- +-If a tunable of the form NAME=NAME=VAL is passed in the environment of a +-setuid program and NAME is valid, it may result in a buffer overflow, +-which could be exploited to achieve escalated privileges. This flaw was +-introduced in glibc 2.34. +- +-CVE-Id: CVE-2023-4911 +-Public-Date: 2023-10-03 +-Vulnerable-Commit: 2ed18c5b534d9e92fc006202a5af0df6b72e7aca (2.34) +-Fix-Commit: 1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa (2.39) +-Fix-Commit: dcc367f148bc92e7f3778a125f7a416b093964d9 (2.34-423) +-Fix-Commit: c84018a05aec80f5ee6f682db0da1130b0196aef (2.35-274) +-Fix-Commit: 22955ad85186ee05834e47e665056148ca07699c (2.36-118) +-Fix-Commit: b4e23c75aea756b4bddc4abcf27a1c6dca8b6bd3 (2.37-45) +-Fix-Commit: 750a45a783906a19591fb8ff6b7841470f1f5701 (2.38-27) +diff --git a/advisories/GLIBC-SA-2023-0005 b/advisories/GLIBC-SA-2023-0005 +deleted file mode 100644 +index cc4eb90b82..0000000000 +--- a/advisories/GLIBC-SA-2023-0005 ++++ /dev/null +@@ -1,18 +0,0 @@ +-getaddrinfo: DoS due to memory leak +- +-The fix for CVE-2023-4806 introduced a memory leak when an application +-calls getaddrinfo for AF_INET6 with AI_CANONNAME, AI_ALL and AI_V4MAPPED +-flags set. +- +-CVE-Id: CVE-2023-5156 +-Public-Date: 2023-09-25 +-Vulnerable-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) +-Vulnerable-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) +-Vulnerable-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) +-Vulnerable-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) +-Vulnerable-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) +-Fix-Commit: 8006457ab7e1cd556b919f477348a96fe88f2e49 (2.34-421) +-Fix-Commit: 17092c0311f954e6f3c010f73ce3a78c24ac279a (2.35-272) +-Fix-Commit: 856bac55f98dc840e7c27cfa82262b933385de90 (2.36-116) +-Fix-Commit: 4473d1b87d04b25cdd0e0354814eeaa421328268 (2.37-42) +-Fix-Commit: 5ee59ca371b99984232d7584fe2b1a758b4421d3 (2.38-24) +diff --git a/advisories/GLIBC-SA-2024-0001 b/advisories/GLIBC-SA-2024-0001 +deleted file mode 100644 +index 28931c75ae..0000000000 +--- a/advisories/GLIBC-SA-2024-0001 ++++ /dev/null +@@ -1,15 +0,0 @@ +-syslog: Heap buffer overflow in __vsyslog_internal +- +-__vsyslog_internal did not handle a case where printing a SYSLOG_HEADER +-containing a long program name failed to update the required buffer +-size, leading to the allocation and overflow of a too-small buffer on +-the heap. +- +-CVE-Id: CVE-2023-6246 +-Public-Date: 2024-01-30 +-Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) +-Fix-Commit: 6bd0e4efcc78f3c0115e5ea9739a1642807450da (2.39) +-Fix-Commit: 23514c72b780f3da097ecf33a793b7ba9c2070d2 (2.38-42) +-Fix-Commit: 97a4292aa4a2642e251472b878d0ec4c46a0e59a (2.37-57) +-Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) +-Fix-Commit: d1a83b6767f68b3cb5b4b4ea2617254acd040c82 (2.36-126) +diff --git a/advisories/GLIBC-SA-2024-0002 b/advisories/GLIBC-SA-2024-0002 +deleted file mode 100644 +index 940bfcf2fc..0000000000 +--- a/advisories/GLIBC-SA-2024-0002 ++++ /dev/null +@@ -1,15 +0,0 @@ +-syslog: Heap buffer overflow in __vsyslog_internal +- +-__vsyslog_internal used the return value of snprintf/vsnprintf to +-calculate buffer sizes for memory allocation. If these functions (for +-any reason) failed and returned -1, the resulting buffer would be too +-small to hold output. +- +-CVE-Id: CVE-2023-6779 +-Public-Date: 2024-01-30 +-Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) +-Fix-Commit: 7e5a0c286da33159d47d0122007aac016f3e02cd (2.39) +-Fix-Commit: d0338312aace5bbfef85e03055e1212dd0e49578 (2.38-43) +-Fix-Commit: 67062eccd9a65d7fda9976a56aeaaf6c25a80214 (2.37-58) +-Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) +-Fix-Commit: 2bc9d7c002bdac38b5c2a3f11b78e309d7765b83 (2.36-127) +diff --git a/advisories/GLIBC-SA-2024-0003 b/advisories/GLIBC-SA-2024-0003 +deleted file mode 100644 +index b43a5150ab..0000000000 +--- a/advisories/GLIBC-SA-2024-0003 ++++ /dev/null +@@ -1,13 +0,0 @@ +-syslog: Integer overflow in __vsyslog_internal +- +-__vsyslog_internal calculated a buffer size by adding two integers, but +-did not first check if the addition would overflow. +- +-CVE-Id: CVE-2023-6780 +-Public-Date: 2024-01-30 +-Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) +-Fix-Commit: ddf542da94caf97ff43cc2875c88749880b7259b (2.39) +-Fix-Commit: d37c2b20a4787463d192b32041c3406c2bd91de0 (2.38-44) +-Fix-Commit: 2b58cba076e912961ceaa5fa58588e4b10f791c0 (2.37-59) +-Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) +-Fix-Commit: b9b7d6a27aa0632f334352fa400771115b3c69b7 (2.36-128) +diff --git a/advisories/GLIBC-SA-2024-0004 b/advisories/GLIBC-SA-2024-0004 +deleted file mode 100644 +index 08df2b3118..0000000000 +--- a/advisories/GLIBC-SA-2024-0004 ++++ /dev/null +@@ -1,28 +0,0 @@ +-ISO-2022-CN-EXT: fix out-of-bound writes when writing escape sequence +- +-The iconv() function in the GNU C Library versions 2.39 and older may +-overflow the output buffer passed to it by up to 4 bytes when converting +-strings to the ISO-2022-CN-EXT character set, which may be used to +-crash an application or overwrite a neighbouring variable. +- +-ISO-2022-CN-EXT uses escape sequences to indicate character set changes +-(as specified by RFC 1922). While the SOdesignation has the expected +-bounds checks, neither SS2designation nor SS3designation have its; +-allowing a write overflow of 1, 2, or 3 bytes with fixed values: +-'$+I', '$+J', '$+K', '$+L', '$+M', or '$*H'. +- +-CVE-Id: CVE-2024-2961 +-Public-Date: 2024-04-17 +-Vulnerable-Commit: 755104edc75c53f4a0e7440334e944ad3c6b32fc (2.1.93-169) +-Fix-Commit: f9dc609e06b1136bb0408be9605ce7973a767ada (2.40) +-Fix-Commit: 31da30f23cddd36db29d5b6a1c7619361b271fb4 (2.39-31) +-Fix-Commit: e1135387deded5d73924f6ca20c72a35dc8e1bda (2.38-66) +-Fix-Commit: 89ce64b269a897a7780e4c73a7412016381c6ecf (2.37-89) +-Fix-Commit: 4ed98540a7fd19f458287e783ae59c41e64df7b5 (2.36-164) +-Fix-Commit: 36280d1ce5e245aabefb877fe4d3c6cff95dabfa (2.35-315) +-Fix-Commit: a8b0561db4b9847ebfbfec20075697d5492a363c (2.34-459) +-Fix-Commit: ed4f16ff6bed3037266f1fa682ebd32a18fce29c (2.33-263) +-Fix-Commit: 682ad4c8623e611a971839990ceef00346289cc9 (2.32-140) +-Fix-Commit: 3703c32a8d304c1ee12126134ce69be965f38000 (2.31-154) +- +-Reported-By: Charles Fol +diff --git a/advisories/GLIBC-SA-2024-0005 b/advisories/GLIBC-SA-2024-0005 +deleted file mode 100644 +index a59596610a..0000000000 +--- a/advisories/GLIBC-SA-2024-0005 ++++ /dev/null +@@ -1,22 +0,0 @@ +-nscd: Stack-based buffer overflow in netgroup cache +- +-If the Name Service Cache Daemon's (nscd) fixed size cache is exhausted +-by client requests then a subsequent client request for netgroup data +-may result in a stack-based buffer overflow. This flaw was introduced +-in glibc 2.15 when the cache was added to nscd. +- +-This vulnerability is only present in the nscd binary. +- +-CVE-Id: CVE-2024-33599 +-Public-Date: 2024-04-23 +-Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) +-Fix-Commit: 69c58d5ef9f584ea198bd00f7964d364d0e6b921 (2.31-155) +-Fix-Commit: a77064893bfe8a701770e2f53a4d33805bc47a5a (2.32-141) +-Fix-Commit: 5c75001a96abcd50cbdb74df24c3f013188d076e (2.33-264) +-Fix-Commit: 52f73e5c4e29b14e79167272297977f360ae1e97 (2.34-460) +-Fix-Commit: 7a95873543ce225376faf13bb71c43dea6d24f86 (2.35-316) +-Fix-Commit: caa3151ca460bdd9330adeedd68c3112d97bffe4 (2.36-165) +-Fix-Commit: f75c298e747b2b8b41b1c2f551c011a52c41bfd1 (2.37-91) +-Fix-Commit: 5968aebb86164034b8f8421b4abab2f837a5bdaf (2.38-72) +-Fix-Commit: 1263d583d2e28afb8be53f8d6922f0842036f35d (2.39-35) +-Fix-Commit: 87801a8fd06db1d654eea3e4f7626ff476a9bdaa (2.40) +diff --git a/advisories/GLIBC-SA-2024-0006 b/advisories/GLIBC-SA-2024-0006 +deleted file mode 100644 +index d44148d3d9..0000000000 +--- a/advisories/GLIBC-SA-2024-0006 ++++ /dev/null +@@ -1,32 +0,0 @@ +-nscd: Null pointer crash after notfound response +- +-If the Name Service Cache Daemon's (nscd) cache fails to add a not-found +-netgroup response to the cache, the client request can result in a null +-pointer dereference. This flaw was introduced in glibc 2.15 when the +-cache was added to nscd. +- +-This vulnerability is only present in the nscd binary. +- +-CVE-Id: CVE-2024-33600 +-Public-Date: 2024-04-24 +-Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) +-Fix-Commit: b048a482f088e53144d26a61c390bed0210f49f2 (2.40) +-Fix-Commit: 7835b00dbce53c3c87bbbb1754a95fb5e58187aa (2.40) +-Fix-Commit: c99f886de54446cd4447db6b44be93dabbdc2f8b (2.39-37) +-Fix-Commit: 5a508e0b508c8ad53bd0d2fb48fd71b242626341 (2.39-36) +-Fix-Commit: 2ae9446c1b7a3064743b4a51c0bbae668ee43e4c (2.38-74) +-Fix-Commit: 541ea5172aa658c4bd5c6c6d6fd13903c3d5bb0a (2.38-73) +-Fix-Commit: a8070b31043c7585c36ba68a74298c4f7af075c3 (2.37-93) +-Fix-Commit: 5eea50c4402e39588de98aa1d4469a79774703d4 (2.37-92) +-Fix-Commit: f205b3af56740e3b014915b1bd3b162afe3407ef (2.36-167) +-Fix-Commit: c34f470a615b136170abd16142da5dd0c024f7d1 (2.36-166) +-Fix-Commit: bafadc589fbe21ae330e8c2af74db9da44a17660 (2.35-318) +-Fix-Commit: 4370bef52b0f3f3652c6aa13d7a9bb3ac079746d (2.35-317) +-Fix-Commit: 1f94122289a9bf7dba573f5d60327aaa2b85cf2e (2.34-462) +-Fix-Commit: 966d6ac9e40222b84bb21674cc4f83c8d72a5a26 (2.34-461) +-Fix-Commit: e3eef1b8fbdd3a7917af466ca9c4b7477251ca79 (2.33-266) +-Fix-Commit: f20a8d696b13c6261b52a6434899121f8b19d5a7 (2.33-265) +-Fix-Commit: be602180146de37582a3da3a0caa4b719645de9c (2.32-143) +-Fix-Commit: 394eae338199078b7961b051c191539870742d7b (2.32-142) +-Fix-Commit: 8d7949183760170c61e55def723c1d8050187874 (2.31-157) +-Fix-Commit: 304ce5fe466c4762b21b36c26926a4657b59b53e (2.31-156) +diff --git a/advisories/GLIBC-SA-2024-0007 b/advisories/GLIBC-SA-2024-0007 +deleted file mode 100644 +index b6928fa27a..0000000000 +--- a/advisories/GLIBC-SA-2024-0007 ++++ /dev/null +@@ -1,28 +0,0 @@ +-nscd: netgroup cache may terminate daemon on memory allocation failure +- +-The Name Service Cache Daemon's (nscd) netgroup cache uses xmalloc or +-xrealloc and these functions may terminate the process due to a memory +-allocation failure resulting in a denial of service to the clients. The +-flaw was introduced in glibc 2.15 when the cache was added to nscd. +- +-This vulnerability is only present in the nscd binary. +- +-Subsequent refactoring of the netgroup cache only added more uses of +-xmalloc and xrealloc. Uses of xmalloc and xrealloc in other parts of +-nscd only occur during startup of the daemon and so are not affected by +-client requests that could trigger an out of memory followed by +-termination. +- +-CVE-Id: CVE-2024-33601 +-Public-Date: 2024-04-24 +-Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) +-Fix-Commit: c04a21e050d64a1193a6daab872bca2528bda44b (2.40) +-Fix-Commit: a9a8d3eebb145779a18d90e3966009a1daa63cd8 (2.39-38) +-Fix-Commit: 71af8ca864345d39b746d5cee84b94b430fad5db (2.38-75) +-Fix-Commit: 6e106dc214d6a033a4e945d1c6cf58061f1c5f1f (2.37-94) +-Fix-Commit: b6742463694b1dfdd5120b91ee21cf05d15ec2e2 (2.36-168) +-Fix-Commit: 7a5864cac60e06000394128a5a2817b03542f5a3 (2.35-319) +-Fix-Commit: 86f1d5f4129c373ac6fb6df5bcf38273838843cb (2.34-463) +-Fix-Commit: 4d27d4b9a188786fc6a56745506cec2acfc51f83 (2.33-267) +-Fix-Commit: 3ed195a8ec89da281e3c4bf887a13d281b72d8f4 (2.32-144) +-Fix-Commit: bbf5a58ccb55679217f94de706164d15372fbbc0 (2.31-158) +diff --git a/advisories/GLIBC-SA-2024-0008 b/advisories/GLIBC-SA-2024-0008 +deleted file mode 100644 +index d93e2a6f0b..0000000000 +--- a/advisories/GLIBC-SA-2024-0008 ++++ /dev/null +@@ -1,26 +0,0 @@ +-nscd: netgroup cache assumes NSS callback uses in-buffer strings +- +-The Name Service Cache Daemon's (nscd) netgroup cache can corrupt memory +-when the NSS callback does not store all strings in the provided buffer. +-The flaw was introduced in glibc 2.15 when the cache was added to nscd. +- +-This vulnerability is only present in the nscd binary. +- +-There is no guarantee from the NSS callback API that the returned +-strings are all within the buffer. However, the netgroup cache code +-assumes that the NSS callback uses in-buffer strings and if it doesn't +-the buffer resizing logic could lead to potential memory corruption. +- +-CVE-Id: CVE-2024-33602 +-Public-Date: 2024-04-24 +-Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) +-Fix-Commit: c04a21e050d64a1193a6daab872bca2528bda44b (2.40) +-Fix-Commit: a9a8d3eebb145779a18d90e3966009a1daa63cd8 (2.39-38) +-Fix-Commit: 71af8ca864345d39b746d5cee84b94b430fad5db (2.38-75) +-Fix-Commit: 6e106dc214d6a033a4e945d1c6cf58061f1c5f1f (2.37-94) +-Fix-Commit: b6742463694b1dfdd5120b91ee21cf05d15ec2e2 (2.36-168) +-Fix-Commit: 7a5864cac60e06000394128a5a2817b03542f5a3 (2.35-319) +-Fix-Commit: 86f1d5f4129c373ac6fb6df5bcf38273838843cb (2.34-463) +-Fix-Commit: 4d27d4b9a188786fc6a56745506cec2acfc51f83 (2.33-267) +-Fix-Commit: 3ed195a8ec89da281e3c4bf887a13d281b72d8f4 (2.32-144) +-Fix-Commit: bbf5a58ccb55679217f94de706164d15372fbbc0 (2.31-158) +diff --git a/advisories/GLIBC-SA-2025-0001 b/advisories/GLIBC-SA-2025-0001 +deleted file mode 100644 +index b053d32e91..0000000000 +--- a/advisories/GLIBC-SA-2025-0001 ++++ /dev/null +@@ -1,40 +0,0 @@ +-assert: Buffer overflow when printing assertion failure message +- +-When the assert() function fails, it does not allocate enough space for the +-assertion failure message string and size information, which may lead to a +-buffer overflow if the message string size aligns to page size. +- +-This bug can be triggered when an assertion in a program fails. The assertion +-failure message is allocated to allow developers to see this failure in core +-dumps and it typically includes, in addition to the invariant assertion +-string and function name, the name of the program. If the name of the failing +-program is user controlled, for example on a local system, this could allow an +-attacker to control the assertion failure to trigger this buffer overflow. +- +-The only viable vector for exploitation of this bug is local, if a setuid +-program exists that has an existing bug that results in an assertion failure. +-No such program has been discovered at the time of publishing this advisory, +-but the presence of custom setuid programs, although strongly discouraged as a +-security practice, cannot be discounted. +- +-CVE-Id: CVE-2025-0395 +-Public-Date: 2025-01-22 +-Vulnerable-Commit: f8a3b5bf8fa1d0c43d2458e03cc109a04fdef194 (2.13-175) +-Fix-Commit: 68ee0f704cb81e9ad0a78c644a83e1e9cd2ee578 (2.41) +-Fix-Commit: cdb9ba84191ce72e86346fb8b1d906e7cd930ea2 (2.42) +-Fix-Commit: 69fda28279b497bd405fdd442a6d8e4d3d5f681b (2.41-7) +-Fix-Commit: 7d4b6bcae91f29d7b4daf15bab06b66cf1d2217c (2.40-66) +-Fix-Commit: d6c156c326999f144cb5b73d29982108d549ad8a (2.40-71) +-Fix-Commit: 808a84a8b81468b517a4d721fdc62069cb8c211f (2.39-146) +-Fix-Commit: f6d48470aef9264d2d56f4c4533eb76db7f9c2e4 (2.39-150) +-Fix-Commit: c32fd59314c343db88c3ea4a203870481d33c3d2 (2.38-122) +-Fix-Commit: f984e2d7e8299726891a1a497a3c36cd5542a0bf (2.38-124) +-Fix-Commit: a3d7865b098a3a67c44f7812208d9ce4718873ba (2.37-143) +-Fix-Commit: b989519fe1683c204ac24ec92830e3fe3bfaccad (2.37-146) +-Fix-Commit: 7971add7ee4171fdd8dfd17e7c04c4ed77a18845 (2.36-216) +-Fix-Commit: 0487893d5c5bc6710d83d7c3152d888a0339559e (2.36-219) +-Fix-Commit: 8b5d4be762419c4f6176261c6fea40ac559b88dc (2.35-370) +-Fix-Commit: 8b3d09dc0d350191985f9d291cc30ce96f034b49 (2.35-373) +-Fix-Commit: df4e1f4a5096b385c9bcc94424cf2eaa227b3761 (2.34-500) +-Fix-Commit: 31eb872cb21449832ab47ad5db83281d240e1d03 (2.34-503) +-Reported-By: Qualys Security Advisory +diff --git a/advisories/GLIBC-SA-2025-0002 b/advisories/GLIBC-SA-2025-0002 +deleted file mode 100644 +index 161da13dd4..0000000000 +--- a/advisories/GLIBC-SA-2025-0002 ++++ /dev/null +@@ -1,23 +0,0 @@ +-elf: static setuid binary dlopen may incorrectly search LD_LIBRARY_PATH +- +-A statically linked setuid binary that calls dlopen (including internal +-dlopen calls after setlocale or calls to NSS functions such as getaddrinfo) +-may incorrectly search LD_LIBRARY_PATH to determine which library to load, +-leading to the execution of library code that is attacker controlled. +- +-The only viable vector for exploitation of this bug is local, if a static +-setuid program exists, and that program calls dlopen, then it may search +-LD_LIBRARY_PATH to locate the SONAME to load. No such program has been +-discovered at the time of publishing this advisory, but the presence of +-custom setuid programs, although strongly discouraged as a security +-practice, cannot be discounted. +- +-CVE-Id: CVE-2025-4802 +-Public-Date: 2025-05-16 +-Vulnerable-Commit: 10e93d968716ab82931d593bada121c17c0a4b93 (2.27) +-Fix-Commit: 5451fa962cd0a90a0e2ec1d8910a559ace02bba0 (2.39) +-Fix-Commit: 3be3728df2f1912c80abd3288bc6e3a25ad679e4 (2.38-132) +-Fix-Commit: 7403ede2d7752e59e0c47d5d33d73c2bf850e7be (2.37-154) +-Fix-Commit: 2ef7850279b2931caf6d6d6743ebaa91839e1cf7 (2.36-227) +-Fix-Commit: 621c65ccf12ddd415ceeb2234423bd1acd0fabb3 (2.35-387) +-Fix-Commit: 35018c0fd20eac9ceaf60060fed2745b3177359d (2.34-517) +diff --git a/advisories/GLIBC-SA-2025-0003 b/advisories/GLIBC-SA-2025-0003 +deleted file mode 100644 +index 2adeb3ce00..0000000000 +--- a/advisories/GLIBC-SA-2025-0003 ++++ /dev/null +@@ -1,30 +0,0 @@ +-power10: strcmp fails to save and restore nonvolatile vector registers +- +-The Power 10 implementation of strcmp in +-sysdeps/powerpc/powerpc64/le/power10/strcmp.S failed to save/restore +-nonvolatile vector registers in the 32-byte aligned loop path. This +-results in callers reading content from those registers in a different +-context, potentially altering program logic. +- +-There could be a program context where a user controlled string could +-leak through strcmp into program code, thus altering its logic. There +-is also a potential for sensitive strings passed into strcmp leaking +-through the clobbered registers into parts of the calling program that +-should otherwise not have had access to those strings. +- +-The impact of this flaw is limited to applications running on Power 10 +-hardware that use the nonvolatile vector registers, i.e. v20 to v31 +-assuming that they have been treated in accordance with the OpenPower +-psABI. It is possible to work around the issue for those specific +-applications by setting the glibc.cpu.hwcaps tunable to "-arch_3_1" like +-so: +- +- export GLIBC_TUNABLES=glibc.cpu.hwcaps=-arch_3_1 +- +-CVE-Id: CVE-2025-5702 +-Public-Date: 2025-06-04 +-Vulnerable-Commit: 3367d8e180848030d1646f088759f02b8dfe0d6f (2.39) +-Fix-Commit: 15808c77b35319e67ee0dc8f984a9a1a434701bc (2.42) +-Fix-Commit: 0c76c951620f9e12df2a89b2c684878b55bb6795 (2.41-60) +-Fix-Commit: 7e12550b8e3a11764a4a9090ce6bd3fc23fc8a8e (2.40-139) +-Fix-Commit: 06a70769fd0b2e1f2a3085ad50ab620282bd77b3 (2.39-209) +diff --git a/advisories/GLIBC-SA-2025-0004 b/advisories/GLIBC-SA-2025-0004 +deleted file mode 100644 +index 9409ca27c4..0000000000 +--- a/advisories/GLIBC-SA-2025-0004 ++++ /dev/null +@@ -1,29 +0,0 @@ +-power10: strncmp fails to save and restore nonvolatile vector registers +- +-The Power 10 implementation of strncmp in +-sysdeps/powerpc/powerpc64/le/power10/strncmp.S failed to save/restore +-nonvolatile vector registers in the 32-byte aligned loop path. This +-results in callers reading content from those registers in a different +-context, potentially altering program logic. +- +-There could be a program context where a user controlled string could +-leak through strncmp into program code, thus altering its logic. There +-is also a potential for sensitive strings passed into strncmp leaking +-through the clobbered registers into parts of the calling program that +-should otherwise not have had access to those strings. +- +-The impact of this flaw is limited to applications running on Power 10 +-hardware that use the nonvolatile vector registers, i.e. v20 to v31 +-assuming that they have been treated in accordance with the OpenPower +-psABI. It is possible to work around the issue for those specific +-applications by setting the glibc.cpu.hwcaps tunable to "-arch_3_1" like +-so: +- +- export GLIBC_TUNABLES=glibc.cpu.hwcaps=-arch_3_1 +- +-CVE-Id: CVE-2025-5745 +-Public-Date: 2025-06-05 +-Vulnerable-Commit: 23f0d81608d0ca6379894ef81670cf30af7fd081 (2.40) +-Fix-Commit: 63c60101ce7c5eac42be90f698ba02099b41b965 (2.42) +-Fix-Commit: 84bdbf8a6f2fdafd3661489dbb7f79835a52da82 (2.41-57) +-Fix-Commit: 42a5a940c974d02540c8da26d6374c744d148cb9 (2.40-136) +diff --git a/advisories/GLIBC-SA-2025-0005 b/advisories/GLIBC-SA-2025-0005 +deleted file mode 100644 +index 8bcccc59a5..0000000000 +--- a/advisories/GLIBC-SA-2025-0005 ++++ /dev/null +@@ -1,14 +0,0 @@ +-posix: Fix double-free after allocation failure in regcomp +- +-The regcomp function in the GNU C library version from 2.4 to 2.41 is +-subject to a double free if some previous allocation fails. It can be +-accomplished either by a malloc failure or by using an interposed +-malloc that injects random malloc failures. The double free can allow +-buffer manipulation depending of how the regex is constructed. +-This issue affects all architectures and ABIs supported by the GNU C +-library. +- +-CVE-Id: CVE-2025-8058 +-Public-Date: 2025-07-22 +-Vulnerable-Commit: 963d8d782fc98fb6dc3a66f0068795f9920c269d (2.3.3-1596) +-Fix-Commit: 7ea06e994093fa0bcca0d0ee2c1db271d8d7885d (2.42) +diff --git a/advisories/README b/advisories/README +deleted file mode 100644 +index b8f8a829ca..0000000000 +--- a/advisories/README ++++ /dev/null +@@ -1,77 +0,0 @@ +-GNU C Library Security Advisory Format +-====================================== +- +-Security advisories in this directory follow a simple git commit log +-format, with a heading and free-format description augmented with tags +-to allow parsing key information. References to code changes are +-specific to the glibc repository and follow a specific format: +- +- Tag-name: (release-version) +- +-The indicates a specific commit in the repository. The +-release-version indicates the publicly consumable release in which this +-commit is known to exist. The release-version is derived from the +-git-describe format, (i.e. stripped out from glibc-2.34.NNN-gxxxx) and +-is of the form 2.34-NNN. If the -NNN suffix is absent, it means that +-the change is in that release tarball, otherwise the change is on the +-release/2.YY/master branch and not in any released tarball. +- +-The following tags are currently being used: +- +-CVE-Id: +-This is the CVE-Id assigned under the CVE Program +-(https://www.cve.org/). +- +-Public-Date: +-The date this issue became publicly known. +- +-Vulnerable-Commit: +-The commit that introduced this vulnerability. There could be multiple +-entries, one for each release branch in the glibc repository; the +-release-version portion of this tag should tell you which branch this is +-on. +- +-Fix-Commit: +-The commit that fixed this vulnerability. There could be multiple +-entries for each release branch in the glibc repository, indicating that +-all of those commits contributed to fixing that issue in each of those +-branches. +- +-Reported-By: +-The entity that reported this issue. There could be multiple entries, one for +-each reporter. +- +-Adding an Advisory +------------------- +- +-An advisory for a CVE needs to be added on the master branch in two steps: +- +-1. Add the text of the advisory without any Fix-Commit tags along with +- the fix for the CVE. Add the Vulnerable-Commit tag, if applicable. +- The advisories directory does not exist in release branches, so keep +- the advisory text commit distinct from the code changes, to ease +- backports. Ask for the GLIBC-SA advisory number from the security +- team. +- +-2. Finish all backports on release branches and then back on the msater +- branch, add all commit refs to the advisory using the Fix-Commit +- tags. Don't bother adding the release-version subscript since the +- next step will overwrite it. +- +-3. Run the process-advisories.sh script in the scripts directory on the +- advisory: +- +- scripts/process-advisories.sh update GLIBC-SA-YYYY-NNNN +- +- (replace YYYY-NNNN with the actual advisory number). +- +-4. Verify the updated advisory and push the result. +- +-Getting a NEWS snippet from advisories +--------------------------------------- +- +-Run: +- +- scripts/process-advisories.sh news +- +-and copy the content into the NEWS file. + +commit 3ec4dd77f648da031bba4d3fa14825e057b5a40d +Author: Andreas K. Hüttel +Date: Mon Jul 28 23:39:48 2025 +0200 + + NEWS: add new section + + Signed-off-by: Andreas K. Hüttel + +diff --git a/NEWS b/NEWS +index f0b0e924a4..9cb8de11f9 100644 +--- a/NEWS ++++ b/NEWS +@@ -5,6 +5,12 @@ See the end for copying conditions. + Please send GNU C library bug reports via + using `glibc' in the "product" field. + ++Version 2.42.1 ++ ++The following bugs were resolved with this release: ++ ++ [insert bugs here] ++ + Version 2.42 + + Major new features: + +commit bc13db73937730401d592b33092db6df806d193e +Author: Sam James +Date: Mon Jul 28 21:55:30 2025 +0100 + + inet-fortified: fix namespace violation (bug 33227) + + We need to use __sz, not sz, as we do elsewhere. + + Reviewed-by: Florian Weimer + (cherry picked from commit 87afbd7a1ad9c1dd116921817fa97198171045db) + +diff --git a/inet/bits/inet-fortified.h b/inet/bits/inet-fortified.h +index 6738221a54..cc476ebcfd 100644 +--- a/inet/bits/inet-fortified.h ++++ b/inet/bits/inet-fortified.h +@@ -45,15 +45,15 @@ __NTH (inet_pton (int __af, + __fortify_clang_warning_only_if_bos0_lt + (4, __dst, "inet_pton called with destination buffer size less than 4") + { +- size_t sz = 0; ++ size_t __sz = 0; + if (__af == AF_INET) +- sz = sizeof (struct in_addr); ++ __sz = sizeof (struct in_addr); + else if (__af == AF_INET6) +- sz = sizeof (struct in6_addr); ++ __sz = sizeof (struct in6_addr); + else + return __inet_pton_alias (__af, __src, __dst); + +- return __glibc_fortify (inet_pton, sz, sizeof (char), ++ return __glibc_fortify (inet_pton, __sz, sizeof (char), + __glibc_objsize (__dst), + __af, __src, __dst); + }; + +commit fd18059c0fcf5568db3688da47403b663cf91c5e +Author: Davide Cavalca +Date: Thu Jul 31 17:32:58 2025 +0200 + + stdlib: resolve a double lock init issue after fork [BZ #32994] + + The __abort_fork_reset_child (introduced in + d40ac01cbbc66e6d9dbd8e3485605c63b2178251) call resets the lock after the + fork. This causes a DRD regression in valgrind + (https://bugs.kde.org/show_bug.cgi?id=503668), as it's effectively a + double initialization, despite it being actually ok in this case. As + suggested in https://sourceware.org/bugzilla/show_bug.cgi?id=32994#c2 + we replace it here with a memcpy of another initialized lock instead, + which makes valgrind happy. + + Reviewed-by: Florian Weimer + (cherry picked from commit d9a348d0927c7a1aec5caf3df3fcd36956b3eb23) + +diff --git a/NEWS b/NEWS +index 9cb8de11f9..4610b8bbc6 100644 +--- a/NEWS ++++ b/NEWS +@@ -9,7 +9,7 @@ Version 2.42.1 + + The following bugs were resolved with this release: + +- [insert bugs here] ++ [32994] stdlib: resolve a double lock init issue after fork + + Version 2.42 + +diff --git a/stdlib/abort.c b/stdlib/abort.c +index caa9e6dc04..904244a2fb 100644 +--- a/stdlib/abort.c ++++ b/stdlib/abort.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + + /* Try to get a machine dependent instruction which will make the +@@ -42,7 +43,10 @@ __libc_rwlock_define_initialized (static, lock); + void + __abort_fork_reset_child (void) + { +- __libc_rwlock_init (lock); ++ /* Reinitialize lock without calling pthread_rwlock_init, to ++ avoid a valgrind DRD false positive. */ ++ __libc_rwlock_define_initialized (, reset_lock); ++ memcpy (&lock, &reset_lock, sizeof (lock)); + } + + void + +commit 2fadee530155bae6682ab2965d6ff3a2fc9eced6 +Author: Florian Weimer +Date: Fri Aug 1 19:27:04 2025 +0200 + + elf: Extract rtld_setup_phdr function from dl_main + + Remove historic binutils reference from comment and update + how this data is used by applications. + + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 2cac9559e06044ba520e785c151fbbd25011865f) + +diff --git a/elf/rtld.c b/elf/rtld.c +index 493f9696ea..6fb900fb31 100644 +--- a/elf/rtld.c ++++ b/elf/rtld.c +@@ -1239,6 +1239,37 @@ rtld_setup_main_map (struct link_map *main_map) + return has_interp; + } + ++/* Set up the program header information for the dynamic linker ++ itself. It can be accessed via _r_debug and dl_iterate_phdr ++ callbacks. */ ++static void ++rtld_setup_phdr (void) ++{ ++ /* Starting from binutils-2.23, the linker will define the magic ++ symbol __ehdr_start to point to our own ELF header if it is ++ visible in a segment that also includes the phdrs. */ ++ ++ const ElfW(Ehdr) *rtld_ehdr = &__ehdr_start; ++ assert (rtld_ehdr->e_ehsize == sizeof *rtld_ehdr); ++ assert (rtld_ehdr->e_phentsize == sizeof (ElfW(Phdr))); ++ ++ const ElfW(Phdr) *rtld_phdr = (const void *) rtld_ehdr + rtld_ehdr->e_phoff; ++ ++ _dl_rtld_map.l_phdr = rtld_phdr; ++ _dl_rtld_map.l_phnum = rtld_ehdr->e_phnum; ++ ++ ++ /* PT_GNU_RELRO is usually the last phdr. */ ++ size_t cnt = rtld_ehdr->e_phnum; ++ while (cnt-- > 0) ++ if (rtld_phdr[cnt].p_type == PT_GNU_RELRO) ++ { ++ _dl_rtld_map.l_relro_addr = rtld_phdr[cnt].p_vaddr; ++ _dl_rtld_map.l_relro_size = rtld_phdr[cnt].p_memsz; ++ break; ++ } ++} ++ + /* Adjusts the contents of the stack and related globals for the user + entry point. The ld.so processed skip_args arguments and bumped + _dl_argv and _dl_argc accordingly. Those arguments are removed from +@@ -1705,33 +1736,7 @@ dl_main (const ElfW(Phdr) *phdr, + ++GL(dl_ns)[LM_ID_BASE]._ns_nloaded; + ++GL(dl_load_adds); + +- /* Starting from binutils-2.23, the linker will define the magic symbol +- __ehdr_start to point to our own ELF header if it is visible in a +- segment that also includes the phdrs. If that's not available, we use +- the old method that assumes the beginning of the file is part of the +- lowest-addressed PT_LOAD segment. */ +- +- /* Set up the program header information for the dynamic linker +- itself. It is needed in the dl_iterate_phdr callbacks. */ +- const ElfW(Ehdr) *rtld_ehdr = &__ehdr_start; +- assert (rtld_ehdr->e_ehsize == sizeof *rtld_ehdr); +- assert (rtld_ehdr->e_phentsize == sizeof (ElfW(Phdr))); +- +- const ElfW(Phdr) *rtld_phdr = (const void *) rtld_ehdr + rtld_ehdr->e_phoff; +- +- _dl_rtld_map.l_phdr = rtld_phdr; +- _dl_rtld_map.l_phnum = rtld_ehdr->e_phnum; +- +- +- /* PT_GNU_RELRO is usually the last phdr. */ +- size_t cnt = rtld_ehdr->e_phnum; +- while (cnt-- > 0) +- if (rtld_phdr[cnt].p_type == PT_GNU_RELRO) +- { +- _dl_rtld_map.l_relro_addr = rtld_phdr[cnt].p_vaddr; +- _dl_rtld_map.l_relro_size = rtld_phdr[cnt].p_memsz; +- break; +- } ++ rtld_setup_phdr (); + + /* Add the dynamic linker to the TLS list if it also uses TLS. */ + if (_dl_rtld_map.l_tls_blocksize != 0) + +commit 5e298d2d937b6da06500478be956abeb24357e05 +Author: Florian Weimer +Date: Fri Aug 1 19:27:35 2025 +0200 + + elf: Handle ld.so with LOAD segment gaps in _dl_find_object (bug 31943) + + Detect if ld.so not contiguous and handle that case in _dl_find_object. + Set l_find_object_processed even for initially loaded link maps, + otherwise dlopen of an initially loaded object adds it to + _dlfo_loaded_mappings (where maps are expected to be contiguous), + in addition to _dlfo_nodelete_mappings. + + Test elf/tst-link-map-contiguous-ldso iterates over the loader + image, reading every word to make sure memory is actually mapped. + It only does that if the l_contiguous flag is set for the link map. + Otherwise, it finds gaps with mmap and checks that _dl_find_object + does not return the ld.so mapping for them. + + The test elf/tst-link-map-contiguous-main does the same thing for + the libc.so shared object. This only works if the kernel loaded + the main program because the glibc dynamic loader may fill + the gaps with PROT_NONE mappings in some cases, making it contiguous, + but accesses to individual words may still fault. + + Test elf/tst-link-map-contiguous-libc is again slightly different + because the dynamic loader always fills the gaps with PROT_NONE + mappings, so a different form of probing has to be used. + + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 20681be149b9eb1b6c1f4246bf4bd801221c86cd) + +diff --git a/NEWS b/NEWS +index 4610b8bbc6..cbe11ac95b 100644 +--- a/NEWS ++++ b/NEWS +@@ -9,6 +9,7 @@ Version 2.42.1 + + The following bugs were resolved with this release: + ++ [31943] _dl_find_object can fail if ld.so contains gaps between load segments + [32994] stdlib: resolve a double lock init issue after fork + + Version 2.42 +diff --git a/elf/Makefile b/elf/Makefile +index 48aa0b57e5..3a5596e2bb 100644 +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -543,6 +543,8 @@ tests-internal += \ + tst-dl_find_object-threads \ + tst-dlmopen2 \ + tst-hash-collision3 \ ++ tst-link-map-contiguous-ldso \ ++ tst-link-map-contiguous-libc \ + tst-ptrguard1 \ + tst-stackguard1 \ + tst-tls-surplus \ +@@ -554,6 +556,10 @@ tests-internal += \ + unload2 \ + # tests-internal + ++ifeq ($(build-hardcoded-path-in-tests),yes) ++tests-internal += tst-link-map-contiguous-main ++endif ++ + tests-container += \ + tst-dlopen-self-container \ + tst-dlopen-tlsmodid-container \ +diff --git a/elf/dl-find_object.c b/elf/dl-find_object.c +index 1e76373292..c9f4c1c8d1 100644 +--- a/elf/dl-find_object.c ++++ b/elf/dl-find_object.c +@@ -465,6 +465,37 @@ _dl_find_object (void *pc1, struct dl_find_object *result) + } + rtld_hidden_def (_dl_find_object) + ++/* Subroutine of _dlfo_process_initial to split out noncontigous link ++ maps. NODELETE is the number of used _dlfo_nodelete_mappings ++ elements. It is incremented as needed, and the new NODELETE value ++ is returned. */ ++static size_t ++_dlfo_process_initial_noncontiguous_map (struct link_map *map, ++ size_t nodelete) ++{ ++ struct dl_find_object_internal dlfo; ++ _dl_find_object_from_map (map, &dlfo); ++ ++ /* PT_LOAD segments for a non-contiguous link map are added to the ++ non-closeable mappings. */ ++ const ElfW(Phdr) *ph = map->l_phdr; ++ const ElfW(Phdr) *ph_end = map->l_phdr + map->l_phnum; ++ for (; ph < ph_end; ++ph) ++ if (ph->p_type == PT_LOAD) ++ { ++ if (_dlfo_nodelete_mappings != NULL) ++ { ++ /* Second pass only. */ ++ _dlfo_nodelete_mappings[nodelete] = dlfo; ++ ElfW(Addr) start = ph->p_vaddr + map->l_addr; ++ _dlfo_nodelete_mappings[nodelete].map_start = start; ++ _dlfo_nodelete_mappings[nodelete].map_end = start + ph->p_memsz; ++ } ++ ++nodelete; ++ } ++ return nodelete; ++} ++ + /* _dlfo_process_initial is called twice. First to compute the array + sizes from the initial loaded mappings. Second to fill in the + bases and infos arrays with the (still unsorted) data. Returns the +@@ -476,29 +507,8 @@ _dlfo_process_initial (void) + + size_t nodelete = 0; + if (!main_map->l_contiguous) +- { +- struct dl_find_object_internal dlfo; +- _dl_find_object_from_map (main_map, &dlfo); +- +- /* PT_LOAD segments for a non-contiguous are added to the +- non-closeable mappings. */ +- for (const ElfW(Phdr) *ph = main_map->l_phdr, +- *ph_end = main_map->l_phdr + main_map->l_phnum; +- ph < ph_end; ++ph) +- if (ph->p_type == PT_LOAD) +- { +- if (_dlfo_nodelete_mappings != NULL) +- { +- /* Second pass only. */ +- _dlfo_nodelete_mappings[nodelete] = dlfo; +- _dlfo_nodelete_mappings[nodelete].map_start +- = ph->p_vaddr + main_map->l_addr; +- _dlfo_nodelete_mappings[nodelete].map_end +- = _dlfo_nodelete_mappings[nodelete].map_start + ph->p_memsz; +- } +- ++nodelete; +- } +- } ++ /* Contiguous case already handled in _dl_find_object_init. */ ++ nodelete = _dlfo_process_initial_noncontiguous_map (main_map, nodelete); + + size_t loaded = 0; + for (Lmid_t ns = 0; ns < GL(dl_nns); ++ns) +@@ -510,11 +520,18 @@ _dlfo_process_initial (void) + /* lt_library link maps are implicitly NODELETE. */ + if (l->l_type == lt_library || l->l_nodelete_active) + { +- if (_dlfo_nodelete_mappings != NULL) +- /* Second pass only. */ +- _dl_find_object_from_map +- (l, _dlfo_nodelete_mappings + nodelete); +- ++nodelete; ++ /* The kernel may have loaded ld.so with gaps. */ ++ if (!l->l_contiguous && is_rtld_link_map (l)) ++ nodelete ++ = _dlfo_process_initial_noncontiguous_map (l, nodelete); ++ else ++ { ++ if (_dlfo_nodelete_mappings != NULL) ++ /* Second pass only. */ ++ _dl_find_object_from_map ++ (l, _dlfo_nodelete_mappings + nodelete); ++ ++nodelete; ++ } + } + else if (l->l_type == lt_loaded) + { +@@ -764,7 +781,6 @@ _dl_find_object_update_1 (struct link_map **loaded, size_t count) + /* Prefer newly loaded link map. */ + assert (loaded_index1 > 0); + _dl_find_object_from_map (loaded[loaded_index1 - 1], dlfo); +- loaded[loaded_index1 - 1]->l_find_object_processed = 1; + --loaded_index1; + } + +diff --git a/elf/dl-find_object.h b/elf/dl-find_object.h +index 9aa2439eaa..d9d75c4ad9 100644 +--- a/elf/dl-find_object.h ++++ b/elf/dl-find_object.h +@@ -94,7 +94,7 @@ _dl_find_object_to_external (struct dl_find_object_internal *internal, + } + + /* Extract the object location data from a link map and writes it to +- *RESULT using relaxed MO stores. */ ++ *RESULT using relaxed MO stores. Set L->l_find_object_processed. */ + static void __attribute__ ((unused)) + _dl_find_object_from_map (struct link_map *l, + struct dl_find_object_internal *result) +@@ -141,8 +141,11 @@ _dl_find_object_from_map (struct link_map *l, + break; + } + if (read_seg == 3) +- return; ++ goto done; + } ++ ++ done: ++ l->l_find_object_processed = 1; + } + + /* Called by the dynamic linker to set up the data structures for the +diff --git a/elf/rtld.c b/elf/rtld.c +index 6fb900fb31..ef4d96c053 100644 +--- a/elf/rtld.c ++++ b/elf/rtld.c +@@ -1241,7 +1241,7 @@ rtld_setup_main_map (struct link_map *main_map) + + /* Set up the program header information for the dynamic linker + itself. It can be accessed via _r_debug and dl_iterate_phdr +- callbacks. */ ++ callbacks, and it is used by _dl_find_object. */ + static void + rtld_setup_phdr (void) + { +@@ -1259,6 +1259,29 @@ rtld_setup_phdr (void) + _dl_rtld_map.l_phnum = rtld_ehdr->e_phnum; + + ++ _dl_rtld_map.l_contiguous = 1; ++ /* The linker may not have produced a contiguous object. The kernel ++ will load the object with actual gaps (unlike the glibc loader ++ for shared objects, which always produces a contiguous mapping). ++ See similar logic in rtld_setup_main_map above. */ ++ { ++ ElfW(Addr) expected_load_address = 0; ++ for (const ElfW(Phdr) *ph = rtld_phdr; ph < &rtld_phdr[rtld_ehdr->e_phnum]; ++ ++ph) ++ if (ph->p_type == PT_LOAD) ++ { ++ ElfW(Addr) mapstart = ph->p_vaddr & ~(GLRO(dl_pagesize) - 1); ++ if (_dl_rtld_map.l_contiguous && expected_load_address != 0 ++ && expected_load_address != mapstart) ++ _dl_rtld_map.l_contiguous = 0; ++ ElfW(Addr) allocend = ph->p_vaddr + ph->p_memsz; ++ /* The next expected address is the page following this load ++ segment. */ ++ expected_load_address = ((allocend + GLRO(dl_pagesize) - 1) ++ & ~(GLRO(dl_pagesize) - 1)); ++ } ++ } ++ + /* PT_GNU_RELRO is usually the last phdr. */ + size_t cnt = rtld_ehdr->e_phnum; + while (cnt-- > 0) +diff --git a/elf/tst-link-map-contiguous-ldso.c b/elf/tst-link-map-contiguous-ldso.c +new file mode 100644 +index 0000000000..04de808bb2 +--- /dev/null ++++ b/elf/tst-link-map-contiguous-ldso.c +@@ -0,0 +1,98 @@ ++/* Check that _dl_find_object behavior matches up with gaps. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ struct link_map *l = xdlopen (LD_SO, RTLD_NOW); ++ if (!l->l_contiguous) ++ { ++ puts ("info: ld.so link map is not contiguous"); ++ ++ /* Try to find holes by probing with mmap. */ ++ int pagesize = getpagesize (); ++ bool gap_found = false; ++ ElfW(Addr) addr = l->l_map_start; ++ TEST_COMPARE (addr % pagesize, 0); ++ while (addr < l->l_map_end) ++ { ++ void *expected = (void *) addr; ++ void *ptr = xmmap (expected, 1, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANONYMOUS, -1); ++ struct dl_find_object dlfo; ++ int dlfo_ret = _dl_find_object (expected, &dlfo); ++ if (ptr == expected) ++ { ++ if (dlfo_ret < 0) ++ { ++ TEST_COMPARE (dlfo_ret, -1); ++ printf ("info: hole without mapping data found at %p\n", ptr); ++ } ++ else ++ FAIL ("object \"%s\" found in gap at %p", ++ dlfo.dlfo_link_map->l_name, ptr); ++ gap_found = true; ++ } ++ else if (dlfo_ret == 0) ++ { ++ if ((void *) dlfo.dlfo_link_map != (void *) l) ++ { ++ printf ("info: object \"%s\" found at %p\n", ++ dlfo.dlfo_link_map->l_name, ptr); ++ gap_found = true; ++ } ++ } ++ else ++ TEST_COMPARE (dlfo_ret, -1); ++ xmunmap (ptr, 1); ++ addr += pagesize; ++ } ++ if (!gap_found) ++ FAIL ("no ld.so gap found"); ++ } ++ else ++ { ++ puts ("info: ld.so link map is contiguous"); ++ ++ /* Assert that ld.so is truly contiguous in memory. */ ++ volatile long int *p = (volatile long int *) l->l_map_start; ++ volatile long int *end = (volatile long int *) l->l_map_end; ++ while (p < end) ++ { ++ *p; ++ ++p; ++ } ++ } ++ ++ xdlclose (l); ++ ++ return 0; ++} ++ ++#include +diff --git a/elf/tst-link-map-contiguous-libc.c b/elf/tst-link-map-contiguous-libc.c +new file mode 100644 +index 0000000000..eb5728c765 +--- /dev/null ++++ b/elf/tst-link-map-contiguous-libc.c +@@ -0,0 +1,57 @@ ++/* Check that the entire libc.so program image is readable if contiguous. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ struct link_map *l = xdlopen (LIBC_SO, RTLD_NOW); ++ ++ /* The dynamic loader fills holes with PROT_NONE mappings. */ ++ if (!l->l_contiguous) ++ FAIL_EXIT1 ("libc.so link map is not contiguous"); ++ ++ /* Direct probing does not work because not everything is readable ++ due to PROT_NONE mappings. */ ++ int pagesize = getpagesize (); ++ ElfW(Addr) addr = l->l_map_start; ++ TEST_COMPARE (addr % pagesize, 0); ++ while (addr < l->l_map_end) ++ { ++ void *expected = (void *) addr; ++ void *ptr = xmmap (expected, 1, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANONYMOUS, -1); ++ if (ptr == expected) ++ FAIL ("hole in libc.so memory image after %lu bytes", ++ (unsigned long int) (addr - l->l_map_start)); ++ xmunmap (ptr, 1); ++ addr += pagesize; ++ } ++ ++ xdlclose (l); ++ ++ return 0; ++} ++#include +diff --git a/elf/tst-link-map-contiguous-main.c b/elf/tst-link-map-contiguous-main.c +new file mode 100644 +index 0000000000..2d1a054f0f +--- /dev/null ++++ b/elf/tst-link-map-contiguous-main.c +@@ -0,0 +1,45 @@ ++/* Check that the entire main program image is readable if contiguous. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ struct link_map *l = xdlopen ("", RTLD_NOW); ++ if (!l->l_contiguous) ++ FAIL_UNSUPPORTED ("main link map is not contiguous"); ++ ++ /* This check only works if the kernel loaded the main program. The ++ dynamic loader replaces gaps with PROT_NONE mappings, resulting ++ in faults. */ ++ volatile long int *p = (volatile long int *) l->l_map_start; ++ volatile long int *end = (volatile long int *) l->l_map_end; ++ while (p < end) ++ { ++ *p; ++ ++p; ++ } ++ ++ xdlclose (l); ++ ++ return 0; ++} ++#include + +commit b38f3f60d5b157edcf4d8bd1fd3ed02d417889e0 +Author: Adhemerval Zanella +Date: Fri Aug 1 15:00:25 2025 -0300 + + nptl: Fix SYSCALL_CANCEL for return values larger than INT_MAX (BZ 33245) + + The SYSCALL_CANCEL calls __syscall_cancel, which in turn + calls __internal_syscall_cancel with an 'int' return instead of the + expected 'long int'. This causes issues with syscalls that return + values larger than INT_MAX, such as copy_file_range [1]. + + Checked on x86_64-linux-gnu. + + [1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=79139 + + Reviewed-by: Andreas K. Huettel + (cherry picked from commit 7107bebf19286f42dcb0a97581137a5893c16206) + +diff --git a/NEWS b/NEWS +index cbe11ac95b..1d04bdfef8 100644 +--- a/NEWS ++++ b/NEWS +@@ -11,6 +11,7 @@ The following bugs were resolved with this release: + + [31943] _dl_find_object can fail if ld.so contains gaps between load segments + [32994] stdlib: resolve a double lock init issue after fork ++ [33245] nptl: nptl: error in internal cancellation syscall handling + + Version 2.42 + +diff --git a/nptl/cancellation.c b/nptl/cancellation.c +index 156e63dcf0..bed0383a23 100644 +--- a/nptl/cancellation.c ++++ b/nptl/cancellation.c +@@ -72,8 +72,8 @@ __syscall_cancel (__syscall_arg_t a1, __syscall_arg_t a2, + __syscall_arg_t a5, __syscall_arg_t a6, + __SYSCALL_CANCEL7_ARG_DEF __syscall_arg_t nr) + { +- int r = __internal_syscall_cancel (a1, a2, a3, a4, a5, a6, +- __SYSCALL_CANCEL7_ARG nr); ++ long int r = __internal_syscall_cancel (a1, a2, a3, a4, a5, a6, ++ __SYSCALL_CANCEL7_ARG nr); + return __glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (r)) + ? SYSCALL_ERROR_LABEL (INTERNAL_SYSCALL_ERRNO (r)) + : r; + +commit 9d5bf9c17db0f35268cd798660c8bbeea1f4071d +Author: H.J. Lu +Date: Sat Jul 19 07:43:26 2025 -0700 + + Delete temporary files in support_subprocess + + Call support_delete_temp_files to delete temporary files before exit in + support_subprocess. + + This partially fixes BZ #33182. + + Signed-off-by: H.J. Lu + Reviewed-by: Adhemerval Zanella + (cherry picked from commit d27b1a71cd424710813bd3d81afb32a36470d643) + +diff --git a/support/support_subprocess.c b/support/support_subprocess.c +index be00dde3a7..8bf9a33ea2 100644 +--- a/support/support_subprocess.c ++++ b/support/support_subprocess.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + static struct support_subprocess + support_subprocess_init (void) +@@ -60,6 +61,8 @@ support_subprocess (void (*callback) (void *), void *closure) + xclose (result.stdout_pipe[1]); + xclose (result.stderr_pipe[1]); + callback (closure); ++ /* Make sure that temporary files are deleted. */ ++ support_delete_temp_files (); + _exit (0); + } + xclose (result.stdout_pipe[1]); + +commit 9ec7a532ffdb9a6e0a4b220d7a694d6120701035 +Author: H.J. Lu +Date: Sat Jul 19 07:43:27 2025 -0700 + + tst-fopen-threaded.c: Delete temporary file + + Update tst-fopen-threaded.c to call support_create_temp_directory to + create a temporary directory and open "file" in the temporary directory, + instead of using /tmp/openclosetest and leaving it behind. + + This partially fixes BZ #33182. + + Signed-off-by: H.J. Lu + Reviewed-by: Adhemerval Zanella + (cherry picked from commit e7db5150603bb2224a2bfd9628cae04ddcbe49e3) + +diff --git a/sysdeps/pthread/tst-fopen-threaded.c b/sysdeps/pthread/tst-fopen-threaded.c +index ade58ad19e..c17f1eaa13 100644 +--- a/sysdeps/pthread/tst-fopen-threaded.c ++++ b/sysdeps/pthread/tst-fopen-threaded.c +@@ -34,11 +34,13 @@ + #include + #include + #include ++#include + + #include + #include + #include + #include ++#include + + #define NUM_THREADS 100 + #define ITERS 10 +@@ -111,7 +113,8 @@ threadOpenCloseRoutine (void *argv) + /* Wait for all threads to be ready to call fopen and fclose. */ + xpthread_barrier_wait (&barrier); + +- FILE *fd = xfopen ("/tmp/openclosetest", "w+"); ++ char *file = (char *) argv; ++ FILE *fd = xfopen (file, "w+"); + xfclose (fd); + return NULL; + } +@@ -235,6 +238,10 @@ do_test (void) + xfclose (fd_file); + } + ++ char *tempdir = support_create_temp_directory ("openclosetest-"); ++ char *file = xasprintf ("%s/file", tempdir); ++ add_temp_file (file); ++ + /* Test 3: Concurrent open/close. */ + for (int reps = 1; reps <= ITERS; reps++) + { +@@ -243,7 +250,7 @@ do_test (void) + { + threads[i] = + xpthread_create (support_small_stack_thread_attribute (), +- threadOpenCloseRoutine, NULL); ++ threadOpenCloseRoutine, file); + } + for (int i = 0; i < NUM_THREADS; i++) + { +@@ -252,6 +259,9 @@ do_test (void) + xpthread_barrier_destroy (&barrier); + } + ++ free (file); ++ free (tempdir); ++ + return 0; + } + + +commit 41a77b78cff821007e3dd874619ebec7ce708c3d +Author: H.J. Lu +Date: Sat Jul 19 07:43:28 2025 -0700 + + tst-freopen4-main.c: Call support_capture_subprocess with chroot + + Update tst-freopen4-main.c to call support_capture_subprocess with chroot, + which makes temporary files inaccessible, so that temporary files can be + deleted. + + This partially fixes BZ #33182. + + Signed-off-by: H.J. Lu + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 6463d4a7b28e5ee3891c34a8a1f0a59c24dfa9de) + +diff --git a/stdio-common/tst-freopen4-main.c b/stdio-common/tst-freopen4-main.c +index 3336f5327d..436da4d203 100644 +--- a/stdio-common/tst-freopen4-main.c ++++ b/stdio-common/tst-freopen4-main.c +@@ -28,25 +28,15 @@ + #include + #include + #include ++#include + +-int +-do_test (void) ++static void ++do_test_chroot (void *data) + { +- mtrace (); +- char *temp_dir; ++ char *temp_dir = (char *) data; + FILE *fp; + int ret; + +- /* These chroot tests verify that either reopening a renamed or +- deleted file works even in the absence of /proc, or that it fails +- (without memory leaks); thus, for example, such reopening does +- not crash in the absence of /proc. */ +- +- support_become_root (); +- if (!support_can_chroot ()) +- return EXIT_UNSUPPORTED; +- +- temp_dir = support_create_temp_directory ("tst-freopen4"); + xchroot (temp_dir); + + /* Test freopen with NULL, renamed file. This verifies that +@@ -96,6 +86,32 @@ do_test (void) + puts ("freopen of deleted file failed (OK)"); + + free (temp_dir); ++} ++ ++int ++do_test (void) ++{ ++ mtrace (); ++ char *temp_dir; ++ ++ /* These chroot tests verify that either reopening a renamed or ++ deleted file works even in the absence of /proc, or that it fails ++ (without memory leaks); thus, for example, such reopening does ++ not crash in the absence of /proc. */ ++ ++ support_become_root (); ++ if (!support_can_chroot ()) ++ return EXIT_UNSUPPORTED; ++ ++ temp_dir = support_create_temp_directory ("tst-freopen4"); ++ ++ struct support_capture_subprocess result; ++ result = support_capture_subprocess (do_test_chroot, temp_dir); ++ support_capture_subprocess_check (&result, "freopen4", 0, ++ sc_allow_stdout); ++ fputs (result.out.buffer, stdout); ++ support_capture_subprocess_free (&result); ++ + return 0; + } + + +commit c090b0cb1cde74aaeec01663dd55d6681dc92075 +Author: H.J. Lu +Date: Sat Jul 19 07:43:29 2025 -0700 + + tst-env-setuid: Delete LD_DEBUG_OUTPUT output + + Update tst-env-setuid.c to delete LD_DEBUG_OUTPUT output, instead of + leaving it behind. + + This partially fixes BZ #33182. + + Signed-off-by: H.J. Lu + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 5d23dfb289174d73b8907b86d2bef7a3ca889840) + +diff --git a/elf/tst-env-setuid.c b/elf/tst-env-setuid.c +index 7209acd616..ff3eda7f91 100644 +--- a/elf/tst-env-setuid.c ++++ b/elf/tst-env-setuid.c +@@ -40,6 +40,8 @@ static char SETGID_CHILD[] = "setgid-child"; + # define PROFILE_LIB "tst-sonamemove-runmod2.so" + #endif + ++#define LD_DEBUG_OUTPUT "/tmp/some-file" ++ + struct envvar_t + { + const char *env; +@@ -61,7 +63,7 @@ static const struct envvar_t filtered_envvars[] = + { "MALLOC_TRIM_THRESHOLD_", FILTERED_VALUE }, + { "RES_OPTIONS", FILTERED_VALUE }, + { "LD_DEBUG", "all" }, +- { "LD_DEBUG_OUTPUT", "/tmp/some-file" }, ++ { "LD_DEBUG_OUTPUT", LD_DEBUG_OUTPUT }, + { "LD_WARN", FILTERED_VALUE }, + { "LD_VERBOSE", FILTERED_VALUE }, + { "LD_BIND_NOW", "0" }, +@@ -74,6 +76,14 @@ static const struct envvar_t unfiltered_envvars[] = + { "LD_ASSUME_KERNEL", UNFILTERED_VALUE }, + }; + ++static void ++unlink_ld_debug_output (pid_t pid) ++{ ++ char *output = xasprintf ("%s.%d", LD_DEBUG_OUTPUT, pid); ++ unlink (output); ++ free (output); ++} ++ + static int + test_child (void) + { +@@ -138,13 +148,21 @@ do_test (int argc, char **argv) + /* Setgid child process. */ + if (argc == 2 && strcmp (argv[1], SETGID_CHILD) == 0) + { ++ pid_t ppid = getppid (); ++ + if (getgid () == getegid ()) +- /* This can happen if the file system is mounted nosuid. */ +- FAIL_UNSUPPORTED ("SGID failed: GID and EGID match (%jd)\n", +- (intmax_t) getgid ()); ++ { ++ /* This can happen if the file system is mounted nosuid. */ ++ unlink_ld_debug_output (ppid); ++ ++ FAIL_UNSUPPORTED ("SGID failed: GID and EGID match (%jd)\n", ++ (intmax_t) getgid ()); ++ } + + int ret = test_child (); + ++ unlink_ld_debug_output (ppid); ++ + if (ret != 0) + exit (1); + return 0; + +commit e5754399b542640f3f69c5e2513c57a307656032 +Author: H.J. Lu +Date: Tue Aug 5 09:16:14 2025 -0700 + + Revert "tst-freopen4-main.c: Call support_capture_subprocess with chroot" + + Revert commit 6463d4a7b28e5ee3891c34a8a1f0a59c24dfa9de to fix + + FAIL: stdio-common/tst-freopen4-mem + FAIL: stdio-common/tst-freopen64-4-mem + + This fixes BZ #33254. + + Reviewed-by: Sam James + (cherry picked from commit adec0bf05bc23ec35573c7a5b96440089b69265e) + +diff --git a/stdio-common/tst-freopen4-main.c b/stdio-common/tst-freopen4-main.c +index 436da4d203..3336f5327d 100644 +--- a/stdio-common/tst-freopen4-main.c ++++ b/stdio-common/tst-freopen4-main.c +@@ -28,15 +28,25 @@ + #include + #include + #include +-#include + +-static void +-do_test_chroot (void *data) ++int ++do_test (void) + { +- char *temp_dir = (char *) data; ++ mtrace (); ++ char *temp_dir; + FILE *fp; + int ret; + ++ /* These chroot tests verify that either reopening a renamed or ++ deleted file works even in the absence of /proc, or that it fails ++ (without memory leaks); thus, for example, such reopening does ++ not crash in the absence of /proc. */ ++ ++ support_become_root (); ++ if (!support_can_chroot ()) ++ return EXIT_UNSUPPORTED; ++ ++ temp_dir = support_create_temp_directory ("tst-freopen4"); + xchroot (temp_dir); + + /* Test freopen with NULL, renamed file. This verifies that +@@ -86,32 +96,6 @@ do_test_chroot (void *data) + puts ("freopen of deleted file failed (OK)"); + + free (temp_dir); +-} +- +-int +-do_test (void) +-{ +- mtrace (); +- char *temp_dir; +- +- /* These chroot tests verify that either reopening a renamed or +- deleted file works even in the absence of /proc, or that it fails +- (without memory leaks); thus, for example, such reopening does +- not crash in the absence of /proc. */ +- +- support_become_root (); +- if (!support_can_chroot ()) +- return EXIT_UNSUPPORTED; +- +- temp_dir = support_create_temp_directory ("tst-freopen4"); +- +- struct support_capture_subprocess result; +- result = support_capture_subprocess (do_test_chroot, temp_dir); +- support_capture_subprocess_check (&result, "freopen4", 0, +- sc_allow_stdout); +- fputs (result.out.buffer, stdout); +- support_capture_subprocess_free (&result); +- + return 0; + } + + +commit c5476b7907d01207ede6bf57b26cef151b601f35 +Author: Samuel Thibault +Date: Fri Jul 18 23:14:40 2025 +0200 + + hurd: support: Fix running SGID tests + + Secure mode is enabled only if SGID actually provides a new privilege, + so we have to drop it before gaining it again. + + Fixes commit 3a3fb2ed83f79100c116c824454095ecfb335ad7 + ("Fix error reporting (false negatives) in SGID tests") + + (cherry picked from commit ad4589e2d834c80a042a8c354fb00cf33e06802c) + +diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c +index b4e4bf9502..c89e65b534 100644 +--- a/support/support_capture_subprocess.c ++++ b/support/support_capture_subprocess.c +@@ -133,6 +133,27 @@ copy_and_spawn_sgid (const char *child_id, gid_t gid) + if (chmod (execname, 02750) != 0) + FAIL_UNSUPPORTED ("cannot make \"%s\" SGID: %m ", execname); + ++ /* Now we can drop the privilege of that group. */ ++ const int count = 64; ++ gid_t groups[count]; ++ int ngroups = getgroups(count, groups); ++ ++ if (ngroups < 0) ++ FAIL_UNSUPPORTED ("Could not get group list again for user %jd\n", ++ (intmax_t) getuid ()); ++ ++ int n = 0; ++ for (int i = 0; i < ngroups; i++) ++ { ++ if (groups[i] != gid) ++ { ++ if (n != i) ++ groups[n] = groups[i]; ++ n++; ++ } ++ } ++ setgroups (n, groups); ++ + /* We have the binary, now spawn the subprocess. Avoid using + support_subprogram because we only want the program exit status, not the + contents. */ + +commit 8a726b63047241c6dd4b55bf85eacd02244362a2 +Author: Wilco Dijkstra +Date: Thu Jul 10 15:49:14 2025 +0000 + + malloc: Remove redundant NULL check + + Remove a redundant NULL check from tcache_get_n. + + Reviewed-by: Cupertino Miranda + (cherry picked from commit 089b4fb90fac8ed53039bc4c465c4d333c6b4048) + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index 5ca390cc22..cf5c02ff64 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -3208,11 +3208,10 @@ tcache_get_n (size_t tc_idx, tcache_entry **ep, bool mangled) + if (__glibc_unlikely (misaligned_mem (e))) + malloc_printerr ("malloc(): unaligned tcache chunk detected"); + +- void *ne = e == NULL ? NULL : REVEAL_PTR (e->next); + if (!mangled) +- *ep = ne; ++ *ep = REVEAL_PTR (e->next); + else +- *ep = PROTECT_PTR (ep, ne); ++ *ep = PROTECT_PTR (ep, REVEAL_PTR (e->next)); + + ++(tcache->num_slots[tc_idx]); + e->key = 0; +@@ -3229,7 +3228,7 @@ tcache_put (mchunkptr chunk, size_t tc_idx) + static __always_inline void * + tcache_get (size_t tc_idx) + { +- return tcache_get_n (tc_idx, & tcache->entries[tc_idx], false); ++ return tcache_get_n (tc_idx, &tcache->entries[tc_idx], false); + } + + static __always_inline tcache_entry ** + +commit c491dabd8a3de090d1ccb4589421a44e79c5b185 +Author: Wilco Dijkstra +Date: Thu Jul 17 14:31:06 2025 +0000 + + malloc: Fix MAX_TCACHE_SMALL_SIZE + + MAX_TCACHE_SMALL_SIZE should use chunk size since it is used after + checked_request2size. Increase limit of tcache_max_bytes by 1 since all + comparisons use '<'. As a result, the last tcache entry is now used as + expected. + + Reviewed-by: DJ Delorie + (cherry picked from commit ad4caba4146583fc543cd434221dec7113c03e09) + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index cf5c02ff64..b89b654f17 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -294,9 +294,9 @@ + # define TCACHE_SMALL_BINS 64 + # define TCACHE_LARGE_BINS 12 /* Up to 4M chunks */ + # define TCACHE_MAX_BINS (TCACHE_SMALL_BINS + TCACHE_LARGE_BINS) +-# define MAX_TCACHE_SMALL_SIZE tidx2usize (TCACHE_SMALL_BINS-1) ++# define MAX_TCACHE_SMALL_SIZE tidx2csize (TCACHE_SMALL_BINS-1) + +-/* Only used to pre-fill the tunables. */ ++# define tidx2csize(idx) (((size_t) idx) * MALLOC_ALIGNMENT + MINSIZE) + # define tidx2usize(idx) (((size_t) idx) * MALLOC_ALIGNMENT + MINSIZE - SIZE_SZ) + + /* When "x" is from chunksize(). */ +@@ -1932,7 +1932,7 @@ static struct malloc_par mp_ = + , + .tcache_count = TCACHE_FILL_COUNT, + .tcache_small_bins = TCACHE_SMALL_BINS, +- .tcache_max_bytes = MAX_TCACHE_SMALL_SIZE, ++ .tcache_max_bytes = MAX_TCACHE_SMALL_SIZE + 1, + .tcache_unsorted_limit = 0 /* No limit. */ + #endif + }; +@@ -5586,15 +5586,13 @@ do_set_arena_max (size_t value) + static __always_inline int + do_set_tcache_max (size_t value) + { ++ if (value > PTRDIFF_MAX) ++ return 0; ++ + size_t nb = request2size (value); + size_t tc_idx = csize2tidx (nb); + +- /* To check that value is not too big and request2size does not return an +- overflown value. */ +- if (value > nb) +- return 0; +- +- if (nb > MAX_TCACHE_SMALL_SIZE) ++ if (tc_idx >= TCACHE_SMALL_BINS) + tc_idx = large_csize2tidx (nb); + + LIBC_PROBE (memory_tunable_tcache_max_bytes, 2, value, mp_.tcache_max_bytes); +@@ -5603,7 +5601,7 @@ do_set_tcache_max (size_t value) + { + if (tc_idx < TCACHE_SMALL_BINS) + mp_.tcache_small_bins = tc_idx + 1; +- mp_.tcache_max_bytes = nb; ++ mp_.tcache_max_bytes = nb + 1; + return 1; + } + + +commit a96a82c4a5efd3139e75cd11fd2a5554164dd5a0 +Author: Samuel Thibault +Date: Wed Jul 30 01:55:22 2025 +0200 + + malloc: Make sure tcache_key is odd enough + + We want tcache_key not to be a commonly-occurring value in memory, so ensure + a minimum amount of one and zero bits. + + And we need it non-zero, otherwise even if tcache_double_free_verify sets + e->key to 0 before calling __libc_free, it gets called again by __libc_free, + thus looping indefinitely. + + Fixes: c968fe50628db74b52124d863cd828225a1d305c ("malloc: Use tailcalls in __libc_free") + (cherry picked from commit 2536c4f8584082a1ac4c5e0a2a6222e290d43983) + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index b89b654f17..e4e2f03600 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -230,6 +230,9 @@ + /* For uintptr_t. */ + #include + ++/* For stdc_count_ones. */ ++#include ++ + /* For va_arg, va_start, va_end. */ + #include + +@@ -3152,6 +3155,19 @@ tcache_key_initialize (void) + if (__getrandom_nocancel_nostatus_direct (&tcache_key, sizeof(tcache_key), + GRND_NONBLOCK) + != sizeof (tcache_key)) ++ tcache_key = 0; ++ ++ /* We need tcache_key to be non-zero (otherwise tcache_double_free_verify's ++ clearing of e->key would go unnoticed and it would loop getting called ++ through __libc_free), and we want tcache_key not to be a ++ commonly-occurring value in memory, so ensure a minimum amount of one and ++ zero bits. */ ++ int minimum_bits = __WORDSIZE / 4; ++ int maximum_bits = __WORDSIZE - minimum_bits; ++ ++ while (labs (tcache_key) <= 0x1000000 ++ || stdc_count_ones (tcache_key) < minimum_bits ++ || stdc_count_ones (tcache_key) > maximum_bits) + { + tcache_key = random_bits (); + #if __WORDSIZE == 64 + +commit d7274d718e6f3655eabe311d4eb70fabb5ffa7ef +Author: Samuel Thibault +Date: Sun Aug 10 23:43:37 2025 +0200 + + malloc: Fix checking for small negative values of tcache_key + + tcache_key is unsigned so we should turn it explicitly to signed before + taking its absolute value. + + (cherry picked from commit 8543577b04ded6d979ffcc5a818930e4d74d0645) + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index e4e2f03600..5f3e701fd1 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -3165,7 +3165,7 @@ tcache_key_initialize (void) + int minimum_bits = __WORDSIZE / 4; + int maximum_bits = __WORDSIZE - minimum_bits; + +- while (labs (tcache_key) <= 0x1000000 ++ while (labs ((intptr_t) tcache_key) <= 0x1000000 + || stdc_count_ones (tcache_key) < minimum_bits + || stdc_count_ones (tcache_key) > maximum_bits) + { + +commit 8dbaecbe92ac7ab73b7d0aae84626af59131e41b +Author: Jens Remus +Date: Fri Jul 25 15:40:03 2025 +0200 + + Use TLS initial-exec model for __libc_tsd_CTYPE_* thread variables [BZ #33234] + + Commit 10a66a8e421b ("Remove ") removed the TLS initial-exec + (IE) model attribute from the __libc_tsd_CTYPE_* thread variable declarations + and definitions. Commit a894f04d8776 ("Optimize __libc_tsd_* thread + variable access") restored it on declarations. + + Restore the TLS initial-exec model attribute on __libc_tsd_CTYPE_* thread + variable definitions. + + This resolves test tst-locale1 failure on s390 32-bit, when using a + GNU linker without the fix from GNU binutils commit aefebe82dc89 + ("IBM zSystems: Fix offset relative to static TLS"). + + Reviewed-by: Florian Weimer + (cherry picked from commit e5363e6f460c2d58809bf10fc96d70fd1ef8b5b2) + +diff --git a/NEWS b/NEWS +index 1d04bdfef8..69aa600c6d 100644 +--- a/NEWS ++++ b/NEWS +@@ -11,6 +11,7 @@ The following bugs were resolved with this release: + + [31943] _dl_find_object can fail if ld.so contains gaps between load segments + [32994] stdlib: resolve a double lock init issue after fork ++ [33234] Use TLS initial-exec model for __libc_tsd_CTYPE_* thread variables + [33245] nptl: nptl: error in internal cancellation syscall handling + + Version 2.42 +diff --git a/ctype/ctype-info.c b/ctype/ctype-info.c +index b7d3422726..fb5acf9419 100644 +--- a/ctype/ctype-info.c ++++ b/ctype/ctype-info.c +@@ -24,11 +24,11 @@ + __ctype_init before user code runs, but this does not happen for + threads in secondary namespaces. With the initializers, secondary + namespaces at least get locale data from the C locale. */ +-__thread const uint16_t * __libc_tsd_CTYPE_B ++__thread const uint16_t * __libc_tsd_CTYPE_B attribute_tls_model_ie + = (const uint16_t *) _nl_C_LC_CTYPE_class + 128; +-__thread const int32_t * __libc_tsd_CTYPE_TOLOWER ++__thread const int32_t * __libc_tsd_CTYPE_TOLOWER attribute_tls_model_ie + = (const int32_t *) _nl_C_LC_CTYPE_tolower + 128; +-__thread const int32_t * __libc_tsd_CTYPE_TOUPPER ++__thread const int32_t * __libc_tsd_CTYPE_TOUPPER attribute_tls_model_ie + = (const int32_t *) _nl_C_LC_CTYPE_toupper + 128; + + + +commit d0f72b96f2e91e1aa93f7e826c71f74078ada7d0 +Author: H.J. Lu +Date: Mon Jul 28 12:16:11 2025 -0700 + + i386: Add GLIBC_ABI_GNU_TLS version [BZ #33221] + + On i386, programs and shared libraries with __thread usage may fail + silently at run-time against glibc without the TLS run-time fix for: + + https://sourceware.org/bugzilla/show_bug.cgi?id=32996 + + Add GLIBC_ABI_GNU_TLS version to indicate that glibc has the working + GNU TLS run-time. Linker can add the GLIBC_ABI_GNU_TLS version to + binaries which depend on the working TLS run-time so that such programs + and shared libraries will fail to load and run at run-time against + libc.so without the GLIBC_ABI_GNU_TLS version, instead of fail silently + at random. + + This fixes BZ #33221. + + Signed-off-by: H.J. Lu + Reviewed-by: Sam James + (cherry picked from commit ed1b7a5a489ab555a27fad9c101ebe2e1c1ba881) + +diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile +index ee6470d78e..c0c017b899 100644 +--- a/sysdeps/i386/Makefile ++++ b/sysdeps/i386/Makefile +@@ -60,6 +60,15 @@ $(objpfx)tst-ld-sse-use.out: ../sysdeps/i386/tst-ld-sse-use.sh $(objpfx)ld.so + @echo "Checking ld.so for SSE register use. This will take a few seconds..." + $(BASH) $< $(objpfx) '$(NM)' '$(OBJDUMP)' '$(READELF)' > $@; \ + $(evaluate-test) ++ ++tests-special += $(objpfx)check-gnu-tls.out ++ ++$(objpfx)check-gnu-tls.out: $(common-objpfx)libc.so ++ LC_ALL=C $(READELF) -V -W $< \ ++ | sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \ ++ | grep GLIBC_ABI_GNU_TLS > $@; \ ++ $(evaluate-test) ++generated += check-gnu-tls.out + else + CFLAGS-.os += $(if $(filter rtld-%.os,$(@F)), $(rtld-CFLAGS)) + endif +diff --git a/sysdeps/i386/Versions b/sysdeps/i386/Versions +index 36e23b466a..9c84c8ef04 100644 +--- a/sysdeps/i386/Versions ++++ b/sysdeps/i386/Versions +@@ -28,6 +28,11 @@ libc { + GLIBC_2.13 { + __fentry__; + } ++ GLIBC_ABI_GNU_TLS { ++ # This symbol is used only for empty version map and will be removed ++ # by scripts/versions.awk. ++ __placeholder_only_for_empty_version_map; ++ } + } + libm { + GLIBC_2.1 { + +commit 3970785bebcc3f1de4460072f3a041d178f64846 +Author: H.J. Lu +Date: Mon Jul 28 12:18:22 2025 -0700 + + x86-64: Add GLIBC_ABI_GNU2_TLS version [BZ #33129] + + Programs and shared libraries compiled with -mtls-dialect=gnu2 may fail + silently at run-time against glibc without the GNU2 TLS run-time fix + for: + + https://sourceware.org/bugzilla/show_bug.cgi?id=31372 + + Add GLIBC_ABI_GNU2_TLS version to indicate that glibc has the working + GNU2 TLS run-time. Linker can add the GLIBC_ABI_GNU2_TLS version to + binaries which depend on the working GNU2 TLS run-time: + + https://sourceware.org/bugzilla/show_bug.cgi?id=33130 + + so that such programs and shared libraries will fail to load and run at + run-time against libc.so without the GLIBC_ABI_GNU2_TLS version, instead + of fail silently at random. + + This fixes BZ #33129. + + Signed-off-by: H.J. Lu + Reviewed-by: Sam James + (cherry picked from commit 9df8fa397d515dc86ff5565f6c45625e672d539e) + +diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile +index c3e1065c81..3ab8c1ed0f 100644 +--- a/sysdeps/x86_64/Makefile ++++ b/sysdeps/x86_64/Makefile +@@ -212,6 +212,15 @@ LDFLAGS-tst-plt-rewrite2 = -Wl,-z,now + LDFLAGS-tst-plt-rewritemod2.so = -Wl,-z,now,-z,undefs + tst-plt-rewrite2-ENV = GLIBC_TUNABLES=glibc.cpu.plt_rewrite=2 + $(objpfx)tst-plt-rewrite2: $(objpfx)tst-plt-rewritemod2.so ++ ++tests-special += $(objpfx)check-gnu2-tls.out ++ ++$(objpfx)check-gnu2-tls.out: $(common-objpfx)libc.so ++ LC_ALL=C $(READELF) -V -W $< \ ++ | sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \ ++ | grep GLIBC_ABI_GNU2_TLS > $@; \ ++ $(evaluate-test) ++generated += check-gnu2-tls.out + endif + + test-internal-extras += tst-gnu2-tls2mod1 +diff --git a/sysdeps/x86_64/Versions b/sysdeps/x86_64/Versions +index e94758b236..a63c11bcb2 100644 +--- a/sysdeps/x86_64/Versions ++++ b/sysdeps/x86_64/Versions +@@ -5,6 +5,11 @@ libc { + GLIBC_2.13 { + __fentry__; + } ++ GLIBC_ABI_GNU2_TLS { ++ # This symbol is used only for empty version map and will be removed ++ # by scripts/versions.awk. ++ __placeholder_only_for_empty_version_map; ++ } + } + libm { + GLIBC_2.1 { + +commit 7a8f3c6ee4b565a02da4ba0dad9aaeaeed4639ce +Author: H.J. Lu +Date: Thu Aug 14 07:03:20 2025 -0700 + + x86-64: Add GLIBC_ABI_DT_X86_64_PLT [BZ #33212] + + When the linker -z mark-plt option is used to add DT_X86_64_PLT, + DT_X86_64_PLTSZ and DT_X86_64_PLTENT, the r_addend field of the + R_X86_64_JUMP_SLOT relocation stores the offset of the indirect + branch instruction. However, glibc versions without the commit: + + commit f8587a61892cbafd98ce599131bf4f103466f084 + Author: H.J. Lu + Date: Fri May 20 19:21:48 2022 -0700 + + x86-64: Ignore r_addend for R_X86_64_GLOB_DAT/R_X86_64_JUMP_SLOT + + According to x86-64 psABI, r_addend should be ignored for R_X86_64_GLOB_DAT + and R_X86_64_JUMP_SLOT. Since linkers always set their r_addends to 0, we + can ignore their r_addends. + + Reviewed-by: Fangrui Song + + won't ignore the r_addend value in the R_X86_64_JUMP_SLOT relocation. + Such programs and shared libraries will fail at run-time randomly. + + Add GLIBC_ABI_DT_X86_64_PLT version to indicate that glibc is compatible + with DT_X86_64_PLT. + + The linker can add the glibc GLIBC_ABI_DT_X86_64_PLT version dependency + whenever -z mark-plt is passed to the linker. The resulting programs and + shared libraries will fail to load at run-time against libc.so without the + GLIBC_ABI_DT_X86_64_PLT version, instead of fail randomly. + + This fixes BZ #33212. + + Signed-off-by: H.J. Lu + Reviewed-by: Sam James + (cherry picked from commit 399384e0c8193e31aea014220ccfa24300ae5938) + +diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile +index 3ab8c1ed0f..01100597a8 100644 +--- a/sysdeps/x86_64/Makefile ++++ b/sysdeps/x86_64/Makefile +@@ -213,6 +213,15 @@ LDFLAGS-tst-plt-rewritemod2.so = -Wl,-z,now,-z,undefs + tst-plt-rewrite2-ENV = GLIBC_TUNABLES=glibc.cpu.plt_rewrite=2 + $(objpfx)tst-plt-rewrite2: $(objpfx)tst-plt-rewritemod2.so + ++tests-special += $(objpfx)check-dt-x86-64-plt.out ++ ++$(objpfx)check-dt-x86-64-plt.out: $(common-objpfx)libc.so ++ LC_ALL=C $(READELF) -V -W $< \ ++ | sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \ ++ | grep GLIBC_ABI_DT_X86_64_PLT > $@; \ ++ $(evaluate-test) ++generated += check-dt-x86-64-plt.out ++ + tests-special += $(objpfx)check-gnu2-tls.out + + $(objpfx)check-gnu2-tls.out: $(common-objpfx)libc.so +diff --git a/sysdeps/x86_64/Versions b/sysdeps/x86_64/Versions +index a63c11bcb2..0a759029e5 100644 +--- a/sysdeps/x86_64/Versions ++++ b/sysdeps/x86_64/Versions +@@ -10,6 +10,11 @@ libc { + # by scripts/versions.awk. + __placeholder_only_for_empty_version_map; + } ++ GLIBC_ABI_DT_X86_64_PLT { ++ # This symbol is used only for empty version map and will be removed ++ # by scripts/versions.awk. ++ __placeholder_only_for_empty_version_map; ++ } + } + libm { + GLIBC_2.1 { + +commit e87844ec42b77363a499ea4da6c4a6ab85eba310 +Author: H.J. Lu +Date: Mon Aug 18 09:06:48 2025 -0700 + + i386: Also add GLIBC_ABI_GNU2_TLS version [BZ #33129] + + Since the GNU2 TLS run-time bug: + + https://sourceware.org/bugzilla/show_bug.cgi?id=31372 + + affects both i386 and x86-64, also add GLIBC_ABI_GNU2_TLS version to i386 + to indicate the working GNU2 TLS run-time. For x86-64, the additional + GNU2 TLS run-time bug fix is needed for + + https://sourceware.org/bugzilla/show_bug.cgi?id=31501 + + Signed-off-by: H.J. Lu + Reviewed-by: Sam James + (cherry picked from commit bd4628f3f18ac312408782eea450429c6f044860) + +diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile +index 4fbd48e1c8..9e1c8cce85 100644 +--- a/sysdeps/x86/Makefile ++++ b/sysdeps/x86/Makefile +@@ -135,6 +135,15 @@ LDFLAGS-tst-tls23 += -rdynamic + tst-tls23-mod.so-no-z-defs = yes + + $(objpfx)tst-tls23-mod.so: $(libsupport) ++ ++tests-special += $(objpfx)check-gnu2-tls.out ++ ++$(objpfx)check-gnu2-tls.out: $(common-objpfx)libc.so ++ LC_ALL=C $(READELF) -V -W $< \ ++ | sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \ ++ | grep GLIBC_ABI_GNU2_TLS > $@; \ ++ $(evaluate-test) ++generated += check-gnu2-tls.out + endif + + ifeq ($(subdir),gmon) +diff --git a/sysdeps/x86/Versions b/sysdeps/x86/Versions +index 4b10c4b5d7..e8dcfccbe4 100644 +--- a/sysdeps/x86/Versions ++++ b/sysdeps/x86/Versions +@@ -7,4 +7,9 @@ libc { + GLIBC_2.33 { + __x86_get_cpuid_feature_leaf; + } ++ GLIBC_ABI_GNU2_TLS { ++ # This symbol is used only for empty version map and will be removed ++ # by scripts/versions.awk. ++ __placeholder_only_for_empty_version_map; ++ } + } +diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile +index 01100597a8..fe9f1cdddb 100644 +--- a/sysdeps/x86_64/Makefile ++++ b/sysdeps/x86_64/Makefile +@@ -221,15 +221,6 @@ $(objpfx)check-dt-x86-64-plt.out: $(common-objpfx)libc.so + | grep GLIBC_ABI_DT_X86_64_PLT > $@; \ + $(evaluate-test) + generated += check-dt-x86-64-plt.out +- +-tests-special += $(objpfx)check-gnu2-tls.out +- +-$(objpfx)check-gnu2-tls.out: $(common-objpfx)libc.so +- LC_ALL=C $(READELF) -V -W $< \ +- | sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \ +- | grep GLIBC_ABI_GNU2_TLS > $@; \ +- $(evaluate-test) +-generated += check-gnu2-tls.out + endif + + test-internal-extras += tst-gnu2-tls2mod1 +diff --git a/sysdeps/x86_64/Versions b/sysdeps/x86_64/Versions +index 0a759029e5..6a989ad3b3 100644 +--- a/sysdeps/x86_64/Versions ++++ b/sysdeps/x86_64/Versions +@@ -5,11 +5,6 @@ libc { + GLIBC_2.13 { + __fentry__; + } +- GLIBC_ABI_GNU2_TLS { +- # This symbol is used only for empty version map and will be removed +- # by scripts/versions.awk. +- __placeholder_only_for_empty_version_map; +- } + GLIBC_ABI_DT_X86_64_PLT { + # This symbol is used only for empty version map and will be removed + # by scripts/versions.awk. + +commit e34453cd6a8c592c325756ff3c7ac0afd3975cb4 +Author: Pierre Blanchard +Date: Wed Aug 20 17:41:50 2025 +0000 + + AArch64: Fix SVE powf routine [BZ #33299] + + Fix a bug in predicate logic introduced in last change. + A slight performance improvement from relying on all true + predicates during conversion from single to double. + This fixes BZ #33299. + + Reviewed-by: Wilco Dijkstra + (cherry picked from commit aac077645a645bba0d67f3250e82017c539d0f4b) + +diff --git a/sysdeps/aarch64/fpu/powf_sve.c b/sysdeps/aarch64/fpu/powf_sve.c +index 7046990aa1..65e9bd29d9 100644 +--- a/sysdeps/aarch64/fpu/powf_sve.c ++++ b/sysdeps/aarch64/fpu/powf_sve.c +@@ -223,15 +223,15 @@ sv_powf_core (const svbool_t pg, svuint32_t i, svuint32_t iz, svint32_t k, + const svbool_t ptrue = svptrue_b64 (); + + /* Unpack and promote input vectors (pg, y, z, i, k and sign_bias) into two +- * in order to perform core computation in double precision. */ ++ in order to perform core computation in double precision. */ + const svbool_t pg_lo = svunpklo (pg); + const svbool_t pg_hi = svunpkhi (pg); +- svfloat64_t y_lo +- = svcvt_f64_x (pg, svreinterpret_f32 (svunpklo (svreinterpret_u32 (y)))); +- svfloat64_t y_hi +- = svcvt_f64_x (pg, svreinterpret_f32 (svunpkhi (svreinterpret_u32 (y)))); +- svfloat64_t z_lo = svcvt_f64_x (pg, svreinterpret_f32 (svunpklo (iz))); +- svfloat64_t z_hi = svcvt_f64_x (pg, svreinterpret_f32 (svunpkhi (iz))); ++ svfloat64_t y_lo = svcvt_f64_x ( ++ ptrue, svreinterpret_f32 (svunpklo (svreinterpret_u32 (y)))); ++ svfloat64_t y_hi = svcvt_f64_x ( ++ ptrue, svreinterpret_f32 (svunpkhi (svreinterpret_u32 (y)))); ++ svfloat64_t z_lo = svcvt_f64_x (ptrue, svreinterpret_f32 (svunpklo (iz))); ++ svfloat64_t z_hi = svcvt_f64_x (ptrue, svreinterpret_f32 (svunpkhi (iz))); + svuint64_t i_lo = svunpklo (i); + svuint64_t i_hi = svunpkhi (i); + svint64_t k_lo = svunpklo (k); +@@ -312,7 +312,7 @@ svfloat32_t SV_NAME_F2 (pow) (svfloat32_t x, svfloat32_t y, const svbool_t pg) + (23 - V_POWF_EXP2_TABLE_BITS)); + + /* Compute core in extended precision and return intermediate ylogx results +- * to handle cases of underflow and underflow in exp. */ ++ to handle cases of underflow and overflow in exp. */ + svfloat32_t ylogx; + svfloat32_t ret + = sv_powf_core (yint_or_xpos, i, iz, k, y, sign_bias, &ylogx, d); + +commit 1166170d95863e5a6f8121a5ca9d97713f524f49 +Author: Florian Weimer +Date: Fri Sep 5 19:02:57 2025 +0200 + + libio: Define AT_RENAME_* with the same tokens as Linux + + Linux uses different expressions for the RENAME_* and AT_RENAME_* + constants. Mirror that in , so that the macro redefinitions + do not result in preprocessor warnings. + + Reviewed-by: Collin Funk + (cherry picked from commit b173557da978a04ac3bdfc0bd3b0e7ac583b44d5) + +diff --git a/libio/stdio.h b/libio/stdio.h +index d042b36618..e0e70945fa 100644 +--- a/libio/stdio.h ++++ b/libio/stdio.h +@@ -168,11 +168,11 @@ extern int renameat (int __oldfd, const char *__old, int __newfd, + #ifdef __USE_GNU + /* Flags for renameat2. */ + # define RENAME_NOREPLACE (1 << 0) +-# define AT_RENAME_NOREPLACE RENAME_NOREPLACE ++# define AT_RENAME_NOREPLACE 0x0001 + # define RENAME_EXCHANGE (1 << 1) +-# define AT_RENAME_EXCHANGE RENAME_EXCHANGE ++# define AT_RENAME_EXCHANGE 0x0002 + # define RENAME_WHITEOUT (1 << 2) +-# define AT_RENAME_WHITEOUT RENAME_WHITEOUT ++# define AT_RENAME_WHITEOUT 0x0004 + + /* Rename file OLD relative to OLDFD to NEW relative to NEWFD, with + additional flags. */ +diff --git a/stdio-common/tst-renameat2.c b/stdio-common/tst-renameat2.c +index 12aa0f8b0f..6213e1376d 100644 +--- a/stdio-common/tst-renameat2.c ++++ b/stdio-common/tst-renameat2.c +@@ -28,6 +28,12 @@ + #include + #include + ++/* These constants are defined with different token sequences, ++ matching the Linux definitions, to avoid preprocessor warnings. */ ++_Static_assert (RENAME_NOREPLACE == AT_RENAME_NOREPLACE, "RENAME_NOREPLACE"); ++_Static_assert (RENAME_EXCHANGE == AT_RENAME_EXCHANGE, "RENAME_EXCHANGE"); ++_Static_assert (RENAME_WHITEOUT == AT_RENAME_WHITEOUT, "RENAME_WHITEOUT"); ++ + /* Directory with the temporary files. */ + static char *directory; + static int directory_fd; + +commit 46b4e37c9e0619d0cf065ba207c29996b326a06f +Author: Florian Weimer +Date: Fri Sep 12 21:33:34 2025 +0200 + + nss: Group merge does not react to ERANGE during merge (bug 33361) + + The break statement in CHECK_MERGE is expected to exit the surrounding + while loop, not the do-while loop with in the macro. Remove the + do-while loop from the macro. It is not needed to turn the macro + expansion into a single statement due to the way CHECK_MERGE is used + (and the statement expression would cover this anyway). + + Reviewed-by: Collin Funk + (cherry picked from commit 0fceed254559836b57ee05188deac649bc505d05) + +diff --git a/NEWS b/NEWS +index 69aa600c6d..06c27a8e17 100644 +--- a/NEWS ++++ b/NEWS +@@ -13,6 +13,7 @@ The following bugs were resolved with this release: + [32994] stdlib: resolve a double lock init issue after fork + [33234] Use TLS initial-exec model for __libc_tsd_CTYPE_* thread variables + [33245] nptl: nptl: error in internal cancellation syscall handling ++ [33361] nss: Group merge does not react to ERANGE during merge + + Version 2.42 + +diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c +index eae6c3480e..2b0735fb6a 100644 +--- a/nss/getXXbyYY_r.c ++++ b/nss/getXXbyYY_r.c +@@ -157,19 +157,15 @@ __merge_einval (LOOKUP_TYPE *a, + + #define CHECK_MERGE(err, status) \ + ({ \ +- do \ ++ if (err) \ + { \ +- if (err) \ +- { \ +- __set_errno (err); \ +- if (err == ERANGE) \ +- status = NSS_STATUS_TRYAGAIN; \ +- else \ +- status = NSS_STATUS_UNAVAIL; \ +- break; \ +- } \ ++ __set_errno (err); \ ++ if (err == ERANGE) \ ++ status = NSS_STATUS_TRYAGAIN; \ ++ else \ ++ status = NSS_STATUS_UNAVAIL; \ ++ break; \ + } \ +- while (0); \ + }) + + /* Type of the lookup function we need here. */ + +commit 18fd689cdced8348e42991964557cddea0ba2dc5 +Author: Adhemerval Zanella +Date: Mon Sep 8 13:06:13 2025 -0300 + + nptl: Fix MADV_GUARD_INSTALL logic for thread without guard page (BZ 33356) + + The main issue is that setup_stack_prot fails to account for cases where + the cached thread stack lacks a guard page, which can cause madvise to + fail. Update the logic to also handle whether MADV_GUARD_INSTALL is + supported when resizing the guard page. + + Checked on x86_64-linux-gnu with 6.8.0 and 6.15 kernels. + + Reviewed-by: Florian Weimer + (cherry picked from commit 855bfa2566bbefefa27c516b344df58a75824a5c) + +diff --git a/NEWS b/NEWS +index 06c27a8e17..ed3c114c7a 100644 +--- a/NEWS ++++ b/NEWS +@@ -13,6 +13,8 @@ The following bugs were resolved with this release: + [32994] stdlib: resolve a double lock init issue after fork + [33234] Use TLS initial-exec model for __libc_tsd_CTYPE_* thread variables + [33245] nptl: nptl: error in internal cancellation syscall handling ++ [33356] nptl: creating thread stack with guardsize 0 can erroneously ++ conclude MADV_GUARD_INSTALL is available + [33361] nss: Group merge does not react to ERANGE during merge + + Version 2.42 +diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c +index 800ca89720..fb8a60a21d 100644 +--- a/nptl/allocatestack.c ++++ b/nptl/allocatestack.c +@@ -240,7 +240,7 @@ setup_stack_prot (char *mem, size_t size, struct pthread *pd, + /* Update the guard area of the thread stack MEM of size SIZE with the new + GUARDISZE. It uses the method defined by PD stack_mode. */ + static inline bool +-adjust_stack_prot (char *mem, size_t size, const struct pthread *pd, ++adjust_stack_prot (char *mem, size_t size, struct pthread *pd, + size_t guardsize, size_t pagesize_m1) + { + /* The required guard area is larger than the current one. For +@@ -258,11 +258,23 @@ adjust_stack_prot (char *mem, size_t size, const struct pthread *pd, + so use the new guard placement with the new size. */ + if (guardsize > pd->guardsize) + { ++ /* There was no need to previously setup a guard page, so we need ++ to check whether the kernel supports guard advise. */ + char *guard = guard_position (mem, size, guardsize, pd, pagesize_m1); +- if (pd->stack_mode == ALLOCATE_GUARD_MADV_GUARD) +- return __madvise (guard, guardsize, MADV_GUARD_INSTALL) == 0; +- else if (pd->stack_mode == ALLOCATE_GUARD_PROT_NONE) +- return __mprotect (guard, guardsize, PROT_NONE) == 0; ++ if (atomic_load_relaxed (&allocate_stack_mode) ++ == ALLOCATE_GUARD_MADV_GUARD) ++ { ++ if (__madvise (guard, guardsize, MADV_GUARD_INSTALL) == 0) ++ { ++ pd->stack_mode = ALLOCATE_GUARD_MADV_GUARD; ++ return true; ++ } ++ atomic_store_relaxed (&allocate_stack_mode, ++ ALLOCATE_GUARD_PROT_NONE); ++ } ++ ++ pd->stack_mode = ALLOCATE_GUARD_PROT_NONE; ++ return __mprotect (guard, guardsize, PROT_NONE) == 0; + } + /* The current guard area is larger than the required one. For + _STACK_GROWS_DOWN is means change the guard as: +diff --git a/nptl/tst-guard1.c b/nptl/tst-guard1.c +index e3e06df0fc..1c73d3fc93 100644 +--- a/nptl/tst-guard1.c ++++ b/nptl/tst-guard1.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -202,7 +203,7 @@ tf (void *closure) + + /* Test 1: caller provided stack without guard. */ + static void +-do_test1 (void) ++do_test1 (void *closure) + { + pthread_attr_t attr; + xpthread_attr_init (&attr); +@@ -227,7 +228,7 @@ do_test1 (void) + + /* Test 2: same as 1., but with a guard area. */ + static void +-do_test2 (void) ++do_test2 (void *closure) + { + pthread_attr_t attr; + xpthread_attr_init (&attr); +@@ -250,18 +251,9 @@ do_test2 (void) + xmunmap (stack, stacksize); + } + +-/* Test 3: pthread_create with default values. */ ++/* Test 3: pthread_create without a guard area. */ + static void +-do_test3 (void) +-{ +- pthread_t t = xpthread_create (NULL, tf, NULL); +- void *status = xpthread_join (t); +- TEST_VERIFY (status == 0); +-} +- +-/* Test 4: pthread_create without a guard area. */ +-static void +-do_test4 (void) ++do_test3 (void *closure) + { + pthread_attr_t attr; + xpthread_attr_init (&attr); +@@ -277,9 +269,18 @@ do_test4 (void) + xpthread_attr_destroy (&attr); + } + ++/* Test 4: pthread_create with default values. */ ++static void ++do_test4 (void *closure) ++{ ++ pthread_t t = xpthread_create (NULL, tf, NULL); ++ void *status = xpthread_join (t); ++ TEST_VERIFY (status == 0); ++} ++ + /* Test 5: pthread_create with non default stack and guard size value. */ + static void +-do_test5 (void) ++do_test5 (void *closure) + { + pthread_attr_t attr; + xpthread_attr_init (&attr); +@@ -299,7 +300,7 @@ do_test5 (void) + test 3, but with a larger guard area. The pthread_create will need to + increase the guard area. */ + static void +-do_test6 (void) ++do_test6 (void *closure) + { + pthread_attr_t attr; + xpthread_attr_init (&attr); +@@ -320,7 +321,7 @@ do_test6 (void) + pthread_create should use the cached stack from previous tests, but it + would require to reduce the guard area. */ + static void +-do_test7 (void) ++do_test7 (void *closure) + { + pthread_t t = xpthread_create (NULL, tf, NULL); + void *status = xpthread_join (t); +@@ -346,21 +347,40 @@ do_test (void) + + static const struct { + const char *descr; +- void (*test)(void); ++ void (*test) (void *); + } tests[] = { + { "user provided stack without guard", do_test1 }, + { "user provided stack with guard", do_test2 }, +- { "default attribute", do_test3 }, +- { "default attribute without guard", do_test4 }, ++ /* N.B: do_test3 should be before do_test4 to check if a new thread ++ that uses the thread stack previously allocated without a guard ++ page correctly sets up the guard pages even on a kernel without ++ MADV_GUARD_INSTALL support (BZ 33356). */ ++ { "default attribute without guard", do_test3 }, ++ { "default attribute", do_test4 }, ++ /* Also checks if the guard is correctly removed from the cache thread ++ stack. */ ++ { "default attribute without guard", do_test3 }, + { "non default stack and guard sizes", do_test5 }, + { "reused stack with larger guard", do_test6 }, + { "reused stack with smaller guard", do_test7 }, + }; + ++ /* Run each test with a clean state. */ ++ for (int i = 0; i < array_length (tests); i++) ++ { ++ printf ("debug: fork: test%01d: %s\n", i, tests[i].descr); ++ struct support_capture_subprocess result = ++ support_capture_subprocess (tests[i].test, NULL); ++ support_capture_subprocess_check (&result, tests[i].descr, 0, ++ sc_allow_none); ++ support_capture_subprocess_free (&result); ++ } ++ ++ /* And now run the same tests along with the thread stack cache. */ + for (int i = 0; i < array_length (tests); i++) + { + printf ("debug: test%01d: %s\n", i, tests[i].descr); +- tests[i].test(); ++ tests[i].test ( NULL); + } + + return 0; + +commit bf48b17a28066a54f172e0d63da9fc5dc60c6355 +Author: Sunil K Pandey +Date: Mon Oct 6 18:13:04 2025 -0700 + + x86: Detect Intel Wildcat Lake Processor + + Detect Intel Wildcat Lake Processor and tune it similar to Intel Panther + Lake. https://cdrdv2.intel.com/v1/dl/getContent/671368 Section 1.2. + + Reviewed-by: H.J. Lu + (cherry picked from commit f8dd52901b72805a831d5a4cb7d971e4a3c9970b) + +diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c +index b7d1506135..4bdade883e 100644 +--- a/sysdeps/x86/cpu-features.c ++++ b/sysdeps/x86/cpu-features.c +@@ -543,6 +543,7 @@ enum intel_microarch + INTEL_BIGCORE_PANTHERLAKE, + INTEL_BIGCORE_GRANITERAPIDS, + INTEL_BIGCORE_DIAMONDRAPIDS, ++ INTEL_BIGCORE_WILDCATLAKE, + + /* Mixed (bigcore + atom SOC). */ + INTEL_MIXED_LAKEFIELD, +@@ -702,6 +703,8 @@ intel_get_fam6_microarch (unsigned int model, + return INTEL_BIGCORE_ARROWLAKE; + case 0xCC: + return INTEL_BIGCORE_PANTHERLAKE; ++ case 0xD5: ++ return INTEL_BIGCORE_WILDCATLAKE; + case 0xAD: + case 0xAE: + return INTEL_BIGCORE_GRANITERAPIDS; +@@ -934,6 +937,7 @@ disable_tsx: + case INTEL_BIGCORE_LUNARLAKE: + case INTEL_BIGCORE_ARROWLAKE: + case INTEL_BIGCORE_PANTHERLAKE: ++ case INTEL_BIGCORE_WILDCATLAKE: + case INTEL_BIGCORE_SAPPHIRERAPIDS: + case INTEL_BIGCORE_EMERALDRAPIDS: + case INTEL_BIGCORE_GRANITERAPIDS: + +commit ab8c1b5d62d7be2c3c23f535bea3d7fff19c53ae +Author: Sunil K Pandey +Date: Wed Sep 24 09:38:17 2025 -0700 + + x86: Detect Intel Nova Lake Processor + + Detect Intel Nova Lake Processor and tune it similar to Intel Panther + Lake. https://cdrdv2.intel.com/v1/dl/getContent/671368 Section 1.2. + + Reviewed-by: H.J. Lu + (cherry picked from commit a114e29ddd530962d2b44aa9d89f1f6075abe7fa) + +diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c +index 4bdade883e..b67ef541dd 100644 +--- a/sysdeps/x86/cpu-features.c ++++ b/sysdeps/x86/cpu-features.c +@@ -544,6 +544,7 @@ enum intel_microarch + INTEL_BIGCORE_GRANITERAPIDS, + INTEL_BIGCORE_DIAMONDRAPIDS, + INTEL_BIGCORE_WILDCATLAKE, ++ INTEL_BIGCORE_NOVALAKE, + + /* Mixed (bigcore + atom SOC). */ + INTEL_MIXED_LAKEFIELD, +@@ -821,6 +822,17 @@ disable_tsx: + break; + } + } ++ else if (family == 18) ++ switch (model) ++ { ++ case 0x01: ++ case 0x03: ++ microarch = INTEL_BIGCORE_NOVALAKE; ++ break; ++ ++ default: ++ break; ++ } + else if (family == 19) + switch (model) + { +@@ -938,6 +950,7 @@ disable_tsx: + case INTEL_BIGCORE_ARROWLAKE: + case INTEL_BIGCORE_PANTHERLAKE: + case INTEL_BIGCORE_WILDCATLAKE: ++ case INTEL_BIGCORE_NOVALAKE: + case INTEL_BIGCORE_SAPPHIRERAPIDS: + case INTEL_BIGCORE_EMERALDRAPIDS: + case INTEL_BIGCORE_GRANITERAPIDS: + +commit 6de12fc9ad56bc19fa6fcbd8ee502f29b5170d47 +Author: Yury Khrustalev +Date: Thu Sep 25 15:51:30 2025 +0100 + + aarch64: define macro for calling __libc_arm_za_disable + + A common sequence of instructions is used in several places + in assembly files, so define it in one place as an assembly + macro. + + Reviewed-by: Adhemerval Zanella + (cherry picked from commit b4b713bd8921aff04773557da94fabb5fb9dd705) + +diff --git a/sysdeps/aarch64/__longjmp.S b/sysdeps/aarch64/__longjmp.S +index 70ac02c44b..53b42e1bdc 100644 +--- a/sysdeps/aarch64/__longjmp.S ++++ b/sysdeps/aarch64/__longjmp.S +@@ -26,16 +26,8 @@ + ENTRY (__longjmp) + + #if IS_IN(libc) +- /* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. +- The calling convention of __libc_arm_za_disable allows to do +- this thus allowing to avoid saving to and reading from stack. +- As a result we also don't need to sign the return address and +- check it after returning because it is not stored to stack. */ +- mov x13, x30 +- cfi_register (x30, x13) +- bl __libc_arm_za_disable +- mov x30, x13 +- cfi_register (x13, x30) ++ /* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. */ ++ CALL_LIBC_ARM_ZA_DISABLE + #endif + + cfi_def_cfa (x0, 0) +diff --git a/sysdeps/aarch64/setjmp.S b/sysdeps/aarch64/setjmp.S +index 53c5e7d8cc..92cedfad83 100644 +--- a/sysdeps/aarch64/setjmp.S ++++ b/sysdeps/aarch64/setjmp.S +@@ -37,16 +37,8 @@ ENTRY_ALIGN (__sigsetjmp, 2) + 1: + + #if IS_IN(libc) +- /* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. +- The calling convention of __libc_arm_za_disable allows to do +- this thus allowing to avoid saving to and reading from stack. +- As a result we also don't need to sign the return address and +- check it after returning because it is not stored to stack. */ +- mov x13, x30 +- cfi_register (x30, x13) +- bl __libc_arm_za_disable +- mov x30, x13 +- cfi_register (x13, x30) ++ /* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. */ ++ CALL_LIBC_ARM_ZA_DISABLE + #endif + + stp x19, x20, [x0, #JB_X19<<3] +diff --git a/sysdeps/unix/sysv/linux/aarch64/setcontext.S b/sysdeps/unix/sysv/linux/aarch64/setcontext.S +index d9716f012e..8e98594663 100644 +--- a/sysdeps/unix/sysv/linux/aarch64/setcontext.S ++++ b/sysdeps/unix/sysv/linux/aarch64/setcontext.S +@@ -49,15 +49,7 @@ ENTRY (__setcontext) + b C_SYMBOL_NAME (__syscall_error) + 1: + /* Clear ZA state of SME. */ +- /* The calling convention of __libc_arm_za_disable allows to do +- this thus allowing to avoid saving to and reading from stack. +- As a result we also don't need to sign the return address and +- check it after returning because it is not stored to stack. */ +- mov x13, x30 +- cfi_register (x30, x13) +- bl __libc_arm_za_disable +- mov x30, x13 +- cfi_register (x13, x30) ++ CALL_LIBC_ARM_ZA_DISABLE + /* Restore the general purpose registers. */ + mov x0, x9 + cfi_def_cfa (x0, 0) +diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h +index f0e8d64eef..fa01386b25 100644 +--- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -150,6 +150,18 @@ + mov x8, SYS_ify (syscall_name); \ + svc 0 + ++/* Clear ZA state of SME (ASM version). */ ++/* The __libc_arm_za_disable function has special calling convention ++ that allows to call it without stack manipulation and preserving ++ most of the registers. */ ++ .macro CALL_LIBC_ARM_ZA_DISABLE ++ mov x13, x30 ++ .cfi_register x30, x13 ++ bl __libc_arm_za_disable ++ mov x30, x13 ++ .cfi_register x13, x30 ++ .endm ++ + #else /* not __ASSEMBLER__ */ + + # define VDSO_NAME "LINUX_2.6.39" + +commit 256030b9842a10b1f22851b1de0c119761417544 +Author: Yury Khrustalev +Date: Thu Sep 25 15:54:36 2025 +0100 + + aarch64: clear ZA state of SME before clone and clone3 syscalls + + This change adds a call to the __arm_za_disable() function immediately + before the SVC instruction inside clone() and clone3() wrappers. It also + adds a macro for inline clone() used in fork() and adds the same call to + the vfork implementation. This sets the ZA state of SME to "off" on return + from these functions (for both the child and the parent). + + The __arm_za_disable() function is described in [1] (8.1.3). Note that + the internal Glibc name for this function is __libc_arm_za_disable(). + + When this change was originally proposed [2,3], it generated a long + discussion where several questions and concerns were raised. Here we + will address these concerns and explain why this change is useful and, + in fact, necessary. + + In a nutshell, a C library that conforms to the AAPCS64 spec [1] (pertinent + to this change, mainly, the chapters 6.2 and 6.6), should have a call to the + __arm_za_disable() function in clone() and clone3() wrappers. The following + explains in detail why this is the case. + + When we consider using the __arm_za_disable() function inside the clone() + and clone3() libc wrappers, we talk about the C library subroutines clone() + and clone3() rather than the syscalls with similar names. In the current + version of Glibc, clone() is public and clone3() is private, but it being + private is not pertinent to this discussion. + + We will begin with stating that this change is NOT a bug fix for something + in the kernel. The requirement to call __arm_za_disable() does NOT come from + the kernel. It also is NOT needed to satisfy a contract between the kernel + and userspace. This is why it is not for the kernel documentation to describe + this requirement. This requirement is instead needed to satisfy a pure userspace + scheme outlined in [1] and to make sure that software that uses Glibc (or any + other C library that has correct handling of SME states (see below)) conforms + to [1] without having to unnecessarily become SME-aware thus losing portability. + + To recap (see [1] (6.2)), SME extension defines SME state which is part of + processor state. Part of this SME state is ZA state that is necessary to + manage ZA storage register in the context of the ZA lazy saving scheme [1] + (6.6). This scheme exists because it would be challenging to handle ZA + storage of SME in either callee-saved or caller-saved manner. + + There are 3 kinds of ZA state that are defined in terms of the PSTATE.ZA + bit and the TPIDR2_EL0 register (see [1] (6.6.3)): + + - "off":       PSTATE.ZA == 0 + - "active":    PSTATE.ZA == 1 TPIDR2_EL0 == null + - "dormant":   PSTATE.ZA == 1 TPIDR2_EL0 != null + + As [1] (6.7.2) outlines, every subroutine has exactly one SME-interface + depending on the permitted ZA-states on entry and on normal return from + a call to this subroutine. Callers of a subroutine must know and respect + the ZA-interface of the subroutines they are using. Using a subroutine + in a way that is not permitted by its ZA-interface is undefined behaviour. + + In particular, clone() and clone3() (the C library functions) have the + ZA-private interface. This means that the permitted ZA-states on entry + are "off" and "dormant" and that the permitted states on return are "off" + or "dormant" (but if and only if it was "dormant" on entry). + + This means that both functions in question should correctly handle both + "off" and "dormant" ZA-states on entry. The conforming states on return + are "off" and "dormant" (if inbound state was already "dormant"). + + This change ensures that the ZA-state on return is always "off". Note, + that, in the context of clone() and clone3(), "on return" means a point + when execution resumes at certain address after transferring from clone() + or clone3(). For the caller (we may refer to it as "parent") this is the + return address in the link register where the RET instruction jumps. For + the "child", this is the target branch address. + + So, the "off" state on return is permitted and conformant. Why can't we + retain the "dormant" state? In theory, we can, but we shouldn't, here is + why. + + Every subroutine with a private-ZA interface, including clone() and clone3(), + must comply with the lazy saving scheme [1] (6.7.2). This puts additional + responsibility on a subroutine if ZA-state on return is "dormant" because + this state has special meaning. The "caller" (that is the place in code + where execution is transferred to, so this include both "parent" and "child") + may check the ZA-state and use it as per the spec of the "dormant" state that + is outlined in [1] (6.6.6 and 6.6.7). + + Conforming to this would require more code inside of clone() and clone3() + which hardly is desirable. + + For the return to "parent" this could be achieved in theory, but given that + neither clone() nor clone3() are supposed to be used in the middle of an + SME operation, if wouldn't be useful. For the "return" to "child" this + would be particularly difficult to achieve given the complexity of these + functions and their interfaces. Most importantly, it would be illegal + and somewhat meaningless to allow a "child" to start execution in the + "dormant" ZA-state because the very essence of the "dormant" state implies + that there is a place to return and that there is some outer context that + we are allowed to interact with. + + To sum up, calling __arm_za_disable() to ensure the "off" ZA-state when the + execution resumes after a call to clone() or clone3() is correct and also + the most simple way to conform to [1]. + + Can there be situations when we can avoid calling __arm_za_disable()? + + Calling __arm_za_disable() implies certain (sufficiently small) overhead, + so one might rightly ponder avoiding making a call to this function when + we can afford not to. The most trivial cases like this (e.g. when the + calling thread doesn't have access to SME or to the TPIDR2_EL0 register) + are already handled by this function (see [1] (8.1.3 and 8.1.2)). Reasoning + about other possible use cases would require making code inside clone() and + clone3() more complicated and it would defeat the point of trying to make + an optimisation of not calling __arm_za_disable(). + + Why can't the kernel do this instead? + + The handling of SME state by the kernel is described in [4]. In short, + kernel must not impose a specific ZA-interface onto a userspace function. + Interaction with the kernel happens (among other thing) via system calls. + In Glibc many of the system calls (notably, including SYS_clone and + SYS_clone3) are used via wrappers, and the kernel has no control of them + and, moreover, it cannot dictate how these wrappers should behave because + it is simply outside of the kernel's remit. + + However, in certain cases, the kernel may ensure that a "child" doesn't + start in an incorrect state. This is what is done by the recent change + included in 6.16 kernel [5]. This is not enough to ensure that code that + uses clone() and clone3() function conforms to [1] when it runs on a + system that provides SME, hence this change. + + [1]: https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst + [2]: https://inbox.sourceware.org/libc-alpha/20250522114828.2291047-1-yury.khrustalev@arm.com + [3]: https://inbox.sourceware.org/libc-alpha/20250609121407.3316070-1-yury.khrustalev@arm.com + [4]: https://www.kernel.org/doc/html/v6.16/arch/arm64/sme.html + [5]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cde5c32db55740659fca6d56c09b88800d88fd29 + + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 27effb3d50424fb9634be77a2acd614b0386ff25) + +diff --git a/sysdeps/unix/sysv/linux/aarch64/clone.S b/sysdeps/unix/sysv/linux/aarch64/clone.S +index 40015c6933..53f1efd728 100644 +--- a/sysdeps/unix/sysv/linux/aarch64/clone.S ++++ b/sysdeps/unix/sysv/linux/aarch64/clone.S +@@ -45,6 +45,9 @@ ENTRY(__clone) + and x1, x1, -16 + cbz x1, .Lsyscall_error + ++ /* Clear ZA state of SME. */ ++ CALL_LIBC_ARM_ZA_DISABLE ++ + /* Do the system call. */ + /* X0:flags, x1:newsp, x2:parenttidptr, x3:newtls, x4:childtid. */ + mov x0, x2 /* flags */ +diff --git a/sysdeps/unix/sysv/linux/aarch64/clone3.S b/sysdeps/unix/sysv/linux/aarch64/clone3.S +index c9ca845ef2..bc978b7e10 100644 +--- a/sysdeps/unix/sysv/linux/aarch64/clone3.S ++++ b/sysdeps/unix/sysv/linux/aarch64/clone3.S +@@ -46,6 +46,9 @@ ENTRY(__clone3) + cbz x10, .Lsyscall_error /* No NULL cl_args pointer. */ + cbz x2, .Lsyscall_error /* No NULL function pointer. */ + ++ /* Clear ZA state of SME. */ ++ CALL_LIBC_ARM_ZA_DISABLE ++ + /* Do the system call, the kernel expects: + x8: system call number + x0: cl_args +diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h +index fa01386b25..30003c0145 100644 +--- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -242,6 +242,31 @@ + #undef HAVE_INTERNAL_BRK_ADDR_SYMBOL + #define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1 + ++/* Clear ZA state of SME (C version). */ ++/* The __libc_arm_za_disable function has special calling convention ++ that allows to call it without stack manipulation and preserving ++ most of the registers. */ ++#define CALL_LIBC_ARM_ZA_DISABLE() \ ++({ \ ++ unsigned long int __tmp; \ ++ asm volatile ( \ ++ " mov %0, x30\n" \ ++ " .cfi_register x30, %0\n" \ ++ " bl __libc_arm_za_disable\n" \ ++ " mov x30, %0\n" \ ++ " .cfi_register %0, x30\n" \ ++ : "=r" (__tmp) \ ++ : \ ++ : "x14", "x15", "x16", "x17", "x18", "memory" ); \ ++}) ++ ++/* Do clear ZA state of SME before making normal clone syscall. */ ++#define INLINE_CLONE_SYSCALL(a0, a1, a2, a3, a4) \ ++({ \ ++ CALL_LIBC_ARM_ZA_DISABLE (); \ ++ INLINE_SYSCALL_CALL (clone, a0, a1, a2, a3, a4); \ ++}) ++ + #endif /* __ASSEMBLER__ */ + + #endif /* linux/aarch64/sysdep.h */ +diff --git a/sysdeps/unix/sysv/linux/aarch64/vfork.S b/sysdeps/unix/sysv/linux/aarch64/vfork.S +index d5943a7485..2600bc9be3 100644 +--- a/sysdeps/unix/sysv/linux/aarch64/vfork.S ++++ b/sysdeps/unix/sysv/linux/aarch64/vfork.S +@@ -27,6 +27,9 @@ + + ENTRY (__vfork) + ++ /* Clear ZA state of SME. */ ++ CALL_LIBC_ARM_ZA_DISABLE ++ + mov x0, #0x4111 /* CLONE_VM | CLONE_VFORK | SIGCHLD */ + mov x1, sp + DO_CALL (clone, 2) + +commit 71874f167aa5bb1538ff7e394beaacee28ebe65f +Author: Yury Khrustalev +Date: Fri Sep 26 10:03:45 2025 +0100 + + aarch64: tests for SME + + This commit adds tests for the following use cases relevant to handing of + the SME state: + + - fork() and vfork() + - clone() and clone3() + - signal handler + + While most cases are trivial, the case of clone3() is more complicated since + the clone3() symbol is not public in Glibc. + + To avoid having to check all possible ways clone3() may be called via other + public functions (e.g. vfork() or pthread_create()), we put together a test + that links directly with clone3.o. All the existing functions that have calls + to clone3() may not actually use it, in which case the outcome of such tests + would be unexpected. Having a direct call to the clone3() symbol in the test + allows to check precisely what we need to test: that the __arm_za_disable() + function is indeed called and has the desired effect. + + Linking to clone3.o also requires linking to __arm_za_disable.o that in + turn requires the _dl_hwcap2 hidden symbol which to provide in the test + and initialise it before using. + + Co-authored-by: Adhemerval Zanella Netto + Reviewed-by: Adhemerval Zanella + (cherry picked from commit ecb0fc2f0f839f36cd2a106283142c9df8ea8214) + +diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile +index bb97d31355..9479fb9679 100644 +--- a/sysdeps/aarch64/Makefile ++++ b/sysdeps/aarch64/Makefile +@@ -79,8 +79,18 @@ sysdep_routines += \ + + tests += \ + tst-sme-jmp \ ++ tst-sme-signal \ + tst-sme-za-state \ + # tests ++tests-internal += \ ++ tst-sme-clone \ ++ tst-sme-clone3 \ ++ tst-sme-fork \ ++ tst-sme-vfork \ ++ # tests-internal ++ ++$(objpfx)tst-sme-clone3: $(objpfx)clone3.o $(objpfx)__arm_za_disable.o ++ + endif + + ifeq ($(subdir),malloc) +diff --git a/sysdeps/aarch64/tst-sme-clone.c b/sysdeps/aarch64/tst-sme-clone.c +new file mode 100644 +index 0000000000..7106ec7926 +--- /dev/null ++++ b/sysdeps/aarch64/tst-sme-clone.c +@@ -0,0 +1,53 @@ ++/* Test that ZA state of SME is cleared in both parent and child ++ when clone() syscall is used. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include "tst-sme-skeleton.c" ++ ++#include ++ ++static int ++fun (void * const arg) ++{ ++ printf ("in child: %s\n", (const char *)arg); ++ /* Check that ZA state of SME was disabled in child. */ ++ check_sme_za_state ("after clone in child", /* Clear. */ true); ++ return 0; ++} ++ ++static char __attribute__((aligned(16))) ++stack[1024 * 1024]; ++ ++static void ++run (struct blk *ptr) ++{ ++ char *syscall_name = (char *)"clone"; ++ printf ("in parent: before %s\n", syscall_name); ++ ++ /* Enabled ZA state so that effect of disabling be observable. */ ++ enable_sme_za_state (ptr); ++ check_sme_za_state ("before clone", /* Clear. */ false); ++ ++ pid_t pid = xclone (fun, syscall_name, stack, sizeof (stack), ++ CLONE_NEWUSER | CLONE_NEWNS | SIGCHLD); ++ ++ /* Check that ZA state of SME was disabled in parent. */ ++ check_sme_za_state ("after clone in parent", /* Clear. */ true); ++ ++ TEST_VERIFY (xwaitpid (pid, NULL, 0) == pid); ++} +diff --git a/sysdeps/aarch64/tst-sme-clone3.c b/sysdeps/aarch64/tst-sme-clone3.c +new file mode 100644 +index 0000000000..402b040cfd +--- /dev/null ++++ b/sysdeps/aarch64/tst-sme-clone3.c +@@ -0,0 +1,84 @@ ++/* Test that ZA state of SME is cleared in both parent and child ++ when clone3() syscall is used. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include "tst-sme-skeleton.c" ++ ++#include ++ ++#include ++#include ++#include ++ ++/* Since clone3 is not a public symbol, we link this test explicitly ++ with clone3.o and have to provide this declaration. */ ++int __clone3 (struct clone_args *cl_args, size_t size, ++ int (*func)(void *arg), void *arg); ++ ++static int ++fun (void * const arg) ++{ ++ printf ("in child: %s\n", (const char *)arg); ++ /* Check that ZA state of SME was disabled in child. */ ++ check_sme_za_state ("after clone3 in child", /* Clear. */ true); ++ return 0; ++} ++ ++static char __attribute__((aligned(16))) ++stack[1024 * 1024]; ++ ++/* Required by __arm_za_disable.o and provided by the startup code ++ as a hidden symbol. */ ++uint64_t _dl_hwcap2; ++ ++static void ++run (struct blk *ptr) ++{ ++ _dl_hwcap2 = getauxval (AT_HWCAP2); ++ ++ char *syscall_name = (char *)"clone3"; ++ struct clone_args args = { ++ .flags = CLONE_VM | CLONE_VFORK, ++ .exit_signal = SIGCHLD, ++ .stack = (uintptr_t) stack, ++ .stack_size = sizeof (stack), ++ }; ++ printf ("in parent: before %s\n", syscall_name); ++ ++ /* Enabled ZA state so that effect of disabling be observable. */ ++ enable_sme_za_state (ptr); ++ check_sme_za_state ("before clone3", /* Clear. */ false); ++ ++ pid_t pid = __clone3 (&args, sizeof (args), fun, syscall_name); ++ ++ /* Check that ZA state of SME was disabled in parent. */ ++ check_sme_za_state ("after clone3 in parent", /* Clear. */ true); ++ ++ printf ("%s child pid: %d\n", syscall_name, pid); ++ ++ xwaitpid (pid, NULL, 0); ++ printf ("in parent: after %s\n", syscall_name); ++} ++ ++/* Workaround to simplify linking with clone3.o. */ ++void __syscall_error(int code) ++{ ++ int err = -code; ++ fprintf (stderr, "syscall error %d (%s)\n", err, strerror (err)); ++ exit (err); ++} +diff --git a/sysdeps/aarch64/tst-sme-fork.c b/sysdeps/aarch64/tst-sme-fork.c +new file mode 100644 +index 0000000000..b003b08884 +--- /dev/null ++++ b/sysdeps/aarch64/tst-sme-fork.c +@@ -0,0 +1,43 @@ ++/* Test that ZA state of SME is cleared in both parent and child ++ when fork() function is used. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include "tst-sme-skeleton.c" ++ ++static void ++run (struct blk *blk) ++{ ++ /* Enabled ZA state so that effect of disabling be observable. */ ++ enable_sme_za_state (blk); ++ check_sme_za_state ("before fork", /* Clear. */ false); ++ fflush (stdout); ++ ++ pid_t pid = xfork (); ++ ++ if (pid == 0) ++ { ++ /* Check that ZA state of SME was disabled in child. */ ++ check_sme_za_state ("after fork in child", /* Clear. */ true); ++ exit (0); ++ } ++ ++ /* Check that ZA state of SME was disabled in parent. */ ++ check_sme_za_state ("after fork in parent", /* Clear. */ true); ++ ++ TEST_VERIFY (xwaitpid (pid, NULL, 0) == pid); ++} +diff --git a/sysdeps/aarch64/tst-sme-helper.h b/sysdeps/aarch64/tst-sme-helper.h +index f049416c2b..ab9c503e45 100644 +--- a/sysdeps/aarch64/tst-sme-helper.h ++++ b/sysdeps/aarch64/tst-sme-helper.h +@@ -16,9 +16,6 @@ + License along with the GNU C Library; if not, see + . */ + +-/* Streaming SVE vector register size. */ +-static unsigned long svl; +- + struct blk { + void *za_save_buffer; + uint16_t num_za_save_slices; +@@ -68,10 +65,10 @@ start_za (void) + + /* Load data into ZA byte by byte from p. */ + static void __attribute__ ((noinline)) +-load_za (const void *p) ++load_za (const void *buf, unsigned long svl) + { + register unsigned long x15 asm ("x15") = 0; +- register unsigned long x16 asm ("x16") = (unsigned long)p; ++ register unsigned long x16 asm ("x16") = (unsigned long)buf; + register unsigned long x17 asm ("x17") = svl; + + asm volatile ( +diff --git a/sysdeps/aarch64/tst-sme-jmp.c b/sysdeps/aarch64/tst-sme-jmp.c +index 103897ad36..b2d21c6e1a 100644 +--- a/sysdeps/aarch64/tst-sme-jmp.c ++++ b/sysdeps/aarch64/tst-sme-jmp.c +@@ -29,6 +29,9 @@ + + #include "tst-sme-helper.h" + ++/* Streaming SVE vector register size. */ ++static unsigned long svl; ++ + static uint8_t *za_orig; + static uint8_t *za_dump; + static uint8_t *za_save; +@@ -82,7 +85,7 @@ longjmp_test (void) + FAIL_EXIT1 ("svcr != 0: %lu", svcr); + set_tpidr2 (&blk); + start_za (); +- load_za (za_orig); ++ load_za (za_orig, svl); + + print_data ("za save space", za_save); + p = get_tpidr2 (); +@@ -131,7 +134,7 @@ setcontext_test (void) + FAIL_EXIT1 ("svcr != 0: %lu", svcr); + set_tpidr2 (&blk); + start_za (); +- load_za (za_orig); ++ load_za (za_orig, svl); + + print_data ("za save space", za_save); + p = get_tpidr2 (); +diff --git a/sysdeps/aarch64/tst-sme-signal.c b/sysdeps/aarch64/tst-sme-signal.c +new file mode 100644 +index 0000000000..b4b07bcc44 +--- /dev/null ++++ b/sysdeps/aarch64/tst-sme-signal.c +@@ -0,0 +1,115 @@ ++/* Test handling of SME state in a signal handler. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include "tst-sme-skeleton.c" ++ ++#include ++ ++static struct _aarch64_ctx * ++extension (void *p) ++{ ++ return p; ++} ++ ++#ifndef TPIDR2_MAGIC ++#define TPIDR2_MAGIC 0x54504902 ++#endif ++ ++#ifndef ZA_MAGIC ++#define ZA_MAGIC 0x54366345 ++#endif ++ ++#ifndef ZT_MAGIC ++#define ZT_MAGIC 0x5a544e01 ++#endif ++ ++#ifndef EXTRA_MAGIC ++#define EXTRA_MAGIC 0x45585401 ++#endif ++ ++/* We use a pipe to make sure that the final check of the SME state ++ happens after signal handler finished. */ ++static int pipefd[2]; ++ ++#define WRITE(msg) xwrite (1, msg, sizeof (msg)); ++ ++static void ++handler (int signo, siginfo_t *si, void *ctx) ++{ ++ TEST_VERIFY (signo == SIGUSR1); ++ WRITE ("in the handler\n"); ++ check_sme_za_state ("during signal", true /* State is clear. */); ++ ucontext_t *uc = ctx; ++ void *p = uc->uc_mcontext.__reserved; ++ unsigned int found = 0; ++ uint32_t m; ++ while ((m = extension (p)->magic)) ++ { ++ if (m == TPIDR2_MAGIC) ++ { ++ WRITE ("found TPIDR2_MAGIC\n"); ++ found += 1; ++ } ++ if (m == ZA_MAGIC) ++ { ++ WRITE ("found ZA_MAGIC\n"); ++ found += 1; ++ } ++ if (m == ZT_MAGIC) ++ { ++ WRITE ("found ZT_MAGIC\n"); ++ found += 1; ++ } ++ if (m == EXTRA_MAGIC) ++ { ++ WRITE ("found EXTRA_MAGIC\n"); ++ struct { struct _aarch64_ctx h; uint64_t data; } *e = p; ++ p = (char *)e->data; ++ continue; ++ } ++ p = (char *)p + extension (p)->size; ++ } ++ TEST_COMPARE (found, 3); ++ ++ /* Signal that the wait is over (see below). */ ++ char message = '\0'; ++ xwrite (pipefd[1], &message, 1); ++} ++ ++static void ++run (struct blk *blk) ++{ ++ xpipe (pipefd); ++ ++ struct sigaction sigact; ++ sigemptyset (&sigact.sa_mask); ++ sigact.sa_flags = 0; ++ sigact.sa_flags |= SA_SIGINFO; ++ sigact.sa_sigaction = handler; ++ xsigaction (SIGUSR1, &sigact, NULL); ++ ++ enable_sme_za_state (blk); ++ check_sme_za_state ("before signal", false /* State is not clear. */); ++ xraise (SIGUSR1); ++ ++ /* Wait for signal handler to complete. */ ++ char response; ++ xread (pipefd[0], &response, 1); ++ ++ check_sme_za_state ("after signal", false /* State is not clear. */); ++} +diff --git a/sysdeps/aarch64/tst-sme-skeleton.c b/sysdeps/aarch64/tst-sme-skeleton.c +new file mode 100644 +index 0000000000..ba84dda1cb +--- /dev/null ++++ b/sysdeps/aarch64/tst-sme-skeleton.c +@@ -0,0 +1,101 @@ ++/* Template for SME tests. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "tst-sme-helper.h" ++ ++/* Streaming SVE vector register size. */ ++static unsigned long svl; ++ ++static uint8_t *state; ++ ++static void ++enable_sme_za_state (struct blk *blk) ++{ ++ start_za (); ++ set_tpidr2 (blk); ++ load_za (blk, svl); ++} ++ ++/* Check if SME state is disabled (when CLEAR is true) or ++ enabled (when CLEAR is false). */ ++static void ++check_sme_za_state (const char msg[], bool clear) ++{ ++ unsigned long svcr = get_svcr (); ++ void *tpidr2 = get_tpidr2 (); ++ printf ("[%s]\n", msg); ++ printf ("svcr = %016lx\n", svcr); ++ printf ("tpidr2 = %016lx\n", (unsigned long)tpidr2); ++ if (clear) ++ { ++ TEST_VERIFY (svcr == 0); ++ TEST_VERIFY (tpidr2 == NULL); ++ } ++ else ++ { ++ TEST_VERIFY (svcr != 0); ++ TEST_VERIFY (tpidr2 != NULL); ++ } ++} ++ ++/* Should be defined in actual test that includes this ++ skeleton file. */ ++static void ++run (struct blk *ptr); ++ ++static int ++do_test (void) ++{ ++ unsigned long hwcap2 = getauxval (AT_HWCAP2); ++ if ((hwcap2 & HWCAP2_SME) == 0) ++ return EXIT_UNSUPPORTED; ++ ++ /* Get current streaming SVE vector length in bytes. */ ++ svl = get_svl (); ++ printf ("svl: %lu\n", svl); ++ ++ TEST_VERIFY_EXIT (!(svl < 16 || svl % 16 != 0 || svl >= (1 << 16))); ++ ++ /* Initialise buffer for ZA state of SME. */ ++ state = xmalloc (svl * svl); ++ memset (state, 1, svl * svl); ++ struct blk blk = { ++ .za_save_buffer = state, ++ .num_za_save_slices = svl, ++ .__reserved = {0}, ++ }; ++ ++ run (&blk); ++ ++ free (state); ++ return 0; ++} ++ ++#include +diff --git a/sysdeps/aarch64/tst-sme-vfork.c b/sysdeps/aarch64/tst-sme-vfork.c +new file mode 100644 +index 0000000000..3feea065e5 +--- /dev/null ++++ b/sysdeps/aarch64/tst-sme-vfork.c +@@ -0,0 +1,43 @@ ++/* Test that ZA state of SME is cleared in both parent and child ++ when vfork() function is used. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include "tst-sme-skeleton.c" ++ ++static void ++run (struct blk *blk) ++{ ++ /* Enabled ZA state so that effect of disabling be observable. */ ++ enable_sme_za_state (blk); ++ check_sme_za_state ("before vfork", /* Clear. */ false); ++ fflush (stdout); ++ ++ pid_t pid = vfork (); ++ ++ if (pid == 0) ++ { ++ /* Check that ZA state of SME was disabled in child. */ ++ check_sme_za_state ("after vfork in child", /* Clear. */ true); ++ _exit (0); ++ } ++ ++ /* Check that ZA state of SME was disabled in parent. */ ++ check_sme_za_state ("after vfork in parent", /* Clear. */ true); ++ ++ TEST_VERIFY (xwaitpid (pid, NULL, 0) == pid); ++} +diff --git a/sysdeps/aarch64/tst-sme-za-state.c b/sysdeps/aarch64/tst-sme-za-state.c +index 63f6eebeb4..00118ef506 100644 +--- a/sysdeps/aarch64/tst-sme-za-state.c ++++ b/sysdeps/aarch64/tst-sme-za-state.c +@@ -16,47 +16,9 @@ + License along with the GNU C Library; if not, see + . */ + +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +- +-#include "tst-sme-helper.h" +- +-static uint8_t *state; +- +-static void +-enable_sme_za_state (struct blk *ptr) +-{ +- set_tpidr2 (ptr); +- start_za (); +- load_za (state); +-} ++#include "tst-sme-skeleton.c" + +-static void +-check_sme_za_state (const char msg[], bool clear) +-{ +- unsigned long svcr = get_svcr (); +- void *tpidr2 = get_tpidr2 (); +- printf ("[%s]\n", msg); +- printf ("svcr = %016lx\n", svcr); +- printf ("tpidr2 = %016lx\n", (unsigned long)tpidr2); +- if (clear) +- { +- TEST_VERIFY (svcr == 0); +- TEST_VERIFY (tpidr2 == NULL); +- } +- else +- { +- TEST_VERIFY (svcr != 0); +- TEST_VERIFY (tpidr2 != NULL); +- } +-} ++#include + + static void + run (struct blk *ptr) +@@ -88,32 +50,3 @@ run (struct blk *ptr) + TEST_COMPARE (ret, 42); + check_sme_za_state ("after longjmp", /* Clear. */ true); + } +- +-static int +-do_test (void) +-{ +- unsigned long hwcap2 = getauxval (AT_HWCAP2); +- if ((hwcap2 & HWCAP2_SME) == 0) +- return EXIT_UNSUPPORTED; +- +- /* Get current streaming SVE vector register size. */ +- svl = get_svl (); +- printf ("svl: %lu\n", svl); +- TEST_VERIFY_EXIT (!(svl < 16 || svl % 16 != 0 || svl >= (1 << 16))); +- +- /* Initialise buffer for ZA state of SME. */ +- state = xmalloc (svl * svl); +- memset (state, 1, svl * svl); +- struct blk blk = { +- .za_save_buffer = state, +- .num_za_save_slices = svl, +- .__reserved = {0}, +- }; +- +- run (&blk); +- +- free (state); +- return 0; +-} +- +-#include + +commit bf499c2a4964bddc25a006ec1402f8996d78c6ff +Author: Jiamei Xie +Date: Tue Oct 14 20:14:11 2025 +0800 + + x86: fix wmemset ifunc stray '!' (bug 33542) + + The ifunc selector for wmemset had a stray '!' in the + X86_ISA_CPU_FEATURES_ARCH_P(...) check: + + if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX2) + && X86_ISA_CPU_FEATURES_ARCH_P (cpu_features, + AVX_Fast_Unaligned_Load, !)) + + This effectively negated the predicate and caused the AVX2/AVX512 + paths to be skipped, making the dispatcher fall back to the SSE2 + implementation even on CPUs where AVX2/AVX512 are available. The + regression leads to noticeable throughput loss for wmemset. + + Remove the stray '!' so the AVX_Fast_Unaligned_Load capability is + tested as intended and the correct AVX2/EVEX variants are selected. + + Impact: + - On AVX2/AVX512-capable x86_64, wmemset no longer incorrectly + falls back to SSE2; perf now shows __wmemset_evex/avx2 variants. + + Testing: + - benchtests/bench-wmemset shows improved bandwidth across sizes. + - perf confirm the selected symbol is no longer SSE2. + + Signed-off-by: xiejiamei + Signed-off-by: Li jing + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 4d86b6cdd8132e0410347e07262239750f86dfb4) + +diff --git a/sysdeps/x86_64/multiarch/ifunc-wmemset.h b/sysdeps/x86_64/multiarch/ifunc-wmemset.h +index f95cca6ae5..50af138230 100644 +--- a/sysdeps/x86_64/multiarch/ifunc-wmemset.h ++++ b/sysdeps/x86_64/multiarch/ifunc-wmemset.h +@@ -35,7 +35,7 @@ IFUNC_SELECTOR (void) + + if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX2) + && X86_ISA_CPU_FEATURES_ARCH_P (cpu_features, +- AVX_Fast_Unaligned_Load, !)) ++ AVX_Fast_Unaligned_Load,)) + { + if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512VL)) + { + +commit de1fe81f471496366580ad728b8986a3424b2fd7 +Author: Yury Khrustalev +Date: Tue Oct 28 11:01:50 2025 +0000 + + aarch64: fix cfi directives around __libc_arm_za_disable + + Incorrect CFI directive corrupted call stack information + and prevented debuggers from correctly displaying call + stack information. + + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 2f77aec043f61e8533487850b11941a640ae2dea) + +diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h +index 30003c0145..8a7690d4a8 100644 +--- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h ++++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h +@@ -155,11 +155,12 @@ + that allows to call it without stack manipulation and preserving + most of the registers. */ + .macro CALL_LIBC_ARM_ZA_DISABLE ++ cfi_remember_state + mov x13, x30 +- .cfi_register x30, x13 ++ cfi_register(x30, x13) + bl __libc_arm_za_disable + mov x30, x13 +- .cfi_register x13, x30 ++ cfi_restore_state + .endm + + #else /* not __ASSEMBLER__ */ +@@ -250,11 +251,12 @@ + ({ \ + unsigned long int __tmp; \ + asm volatile ( \ ++ " .cfi_remember_state\n" \ + " mov %0, x30\n" \ +- " .cfi_register x30, %0\n" \ ++ " .cfi_register x30, %0\n" \ + " bl __libc_arm_za_disable\n" \ + " mov x30, %0\n" \ +- " .cfi_register %0, x30\n" \ ++ " .cfi_restore_state\n" \ + : "=r" (__tmp) \ + : \ + : "x14", "x15", "x16", "x17", "x18", "memory" ); \ + +commit 17c3eab387c3ceb6972e57888a89b1480793f81a +Author: Yury Khrustalev +Date: Tue Nov 11 11:40:25 2025 +0000 + + aarch64: fix includes in SME tests + + Use the correct include for the SIGCHLD macro: signal.h + + Reviewed-by: Wilco Dijkstra + (cherry picked from commit a9c426bcca59a9e228c4fbe75e75154217ec4ada) + +diff --git a/sysdeps/aarch64/tst-sme-clone.c b/sysdeps/aarch64/tst-sme-clone.c +index 7106ec7926..b6ad54fa37 100644 +--- a/sysdeps/aarch64/tst-sme-clone.c ++++ b/sysdeps/aarch64/tst-sme-clone.c +@@ -19,6 +19,7 @@ + + #include "tst-sme-skeleton.c" + ++#include + #include + + static int +diff --git a/sysdeps/aarch64/tst-sme-clone3.c b/sysdeps/aarch64/tst-sme-clone3.c +index 402b040cfd..f420d5984d 100644 +--- a/sysdeps/aarch64/tst-sme-clone3.c ++++ b/sysdeps/aarch64/tst-sme-clone3.c +@@ -22,7 +22,7 @@ + #include + + #include +-#include ++#include + #include + + /* Since clone3 is not a public symbol, we link this test explicitly + +commit 97297120ce04f0edd16ed0357a11ef8731c5bd1e +Author: Joe Ramsay +Date: Thu Nov 6 15:36:03 2025 +0000 + + AArch64: Optimise SVE scalar callbacks + + Instead of using SVE instructions to marshall special results into the + correct lane, just write the entire vector (and the predicate) to + memory, then use cheaper scalar operations. + + Geomean speedup of 16% in special intervals on Neoverse with GCC 14. + + Reviewed-by: Wilco Dijkstra + (cherry picked from commit 5b82fb18827e962af9f080fdf3c1a69802783f67) + +diff --git a/sysdeps/aarch64/fpu/sv_math.h b/sysdeps/aarch64/fpu/sv_math.h +index 3d576df4cc..65d7f0ff20 100644 +--- a/sysdeps/aarch64/fpu/sv_math.h ++++ b/sysdeps/aarch64/fpu/sv_math.h +@@ -24,11 +24,29 @@ + + #include "vecmath_config.h" + ++#if !defined(__ARM_FEATURE_SVE_BITS) || __ARM_FEATURE_SVE_BITS == 0 ++/* If not specified by -msve-vector-bits, assume maximum vector length. */ ++# define SVE_VECTOR_BYTES 256 ++#else ++# define SVE_VECTOR_BYTES (__ARM_FEATURE_SVE_BITS / 8) ++#endif ++#define SVE_NUM_FLTS (SVE_VECTOR_BYTES / sizeof (float)) ++#define SVE_NUM_DBLS (SVE_VECTOR_BYTES / sizeof (double)) ++/* Predicate is stored as one bit per byte of VL so requires VL / 64 bytes. */ ++#define SVE_NUM_PG_BYTES (SVE_VECTOR_BYTES / sizeof (uint64_t)) ++ + #define SV_NAME_F1(fun) _ZGVsMxv_##fun##f + #define SV_NAME_D1(fun) _ZGVsMxv_##fun + #define SV_NAME_F2(fun) _ZGVsMxvv_##fun##f + #define SV_NAME_D2(fun) _ZGVsMxvv_##fun + ++static inline void ++svstr_p (uint8_t *dst, svbool_t p) ++{ ++ /* Predicate STR does not currently have an intrinsic. */ ++ __asm__("str %0, [%x1]\n" : : "Upa"(p), "r"(dst) : "memory"); ++} ++ + /* Double precision. */ + static inline svint64_t + sv_s64 (int64_t x) +@@ -51,33 +69,35 @@ sv_f64 (double x) + static inline svfloat64_t + sv_call_f64 (double (*f) (double), svfloat64_t x, svfloat64_t y, svbool_t cmp) + { +- svbool_t p = svpfirst (cmp, svpfalse ()); +- while (svptest_any (cmp, p)) ++ double tmp[SVE_NUM_DBLS]; ++ uint8_t pg_bits[SVE_NUM_PG_BYTES]; ++ svstr_p (pg_bits, cmp); ++ svst1 (svptrue_b64 (), tmp, svsel (cmp, x, y)); ++ ++ for (int i = 0; i < svcntd (); i++) + { +- double elem = svclastb_n_f64 (p, 0, x); +- elem = (*f) (elem); +- svfloat64_t y2 = svdup_n_f64 (elem); +- y = svsel_f64 (p, y2, y); +- p = svpnext_b64 (cmp, p); ++ if (pg_bits[i] & 1) ++ tmp[i] = f (tmp[i]); + } +- return y; ++ return svld1 (svptrue_b64 (), tmp); + } + + static inline svfloat64_t + sv_call2_f64 (double (*f) (double, double), svfloat64_t x1, svfloat64_t x2, + svfloat64_t y, svbool_t cmp) + { +- svbool_t p = svpfirst (cmp, svpfalse ()); +- while (svptest_any (cmp, p)) ++ double tmp1[SVE_NUM_DBLS], tmp2[SVE_NUM_DBLS]; ++ uint8_t pg_bits[SVE_NUM_PG_BYTES]; ++ svstr_p (pg_bits, cmp); ++ svst1 (svptrue_b64 (), tmp1, svsel (cmp, x1, y)); ++ svst1 (cmp, tmp2, x2); ++ ++ for (int i = 0; i < svcntd (); i++) + { +- double elem1 = svclastb_n_f64 (p, 0, x1); +- double elem2 = svclastb_n_f64 (p, 0, x2); +- double ret = (*f) (elem1, elem2); +- svfloat64_t y2 = svdup_n_f64 (ret); +- y = svsel_f64 (p, y2, y); +- p = svpnext_b64 (cmp, p); ++ if (pg_bits[i] & 1) ++ tmp1[i] = f (tmp1[i], tmp2[i]); + } +- return y; ++ return svld1 (svptrue_b64 (), tmp1); + } + + static inline svuint64_t +@@ -109,33 +129,40 @@ sv_f32 (float x) + static inline svfloat32_t + sv_call_f32 (float (*f) (float), svfloat32_t x, svfloat32_t y, svbool_t cmp) + { +- svbool_t p = svpfirst (cmp, svpfalse ()); +- while (svptest_any (cmp, p)) ++ float tmp[SVE_NUM_FLTS]; ++ uint8_t pg_bits[SVE_NUM_PG_BYTES]; ++ svstr_p (pg_bits, cmp); ++ svst1 (svptrue_b32 (), tmp, svsel (cmp, x, y)); ++ ++ for (int i = 0; i < svcntd (); i++) + { +- float elem = svclastb_n_f32 (p, 0, x); +- elem = f (elem); +- svfloat32_t y2 = svdup_n_f32 (elem); +- y = svsel_f32 (p, y2, y); +- p = svpnext_b32 (cmp, p); ++ uint8_t p = pg_bits[i]; ++ if (p & 1) ++ tmp[i * 2] = f (tmp[i * 2]); ++ if (p & (1 << 4)) ++ tmp[i * 2 + 1] = f (tmp[i * 2 + 1]); + } +- return y; ++ return svld1 (svptrue_b32 (), tmp); + } + + static inline svfloat32_t + sv_call2_f32 (float (*f) (float, float), svfloat32_t x1, svfloat32_t x2, + svfloat32_t y, svbool_t cmp) + { +- svbool_t p = svpfirst (cmp, svpfalse ()); +- while (svptest_any (cmp, p)) ++ float tmp1[SVE_NUM_FLTS], tmp2[SVE_NUM_FLTS]; ++ uint8_t pg_bits[SVE_NUM_PG_BYTES]; ++ svstr_p (pg_bits, cmp); ++ svst1 (svptrue_b32 (), tmp1, svsel (cmp, x1, y)); ++ svst1 (cmp, tmp2, x2); ++ ++ for (int i = 0; i < svcntd (); i++) + { +- float elem1 = svclastb_n_f32 (p, 0, x1); +- float elem2 = svclastb_n_f32 (p, 0, x2); +- float ret = f (elem1, elem2); +- svfloat32_t y2 = svdup_n_f32 (ret); +- y = svsel_f32 (p, y2, y); +- p = svpnext_b32 (cmp, p); ++ uint8_t p = pg_bits[i]; ++ if (p & 1) ++ tmp1[i * 2] = f (tmp1[i * 2], tmp2[i * 2]); ++ if (p & (1 << 4)) ++ tmp1[i * 2 + 1] = f (tmp1[i * 2 + 1], tmp2[i * 2 + 1]); + } +- return y; ++ return svld1 (svptrue_b32 (), tmp1); + } +- + #endif + +commit ec041b1f53bf1fd29d94ee147fac69da66437dc6 +Author: Joe Ramsay +Date: Thu Nov 6 18:26:54 2025 +0000 + + AArch64: Fix instability in AdvSIMD tan + + Previously presence of special-cases in one lane could affect the + results in other lanes due to unconditional scalar fallback. The old + WANT_SIMD_EXCEPT option (which has never been enabled in libmvec) has + been removed from AOR, making it easier to spot and fix this. 4% + improvement in throughput with GCC 14 on Neoverse V1. This bug is + present as far back as 2.39 (where tan was first introduced). + + Reviewed-by: Wilco Dijkstra + (cherry picked from commit 6c22823da57aa5218f717f569c04c9573c0448c5) + +diff --git a/sysdeps/aarch64/fpu/tan_advsimd.c b/sysdeps/aarch64/fpu/tan_advsimd.c +index 825c9754b3..d391a003d8 100644 +--- a/sysdeps/aarch64/fpu/tan_advsimd.c ++++ b/sysdeps/aarch64/fpu/tan_advsimd.c +@@ -25,9 +25,7 @@ static const struct data + float64x2_t poly[9]; + double half_pi[2]; + float64x2_t two_over_pi, shift; +-#if !WANT_SIMD_EXCEPT + float64x2_t range_val; +-#endif + } data = { + /* Coefficients generated using FPMinimax. */ + .poly = { V2 (0x1.5555555555556p-2), V2 (0x1.1111111110a63p-3), +@@ -38,20 +36,17 @@ static const struct data + .half_pi = { 0x1.921fb54442d18p0, 0x1.1a62633145c07p-54 }, + .two_over_pi = V2 (0x1.45f306dc9c883p-1), + .shift = V2 (0x1.8p52), +-#if !WANT_SIMD_EXCEPT + .range_val = V2 (0x1p23), +-#endif + }; + + #define RangeVal 0x4160000000000000 /* asuint64(0x1p23). */ + #define TinyBound 0x3e50000000000000 /* asuint64(2^-26). */ +-#define Thresh 0x310000000000000 /* RangeVal - TinyBound. */ + + /* Special cases (fall back to scalar calls). */ + static float64x2_t VPCS_ATTR NOINLINE +-special_case (float64x2_t x) ++special_case (float64x2_t x, float64x2_t n, float64x2_t d, uint64x2_t special) + { +- return v_call_f64 (tan, x, x, v_u64 (-1)); ++ return v_call_f64 (tan, x, vdivq_f64 (n, d), special); + } + + /* Vector approximation for double-precision tan. +@@ -65,14 +60,6 @@ float64x2_t VPCS_ATTR V_NAME_D1 (tan) (float64x2_t x) + very large inputs. Fall back to scalar routine for all lanes if any are + too large, or Inf/NaN. If fenv exceptions are expected, also fall back for + tiny input to avoid underflow. */ +-#if WANT_SIMD_EXCEPT +- uint64x2_t iax = vreinterpretq_u64_f64 (vabsq_f64 (x)); +- /* iax - tiny_bound > range_val - tiny_bound. */ +- uint64x2_t special +- = vcgtq_u64 (vsubq_u64 (iax, v_u64 (TinyBound)), v_u64 (Thresh)); +- if (__glibc_unlikely (v_any_u64 (special))) +- return special_case (x); +-#endif + + /* q = nearest integer to 2 * x / pi. */ + float64x2_t q +@@ -81,9 +68,8 @@ float64x2_t VPCS_ATTR V_NAME_D1 (tan) (float64x2_t x) + + /* Use q to reduce x to r in [-pi/4, pi/4], by: + r = x - q * pi/2, in extended precision. */ +- float64x2_t r = x; + float64x2_t half_pi = vld1q_f64 (dat->half_pi); +- r = vfmsq_laneq_f64 (r, q, half_pi, 0); ++ float64x2_t r = vfmsq_laneq_f64 (x, q, half_pi, 0); + r = vfmsq_laneq_f64 (r, q, half_pi, 1); + /* Further reduce r to [-pi/8, pi/8], to be reconstructed using double angle + formula. */ +@@ -114,12 +100,13 @@ float64x2_t VPCS_ATTR V_NAME_D1 (tan) (float64x2_t x) + + uint64x2_t no_recip = vtstq_u64 (vreinterpretq_u64_s64 (qi), v_u64 (1)); + +-#if !WANT_SIMD_EXCEPT + uint64x2_t special = vcageq_f64 (x, dat->range_val); ++ float64x2_t swap = vbslq_f64 (no_recip, n, vnegq_f64 (d)); ++ d = vbslq_f64 (no_recip, d, n); ++ n = swap; ++ + if (__glibc_unlikely (v_any_u64 (special))) +- return special_case (x); +-#endif ++ return special_case (x, n, d, special); + +- return vdivq_f64 (vbslq_f64 (no_recip, n, vnegq_f64 (d)), +- vbslq_f64 (no_recip, d, n)); ++ return vdivq_f64 (n, d); + } + +commit 0c9430ed976b961343dd29b752091f3c4771cf30 +Author: Joe Ramsay +Date: Thu Nov 6 18:29:33 2025 +0000 + + AArch64: Fix instability in AdvSIMD sinh + + Previously presence of special-cases in one lane could affect the + results in other lanes due to unconditional scalar fallback. The old + WANT_SIMD_EXCEPT option (which has never been enabled in libmvec) has + been removed from AOR, making it easier to spot and fix + this. No measured change in performance. This patch applies cleanly as + far back as 2.41, however there are conflicts with 2.40 where sinh was + first introduced. + + Reviewed-by: Wilco Dijkstra + (cherry picked from commit e45af510bc816e860c8e2e1d4a652b4fe15c4b34) + +diff --git a/sysdeps/aarch64/fpu/sinh_advsimd.c b/sysdeps/aarch64/fpu/sinh_advsimd.c +index 0d6a4856f8..b6b60262c6 100644 +--- a/sysdeps/aarch64/fpu/sinh_advsimd.c ++++ b/sysdeps/aarch64/fpu/sinh_advsimd.c +@@ -24,36 +24,26 @@ static const struct data + { + struct v_expm1_data d; + uint64x2_t halff; +-#if WANT_SIMD_EXCEPT +- uint64x2_t tiny_bound, thresh; +-#else + float64x2_t large_bound; +-#endif + } data = { + .d = V_EXPM1_DATA, + .halff = V2 (0x3fe0000000000000), +-#if WANT_SIMD_EXCEPT +- /* 2^-26, below which sinh(x) rounds to x. */ +- .tiny_bound = V2 (0x3e50000000000000), +- /* asuint(large_bound) - asuint(tiny_bound). */ +- .thresh = V2 (0x0230000000000000), +-#else + /* 2^9. expm1 helper overflows for large input. */ + .large_bound = V2 (0x1p+9), +-#endif + }; + + static float64x2_t NOINLINE VPCS_ATTR +-special_case (float64x2_t x) ++special_case (float64x2_t x, float64x2_t t, float64x2_t halfsign, ++ uint64x2_t special) + { +- return v_call_f64 (sinh, x, x, v_u64 (-1)); ++ return v_call_f64 (sinh, x, vmulq_f64 (t, halfsign), special); + } + + /* Approximation for vector double-precision sinh(x) using expm1. + sinh(x) = (exp(x) - exp(-x)) / 2. + The greatest observed error is 2.52 ULP: +- _ZGVnN2v_sinh(-0x1.a098a2177a2b9p-2) got -0x1.ac2f05bb66fccp-2 +- want -0x1.ac2f05bb66fc9p-2. */ ++ _ZGVnN2v_sinh(0x1.9f6ff2ab6fb19p-2) got 0x1.aaed83a3153ccp-2 ++ want 0x1.aaed83a3153c9p-2. */ + float64x2_t VPCS_ATTR V_NAME_D1 (sinh) (float64x2_t x) + { + const struct data *d = ptr_barrier (&data); +@@ -63,21 +53,16 @@ float64x2_t VPCS_ATTR V_NAME_D1 (sinh) (float64x2_t x) + float64x2_t halfsign = vreinterpretq_f64_u64 ( + vbslq_u64 (v_u64 (0x8000000000000000), ix, d->halff)); + +-#if WANT_SIMD_EXCEPT +- uint64x2_t special = vcgeq_u64 ( +- vsubq_u64 (vreinterpretq_u64_f64 (ax), d->tiny_bound), d->thresh); +-#else + uint64x2_t special = vcageq_f64 (x, d->large_bound); +-#endif +- +- /* Fall back to scalar variant for all lanes if any of them are special. */ +- if (__glibc_unlikely (v_any_u64 (special))) +- return special_case (x); + + /* Up to the point that expm1 overflows, we can use it to calculate sinh + using a slight rearrangement of the definition of sinh. This allows us to + retain acceptable accuracy for very small inputs. */ + float64x2_t t = expm1_inline (ax, &d->d); + t = vaddq_f64 (t, vdivq_f64 (t, vaddq_f64 (t, v_f64 (1.0)))); ++ ++ if (__glibc_unlikely (v_any_u64 (special))) ++ return special_case (x, t, halfsign, special); ++ + return vmulq_f64 (t, halfsign); + } + +commit 710d7a2e8374cf09280a0db170a6c813b70b59e5 +Author: Pierre Blanchard +Date: Tue Nov 18 15:03:10 2025 +0000 + + AArch64: fix SVE tanpi(f) [BZ #33642] + + Fixed svld1rq using incorrect predicates (BZ #33642). + Next to no performance variations (tested on V1). + + Reviewed-by: Wilco Dijkstra  + (cherry picked from commit e889160273a4c2b68870c9adf341955867d76a7d) + +diff --git a/sysdeps/aarch64/fpu/tanpi_sve.c b/sysdeps/aarch64/fpu/tanpi_sve.c +index 57c643ae29..bfe6828e1f 100644 +--- a/sysdeps/aarch64/fpu/tanpi_sve.c ++++ b/sysdeps/aarch64/fpu/tanpi_sve.c +@@ -1,6 +1,6 @@ + /* Double-precision (SVE) tanpi function + +- Copyright (C) 2024 Free Software Foundation, Inc. ++ Copyright (C) 2024-2025 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -58,10 +58,10 @@ svfloat64_t SV_NAME_D1 (tanpi) (svfloat64_t x, const svbool_t pg) + svfloat64_t r2 = svmul_x (pg, r, r); + svfloat64_t r4 = svmul_x (pg, r2, r2); + +- svfloat64_t c_1_3 = svld1rq (pg, &d->c1); +- svfloat64_t c_5_7 = svld1rq (pg, &d->c5); +- svfloat64_t c_9_11 = svld1rq (pg, &d->c9); +- svfloat64_t c_13_14 = svld1rq (pg, &d->c13); ++ svfloat64_t c_1_3 = svld1rq (svptrue_b64 (), &d->c1); ++ svfloat64_t c_5_7 = svld1rq (svptrue_b64 (), &d->c5); ++ svfloat64_t c_9_11 = svld1rq (svptrue_b64 (), &d->c9); ++ svfloat64_t c_13_14 = svld1rq (svptrue_b64 (), &d->c13); + svfloat64_t p01 = svmla_lane (sv_f64 (d->c0), r2, c_1_3, 0); + svfloat64_t p23 = svmla_lane (sv_f64 (d->c2), r2, c_1_3, 1); + svfloat64_t p45 = svmla_lane (sv_f64 (d->c4), r2, c_5_7, 0); +diff --git a/sysdeps/aarch64/fpu/tanpif_sve.c b/sysdeps/aarch64/fpu/tanpif_sve.c +index 0285f56f34..6894379564 100644 +--- a/sysdeps/aarch64/fpu/tanpif_sve.c ++++ b/sysdeps/aarch64/fpu/tanpif_sve.c +@@ -1,6 +1,6 @@ + /* Single-precision (SVE) tanpi function + +- Copyright (C) 2024 Free Software Foundation, Inc. ++ Copyright (C) 2024-2025 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -37,7 +37,7 @@ const static struct v_tanpif_data + svfloat32_t SV_NAME_F1 (tanpi) (svfloat32_t x, const svbool_t pg) + { + const struct v_tanpif_data *d = ptr_barrier (&tanpif_data); +- svfloat32_t odd_coeffs = svld1rq (pg, &d->c1); ++ svfloat32_t odd_coeffs = svld1rq (svptrue_b32 (), &d->c1); + svfloat32_t n = svrintn_x (pg, x); + + /* inf produces nan that propagates. */ + +commit 828b8d23f3fa05234d35032a61a746918accf91d +Author: Pierre Blanchard +Date: Tue Nov 18 15:09:05 2025 +0000 + + AArch64: Fix and improve SVE pow(f) special cases + + powf: + + Update scalar special case function to best use new interface. + + pow: + + Make specialcase NOINLINE to prevent str/ldr leaking in fast path. + Remove depency in sv_call2, as new callback impl is not a + performance gain. + Replace with vectorised specialcase since structure of scalar + routine is fairly simple. + + Throughput gain of about 5-10% on V1 for large values and 25% for subnormal `x`. + + Reviewed-by: Wilco Dijkstra  + (cherry picked from commit bb6519de1e6fe73d79bc71588ec4e5668907f080) + +diff --git a/sysdeps/aarch64/fpu/pow_sve.c b/sysdeps/aarch64/fpu/pow_sve.c +index b8c1b39dca..becf1a8410 100644 +--- a/sysdeps/aarch64/fpu/pow_sve.c ++++ b/sysdeps/aarch64/fpu/pow_sve.c +@@ -31,8 +31,8 @@ + The SVE algorithm drops the tail in the exp computation at the price of + a lower accuracy, slightly above 1ULP. + The SVE algorithm also drops the special treatement of small (< 2^-65) and +- large (> 2^63) finite values of |y|, as they only affect non-round to nearest +- modes. ++ large (> 2^63) finite values of |y|, as they only affect non-round to ++ nearest modes. + + Maximum measured error is 1.04 ULPs: + SV_NAME_D2 (pow) (0x1.3d2d45bc848acp+63, -0x1.a48a38b40cd43p-12) +@@ -156,42 +156,22 @@ sv_zeroinfnan (svbool_t pg, svuint64_t i) + a double. (int32_t)KI is the k used in the argument reduction and exponent + adjustment of scale, positive k here means the result may overflow and + negative k means the result may underflow. */ +-static inline double +-specialcase (double tmp, uint64_t sbits, uint64_t ki) +-{ +- double scale; +- if ((ki & 0x80000000) == 0) +- { +- /* k > 0, the exponent of scale might have overflowed by <= 460. */ +- sbits -= 1009ull << 52; +- scale = asdouble (sbits); +- return 0x1p1009 * (scale + scale * tmp); +- } +- /* k < 0, need special care in the subnormal range. */ +- sbits += 1022ull << 52; +- /* Note: sbits is signed scale. */ +- scale = asdouble (sbits); +- double y = scale + scale * tmp; +- return 0x1p-1022 * y; +-} +- +-/* Scalar fallback for special cases of SVE pow's exp. */ + static inline svfloat64_t +-sv_call_specialcase (svfloat64_t x1, svuint64_t u1, svuint64_t u2, +- svfloat64_t y, svbool_t cmp) ++specialcase (svfloat64_t tmp, svuint64_t sbits, svuint64_t ki, svbool_t cmp) + { +- svbool_t p = svpfirst (cmp, svpfalse ()); +- while (svptest_any (cmp, p)) +- { +- double sx1 = svclastb (p, 0, x1); +- uint64_t su1 = svclastb (p, 0, u1); +- uint64_t su2 = svclastb (p, 0, u2); +- double elem = specialcase (sx1, su1, su2); +- svfloat64_t y2 = sv_f64 (elem); +- y = svsel (p, y2, y); +- p = svpnext_b64 (cmp, p); +- } +- return y; ++ svbool_t p_pos = svcmpge_n_f64 (cmp, svreinterpret_f64_u64 (ki), 0.0); ++ ++ /* Scale up or down depending on sign of k. */ ++ svint64_t offset ++ = svsel_s64 (p_pos, sv_s64 (1009ull << 52), sv_s64 (-1022ull << 52)); ++ svfloat64_t factor ++ = svsel_f64 (p_pos, sv_f64 (0x1p1009), sv_f64 (0x1p-1022)); ++ ++ svuint64_t offset_sbits ++ = svsub_u64_x (cmp, sbits, svreinterpret_u64_s64 (offset)); ++ svfloat64_t scale = svreinterpret_f64_u64 (offset_sbits); ++ svfloat64_t res = svmad_f64_x (cmp, scale, tmp, scale); ++ return svmul_f64_x (cmp, res, factor); + } + + /* Compute y+TAIL = log(x) where the rounded result is y and TAIL has about +@@ -214,8 +194,8 @@ sv_log_inline (svbool_t pg, svuint64_t ix, svfloat64_t *tail, + + /* log(x) = k*Ln2 + log(c) + log1p(z/c-1). */ + /* SVE lookup requires 3 separate lookup tables, as opposed to scalar version +- that uses array of structures. We also do the lookup earlier in the code to +- make sure it finishes as early as possible. */ ++ that uses array of structures. We also do the lookup earlier in the code ++ to make sure it finishes as early as possible. */ + svfloat64_t invc = svld1_gather_index (pg, __v_pow_log_data.invc, i); + svfloat64_t logc = svld1_gather_index (pg, __v_pow_log_data.logc, i); + svfloat64_t logctail = svld1_gather_index (pg, __v_pow_log_data.logctail, i); +@@ -325,14 +305,14 @@ sv_exp_inline (svbool_t pg, svfloat64_t x, svfloat64_t xtail, + svbool_t oflow = svcmpge (pg, abstop, HugeExp); + oflow = svand_z (pg, uoflow, svbic_z (pg, oflow, uflow)); + +- /* For large |x| values (512 < |x| < 1024) scale * (1 + TMP) can overflow +- or underflow. */ ++ /* Handle underflow and overlow in scale. ++ For large |x| values (512 < |x| < 1024), scale * (1 + TMP) can ++ overflow or underflow. */ + svbool_t special = svbic_z (pg, uoflow, svorr_z (pg, uflow, oflow)); ++ if (__glibc_unlikely (svptest_any (pg, special))) ++ z = svsel (special, specialcase (tmp, sbits, ki, special), z); + +- /* Update result with special and large cases. */ +- z = sv_call_specialcase (tmp, sbits, ki, z, special); +- +- /* Handle underflow and overflow. */ ++ /* Handle underflow and overflow in exp. */ + svbool_t x_is_neg = svcmplt (pg, x, 0); + svuint64_t sign_mask + = svlsl_x (pg, sign_bias, 52 - V_POW_EXP_TABLE_BITS); +@@ -353,7 +333,7 @@ sv_exp_inline (svbool_t pg, svfloat64_t x, svfloat64_t xtail, + } + + static inline double +-pow_sc (double x, double y) ++pow_specialcase (double x, double y) + { + uint64_t ix = asuint64 (x); + uint64_t iy = asuint64 (y); +@@ -382,6 +362,14 @@ pow_sc (double x, double y) + return x; + } + ++/* Scalar fallback for special case routines with custom signature. */ ++static svfloat64_t NOINLINE ++sv_pow_specialcase (svfloat64_t x1, svfloat64_t x2, svfloat64_t y, ++ svbool_t cmp) ++{ ++ return sv_call2_f64 (pow_specialcase, x1, x2, y, cmp); ++} ++ + svfloat64_t SV_NAME_D2 (pow) (svfloat64_t x, svfloat64_t y, const svbool_t pg) + { + const struct data *d = ptr_barrier (&data); +@@ -444,7 +432,7 @@ svfloat64_t SV_NAME_D2 (pow) (svfloat64_t x, svfloat64_t y, const svbool_t pg) + + /* Cases of zero/inf/nan x or y. */ + if (__glibc_unlikely (svptest_any (svptrue_b64 (), special))) +- vz = sv_call2_f64 (pow_sc, x, y, vz, special); ++ vz = sv_pow_specialcase (x, y, vz, special); + + return vz; + } +diff --git a/sysdeps/aarch64/fpu/powf_sve.c b/sysdeps/aarch64/fpu/powf_sve.c +index 65e9bd29d9..76f54b3522 100644 +--- a/sysdeps/aarch64/fpu/powf_sve.c ++++ b/sysdeps/aarch64/fpu/powf_sve.c +@@ -116,11 +116,10 @@ zeroinfnan (uint32_t ix) + preamble of scalar powf except that we do not update ix and sign_bias. This + is done in the preamble of the SVE powf. */ + static inline float +-powf_specialcase (float x, float y, float z) ++powf_specialcase (float x, float y) + { + uint32_t ix = asuint (x); + uint32_t iy = asuint (y); +- /* Either (x < 0x1p-126 or inf or nan) or (y is 0 or inf or nan). */ + if (__glibc_unlikely (zeroinfnan (iy))) + { + if (2 * iy == 0) +@@ -142,32 +141,15 @@ powf_specialcase (float x, float y, float z) + x2 = -x2; + return iy & 0x80000000 ? 1 / x2 : x2; + } +- /* We need a return here in case x<0 and y is integer, but all other tests +- need to be run. */ +- return z; ++ /* Return x for convenience, but make sure result is never used. */ ++ return x; + } + + /* Scalar fallback for special case routines with custom signature. */ + static svfloat32_t NOINLINE +-sv_call_powf_sc (svfloat32_t x1, svfloat32_t x2, svfloat32_t y) ++sv_call_powf_sc (svfloat32_t x1, svfloat32_t x2, svfloat32_t y, svbool_t cmp) + { +- /* Special cases of x or y: zero, inf and nan. */ +- svbool_t xspecial = sv_zeroinfnan (svptrue_b32 (), svreinterpret_u32 (x1)); +- svbool_t yspecial = sv_zeroinfnan (svptrue_b32 (), svreinterpret_u32 (x2)); +- svbool_t cmp = svorr_z (svptrue_b32 (), xspecial, yspecial); +- +- svbool_t p = svpfirst (cmp, svpfalse ()); +- while (svptest_any (cmp, p)) +- { +- float sx1 = svclastb (p, 0, x1); +- float sx2 = svclastb (p, 0, x2); +- float elem = svclastb (p, 0, y); +- elem = powf_specialcase (sx1, sx2, elem); +- svfloat32_t y2 = sv_f32 (elem); +- y = svsel (p, y2, y); +- p = svpnext_b32 (cmp, p); +- } +- return y; ++ return sv_call2_f32 (powf_specialcase, x1, x2, y, cmp); + } + + /* Compute core for half of the lanes in double precision. */ +@@ -330,7 +312,7 @@ svfloat32_t SV_NAME_F2 (pow) (svfloat32_t x, svfloat32_t y, const svbool_t pg) + ret = svsel (yint_or_xpos, ret, sv_f32 (__builtin_nanf (""))); + + if (__glibc_unlikely (svptest_any (cmp, cmp))) +- return sv_call_powf_sc (x, y, ret); ++ return sv_call_powf_sc (x, y, ret, cmp); + + return ret; + } + +commit 6b2957cfe8ad1e02c03a28abfc5a251c05e4005e +Author: Sachin Monga +Date: Fri Nov 21 00:30:04 2025 -0500 + + ppc64le: Restore optimized strcmp for power10 + + This patch addresses the actual cause of CVE-2025-5702 + + The vector non-volatile registers are not used anymore for + 32 byte load and comparison operation + + Additionally, the assembler workaround used earlier for the + instruction lxvp is replaced with actual instruction. + + Signed-off-by: Sachin Monga + Co-authored-by: Paul Murphy + (cherry picked from commit 9a40b1cda519cc4f532acb6d020390829df3d81b) + +diff --git a/sysdeps/powerpc/powerpc64/le/power10/strcmp.S b/sysdeps/powerpc/powerpc64/le/power10/strcmp.S +new file mode 100644 +index 0000000000..0d4a53317c +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/le/power10/strcmp.S +@@ -0,0 +1,185 @@ ++/* Optimized strcmp implementation for PowerPC64/POWER10. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++#include ++ ++#ifndef STRCMP ++# define STRCMP strcmp ++#endif ++ ++/* Implements the function ++ int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]). */ ++ ++ ++#define COMPARE_16(vreg1,vreg2,offset) \ ++ lxv vreg1+32,offset(r3); \ ++ lxv vreg2+32,offset(r4); \ ++ vcmpnezb. v7,vreg1,vreg2; \ ++ bne cr6,L(different); \ ++ ++#define COMPARE_32(vreg1,vreg2,offset,label1,label2) \ ++ lxvp vreg1+32,offset(r3); \ ++ lxvp vreg2+32,offset(r4); \ ++ vcmpnezb. v7,vreg1+1,vreg2+1; \ ++ bne cr6,L(label1); \ ++ vcmpnezb. v7,vreg1,vreg2; \ ++ bne cr6,L(label2); \ ++ ++#define TAIL(vreg1,vreg2) \ ++ vctzlsbb r6,v7; \ ++ vextubrx r5,r6,vreg1; \ ++ vextubrx r4,r6,vreg2; \ ++ subf r3,r4,r5; \ ++ blr; \ ++ ++#define CHECK_N_BYTES(reg1,reg2,len_reg) \ ++ sldi r0,len_reg,56; \ ++ lxvl 32+v4,reg1,r0; \ ++ lxvl 32+v5,reg2,r0; \ ++ add reg1,reg1,len_reg; \ ++ add reg2,reg2,len_reg; \ ++ vcmpnezb. v7,v4,v5; \ ++ vctzlsbb r6,v7; \ ++ cmpld cr7,r6,len_reg; \ ++ blt cr7,L(different); \ ++ ++ ++ .machine power10 ++ENTRY_TOCLESS (STRCMP, 4) ++ li r11,16 ++ /* eq bit of cr1 used as swap status flag to indicate if ++ source pointers were swapped. */ ++ crclr 4*cr1+eq ++ andi. r7,r3,15 ++ sub r7,r11,r7 /* r7(nalign1) = 16 - (str1 & 15). */ ++ andi. r9,r4,15 ++ sub r5,r11,r9 /* r5(nalign2) = 16 - (str2 & 15). */ ++ cmpld cr7,r7,r5 ++ beq cr7,L(same_aligned) ++ blt cr7,L(nalign1_min) ++ /* Swap r3 and r4, and r7 and r5 such that r3 and r7 hold the ++ pointer which is closer to the next 16B boundary so that only ++ one CHECK_N_BYTES is needed before entering the loop below. */ ++ mr r8,r4 ++ mr r4,r3 ++ mr r3,r8 ++ mr r12,r7 ++ mr r7,r5 ++ mr r5,r12 ++ crset 4*cr1+eq /* Set bit on swapping source pointers. */ ++ ++ .p2align 5 ++L(nalign1_min): ++ CHECK_N_BYTES(r3,r4,r7) ++ ++ .p2align 5 ++L(s1_aligned): ++ /* r9 and r5 is number of bytes to be read after and before ++ page boundary correspondingly. */ ++ sub r5,r5,r7 ++ subfic r9,r5,16 ++ /* Now let r7 hold the count of quadwords which can be ++ checked without crossing a page boundary. quadword offset is ++ (str2>>4)&0xFF. */ ++ rlwinm r7,r4,28,0xFF ++ /* Below check is required only for first iteration. For second ++ iteration and beyond, the new loop counter is always 255. */ ++ cmpldi r7,255 ++ beq L(L3) ++ /* Get the initial loop count by 255-((str2>>4)&0xFF). */ ++ subfic r11,r7,255 ++ ++ .p2align 5 ++L(L1): ++ mtctr r11 ++ ++ .p2align 5 ++L(L2): ++ COMPARE_16(v4,v5,0) /* Load 16B blocks using lxv. */ ++ addi r3,r3,16 ++ addi r4,r4,16 ++ bdnz L(L2) ++ /* Cross the page boundary of s2, carefully. */ ++ ++ .p2align 5 ++L(L3): ++ CHECK_N_BYTES(r3,r4,r5) ++ CHECK_N_BYTES(r3,r4,r9) ++ li r11,255 /* Load the new loop counter. */ ++ b L(L1) ++ ++ .p2align 5 ++L(same_aligned): ++ CHECK_N_BYTES(r3,r4,r7) ++ /* Align s1 to 32B and adjust s2 address. ++ Use lxvp only if both s1 and s2 are 32B aligned. */ ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ COMPARE_16(v4,v5,32) ++ COMPARE_16(v4,v5,48) ++ addi r3,r3,64 ++ addi r4,r4,64 ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ ++ clrldi r6,r3,59 ++ subfic r5,r6,32 ++ add r3,r3,r5 ++ add r4,r4,r5 ++ andi. r5,r4,0x1F ++ beq cr0,L(32B_aligned_loop) ++ ++ .p2align 5 ++L(16B_aligned_loop): ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ COMPARE_16(v4,v5,32) ++ COMPARE_16(v4,v5,48) ++ addi r3,r3,64 ++ addi r4,r4,64 ++ b L(16B_aligned_loop) ++ ++ /* Calculate and return the difference. */ ++L(different): ++ vctzlsbb r6,v7 ++ vextubrx r5,r6,v4 ++ vextubrx r4,r6,v5 ++ bt 4*cr1+eq,L(swapped) ++ subf r3,r4,r5 ++ blr ++ ++ /* If src pointers were swapped, then swap the ++ indices and calculate the return value. */ ++L(swapped): ++ subf r3,r5,r4 ++ blr ++ ++ .p2align 5 ++L(32B_aligned_loop): ++ COMPARE_32(v14,v16,0,tail1,tail2) ++ COMPARE_32(v14,v16,32,tail1,tail2) ++ COMPARE_32(v14,v16,64,tail1,tail2) ++ COMPARE_32(v14,v16,96,tail1,tail2) ++ addi r3,r3,128 ++ addi r4,r4,128 ++ b L(32B_aligned_loop) ++ ++L(tail1): TAIL(v15,v17) ++L(tail2): TAIL(v14,v16) ++ ++END (STRCMP) ++libc_hidden_builtin_def (strcmp) +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index e321ce54e0..818f287925 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -32,7 +32,7 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ + ifneq (,$(filter %le,$(config-machine))) + sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \ + rawmemchr-power9 rawmemchr-power10 \ +- strcmp-power9 strncmp-power9 \ ++ strcmp-power9 strcmp-power10 strncmp-power9 \ + strcpy-power9 strcat-power10 stpcpy-power9 \ + strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 + endif +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index 016d05fd16..dde3bec709 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -366,6 +366,10 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c. */ + IFUNC_IMPL (i, name, strcmp, + #ifdef __LITTLE_ENDIAN__ ++ IFUNC_IMPL_ADD (array, i, strcmp, ++ (hwcap2 & PPC_FEATURE2_ARCH_3_1) ++ && (hwcap & PPC_FEATURE_HAS_VSX), ++ __strcmp_power10) + IFUNC_IMPL_ADD (array, i, strcmp, + hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S +new file mode 100644 +index 0000000000..a4ee7fb53c +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S +@@ -0,0 +1,26 @@ ++/* Optimized strcmp implementation for POWER10/PPC64. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined __LITTLE_ENDIAN__ && IS_IN (libc) ++#define STRCMP __strcmp_power10 ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include ++#endif /* __LITTLE_ENDIAN__ && IS_IN (libc) */ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c +index 7c77c084a7..3c636e3bbc 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c +@@ -29,12 +29,16 @@ extern __typeof (strcmp) __strcmp_power7 attribute_hidden; + extern __typeof (strcmp) __strcmp_power8 attribute_hidden; + # ifdef __LITTLE_ENDIAN__ + extern __typeof (strcmp) __strcmp_power9 attribute_hidden; ++extern __typeof (strcmp) __strcmp_power10 attribute_hidden; + # endif + + # undef strcmp + + libc_ifunc_redirected (__redirect_strcmp, strcmp, + # ifdef __LITTLE_ENDIAN__ ++ (hwcap2 & PPC_FEATURE2_ARCH_3_1 ++ && hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strcmp_power10 : + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) + ? __strcmp_power9 : + +commit 2dbf973fe03f9b8fd5a4740ee0af0d47afdd7bbd +Author: Sachin Monga +Date: Fri Nov 21 00:30:52 2025 -0500 + + ppc64le: Restore optimized strncmp for power10 + + This patch addresses the actual cause of CVE-2025-5745 + + The vector non-volatile registers are not used anymore for + 32 byte load and comparison operation + + Additionally, the assembler workaround used earlier for the + instruction lxvp is replaced with actual instruction. + + Signed-off-by: Sachin Monga + Co-authored-by: Paul Murphy + (cherry picked from commit 2ea943f7d487d6a4166658b32af7c5365889fc34) + +diff --git a/sysdeps/powerpc/powerpc64/le/power10/strncmp.S b/sysdeps/powerpc/powerpc64/le/power10/strncmp.S +new file mode 100644 +index 0000000000..6e09fcb7f2 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/le/power10/strncmp.S +@@ -0,0 +1,252 @@ ++/* Optimized strncmp implementation for PowerPC64/POWER10. ++ Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++ ++/* Implements the function ++ ++ int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t [r5] n) ++ ++ The implementation uses unaligned doubleword access to avoid specialized ++ code paths depending of data alignment for first 32 bytes and uses ++ vectorised loops after that. */ ++ ++#ifndef STRNCMP ++# define STRNCMP strncmp ++#endif ++ ++#define COMPARE_16(vreg1,vreg2,offset) \ ++ lxv vreg1+32,offset(r3); \ ++ lxv vreg2+32,offset(r4); \ ++ vcmpnezb. v7,vreg1,vreg2; \ ++ bne cr6,L(different); \ ++ cmpldi cr7,r5,16; \ ++ ble cr7,L(ret0); \ ++ addi r5,r5,-16; ++ ++#define COMPARE_32(vreg1,vreg2,offset,label1,label2) \ ++ lxvp vreg1+32,offset(r3); \ ++ lxvp vreg2+32,offset(r4); \ ++ vcmpnezb. v7,vreg1+1,vreg2+1; \ ++ bne cr6,L(label1); \ ++ vcmpnezb. v7,vreg1,vreg2; \ ++ bne cr6,L(label2); \ ++ cmpldi cr7,r5,32; \ ++ ble cr7,L(ret0); \ ++ addi r5,r5,-32; ++ ++#define TAIL_FIRST_16B(vreg1,vreg2) \ ++ vctzlsbb r6,v7; \ ++ cmpld cr7,r5,r6; \ ++ ble cr7,L(ret0); \ ++ vextubrx r5,r6,vreg1; \ ++ vextubrx r4,r6,vreg2; \ ++ subf r3,r4,r5; \ ++ blr; ++ ++#define TAIL_SECOND_16B(vreg1,vreg2) \ ++ vctzlsbb r6,v7; \ ++ addi r0,r6,16; \ ++ cmpld cr7,r5,r0; \ ++ ble cr7,L(ret0); \ ++ vextubrx r5,r6,vreg1; \ ++ vextubrx r4,r6,vreg2; \ ++ subf r3,r4,r5; \ ++ blr; ++ ++#define CHECK_N_BYTES(reg1,reg2,len_reg) \ ++ sldi r6,len_reg,56; \ ++ lxvl 32+v4,reg1,r6; \ ++ lxvl 32+v5,reg2,r6; \ ++ add reg1,reg1,len_reg; \ ++ add reg2,reg2,len_reg; \ ++ vcmpnezb v7,v4,v5; \ ++ vctzlsbb r6,v7; \ ++ cmpld cr7,r6,len_reg; \ ++ blt cr7,L(different); \ ++ cmpld cr7,r5,len_reg; \ ++ ble cr7,L(ret0); \ ++ sub r5,r5,len_reg; \ ++ ++ .machine power10 ++ENTRY_TOCLESS (STRNCMP, 4) ++ /* Check if size is 0. */ ++ cmpdi cr0,r5,0 ++ beq cr0,L(ret0) ++ andi. r7,r3,4095 ++ andi. r8,r4,4095 ++ cmpldi cr0,r7,4096-16 ++ cmpldi cr1,r8,4096-16 ++ bgt cr0,L(crosses) ++ bgt cr1,L(crosses) ++ COMPARE_16(v4,v5,0) ++ addi r3,r3,16 ++ addi r4,r4,16 ++ ++L(crosses): ++ andi. r7,r3,15 ++ subfic r7,r7,16 /* r7(nalign1) = 16 - (str1 & 15). */ ++ andi. r9,r4,15 ++ subfic r8,r9,16 /* r8(nalign2) = 16 - (str2 & 15). */ ++ cmpld cr7,r7,r8 ++ beq cr7,L(same_aligned) ++ blt cr7,L(nalign1_min) ++ ++ /* nalign2 is minimum and s2 pointer is aligned. */ ++ CHECK_N_BYTES(r3,r4,r8) ++ /* Are we on the 64B hunk which crosses a page? */ ++ andi. r10,r3,63 /* Determine offset into 64B hunk. */ ++ andi. r8,r3,15 /* The offset into the 16B hunk. */ ++ neg r7,r3 ++ andi. r9,r7,15 /* Number of bytes after a 16B cross. */ ++ rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */ ++ beq L(compare_64_pagecross) ++ mtctr r7 ++ b L(compare_64B_unaligned) ++ ++ /* nalign1 is minimum and s1 pointer is aligned. */ ++L(nalign1_min): ++ CHECK_N_BYTES(r3,r4,r7) ++ /* Are we on the 64B hunk which crosses a page? */ ++ andi. r10,r4,63 /* Determine offset into 64B hunk. */ ++ andi. r8,r4,15 /* The offset into the 16B hunk. */ ++ neg r7,r4 ++ andi. r9,r7,15 /* Number of bytes after a 16B cross. */ ++ rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */ ++ beq L(compare_64_pagecross) ++ mtctr r7 ++ ++ .p2align 5 ++L(compare_64B_unaligned): ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ COMPARE_16(v4,v5,32) ++ COMPARE_16(v4,v5,48) ++ addi r3,r3,64 ++ addi r4,r4,64 ++ bdnz L(compare_64B_unaligned) ++ ++ /* Cross the page boundary of s2, carefully. Only for first ++ iteration we have to get the count of 64B blocks to be checked. ++ From second iteration and beyond, loop counter is always 63. */ ++L(compare_64_pagecross): ++ li r11, 63 ++ mtctr r11 ++ cmpldi r10,16 ++ ble L(cross_4) ++ cmpldi r10,32 ++ ble L(cross_3) ++ cmpldi r10,48 ++ ble L(cross_2) ++L(cross_1): ++ CHECK_N_BYTES(r3,r4,r9) ++ CHECK_N_BYTES(r3,r4,r8) ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ COMPARE_16(v4,v5,32) ++ addi r3,r3,48 ++ addi r4,r4,48 ++ b L(compare_64B_unaligned) ++L(cross_2): ++ COMPARE_16(v4,v5,0) ++ addi r3,r3,16 ++ addi r4,r4,16 ++ CHECK_N_BYTES(r3,r4,r9) ++ CHECK_N_BYTES(r3,r4,r8) ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ addi r3,r3,32 ++ addi r4,r4,32 ++ b L(compare_64B_unaligned) ++L(cross_3): ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ addi r3,r3,32 ++ addi r4,r4,32 ++ CHECK_N_BYTES(r3,r4,r9) ++ CHECK_N_BYTES(r3,r4,r8) ++ COMPARE_16(v4,v5,0) ++ addi r3,r3,16 ++ addi r4,r4,16 ++ b L(compare_64B_unaligned) ++L(cross_4): ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ COMPARE_16(v4,v5,32) ++ addi r3,r3,48 ++ addi r4,r4,48 ++ CHECK_N_BYTES(r3,r4,r9) ++ CHECK_N_BYTES(r3,r4,r8) ++ b L(compare_64B_unaligned) ++ ++L(same_aligned): ++ CHECK_N_BYTES(r3,r4,r7) ++ /* Align s1 to 32B and adjust s2 address. ++ Use lxvp only if both s1 and s2 are 32B aligned. */ ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ COMPARE_16(v4,v5,32) ++ COMPARE_16(v4,v5,48) ++ addi r3,r3,64 ++ addi r4,r4,64 ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ addi r5,r5,32 ++ ++ clrldi r6,r3,59 ++ subfic r7,r6,32 ++ add r3,r3,r7 ++ add r4,r4,r7 ++ subf r5,r7,r5 ++ andi. r7,r4,0x1F ++ beq cr0,L(32B_aligned_loop) ++ ++ .p2align 5 ++L(16B_aligned_loop): ++ COMPARE_16(v4,v5,0) ++ COMPARE_16(v4,v5,16) ++ COMPARE_16(v4,v5,32) ++ COMPARE_16(v4,v5,48) ++ addi r3,r3,64 ++ addi r4,r4,64 ++ b L(16B_aligned_loop) ++ ++ /* Calculate and return the difference. */ ++L(different): ++ TAIL_FIRST_16B(v4,v5) ++ ++ .p2align 5 ++L(32B_aligned_loop): ++ COMPARE_32(v14,v16,0,tail1,tail2) ++ COMPARE_32(v14,v16,32,tail1,tail2) ++ COMPARE_32(v14,v16,64,tail1,tail2) ++ COMPARE_32(v14,v16,96,tail1,tail2) ++ addi r3,r3,128 ++ addi r4,r4,128 ++ b L(32B_aligned_loop) ++ ++L(tail1): TAIL_FIRST_16B(v15,v17) ++L(tail2): TAIL_SECOND_16B(v14,v16) ++ ++ .p2align 5 ++L(ret0): ++ li r3,0 ++ blr ++ ++END(STRNCMP) ++libc_hidden_builtin_def(strncmp) +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 818f287925..c9178223a8 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -32,7 +32,7 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ + ifneq (,$(filter %le,$(config-machine))) + sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \ + rawmemchr-power9 rawmemchr-power10 \ +- strcmp-power9 strcmp-power10 strncmp-power9 \ ++ strcmp-power9 strcmp-power10 strncmp-power9 strncmp-power10 \ + strcpy-power9 strcat-power10 stpcpy-power9 \ + strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 + endif +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index dde3bec709..f2b9cccde3 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -164,6 +164,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, + /* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c. */ + IFUNC_IMPL (i, name, strncmp, + #ifdef __LITTLE_ENDIAN__ ++ IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_1 ++ && hwcap & PPC_FEATURE_HAS_VSX, ++ __strncmp_power10) + IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, + __strncmp_power9) +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S +new file mode 100644 +index 0000000000..bb25bc75b8 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S +@@ -0,0 +1,25 @@ ++/* Copyright (C) 2025 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#if defined __LITTLE_ENDIAN__ && IS_IN (libc) ++#define STRNCMP __strncmp_power10 ++ ++#undef libc_hidden_builtin_def ++#define libc_hidden_builtin_def(name) ++ ++#include ++#endif +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +index 4cfe27fa45..0a664a620d 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +@@ -29,6 +29,7 @@ extern __typeof (strncmp) __strncmp_ppc attribute_hidden; + extern __typeof (strncmp) __strncmp_power8 attribute_hidden; + # ifdef __LITTLE_ENDIAN__ + extern __typeof (strncmp) __strncmp_power9 attribute_hidden; ++extern __typeof (strncmp) __strncmp_power10 attribute_hidden; + # endif + # undef strncmp + +@@ -36,6 +37,9 @@ extern __typeof (strncmp) __strncmp_power9 attribute_hidden; + ifunc symbol properly. */ + libc_ifunc_redirected (__redirect_strncmp, strncmp, + # ifdef __LITTLE_ENDIAN__ ++ (hwcap2 & PPC_FEATURE2_ARCH_3_1 ++ && hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strncmp_power10 : + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) + ? __strncmp_power9 : + +commit 8aaf4b732d7650c2db3beb4dc8bb70eab5b022c3 +Author: Sachin Monga +Date: Thu Nov 27 03:28:17 2025 -0500 + + ppc64le: Power 10 rawmemchr clobbers v20 (bug #33091) + + Replace non-volatile(v20) by volatile(v17) + since v20 is not restored + + Reviewed-by: Peter Bergner + (cherry picked from commit b59799f14f97f697c3a36b4380bd4ce2fbe65f11) + +diff --git a/sysdeps/powerpc/powerpc64/le/power10/strlen.S b/sysdeps/powerpc/powerpc64/le/power10/strlen.S +index ec644d5bff..29a5a7d960 100644 +--- a/sysdeps/powerpc/powerpc64/le/power10/strlen.S ++++ b/sysdeps/powerpc/powerpc64/le/power10/strlen.S +@@ -31,7 +31,7 @@ + # define FUNCNAME RAWMEMCHR + # endif + # define MCOUNT_NARGS 2 +-# define VREG_ZERO v20 ++# define VREG_ZERO v17 + # define OFF_START_LOOP 256 + # define RAWMEMCHR_SUBTRACT_VECTORS \ + vsububm v4,v4,v18; \ + +commit b11411fe2ee7a8f3c3a2c1ee99c1729adb9a0efe +Author: Yury Khrustalev +Date: Thu Nov 6 12:57:58 2025 +0000 + + posix: Fix invalid flags test for p{write,read}v2 + + Two tests fail from time to time when a new flag is added for the + p{write,read}v2 functions in a new Linux kernel: + + - misc/tst-preadvwritev2 + - misc/tst-preadvwritev64v2 + + This disrupts when testing Glibc on a system with a newer kernel + and it seems we can try improve testing for invalid flags setting + all the bits that are not supposed to be supported (rather than + setting only the next unsupported bit). + + Reviewed-by: Adhemerval Zanella + (cherry picked from commit 58a31b4316f1f687184eb147ffa1c676bc6a190e) + +diff --git a/misc/tst-preadvwritev2-common.c b/misc/tst-preadvwritev2-common.c +index ff1007d6d2..5182fcdce0 100644 +--- a/misc/tst-preadvwritev2-common.c ++++ b/misc/tst-preadvwritev2-common.c +@@ -109,9 +109,8 @@ do_test_with_invalid_iov (void) + static void + do_test_with_invalid_flags (void) + { +- /* Set the next bit from the mask of all supported flags. */ +- int invalid_flag = RWF_SUPPORTED != 0 ? __builtin_clz (RWF_SUPPORTED) : 2; +- invalid_flag = 0x1 << ((sizeof (int) * CHAR_BIT) - invalid_flag); ++ /* Set all the bits that are not used by the supported flags. */ ++ int invalid_flag = ~RWF_SUPPORTED; + + char buf[32]; + const struct iovec vec = { .iov_base = buf, .iov_len = sizeof (buf) }; + +commit efdf4c0c879590109778244046f84a80a4bf8fee +Author: DJ Delorie +Date: Wed Oct 15 21:37:56 2025 -0400 + + sprof: check pread size and offset for overflow + + Add a bit of descriptive paranoia to the values we read from + the ELF headers and use to access data. + + Reviewed-by: Collin Funk + (cherry picked from commit 324084649b2da2f6840e3a1b84159a4e9a9e9a74) + +diff --git a/elf/sprof.c b/elf/sprof.c +index c82c7c9db6..e9d2a66a4f 100644 +--- a/elf/sprof.c ++++ b/elf/sprof.c +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + + /* Get libc version number. */ + #include "../version.h" +@@ -410,6 +411,7 @@ load_shobj (const char *name) + int fd; + ElfW(Shdr) *shdr; + size_t pagesize = getpagesize (); ++ struct stat st; + + /* Since we use dlopen() we must be prepared to work around the sometimes + strange lookup rules for the shared objects. If we have a file foo.so +@@ -550,14 +552,39 @@ load_shobj (const char *name) + error (EXIT_FAILURE, errno, _("Reopening shared object `%s' failed"), + map->l_name); + ++ if (fstat (fd, &st) < 0) ++ error (EXIT_FAILURE, errno, _("stat(%s) failure"), map->l_name); ++ ++ /* We're depending on data that's being read from the file, so be a ++ bit paranoid here and make sure the requests are reasonable - ++ i.e. both size and offset are nonnegative and smaller than the ++ file size, as well as the offset of the end of the data. PREAD ++ would have failed anyway, but this is more robust and explains ++ what happened better. Note that SZ must be unsigned and OFF may ++ be signed or unsigned. */ ++#define PCHECK(sz1,off1) { \ ++ size_t sz = sz1, end_off; \ ++ off_t off = off1; \ ++ if (sz > st.st_size \ ++ || off < 0 || off > st.st_size \ ++ || INT_ADD_WRAPV (sz, off, &end_off) \ ++ || end_off > st.st_size) \ ++ error (EXIT_FAILURE, ERANGE, \ ++ _("read outside of file extents %zu + %zd > %zu"), \ ++ sz, off, st.st_size); \ ++ } ++ + /* Map the section header. */ + size_t size = ehdr->e_shnum * sizeof (ElfW(Shdr)); + shdr = (ElfW(Shdr) *) alloca (size); ++ PCHECK (size, ehdr->e_shoff); + if (pread (fd, shdr, size, ehdr->e_shoff) != size) + error (EXIT_FAILURE, errno, _("reading of section headers failed")); + + /* Get the section header string table. */ + char *shstrtab = (char *) alloca (shdr[ehdr->e_shstrndx].sh_size); ++ PCHECK (shdr[ehdr->e_shstrndx].sh_size, ++ shdr[ehdr->e_shstrndx].sh_offset); + if (pread (fd, shstrtab, shdr[ehdr->e_shstrndx].sh_size, + shdr[ehdr->e_shstrndx].sh_offset) + != shdr[ehdr->e_shstrndx].sh_size) +@@ -585,6 +612,7 @@ load_shobj (const char *name) + size_t size = debuglink_entry->sh_size; + char *debuginfo_fname = (char *) alloca (size + 1); + debuginfo_fname[size] = '\0'; ++ PCHECK (size, debuglink_entry->sh_offset); + if (pread (fd, debuginfo_fname, size, debuglink_entry->sh_offset) + != size) + { +@@ -638,21 +666,32 @@ load_shobj (const char *name) + if (fd2 != -1) + { + ElfW(Ehdr) ehdr2; ++ struct stat st; ++ ++ if (fstat (fd2, &st) < 0) ++ error (EXIT_FAILURE, errno, _("stat(%s) failure"), workbuf); + + /* Read the ELF header. */ ++ PCHECK (sizeof (ehdr2), 0); + if (pread (fd2, &ehdr2, sizeof (ehdr2), 0) != sizeof (ehdr2)) + error (EXIT_FAILURE, errno, + _("reading of ELF header failed")); + + /* Map the section header. */ +- size_t size = ehdr2.e_shnum * sizeof (ElfW(Shdr)); ++ size_t size; ++ if (INT_MULTIPLY_WRAPV (ehdr2.e_shnum, sizeof (ElfW(Shdr)), &size)) ++ error (EXIT_FAILURE, errno, _("too many section headers")); ++ + ElfW(Shdr) *shdr2 = (ElfW(Shdr) *) alloca (size); ++ PCHECK (size, ehdr2.e_shoff); + if (pread (fd2, shdr2, size, ehdr2.e_shoff) != size) + error (EXIT_FAILURE, errno, + _("reading of section headers failed")); + + /* Get the section header string table. */ + shstrtab = (char *) alloca (shdr2[ehdr2.e_shstrndx].sh_size); ++ PCHECK (shdr2[ehdr2.e_shstrndx].sh_size, ++ shdr2[ehdr2.e_shstrndx].sh_offset); + if (pread (fd2, shstrtab, shdr2[ehdr2.e_shstrndx].sh_size, + shdr2[ehdr2.e_shstrndx].sh_offset) + != shdr2[ehdr2.e_shstrndx].sh_size) + +commit 2a0873aa81446149c6065237e1dc2511201bef88 +Author: Collin Funk +Date: Wed Oct 22 01:51:09 2025 -0700 + + sprof: fix -Wformat warnings on 32-bit hosts + + Reviewed-by: H.J. Lu + (cherry picked from commit 9681f645ba20fc3c18eb12ffebf94e3df1f888e3) + +diff --git a/elf/sprof.c b/elf/sprof.c +index e9d2a66a4f..513e0470b2 100644 +--- a/elf/sprof.c ++++ b/elf/sprof.c +@@ -570,8 +570,8 @@ load_shobj (const char *name) + || INT_ADD_WRAPV (sz, off, &end_off) \ + || end_off > st.st_size) \ + error (EXIT_FAILURE, ERANGE, \ +- _("read outside of file extents %zu + %zd > %zu"), \ +- sz, off, st.st_size); \ ++ _("read outside of file extents %zu + %jd > %jd"), \ ++ sz, (intmax_t) off, (intmax_t) st.st_size); \ + } + + /* Map the section header. */ + +commit 8dfb84ad4efbc39c7a7d9efdff6f6ac9017e0a53 +Author: Florian Weimer +Date: Thu Nov 6 14:33:22 2025 +0100 + + support: Fix FILE * leak in check_for_unshare_hints in test-container + + The file opened via fopen is never closed. + + (cherry picked from commit 20a2a756089eacd7e7f4c02e381e82b5d0e40a2c) + +diff --git a/support/test-container.c b/support/test-container.c +index 1c40ab377f..d78139622f 100644 +--- a/support/test-container.c ++++ b/support/test-container.c +@@ -705,6 +705,7 @@ check_for_unshare_hints (int require_pidns) + + val = -1; /* Sentinel. */ + int cnt = fscanf (f, "%d", &val); ++ fclose (f); + if (cnt == 1 && val != files[i].bad_value) + continue; + + +commit a1d3294a5bed821aece03994ab4e72c8b822a962 +Author: Florian Weimer +Date: Thu Nov 6 14:49:21 2025 +0100 + + support: Exit on consistency check failure in resolv_response_add_name + + Using TEST_VERIFY (crname_target != crname) instructs some analysis + tools that crname_target == crname might hold. Under this assumption, + they report a use-after-free for crname_target->offset below, caused + by the previous free (crname). + + Reviewed-by: Collin Funk + (cherry picked from commit b64335ff111c071fde61aec1c1a8460afb3d16d4) + +diff --git a/support/resolv_test.c b/support/resolv_test.c +index ab37d3d58c..29e59da958 100644 +--- a/support/resolv_test.c ++++ b/support/resolv_test.c +@@ -326,7 +326,7 @@ resolv_response_add_name (struct resolv_response_builder *b, + crname_target = *ptr; + else + crname_target = NULL; +- TEST_VERIFY (crname_target != crname); ++ TEST_VERIFY_EXIT (crname_target != crname); + /* Not added to the tree. */ + free (crname); + } diff --git a/pkgs/development/libraries/glibc/common.nix b/pkgs/development/libraries/glibc/common.nix index 7e617c326996..664c373caa2d 100644 --- a/pkgs/development/libraries/glibc/common.nix +++ b/pkgs/development/libraries/glibc/common.nix @@ -49,9 +49,9 @@ }@args: let - version = "2.40"; - patchSuffix = "-66"; - sha256 = "sha256-GaiQF16SY9dI9ieZPeb0sa+c0h4D8IDkv7Oh+sECBaI="; + version = "2.42"; + patchSuffix = "-47"; + sha256 = "sha256-0XdeMuRijmTvkw9DW2e7Y691may2viszW58Z8WUJ8X8="; in assert withLinuxHeaders -> linuxHeaders != null; @@ -68,17 +68,17 @@ stdenv.mkDerivation ( /* No tarballs for stable upstream branch, only https://sourceware.org/git/glibc.git and using git would complicate bootstrapping. $ git fetch --all -p && git checkout origin/release/2.40/master && git describe - glibc-2.40-142-g2eb180377b - $ git show --minimal --reverse glibc-2.40.. ':!ADVISORIES' > 2.40-master.patch + glibc-2.42-47-ga1d3294a5b + $ git show --minimal --reverse glibc-2.42.. ':!ADVISORIES' > 2.42-master.patch To compare the archive contents zdiff can be used. - $ diff -u 2.40-master.patch ../nixpkgs/pkgs/development/libraries/glibc/2.40-master.patch + $ diff -u 2.42-master.patch ../nixpkgs/pkgs/development/libraries/glibc/2.42-master.patch Please note that each commit has changes to the file ADVISORIES excluded since that conflicts with the directory advisories/ making cross-builds from hosts with case-insensitive file-systems impossible. */ - ./2.40-master.patch + ./2.42-master.patch # Allow NixOS and Nix to handle the locale-archive. ./nix-locale-archive.patch @@ -164,15 +164,6 @@ stdenv.mkDerivation ( -#define LIBIDN2_SONAME "libidn2.so.0" +#define LIBIDN2_SONAME "${lib.getLib libidn2}/lib/libidn2.so.0" EOF - '' - # For some reason, with gcc-15 build fails with the following error: - # - # zic.c:3767:1: note: did you mean to specify it after ')' following function parameters? - # zic.c:3781:1: error: standard 'reproducible' attribute can only be applied to function declarators or type specifiers with function type [] - + '' - for path in timezone/zic.c timezone/zdump.c ; do - substituteInPlace $path --replace-fail "ATTRIBUTE_REPRODUCIBLE" "" - done ''; configureFlags = [