mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
soft-fp: Refactor exception handling for comparisons.
This patch refactors how soft-fp comparisons handle setting exceptions for NaN operands, so that exceptions are set through the FP_CMP macros rather than directly in the C files calling them. The _FP_CMP* and FP_CMP* macros gain an extra argument to specify when exceptions should be set, 0 for no exception setting (I'm not sure this is actually needed - at least it's not needed for IEEE operations in glibc / libgcc, but might be relevant in some cases for kernel use), 1 for exceptions only for signaling NaNs and 2 for exceptions for all NaNs. This argument is handled through _FP_CMP_CHECK_NAN, newly called by the _FP_CMP* macros when a NaN is encountered. Calls to these macros are updated, which eliminates all the existing checking and exception setting in soft-fp *.c files in glibc. Tested for powerpc-nofpu. (The __unord* functions have no code changes; the __eq* / __ge* / __le* functions get slightly larger, but I don't think that's significant.) * soft-fp/op-common.h (_FP_CMP_CHECK_NAN): New macro. (_FP_CMP): Add extra argument EX. Call _FP_CMP_CHECK_NAN. (_FP_CMP_EQ): Likewise. (_FP_CMP_UNORD): Likewise. * soft-fp/double.h (FP_CMP_D): Add extra argument EX. (FP_CMP_EQ_D): Likewise. (FP_CMP_UNORD_D): Likewise. * soft-fp/extended.h (FP_CMP_E): Likewise. (FP_CMP_EQ_E): Likewise. (FP_CMP_UNORD_E): Likewise. * soft-fp/quad.h (FP_CMP_Q): Likewise. (FP_CMP_EQ_Q): Likewise. (FP_CMP_UNORD_Q): Likewise. * soft-fp/single.h (FP_CMP_S): Likewise. (FP_CMP_EQ_S): Likewise. (FP_CMP_UNORD_S): Likewise. * soft-fp/eqdf2.c (__eqdf2): Update call to FP_CMP_EQ_D. * soft-fp/eqsf2.c (__eqsf2): Update call to FP_CMP_EQ_S. * soft-fp/eqtf2.c (__eqtf2): Update call to FP_CMP_EQ_Q. * soft-fp/gedf2.c (__gedf2): Update call to FP_CMP_D. * soft-fp/gesf2.c (__gesf2): Update call to FP_CMP_S. * soft-fp/getf2.c (__getf2): Update call to FP_CMP_Q. * soft-fp/ledf2.c (__ledf2): Update call to FP_CMP_D. * soft-fp/lesf2.c (__lesf2): Update call to FP_CMP_S. * soft-fp/letf2.c (__letf2): Update call to FP_CMP_Q. * soft-fp/unorddf2.c (__unorddf2): Update call to FP_CMP_UNORD_D. * soft-fp/unordsf2.c (__unordsf2): Update call to FP_CMP_UNORD_S. * soft-fp/unordtf2.c (__unordtf2): Update call to FP_CMP_UNORD_Q. * sysdeps/alpha/soft-fp/ots_cmpe.c (internal_compare): Update call to FP_CMP_Q. * sysdeps/sparc/sparc32/soft-fp/q_cmp.c (_Q_cmp): Update call to FP_CMP_Q. * sysdeps/sparc/sparc32/soft-fp/q_cmpe.c (_Q_cmpe): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_feq.c (_Q_feq): Update call to FP_CMP_EQ_Q. * sysdeps/sparc/sparc32/soft-fp/q_fge.c (_Q_fge): Update call to FP_CMP_Q. * sysdeps/sparc/sparc32/soft-fp/q_fgt.c (_Q_fgt): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_fle.c (_Q_fle): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_flt.c (_Q_flt): Likewise. * sysdeps/sparc/sparc32/soft-fp/q_fne.c (_Q_fne): Update call to FP_CMP_EQ_Q. * sysdeps/sparc/sparc64/soft-fp/qp_cmp.c (_Qp_cmp): Update call to FP_CMP_Q. * sysdeps/sparc/sparc64/soft-fp/qp_cmpe.c (_Qp_cmpe): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_feq.c (_Qp_feq): Update call to FP_CMP_EQ_Q. * sysdeps/sparc/sparc64/soft-fp/qp_fge.c (_Qp_fge): Update call to FP_CMP_Q. * sysdeps/sparc/sparc64/soft-fp/qp_fgt.c (_Qp_fgt): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_fle.c (_Qp_fle): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_flt.c (_Qp_flt): Likewise. * sysdeps/sparc/sparc64/soft-fp/qp_fne.c (_Qp_fne): Update call to FP_CMP_EQ_Q.
This commit is contained in:
parent
43059f42db
commit
73e28d9c88
55
ChangeLog
55
ChangeLog
@ -1,5 +1,60 @@
|
||||
2014-10-09 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* soft-fp/op-common.h (_FP_CMP_CHECK_NAN): New macro.
|
||||
(_FP_CMP): Add extra argument EX. Call _FP_CMP_CHECK_NAN.
|
||||
(_FP_CMP_EQ): Likewise.
|
||||
(_FP_CMP_UNORD): Likewise.
|
||||
* soft-fp/double.h (FP_CMP_D): Add extra argument EX.
|
||||
(FP_CMP_EQ_D): Likewise.
|
||||
(FP_CMP_UNORD_D): Likewise.
|
||||
* soft-fp/extended.h (FP_CMP_E): Likewise.
|
||||
(FP_CMP_EQ_E): Likewise.
|
||||
(FP_CMP_UNORD_E): Likewise.
|
||||
* soft-fp/quad.h (FP_CMP_Q): Likewise.
|
||||
(FP_CMP_EQ_Q): Likewise.
|
||||
(FP_CMP_UNORD_Q): Likewise.
|
||||
* soft-fp/single.h (FP_CMP_S): Likewise.
|
||||
(FP_CMP_EQ_S): Likewise.
|
||||
(FP_CMP_UNORD_S): Likewise.
|
||||
* soft-fp/eqdf2.c (__eqdf2): Update call to FP_CMP_EQ_D.
|
||||
* soft-fp/eqsf2.c (__eqsf2): Update call to FP_CMP_EQ_S.
|
||||
* soft-fp/eqtf2.c (__eqtf2): Update call to FP_CMP_EQ_Q.
|
||||
* soft-fp/gedf2.c (__gedf2): Update call to FP_CMP_D.
|
||||
* soft-fp/gesf2.c (__gesf2): Update call to FP_CMP_S.
|
||||
* soft-fp/getf2.c (__getf2): Update call to FP_CMP_Q.
|
||||
* soft-fp/ledf2.c (__ledf2): Update call to FP_CMP_D.
|
||||
* soft-fp/lesf2.c (__lesf2): Update call to FP_CMP_S.
|
||||
* soft-fp/letf2.c (__letf2): Update call to FP_CMP_Q.
|
||||
* soft-fp/unorddf2.c (__unorddf2): Update call to FP_CMP_UNORD_D.
|
||||
* soft-fp/unordsf2.c (__unordsf2): Update call to FP_CMP_UNORD_S.
|
||||
* soft-fp/unordtf2.c (__unordtf2): Update call to FP_CMP_UNORD_Q.
|
||||
* sysdeps/alpha/soft-fp/ots_cmpe.c (internal_compare): Update call
|
||||
to FP_CMP_Q.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_cmp.c (_Q_cmp): Update call to
|
||||
FP_CMP_Q.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_cmpe.c (_Q_cmpe): Likewise.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_feq.c (_Q_feq): Update call to
|
||||
FP_CMP_EQ_Q.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_fge.c (_Q_fge): Update call to
|
||||
FP_CMP_Q.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_fgt.c (_Q_fgt): Likewise.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_fle.c (_Q_fle): Likewise.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_flt.c (_Q_flt): Likewise.
|
||||
* sysdeps/sparc/sparc32/soft-fp/q_fne.c (_Q_fne): Update call to
|
||||
FP_CMP_EQ_Q.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_cmp.c (_Qp_cmp): Update call to
|
||||
FP_CMP_Q.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_cmpe.c (_Qp_cmpe): Likewise.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_feq.c (_Qp_feq): Update call to
|
||||
FP_CMP_EQ_Q.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_fge.c (_Qp_fge): Update call to
|
||||
FP_CMP_Q.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_fgt.c (_Qp_fgt): Likewise.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_fle.c (_Qp_fle): Likewise.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_flt.c (_Qp_flt): Likewise.
|
||||
* sysdeps/sparc/sparc64/soft-fp/qp_fne.c (_Qp_fne): Update call to
|
||||
FP_CMP_EQ_Q.
|
||||
|
||||
* soft-fp/op-common.h (FP_EXTEND): When a subnormal input produces
|
||||
a subnormal result, set the underflow exception if trapping on
|
||||
underflow is enabled.
|
||||
|
@ -177,9 +177,9 @@ union _FP_UNION_D
|
||||
# define _FP_SQRT_MEAT_D(R, S, T, X, Q) _FP_SQRT_MEAT_2 (R, S, T, X, Q)
|
||||
# define FP_FMA_D(R, X, Y, Z) _FP_FMA (D, 2, 4, R, X, Y, Z)
|
||||
|
||||
# define FP_CMP_D(r, X, Y, un) _FP_CMP (D, 2, r, X, Y, un)
|
||||
# define FP_CMP_EQ_D(r, X, Y) _FP_CMP_EQ (D, 2, r, X, Y)
|
||||
# define FP_CMP_UNORD_D(r, X, Y) _FP_CMP_UNORD (D, 2, r, X, Y)
|
||||
# define FP_CMP_D(r, X, Y, un, ex) _FP_CMP (D, 2, r, X, Y, un, ex)
|
||||
# define FP_CMP_EQ_D(r, X, Y, ex) _FP_CMP_EQ (D, 2, r, X, Y, ex)
|
||||
# define FP_CMP_UNORD_D(r, X, Y, ex) _FP_CMP_UNORD (D, 2, r, X, Y, ex)
|
||||
|
||||
# define FP_TO_INT_D(r, X, rsz, rsg) _FP_TO_INT (D, 2, r, X, rsz, rsg)
|
||||
# define FP_FROM_INT_D(X, r, rs, rt) _FP_FROM_INT (D, 2, X, r, rs, rt)
|
||||
@ -299,9 +299,9 @@ union _FP_UNION_D
|
||||
/* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
|
||||
the target machine. */
|
||||
|
||||
# define FP_CMP_D(r, X, Y, un) _FP_CMP (D, 1, r, X, Y, un)
|
||||
# define FP_CMP_EQ_D(r, X, Y) _FP_CMP_EQ (D, 1, r, X, Y)
|
||||
# define FP_CMP_UNORD_D(r, X, Y) _FP_CMP_UNORD (D, 1, r, X, Y)
|
||||
# define FP_CMP_D(r, X, Y, un, ex) _FP_CMP (D, 1, r, X, Y, un, ex)
|
||||
# define FP_CMP_EQ_D(r, X, Y, ex) _FP_CMP_EQ (D, 1, r, X, Y, ex)
|
||||
# define FP_CMP_UNORD_D(r, X, Y, ex) _FP_CMP_UNORD (D, 1, r, X, Y, ex)
|
||||
|
||||
# define FP_TO_INT_D(r, X, rsz, rsg) _FP_TO_INT (D, 1, r, X, rsz, rsg)
|
||||
# define FP_FROM_INT_D(X, r, rs, rt) _FP_FROM_INT (D, 1, X, r, rs, rt)
|
||||
|
@ -42,9 +42,7 @@ __eqdf2 (DFtype a, DFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_D (A, a);
|
||||
FP_UNPACK_RAW_D (B, b);
|
||||
FP_CMP_EQ_D (r, A, B);
|
||||
if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_EQ_D (r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -42,9 +42,7 @@ __eqsf2 (SFtype a, SFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_S (A, a);
|
||||
FP_UNPACK_RAW_S (B, b);
|
||||
FP_CMP_EQ_S (r, A, B);
|
||||
if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_EQ_S (r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -42,9 +42,7 @@ __eqtf2 (TFtype a, TFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_Q (A, a);
|
||||
FP_UNPACK_RAW_Q (B, b);
|
||||
FP_CMP_EQ_Q (r, A, B);
|
||||
if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_EQ_Q (r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -287,9 +287,9 @@ union _FP_UNION_E
|
||||
} \
|
||||
while (0)
|
||||
|
||||
# define FP_CMP_E(r, X, Y, un) _FP_CMP (E, 4, r, X, Y, un)
|
||||
# define FP_CMP_EQ_E(r, X, Y) _FP_CMP_EQ (E, 4, r, X, Y)
|
||||
# define FP_CMP_UNORD_E(r, X, Y) _FP_CMP_UNORD (E, 4, r, X, Y)
|
||||
# define FP_CMP_E(r, X, Y, un, ex) _FP_CMP (E, 4, r, X, Y, un, ex)
|
||||
# define FP_CMP_EQ_E(r, X, Y, ex) _FP_CMP_EQ (E, 4, r, X, Y, ex)
|
||||
# define FP_CMP_UNORD_E(r, X, Y, ex) _FP_CMP_UNORD (E, 4, r, X, Y, ex)
|
||||
|
||||
# define FP_TO_INT_E(r, X, rsz, rsg) _FP_TO_INT (E, 4, r, X, rsz, rsg)
|
||||
# define FP_FROM_INT_E(X, r, rs, rt) _FP_FROM_INT (E, 4, X, r, rs, rt)
|
||||
@ -489,9 +489,9 @@ union _FP_UNION_E
|
||||
} \
|
||||
while (0)
|
||||
|
||||
# define FP_CMP_E(r, X, Y, un) _FP_CMP (E, 2, r, X, Y, un)
|
||||
# define FP_CMP_EQ_E(r, X, Y) _FP_CMP_EQ (E, 2, r, X, Y)
|
||||
# define FP_CMP_UNORD_E(r, X, Y) _FP_CMP_UNORD (E, 2, r, X, Y)
|
||||
# define FP_CMP_E(r, X, Y, un, ex) _FP_CMP (E, 2, r, X, Y, un, ex)
|
||||
# define FP_CMP_EQ_E(r, X, Y, ex) _FP_CMP_EQ (E, 2, r, X, Y, ex)
|
||||
# define FP_CMP_UNORD_E(r, X, Y, ex) _FP_CMP_UNORD (E, 2, r, X, Y, ex)
|
||||
|
||||
# define FP_TO_INT_E(r, X, rsz, rsg) _FP_TO_INT (E, 2, r, X, rsz, rsg)
|
||||
# define FP_FROM_INT_E(X, r, rs, rt) _FP_FROM_INT (E, 2, X, r, rs, rt)
|
||||
|
@ -42,9 +42,7 @@ __gedf2 (DFtype a, DFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_D (A, a);
|
||||
FP_UNPACK_RAW_D (B, b);
|
||||
FP_CMP_D (r, A, B, -2);
|
||||
if (r == -2)
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_D (r, A, B, -2, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -42,9 +42,7 @@ __gesf2 (SFtype a, SFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_S (A, a);
|
||||
FP_UNPACK_RAW_S (B, b);
|
||||
FP_CMP_S (r, A, B, -2);
|
||||
if (r == -2)
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_S (r, A, B, -2, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -42,9 +42,7 @@ __getf2 (TFtype a, TFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_Q (A, a);
|
||||
FP_UNPACK_RAW_Q (B, b);
|
||||
FP_CMP_Q (r, A, B, -2);
|
||||
if (r == -2)
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_Q (r, A, B, -2, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -42,9 +42,7 @@ __ledf2 (DFtype a, DFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_D (A, a);
|
||||
FP_UNPACK_RAW_D (B, b);
|
||||
FP_CMP_D (r, A, B, 2);
|
||||
if (r == 2)
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_D (r, A, B, 2, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -42,9 +42,7 @@ __lesf2 (SFtype a, SFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_S (A, a);
|
||||
FP_UNPACK_RAW_S (B, b);
|
||||
FP_CMP_S (r, A, B, 2);
|
||||
if (r == 2)
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_S (r, A, B, 2, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -42,9 +42,7 @@ __letf2 (TFtype a, TFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_Q (A, a);
|
||||
FP_UNPACK_RAW_Q (B, b);
|
||||
FP_CMP_Q (r, A, B, 2);
|
||||
if (r == 2)
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_Q (r, A, B, 2, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -1186,10 +1186,28 @@
|
||||
while (0)
|
||||
|
||||
|
||||
/* Main differential comparison routine. The inputs should be raw not
|
||||
cooked. The return is -1,0,1 for normal values, 2 otherwise. */
|
||||
/* Helper for comparisons. EX is 0 not to raise exceptions, 1 to
|
||||
raise exceptions for signaling NaN operands, 2 to raise exceptions
|
||||
for all NaN operands. */
|
||||
|
||||
#define _FP_CMP(fs, wc, ret, X, Y, un) \
|
||||
#define _FP_CMP_CHECK_NAN(fs, wc, X, Y, ex) \
|
||||
do \
|
||||
{ \
|
||||
if (ex) \
|
||||
{ \
|
||||
if ((ex) == 2 \
|
||||
|| _FP_ISSIGNAN (fs, wc, X) \
|
||||
|| _FP_ISSIGNAN (fs, wc, Y)) \
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* Main differential comparison routine. The inputs should be raw not
|
||||
cooked. The return is -1, 0, 1 for normal values, UN
|
||||
otherwise. */
|
||||
|
||||
#define _FP_CMP(fs, wc, ret, X, Y, un, ex) \
|
||||
do \
|
||||
{ \
|
||||
/* NANs are unordered. */ \
|
||||
@ -1197,6 +1215,7 @@
|
||||
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y))) \
|
||||
{ \
|
||||
ret = un; \
|
||||
_FP_CMP_CHECK_NAN (fs, wc, X, Y, ex); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
@ -1233,7 +1252,7 @@
|
||||
|
||||
/* Simplification for strict equality. */
|
||||
|
||||
#define _FP_CMP_EQ(fs, wc, ret, X, Y) \
|
||||
#define _FP_CMP_EQ(fs, wc, ret, X, Y, ex) \
|
||||
do \
|
||||
{ \
|
||||
/* NANs are unordered. */ \
|
||||
@ -1241,6 +1260,7 @@
|
||||
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y))) \
|
||||
{ \
|
||||
ret = 1; \
|
||||
_FP_CMP_CHECK_NAN (fs, wc, X, Y, ex); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
@ -1253,11 +1273,13 @@
|
||||
|
||||
/* Version to test unordered. */
|
||||
|
||||
#define _FP_CMP_UNORD(fs, wc, ret, X, Y) \
|
||||
#define _FP_CMP_UNORD(fs, wc, ret, X, Y, ex) \
|
||||
do \
|
||||
{ \
|
||||
ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X)) \
|
||||
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y))); \
|
||||
if (ret) \
|
||||
_FP_CMP_CHECK_NAN (fs, wc, X, Y, ex); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
|
@ -182,9 +182,9 @@ union _FP_UNION_Q
|
||||
# define _FP_SQRT_MEAT_Q(R, S, T, X, Q) _FP_SQRT_MEAT_4 (R, S, T, X, Q)
|
||||
# define FP_FMA_Q(R, X, Y, Z) _FP_FMA (Q, 4, 8, R, X, Y, Z)
|
||||
|
||||
# define FP_CMP_Q(r, X, Y, un) _FP_CMP (Q, 4, r, X, Y, un)
|
||||
# define FP_CMP_EQ_Q(r, X, Y) _FP_CMP_EQ (Q, 4, r, X, Y)
|
||||
# define FP_CMP_UNORD_Q(r, X, Y) _FP_CMP_UNORD (Q, 4, r, X, Y)
|
||||
# define FP_CMP_Q(r, X, Y, un, ex) _FP_CMP (Q, 4, r, X, Y, un, ex)
|
||||
# define FP_CMP_EQ_Q(r, X, Y, ex) _FP_CMP_EQ (Q, 4, r, X, Y, ex)
|
||||
# define FP_CMP_UNORD_Q(r, X, Y, ex) _FP_CMP_UNORD (Q, 4, r, X, Y, ex)
|
||||
|
||||
# define FP_TO_INT_Q(r, X, rsz, rsg) _FP_TO_INT (Q, 4, r, X, rsz, rsg)
|
||||
# define FP_FROM_INT_Q(X, r, rs, rt) _FP_FROM_INT (Q, 4, X, r, rs, rt)
|
||||
@ -306,9 +306,9 @@ union _FP_UNION_Q
|
||||
# define _FP_SQRT_MEAT_Q(R, S, T, X, Q) _FP_SQRT_MEAT_2 (R, S, T, X, Q)
|
||||
# define FP_FMA_Q(R, X, Y, Z) _FP_FMA (Q, 2, 4, R, X, Y, Z)
|
||||
|
||||
# define FP_CMP_Q(r, X, Y, un) _FP_CMP (Q, 2, r, X, Y, un)
|
||||
# define FP_CMP_EQ_Q(r, X, Y) _FP_CMP_EQ (Q, 2, r, X, Y)
|
||||
# define FP_CMP_UNORD_Q(r, X, Y) _FP_CMP_UNORD (Q, 2, r, X, Y)
|
||||
# define FP_CMP_Q(r, X, Y, un, ex) _FP_CMP (Q, 2, r, X, Y, un, ex)
|
||||
# define FP_CMP_EQ_Q(r, X, Y, ex) _FP_CMP_EQ (Q, 2, r, X, Y, ex)
|
||||
# define FP_CMP_UNORD_Q(r, X, Y, ex) _FP_CMP_UNORD (Q, 2, r, X, Y, ex)
|
||||
|
||||
# define FP_TO_INT_Q(r, X, rsz, rsg) _FP_TO_INT (Q, 2, r, X, rsz, rsg)
|
||||
# define FP_FROM_INT_Q(X, r, rs, rt) _FP_FROM_INT (Q, 2, X, r, rs, rt)
|
||||
|
@ -175,9 +175,9 @@ union _FP_UNION_S
|
||||
# define FP_FMA_S(R, X, Y, Z) _FP_FMA (S, 1, 1, R, X, Y, Z)
|
||||
#endif
|
||||
|
||||
#define FP_CMP_S(r, X, Y, un) _FP_CMP (S, 1, r, X, Y, un)
|
||||
#define FP_CMP_EQ_S(r, X, Y) _FP_CMP_EQ (S, 1, r, X, Y)
|
||||
#define FP_CMP_UNORD_S(r, X, Y) _FP_CMP_UNORD (S, 1, r, X, Y)
|
||||
#define FP_CMP_S(r, X, Y, un, ex) _FP_CMP (S, 1, r, X, Y, un, ex)
|
||||
#define FP_CMP_EQ_S(r, X, Y, ex) _FP_CMP_EQ (S, 1, r, X, Y, ex)
|
||||
#define FP_CMP_UNORD_S(r, X, Y, ex) _FP_CMP_UNORD (S, 1, r, X, Y, ex)
|
||||
|
||||
#define FP_TO_INT_S(r, X, rsz, rsg) _FP_TO_INT (S, 1, r, X, rsz, rsg)
|
||||
#define FP_FROM_INT_S(X, r, rs, rt) _FP_FROM_INT (S, 1, X, r, rs, rt)
|
||||
|
@ -41,9 +41,7 @@ __unorddf2 (DFtype a, DFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_D (A, a);
|
||||
FP_UNPACK_RAW_D (B, b);
|
||||
FP_CMP_UNORD_D (r, A, B);
|
||||
if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_UNORD_D (r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -41,9 +41,7 @@ __unordsf2 (SFtype a, SFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_S (A, a);
|
||||
FP_UNPACK_RAW_S (B, b);
|
||||
FP_CMP_UNORD_S (r, A, B);
|
||||
if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_UNORD_S (r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -41,9 +41,7 @@ __unordtf2 (TFtype a, TFtype b)
|
||||
FP_INIT_EXCEPTIONS;
|
||||
FP_UNPACK_RAW_Q (A, a);
|
||||
FP_UNPACK_RAW_Q (B, b);
|
||||
FP_CMP_UNORD_Q (r, A, B);
|
||||
if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
|
||||
FP_SET_EXCEPTION (FP_EX_INVALID);
|
||||
FP_CMP_UNORD_Q (r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -29,14 +29,9 @@ internal_compare (long al, long ah, long bl, long bh)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_Q (r, A, B, 2);
|
||||
FP_CMP_Q (r, A, B, 2, 2);
|
||||
|
||||
/* Relative comparisons signal invalid operation if either operand is NaN. */
|
||||
if (r == 2)
|
||||
{
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
}
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
@ -30,10 +30,8 @@ int _Q_cmp(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
FP_CMP_Q(r, B, A, 3, 1);
|
||||
if (r == -1) r = 2;
|
||||
if (r == 3 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -31,10 +31,8 @@ int _Q_cmpe(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
if (r == -1) r = 2;
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -30,9 +30,7 @@ int _Q_feq(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_EQ_Q(r, A, B);
|
||||
if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_EQ_Q(r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return !r;
|
||||
|
@ -30,9 +30,7 @@ int _Q_fge(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return (r <= 0);
|
||||
|
@ -30,9 +30,7 @@ int _Q_fgt(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return (r == -1);
|
||||
|
@ -30,9 +30,7 @@ int _Q_fle(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_Q(r, B, A, -2);
|
||||
if (r == -2)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, -2, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return (r >= 0);
|
||||
|
@ -30,9 +30,7 @@ int _Q_flt(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return (r == 1);
|
||||
|
@ -30,9 +30,7 @@ int _Q_fne(const long double a, const long double b)
|
||||
|
||||
FP_UNPACK_RAW_Q(A, a);
|
||||
FP_UNPACK_RAW_Q(B, b);
|
||||
FP_CMP_EQ_Q(r, A, B);
|
||||
if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_EQ_Q(r, A, B, 1);
|
||||
FP_HANDLE_EXCEPTIONS;
|
||||
|
||||
return r;
|
||||
|
@ -31,10 +31,8 @@ int _Qp_cmp(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
FP_CMP_Q(r, B, A, 3, 1);
|
||||
if (r == -1) r = 2;
|
||||
if (r == 3 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
" ldd [%0], %%f52\n"
|
||||
|
@ -32,10 +32,8 @@ int _Qp_cmpe(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
if (r == -1) r = 2;
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
" ldd [%0], %%f52\n"
|
||||
|
@ -31,9 +31,7 @@ int _Qp_feq(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_EQ_Q(r, A, B);
|
||||
if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_EQ_Q(r, A, B, 1);
|
||||
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
|
@ -31,9 +31,7 @@ int _Qp_fge(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
|
@ -31,9 +31,7 @@ int _Qp_fgt(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
|
@ -31,9 +31,7 @@ int _Qp_fle(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_Q(r, B, A, -2);
|
||||
if (r == -2)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, -2, 2);
|
||||
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
|
@ -31,9 +31,7 @@ int _Qp_flt(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_Q(r, B, A, 3);
|
||||
if (r == 3)
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_Q(r, B, A, 3, 2);
|
||||
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
|
@ -31,9 +31,7 @@ int _Qp_fne(const long double *a, const long double *b)
|
||||
FP_INIT_ROUNDMODE;
|
||||
FP_UNPACK_RAW_QP(A, a);
|
||||
FP_UNPACK_RAW_QP(B, b);
|
||||
FP_CMP_EQ_Q(r, A, B);
|
||||
if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
|
||||
FP_SET_EXCEPTION(FP_EX_INVALID);
|
||||
FP_CMP_EQ_Q(r, A, B, 1);
|
||||
|
||||
QP_HANDLE_EXCEPTIONS(
|
||||
__asm (
|
||||
|
Loading…
Reference in New Issue
Block a user