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] 54b21fc5ae

PR:		242067
Reported by:	Dennis Clarke <dclarke@blastwave.org>
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D25420
This commit is contained in:
Mitchell Horne 2020-06-29 19:30:35 +00:00
parent 70448a5414
commit bbfbc439f2

View File

@ -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