diff options
author | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
commit | d20db0561a6a36f914fde030512503b114ef9a0c (patch) | |
tree | d4e5e3494d95c269a1cee6195f11bf3201bcadbf /math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch | |
parent | 016343d99b1b269d7246ef1e143d4b54914433d4 (diff) |
automatic import of glibcopeneuler22.03_LTS_SP4openeuler22.03_LTS_SP3openeuler20.03
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.patch | 64 |
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 + |