public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] Remap __GLIBC_FLT_EVAL_METHOD to 0 if __FLT_EVAL_METHOD__ is -1
@ 2023-04-28 14:03 Palmer Dabbelt
  0 siblings, 0 replies; only message in thread
From: Palmer Dabbelt @ 2023-04-28 14:03 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=a225cb3ee9a22021312ae25c37595cd9d1995a1f

commit a225cb3ee9a22021312ae25c37595cd9d1995a1f
Author: Kito Cheng <kito.cheng@sifive.com>
Date:   Tue Mar 14 23:19:48 2023 +0800

    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>

Diff:
---
 bits/flt-eval-method.h | 8 +++-----
 1 file 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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-28 14:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-28 14:03 [glibc] Remap __GLIBC_FLT_EVAL_METHOD to 0 if __FLT_EVAL_METHOD__ is -1 Palmer Dabbelt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).