soft-fp: fix negation NaN handling (bug 16034).

This commit is contained in:
Joseph Myers 2013-10-10 11:38:56 +00:00
parent cb8f9562a5
commit 2ae21ed2d2
7 changed files with 21 additions and 24 deletions

View File

@ -1,3 +1,14 @@
2013-10-10 Joseph Myers <joseph@codesourcery.com>
[BZ #16034]
* soft-fp/op-common.h (_FP_NEG): Document input as raw. Do not
copy class of input value.
* soft-fp/negdf2.c (__negdf2): Use raw unpacking and packing. Do
not handle exceptions.
* soft-fp/negsf2.c (__negsf2): Likewise.
* soft-fp/negtf2.c (__negtf2): Likewise.
* sysdeps/sparc/sparc32/soft-fp/q_neg.c (_Q_neg): Likewise.
2013-10-09 Joseph Myers <joseph@codesourcery.com>
* soft-fp/op-4.h (_FP_FRAC_DISASSEMBLE_4): Remove trailing

2
NEWS
View File

@ -14,7 +14,7 @@ Version 2.19
15734, 15735, 15736, 15748, 15749, 15754, 15760, 15797, 15844, 15849,
15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890, 15892, 15893,
15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966,
15988.
15988, 16034.
* CVE-2012-4412 The strcoll implementation caches indices and rules for
large collation sequences to optimize multiple passes. This cache

View File

@ -33,15 +33,12 @@
DFtype __negdf2(DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(R);
DFtype r;
FP_UNPACK_D(A, a);
FP_UNPACK_RAW_D(A, a);
FP_NEG_D(R, A);
FP_PACK_D(r, R);
FP_CLEAR_EXCEPTIONS;
FP_HANDLE_EXCEPTIONS;
FP_PACK_RAW_D(r, R);
return r;
}

View File

@ -33,15 +33,12 @@
SFtype __negsf2(SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(R);
SFtype r;
FP_UNPACK_S(A, a);
FP_UNPACK_RAW_S(A, a);
FP_NEG_S(R, A);
FP_PACK_S(r, R);
FP_CLEAR_EXCEPTIONS;
FP_HANDLE_EXCEPTIONS;
FP_PACK_RAW_S(r, R);
return r;
}

View File

@ -33,15 +33,12 @@
TFtype __negtf2(TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(R);
TFtype r;
FP_UNPACK_Q(A, a);
FP_UNPACK_RAW_Q(A, a);
FP_NEG_Q(R, A);
FP_PACK_Q(r, R);
FP_CLEAR_EXCEPTIONS;
FP_HANDLE_EXCEPTIONS;
FP_PACK_RAW_Q(r, R);
return r;
}

View File

@ -771,14 +771,12 @@ do { \
/*
* Main negation routine. FIXME -- when we care about setting exception
* bits reliably, this will not do. We should examine all of the fp classes.
* Main negation routine. The input value is raw.
*/
#define _FP_NEG(fs, wc, R, X) \
do { \
_FP_FRAC_COPY_##wc(R, X); \
R##_c = X##_c; \
R##_e = X##_e; \
R##_s = 1 ^ X##_s; \
} while (0)

View File

@ -24,7 +24,6 @@
long double _Q_neg(const long double a)
{
FP_DECL_EX;
long double c = a;
#if (__BYTE_ORDER == __BIG_ENDIAN)
@ -36,11 +35,9 @@ long double _Q_neg(const long double a)
#else
FP_DECL_Q(A); FP_DECL_Q(C);
FP_UNPACK_Q(A, a);
FP_UNPACK_RAW_Q(A, a);
FP_NEG_Q(C, A);
FP_PACK_Q(c, C);
FP_PACK_RAW_Q(c, C);
#endif
FP_CLEAR_EXCEPTIONS;
FP_HANDLE_EXCEPTIONS;
return c;
}