svn commit: r241051 - in head/lib/msun: ld80 src
Steve Kargl
kargl at FreeBSD.org
Sat Sep 29 16:40:13 UTC 2012
Author: kargl
Date: Sat Sep 29 16:40:12 2012
New Revision: 241051
URL: http://svn.freebsd.org/changeset/base/241051
Log:
* src/math_private.h:
. Change the API for the LD80C by removing the explicit passing
of the sign bit. The sign can be determined from the last
parameter of the macro.
. On i386, load long double by bit manipulations to work around
at least a gcc compiler issue. On non-i386 ld80 architectures,
use a simple assignment.
* ld80/s_expl.c:
. Update the only consumer of LD80C.
Submitted by: bde
Approved by: das (mentor)
Modified:
head/lib/msun/ld80/s_expl.c
head/lib/msun/src/math_private.h
Modified: head/lib/msun/ld80/s_expl.c
==============================================================================
--- head/lib/msun/ld80/s_expl.c Sat Sep 29 16:27:13 2012 (r241050)
+++ head/lib/msun/ld80/s_expl.c Sat Sep 29 16:40:12 2012 (r241051)
@@ -60,9 +60,9 @@ static volatile const long double tiny =
static const union IEEEl2bits
/* log(2**16384 - 0.5) rounded towards zero: */
-o_threshold = LD80C(0xb17217f7d1cf79ab, 13, 0, 11356.5234062941439488L),
+o_threshold = LD80C(0xb17217f7d1cf79ab, 13, 11356.5234062941439488L),
/* log(2**(-16381-64-1)) rounded towards zero: */
-u_threshold = LD80C(0xb21dfe7f09e2baa9, 13, 1, -11399.4985314888605581L);
+u_threshold = LD80C(0xb21dfe7f09e2baa9, 13, -11399.4985314888605581L);
static const double __aligned(64)
/*
Modified: head/lib/msun/src/math_private.h
==============================================================================
--- head/lib/msun/src/math_private.h Sat Sep 29 16:27:13 2012 (r241050)
+++ head/lib/msun/src/math_private.h Sat Sep 29 16:40:12 2012 (r241051)
@@ -207,12 +207,16 @@ do { \
(d) = se_u.e; \
} while (0)
-/* Long double constants are broken on i386. This workaround is OK always. */
-#define LD80C(m, ex, s, v) { \
- /* .e = v, */ /* overwritten */ \
- .xbits.man = __CONCAT(m, ULL), \
- .xbits.expsign = (0x3fff + (ex)) | ((s) ? 0x8000 : 0), \
+#ifdef __i386__
+/* Long double constants are broken on i386. */
+#define LD80C(m, ex, v) { \
+ .xbits.man = __CONCAT(m, ULL), \
+ .xbits.expsign = (0x3fff + (ex)) | ((v) < 0 ? 0x8000 : 0), \
}
+#else
+/* The above works on non-i386 too, but we use this to check v. */
+#define LD80C(m, ex, v) { .e = (v), }
+#endif
#ifdef FLT_EVAL_METHOD
/*
More information about the svn-src-head
mailing list