diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2006-02-07 15:16:27 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2006-02-07 15:16:27 -0500 |
commit | 5d1769ac3d0ea5ff3a286b097c21faaf6a9e6859 (patch) | |
tree | 63429c2222a55509dc81269233bbe7a321bb86ed /arch/mips/math-emu/sp_simple.c | |
parent | 23a56e2cbec2860ef02d6720508fbcb07accc8b4 (diff) | |
parent | ce4b50f2fc62267eeaf331c41bc11b92d9bc7865 (diff) |
Merge branch 'master'
Diffstat (limited to 'arch/mips/math-emu/sp_simple.c')
-rw-r--r-- | arch/mips/math-emu/sp_simple.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/mips/math-emu/sp_simple.c b/arch/mips/math-emu/sp_simple.c index c809830dffb..770f0f4677c 100644 --- a/arch/mips/math-emu/sp_simple.c +++ b/arch/mips/math-emu/sp_simple.c @@ -48,16 +48,22 @@ ieee754sp ieee754sp_neg(ieee754sp x) CLEARCX; FLUSHXSP; + /* + * Invert the sign ALWAYS to prevent an endless recursion on + * pow() in libc. + */ + /* quick fix up */ + SPSIGN(x) ^= 1; + if (xc == IEEE754_CLASS_SNAN) { + ieee754sp y = ieee754sp_indef(); SETCX(IEEE754_INVALID_OPERATION); - return ieee754sp_nanxcpt(ieee754sp_indef(), "neg"); + SPSIGN(y) = SPSIGN(x); + return ieee754sp_nanxcpt(y, "neg"); } if (ieee754sp_isnan(x)) /* but not infinity */ return ieee754sp_nanxcpt(x, "neg", x); - - /* quick fix up */ - SPSIGN(x) ^= 1; return x; } |