svn commit: r362788 - head/lib/libc/riscv
Mitchell Horne
mhorne at FreeBSD.org
Mon Jun 29 19:30:36 UTC 2020
Author: mhorne
Date: Mon Jun 29 19:30:35 2020
New Revision: 362788
URL: https://svnweb.freebsd.org/changeset/base/362788
Log:
Fix printf(3) output of long doubles on RISC-V
When the RISC-V port was initially committed to FreeBSD, GCC would
generate 64-bit long doubles, and the definitions in _fpmath.h reflected
that. This was changed to 128-bit in GCC later that year [1], but the
definitions were never updated, despite the documented workaround. This
causes printf(3) and friends to interpret only the low 64-bits of a long
double in ldtoa, thereby printing incorrect values.
Update the definitions now that both clang and GCC generate 128-bit long
doubles.
[1] https://github.com/riscv/riscv-gcc/commit/54b21fc5ae83cefec44bc2caed4a8c664c274ba0
PR: 242067
Reported by: Dennis Clarke <dclarke at blastwave.org>
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D25420
Modified:
head/lib/libc/riscv/_fpmath.h
Modified: head/lib/libc/riscv/_fpmath.h
==============================================================================
--- head/lib/libc/riscv/_fpmath.h Mon Jun 29 18:06:00 2020 (r362787)
+++ head/lib/libc/riscv/_fpmath.h Mon Jun 29 19:30:35 2020 (r362788)
@@ -46,19 +46,6 @@ union IEEEl2bits {
#define LDBL_IMPLICIT_NBIT
#define mask_nbit_l(u) ((void)0)
-#define LDBL_MANH_SIZE 20
-#define LDBL_MANL_SIZE 32
-
-#define LDBL_TO_ARRAY32(u, a) do { \
- (a)[0] = (uint32_t)(u).bits.manl; \
- (a)[1] = (uint32_t)(u).bits.manh; \
-} while(0)
-
-/*
- * TODO: Due to compiler problem we are temporary using
- * LDBL_PREC == 53. Use code below for LDBL_PREC == 113
- */
-#if 0
#define LDBL_MANH_SIZE 48
#define LDBL_MANL_SIZE 64
@@ -68,4 +55,3 @@ union IEEEl2bits {
(a)[2] = (uint32_t)(u).bits.manh; \
(a)[3] = (uint32_t)((u).bits.manh >> 32); \
} while(0)
-#endif
More information about the svn-src-head
mailing list