mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 05:50:14 +00:00
Fix soft-fp extended.h unpacking (GCC bug 77265).
soft-fp unpacking for x86 "extended" fails to clear the implicit mantissa high bit that is explicit in that format, resulting in problems for operations that expect this bit to be clear in raw unpacked values. Specifically, the code for this format is used only for conversions to and from TFmode (__float128) in libgcc, where this issue results in GCC bug 77265, extension of long double infinity to __float128 wrongly produces a NaN. This patch fixes this by always masking out the implicit bit on unpacking, so that the results of unpacking meet the expectations of the rest of the soft-fp code for a normal IEEE format. Tested for x86_64 in libgcc in conjunction with a GCC testcase for this issue (this code isn't used in glibc, only in libgcc). * soft-fp/extended.h [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_E): Mask implicit bit out of unpacked value. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_EP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_EP): Likewise.
This commit is contained in:
parent
8b7d13322a
commit
c20809709a
@ -1,5 +1,11 @@
|
||||
2016-08-16 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* soft-fp/extended.h [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_E):
|
||||
Mask implicit bit out of unpacked value.
|
||||
[_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_EP): Likewise.
|
||||
[_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_E): Likewise.
|
||||
[_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_EP): Likewise.
|
||||
|
||||
* sysdeps/sparc/fpu/fesetexcept.c: New file.
|
||||
|
||||
* sysdeps/sh/sh4/fpu/fesetexcept.c: New file.
|
||||
|
@ -104,6 +104,7 @@ union _FP_UNION_E
|
||||
X##_f[3] = 0; \
|
||||
X##_f[0] = FP_UNPACK_RAW_E_flo.bits.frac0; \
|
||||
X##_f[1] = FP_UNPACK_RAW_E_flo.bits.frac1; \
|
||||
X##_f[1] &= ~_FP_IMPLBIT_E; \
|
||||
X##_e = FP_UNPACK_RAW_E_flo.bits.exp; \
|
||||
X##_s = FP_UNPACK_RAW_E_flo.bits.sign; \
|
||||
} \
|
||||
@ -119,6 +120,7 @@ union _FP_UNION_E
|
||||
X##_f[3] = 0; \
|
||||
X##_f[0] = FP_UNPACK_RAW_EP_flo->bits.frac0; \
|
||||
X##_f[1] = FP_UNPACK_RAW_EP_flo->bits.frac1; \
|
||||
X##_f[1] &= ~_FP_IMPLBIT_E; \
|
||||
X##_e = FP_UNPACK_RAW_EP_flo->bits.exp; \
|
||||
X##_s = FP_UNPACK_RAW_EP_flo->bits.sign; \
|
||||
} \
|
||||
@ -332,6 +334,7 @@ union _FP_UNION_E
|
||||
FP_UNPACK_RAW_E_flo.flt = (val); \
|
||||
\
|
||||
X##_f0 = FP_UNPACK_RAW_E_flo.bits.frac; \
|
||||
X##_f0 &= ~_FP_IMPLBIT_E; \
|
||||
X##_f1 = 0; \
|
||||
X##_e = FP_UNPACK_RAW_E_flo.bits.exp; \
|
||||
X##_s = FP_UNPACK_RAW_E_flo.bits.sign; \
|
||||
@ -345,6 +348,7 @@ union _FP_UNION_E
|
||||
= (union _FP_UNION_E *) (val); \
|
||||
\
|
||||
X##_f0 = FP_UNPACK_RAW_EP_flo->bits.frac; \
|
||||
X##_f0 &= ~_FP_IMPLBIT_E; \
|
||||
X##_f1 = 0; \
|
||||
X##_e = FP_UNPACK_RAW_EP_flo->bits.exp; \
|
||||
X##_s = FP_UNPACK_RAW_EP_flo->bits.sign; \
|
||||
|
Loading…
Reference in New Issue
Block a user