aboutsummaryrefslogtreecommitdiff
path: root/bits
diff options
context:
space:
mode:
authorKito Cheng <kito.cheng@sifive.com>2023-03-14 23:19:48 +0800
committerPalmer Dabbelt <palmer@rivosinc.com>2023-04-28 07:02:48 -0700
commita225cb3ee9a22021312ae25c37595cd9d1995a1f (patch)
tree8268a859965d0bea7009a6434abf75f5998c3f50 /bits
parent117e8b341c5c0ace8d65feeef136fececb3fdc9c (diff)
downloadglibc-a225cb3ee9a22021312ae25c37595cd9d1995a1f.tar
glibc-a225cb3ee9a22021312ae25c37595cd9d1995a1f.tar.gz
glibc-a225cb3ee9a22021312ae25c37595cd9d1995a1f.tar.bz2
glibc-a225cb3ee9a22021312ae25c37595cd9d1995a1f.zip
Remap __GLIBC_FLT_EVAL_METHOD to 0 if __FLT_EVAL_METHOD__ is -1
__GLIBC_FLT_EVAL_METHOD will effect the definition of float_t and double_t, currently we'll set __GLIBC_FLT_EVAL_METHOD to 2 when __FLT_EVAL_METHOD__ is -1, that means we'll define float_t and double_t to long double. However some target isn't natively (HW) support long double like AArch64 and RISC-V, they defined long double as 128-bits IEEE 754 floating point type. That means setting __GLIBC_FLT_EVAL_METHOD to 2 will cause very inefficient code gen for those target who didn't provide native support for long double, and that's violate the spirit float_t and double_t - most efficient types at least as wide as float and double. So this patch propose to remap __GLIBC_FLT_EVAL_METHOD to 0 rather than 2 when __FLT_EVAL_METHOD__ is -1, which means we'll use float/double rather than long double for float_t and double_t. Note: __FLT_EVAL_METHOD__ == -1 means the precision is indeterminable, which means compiler might using indeterminable precision during optimization/code gen, clang will set this value to -1 when fast math is enabled. Note: Default definition float_t and double_t in current glibc: | __GLIBC_FLT_EVAL_METHOD | float_t | double_t | 0 or 16 | float | double | 1 | double | doulbe | 2 | long double | long double More complete list see math/math.h Note: RISC-V has defined ISA extension to support 128-bits IEEE 754 floating point operations, but only rare RISC-V core will implement that. Related link: [1] LLVM issue (__FLT_EVAL_METHOD__ is set to -1 with Ofast. #60781): https://github.com/llvm/llvm-project/issues/60781 [2] Last version of this patch: https://sourceware.org/pipermail/libc-alpha/2023-February/145622.html Acked-by: Palmer Dabbelt <palmer@rivosinc.com> # RISC-V Reviewed-by: Wilco Dijkstra  <Wilco.Dijkstra@arm.com> Link: https://inbox.sourceware.org/libc-alpha/20230314151948.12892-1-kito.cheng@sifive.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
Diffstat (limited to 'bits')
-rw-r--r--bits/flt-eval-method.h8
1 files changed, 3 insertions, 5 deletions
diff --git a/bits/flt-eval-method.h b/bits/flt-eval-method.h
index 75f57b9a0e..f9262d7d0b 100644
--- a/bits/flt-eval-method.h
+++ b/bits/flt-eval-method.h
@@ -26,14 +26,12 @@
-1. */
/* In the default version of this header, follow __FLT_EVAL_METHOD__.
- -1 is mapped to 2 (considering evaluation as long double to be a
- conservatively safe assumption), and if __FLT_EVAL_METHOD__ is not
- defined then assume there is no excess precision and use the value
- 0. */
+ If __FLT_EVAL_METHOD__ is not defined or set to -1, assume there is no
+ excess precision and use the value 0 (this is correct for most targets). */
#ifdef __FLT_EVAL_METHOD__
# if __FLT_EVAL_METHOD__ == -1
-# define __GLIBC_FLT_EVAL_METHOD 2
+# define __GLIBC_FLT_EVAL_METHOD 0
# else
# define __GLIBC_FLT_EVAL_METHOD __FLT_EVAL_METHOD__
# endif