summaryrefslogtreecommitdiff
path: root/math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
commitd20db0561a6a36f914fde030512503b114ef9a0c (patch)
treed4e5e3494d95c269a1cee6195f11bf3201bcadbf /math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch
parent016343d99b1b269d7246ef1e143d4b54914433d4 (diff)
Diffstat (limited to 'math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch')
-rw-r--r--math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch b/math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch
new file mode 100644
index 0000000..bdd129b
--- /dev/null
+++ b/math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch
@@ -0,0 +1,64 @@
+From 672f05a903f2b3ef7144c8c92efdff5e766a0dba Mon Sep 17 00:00:00 2001
+From: XingLi <lixing@loongson.cn>
+Date: Thu, 2 Feb 2023 18:49:01 +0800
+Subject: [PATCH] math: Fix asin and acos invalid exception with old gcc
+
+ This works around a gcc issue where it const folded inf/inf into nan,
+ preventing the invalid exception to be signalled.
+
+ (x-x)/(x-x) is more robust against optimizations and works for all
+ out of bounds values including x==nan.
+
+ The gcc issue https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95115
+ should be fixed on release branches starting from gcc-10, but it is
+ better to change the code in case glibc is built with older gcc.
+
+ Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
+
+ upstream commit 7363a9a9a097c455a7ddb9386b4c6f7bdf91065f
+ Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
+---
+ sysdeps/ieee754/dbl-64/e_asin.c | 20 +++-----------------
+ 1 file changed, 3 insertions(+), 17 deletions(-)
+
+diff --git a/sysdeps/ieee754/dbl-64/e_asin.c b/sysdeps/ieee754/dbl-64/e_asin.c
+index 4473ae5d..b03a0a94 100644
+--- a/sysdeps/ieee754/dbl-64/e_asin.c
++++ b/sysdeps/ieee754/dbl-64/e_asin.c
+@@ -165,15 +165,8 @@ __ieee754_asin(double x){
+ /*---------------------------- |x|>=1 -------------------------------*/
+ else if (k==0x3ff00000 && u.i[LOW_HALF]==0) return (m>0)?hp0.x:-hp0.x;
+ else
+- if (k>0x7ff00000 || (k == 0x7ff00000 && u.i[LOW_HALF] != 0)) return x + x;
+- else {
+- u.i[HIGH_HALF]=0x7ff00000;
+- v.i[HIGH_HALF]=0x7ff00000;
+- u.i[LOW_HALF]=0;
+- v.i[LOW_HALF]=0;
+- return u.x/v.x; /* NaN */
+- }
+-}
++ return (x - x) / (x - x);
++ }
+ #ifndef __ieee754_asin
+ libm_alias_finite (__ieee754_asin, __asin)
+ #endif
+@@ -334,14 +327,7 @@ __ieee754_acos(double x)
+ else
+ if (k==0x3ff00000 && u.i[LOW_HALF]==0) return (m>0)?0:2.0*hp0.x;
+ else
+- if (k>0x7ff00000 || (k == 0x7ff00000 && u.i[LOW_HALF] != 0)) return x + x;
+- else {
+- u.i[HIGH_HALF]=0x7ff00000;
+- v.i[HIGH_HALF]=0x7ff00000;
+- u.i[LOW_HALF]=0;
+- v.i[LOW_HALF]=0;
+- return u.x/v.x;
+- }
++ return (x - x) / (x - x);
+ }
+ #ifndef __ieee754_acos
+ libm_alias_finite (__ieee754_acos, __acos)
+--
+2.33.0
+