diff options
author | marius <marius@FreeBSD.org> | 2010-03-20 22:12:15 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2010-03-20 22:12:15 +0000 |
commit | 8ab5f9bf652c511a69fdb00dc41d41a4f8810892 (patch) | |
tree | f161a691e8166639329a7e7518d55968f1a9dc02 /lib/libc/sparc64 | |
parent | 3bd5fab1ded7d0dbc6b779cc6a858d48ffedd972 (diff) | |
download | FreeBSD-src-8ab5f9bf652c511a69fdb00dc41d41a4f8810892.zip FreeBSD-src-8ab5f9bf652c511a69fdb00dc41d41a4f8810892.tar.gz |
Division should take both arguments' signs into account when the
the dividend is infinity or zero and the divisor is not the same.
PR: 144900
Submitted by: Peter Jeremy
MFC after: 3 days
Diffstat (limited to 'lib/libc/sparc64')
-rw-r--r-- | lib/libc/sparc64/fpu/fpu_div.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/lib/libc/sparc64/fpu/fpu_div.c b/lib/libc/sparc64/fpu/fpu_div.c index c4b8ef6..4748daf 100644 --- a/lib/libc/sparc64/fpu/fpu_div.c +++ b/lib/libc/sparc64/fpu/fpu_div.c @@ -167,14 +167,16 @@ __fpu_div(fe) * return it. Otherwise we have the following cases: * * Inf / Inf = NaN, plus NV exception - * Inf / num = Inf [i.e., return x] - * Inf / 0 = Inf [i.e., return x] - * 0 / Inf = 0 [i.e., return x] - * 0 / num = 0 [i.e., return x] + * Inf / num = Inf [i.e., return x #] + * Inf / 0 = Inf [i.e., return x #] + * 0 / Inf = 0 [i.e., return x #] + * 0 / num = 0 [i.e., return x #] * 0 / 0 = NaN, plus NV exception - * num / Inf = 0 + * num / Inf = 0 # * num / num = num (do the divide) - * num / 0 = Inf, plus DZ exception + * num / 0 = Inf #, plus DZ exception + * + * # Sign of result is XOR of operand signs. */ if (ISNAN(x) || ISNAN(y)) { ORDER(x, y); @@ -183,10 +185,10 @@ __fpu_div(fe) if (ISINF(x) || ISZERO(x)) { if (x->fp_class == y->fp_class) return (__fpu_newnan(fe)); + x->fp_sign ^= y->fp_sign; return (x); } - /* all results at this point use XOR of operand signs */ x->fp_sign ^= y->fp_sign; if (ISINF(y)) { x->fp_class = FPC_ZERO; |