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:
parent
70448a5414
commit
bbfbc439f2
@ -46,19 +46,6 @@ union IEEEl2bits {
|
|||||||
#define LDBL_IMPLICIT_NBIT
|
#define LDBL_IMPLICIT_NBIT
|
||||||
#define mask_nbit_l(u) ((void)0)
|
#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_MANH_SIZE 48
|
||||||
#define LDBL_MANL_SIZE 64
|
#define LDBL_MANL_SIZE 64
|
||||||
|
|
||||||
@ -68,4 +55,3 @@ union IEEEl2bits {
|
|||||||
(a)[2] = (uint32_t)(u).bits.manh; \
|
(a)[2] = (uint32_t)(u).bits.manh; \
|
||||||
(a)[3] = (uint32_t)((u).bits.manh >> 32); \
|
(a)[3] = (uint32_t)((u).bits.manh >> 32); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#endif
|
|
||||||
|
Loading…
Reference in New Issue
Block a user