diff options
Diffstat (limited to 'soft-fp')
-rw-r--r-- | soft-fp/double.h | 12 | ||||
-rw-r--r-- | soft-fp/eqdf2.c | 4 | ||||
-rw-r--r-- | soft-fp/eqsf2.c | 4 | ||||
-rw-r--r-- | soft-fp/eqtf2.c | 4 | ||||
-rw-r--r-- | soft-fp/extended.h | 12 | ||||
-rw-r--r-- | soft-fp/gedf2.c | 4 | ||||
-rw-r--r-- | soft-fp/gesf2.c | 4 | ||||
-rw-r--r-- | soft-fp/getf2.c | 4 | ||||
-rw-r--r-- | soft-fp/ledf2.c | 4 | ||||
-rw-r--r-- | soft-fp/lesf2.c | 4 | ||||
-rw-r--r-- | soft-fp/letf2.c | 4 | ||||
-rw-r--r-- | soft-fp/op-common.h | 30 | ||||
-rw-r--r-- | soft-fp/quad.h | 12 | ||||
-rw-r--r-- | soft-fp/single.h | 6 | ||||
-rw-r--r-- | soft-fp/unorddf2.c | 4 | ||||
-rw-r--r-- | soft-fp/unordsf2.c | 4 | ||||
-rw-r--r-- | soft-fp/unordtf2.c | 4 |
17 files changed, 59 insertions, 61 deletions
diff --git a/soft-fp/double.h b/soft-fp/double.h index 7782994..1e6283e 100644 --- a/soft-fp/double.h +++ b/soft-fp/double.h @@ -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) diff --git a/soft-fp/eqdf2.c b/soft-fp/eqdf2.c index 006b1ef..e8ce12d 100644 --- a/soft-fp/eqdf2.c +++ b/soft-fp/eqdf2.c @@ -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; diff --git a/soft-fp/eqsf2.c b/soft-fp/eqsf2.c index 437ef99..2ee837d 100644 --- a/soft-fp/eqsf2.c +++ b/soft-fp/eqsf2.c @@ -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; diff --git a/soft-fp/eqtf2.c b/soft-fp/eqtf2.c index ffc558c..17b9d40 100644 --- a/soft-fp/eqtf2.c +++ b/soft-fp/eqtf2.c @@ -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; diff --git a/soft-fp/extended.h b/soft-fp/extended.h index 989b056..0dd6a87 100644 --- a/soft-fp/extended.h +++ b/soft-fp/extended.h @@ -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) diff --git a/soft-fp/gedf2.c b/soft-fp/gedf2.c index 4ff9756..a8cc949 100644 --- a/soft-fp/gedf2.c +++ b/soft-fp/gedf2.c @@ -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; diff --git a/soft-fp/gesf2.c b/soft-fp/gesf2.c index f3c5d2d..aa84b26 100644 --- a/soft-fp/gesf2.c +++ b/soft-fp/gesf2.c @@ -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; diff --git a/soft-fp/getf2.c b/soft-fp/getf2.c index fb82b79..c852228 100644 --- a/soft-fp/getf2.c +++ b/soft-fp/getf2.c @@ -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; diff --git a/soft-fp/ledf2.c b/soft-fp/ledf2.c index 8b15d32..fb5bbb2 100644 --- a/soft-fp/ledf2.c +++ b/soft-fp/ledf2.c @@ -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; diff --git a/soft-fp/lesf2.c b/soft-fp/lesf2.c index e86ac3f..1b67204 100644 --- a/soft-fp/lesf2.c +++ b/soft-fp/lesf2.c @@ -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; diff --git a/soft-fp/letf2.c b/soft-fp/letf2.c index 94b7d78..1293519 100644 --- a/soft-fp/letf2.c +++ b/soft-fp/letf2.c @@ -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; diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h index e3212ec..e62558e 100644 --- a/soft-fp/op-common.h +++ b/soft-fp/op-common.h @@ -1186,10 +1186,28 @@ while (0) +/* 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_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, 2 otherwise. */ + cooked. The return is -1, 0, 1 for normal values, UN + otherwise. */ -#define _FP_CMP(fs, wc, ret, X, Y, un) \ +#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) diff --git a/soft-fp/quad.h b/soft-fp/quad.h index 16e362f..c2e4133 100644 --- a/soft-fp/quad.h +++ b/soft-fp/quad.h @@ -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) diff --git a/soft-fp/single.h b/soft-fp/single.h index 19fd647..efa8294 100644 --- a/soft-fp/single.h +++ b/soft-fp/single.h @@ -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) diff --git a/soft-fp/unorddf2.c b/soft-fp/unorddf2.c index ceacb9e..e09a1ec 100644 --- a/soft-fp/unorddf2.c +++ b/soft-fp/unorddf2.c @@ -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; diff --git a/soft-fp/unordsf2.c b/soft-fp/unordsf2.c index 057f2c4..4d6be98 100644 --- a/soft-fp/unordsf2.c +++ b/soft-fp/unordsf2.c @@ -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; diff --git a/soft-fp/unordtf2.c b/soft-fp/unordtf2.c index 433a84f..79d3421 100644 --- a/soft-fp/unordtf2.c +++ b/soft-fp/unordtf2.c @@ -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; |