Author: rlibby
Date: Fri Aug 11 22:41:24 2017
New Revision: 322418
URL: https://svnweb.freebsd.org/changeset/base/322418

Log:
  lib/msun: avoid referring to broken LDBL_MAX
  
  LDBL_MAX is broken on i386:
  
https://lists.freebsd.org/pipermail/freebsd-numerics/2012-September/000288.html
  
  Gcc has produced +Infinity for LDBL_MAX on i386 and amd64 with -m32
  for some time, and newer versions of gcc are now warning that the
  "floating constant exceeds range of 'long double'".  Avoid this by
  referring to half the value of LDBL_MAX instead.
  
  Reviewed by:  bde
  Approved by:  markj (mentor)
  Sponsored by: Dell EMC Isilon

Modified:
  head/lib/msun/src/catrigl.c
  head/lib/msun/src/math_private.h
  head/lib/msun/src/s_csqrtl.c

Modified: head/lib/msun/src/catrigl.c
==============================================================================
--- head/lib/msun/src/catrigl.c Fri Aug 11 22:39:38 2017        (r322417)
+++ head/lib/msun/src/catrigl.c Fri Aug 11 22:41:24 2017        (r322418)
@@ -307,7 +307,7 @@ clog_for_large_values(long double complex z)
                ay = t;
        }
 
-       if (ax > LDBL_MAX / 2)
+       if (ax >= HALF_LDBL_MAX)
                return (CMPLXL(logl(hypotl(x / m_e, y / m_e)) + 1,
                    atan2l(y, x)));
 

Modified: head/lib/msun/src/math_private.h
==============================================================================
--- head/lib/msun/src/math_private.h    Fri Aug 11 22:39:38 2017        
(r322417)
+++ head/lib/msun/src/math_private.h    Fri Aug 11 22:41:24 2017        
(r322418)
@@ -272,6 +272,15 @@ do {                                                       
        \
 #define        LD80C(m, ex, v) { .e = (v), }
 #endif
 
+/*
+ * XXX LDBL_MAX is broken on i386.  If the precise value of LDBL_MAX is not
+ * needed, this may be worked around by instead referring to a proxy, such
+ * as HALF_LDBL_MAX, below.  HALF_LDBL_MAX is approximately LDBL_MAX / 2,
+ * actually just greater than.  Note that 2 * HALF_LDBL_MAX will always
+ * overflow to infinity, regardless of the precision and rounding modes.
+ */
+#define        HALF_LDBL_MAX   __CONCAT(__CONCAT(0x0.8p, LDBL_MAX_EXP), L)
+
 #ifdef FLT_EVAL_METHOD
 /*
  * Attempt to get strict C99 semantics for assignment with non-C99 compilers.

Modified: head/lib/msun/src/s_csqrtl.c
==============================================================================
--- head/lib/msun/src/s_csqrtl.c        Fri Aug 11 22:39:38 2017        
(r322417)
+++ head/lib/msun/src/s_csqrtl.c        Fri Aug 11 22:41:24 2017        
(r322418)
@@ -43,7 +43,7 @@ __FBSDID("$FreeBSD$");
 #pragma        STDC CX_LIMITED_RANGE   ON
 
 /* We risk spurious overflow for components >= LDBL_MAX / (1 + sqrt(2)). */
-#define        THRESH  (LDBL_MAX / 2.414213562373095048801688724209698L)
+#define        THRESH  (HALF_LDBL_MAX / 1.207106781186547524400844362104849L)
 
 long double complex
 csqrtl(long double complex z)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to