I discovered that the fix (from last year) does not work for cvt.w.d of e.g. 0xc1e0000000000001. Here is a patch: Index: dp_tint.c =================================================================== RCS file: /cvs/linux/arch/mips/math-emu/dp_tint.c,v retrieving revision 1.5 diff -u -r1.5 dp_tint.c --- dp_tint.c 2001/12/02 14:21:29 1.5 +++ dp_tint.c 2002/05/17 13:58:03 @@ -49,10 +49,7 @@ case IEEE754_CLASS_NORM: break; } - if (xe >= 31) { - /* look for valid corner case */ - if (xe == 31 && xs && xm == DP_HIDDEN_BIT) - return -2147483648; + if (xe > 31) { /* Set invalid. We will only use overflow for floating point overflow */ SETCX(IEEE754_INVALID_OPERATION); @@ -98,7 +95,8 @@ xm++; break; } - if ((xm >> 31) != 0) { + /* look for valid corner case 0x80000000 */ + if ((xm >> 31) != 0 && (xs == 0 || xm != 0x80000000)) { /* This can happen after rounding */ SETCX(IEEE754_INVALID_OPERATION); return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x); /Kjeld On Sat, 1 Dec 2001, Kjeld Borch Egevang wrote: > Great. The same problem exists for sp_tlong.c and dp_tlong.c. > > /Kjeld > > On Thu, 29 Nov 2001, Mark Salter wrote: > > > > > The following patch fixes the emulation of cvt.w.s and cvt.w.d for > > values of -2147483648. > > > > --Mark > > > > > > Index: sp_tint.c > > =================================================================== > > RCS file: /cvs/linux/arch/mips/math-emu/sp_tint.c,v > > retrieving revision 1.4 > > diff -u -p -5 -c -r1.4 sp_tint.c > > cvs server: conflicting specifications of output style > > *** sp_tint.c 2001/10/09 23:56:19 1.4 > > --- sp_tint.c 2001/11/29 19:14:58 > > *************** int ieee754sp_tint(ieee754sp x) > > *** 48,57 **** > > --- 48,60 ---- > > case IEEE754_CLASS_DNORM: > > case IEEE754_CLASS_NORM: > > break; > > } > > if (xe >= 31) { > > + /* look for valid corner case */ > > + if (xe == 31 && xs && xm == SP_HIDDEN_BIT) > > + return -2147483648; > > /* Set invalid. We will only use overflow for floating > > point overflow */ > > SETCX(IEEE754_INVALID_OPERATION); > > return ieee754si_xcpt(ieee754si_indef(), "sp_tint", x); > > } > > Index: dp_tint.c > > =================================================================== > > RCS file: /cvs/linux/arch/mips/math-emu/dp_tint.c,v > > retrieving revision 1.4 > > diff -u -p -5 -c -r1.4 dp_tint.c > > cvs server: conflicting specifications of output style > > *** dp_tint.c 2001/10/09 23:56:18 1.4 > > --- dp_tint.c 2001/11/29 19:18:02 > > *************** int ieee754dp_tint(ieee754dp x) > > *** 48,57 **** > > --- 48,60 ---- > > case IEEE754_CLASS_DNORM: > > case IEEE754_CLASS_NORM: > > break; > > } > > if (xe >= 31) { > > + /* look for valid corner case */ > > + if (xe == 31 && xs && xm == DP_HIDDEN_BIT) > > + return -2147483648; > > /* Set invalid. We will only use overflow for floating > > point overflow */ > > SETCX(IEEE754_INVALID_OPERATION); > > return ieee754si_xcpt(ieee754si_indef(), "dp_tint", x); > > } > > > > -- _ _ ____ ___ Mailto:kjelde@mips.com |\ /|||___)(___ MIPS Denmark Direct: +45 44 86 55 85 | \/ ||| ____) Lautrupvang 4 B Switch: +45 44 86 55 55 TECHNOLOGIES DK-2750 Ballerup Fax...: +45 44 86 55 56 Denmark http://www.mips.com/