fpgnulib.c (__extendsfdf2): Handle negative zero.

2005-12-29  Paul Brook  <paul@codesourcery.com>

	* config/m68k/fpgnulib.c (__extendsfdf2): Handle negative zero.
	(__truncdfsf2): Ditto.
	(__extenddfxf2): Ditto.
	(__truncxfdf2): Ditto.
	* config/m68k/lb1sf68.asm (__addsf3): Return -0.0 for -0.0 + -0.0.
	(__adddf3): Ditto.

From-SVN: r109143
This commit is contained in:
Paul Brook 2005-12-29 15:14:12 +00:00 committed by Paul Brook
parent 338276300e
commit 75a75b8850
3 changed files with 44 additions and 18 deletions

View File

@ -1,3 +1,12 @@
2005-12-29 Paul Brook <paul@codesourcery.com>
* config/m68k/fpgnulib.c (__extendsfdf2): Handle negative zero.
(__truncdfsf2): Ditto.
(__extenddfxf2): Ditto.
(__truncxfdf2): Ditto.
* config/m68k/lb1sf68.asm (__addsf3): Return -0.0 for -0.0 + -0.0.
(__adddf3): Ditto.
2005-12-29 Daniel Jacobowitz <dan@codesourcery.com>
Paul Brook <paul@codesourcery.com>

View File

@ -241,13 +241,13 @@ __extendsfdf2 (float a1)
fl1.f = a1;
if (!fl1.l)
dl.l.upper = SIGN (fl1.l);
if ((fl1.l & ~SIGNBIT) == 0)
{
dl.l.upper = dl.l.lower = 0;
dl.l.lower = 0;
return dl.d;
}
dl.l.upper = SIGN (fl1.l);
exp = EXP(fl1.l);
mant = MANT (fl1.l) & ~HIDDEN;
if (exp == 0)
@ -280,8 +280,11 @@ __truncdfsf2 (double a1)
dl1.d = a1;
if (!dl1.l.upper && !dl1.l.lower)
return 0;
if ((dl1.l.upper & ~SIGNBIT) == 0 && !dl1.l.lower)
{
fl.l = SIGND(dl1);
return fl.f;
}
exp = EXPD (dl1) - EXCESSD + EXCESS;
@ -398,10 +401,14 @@ __extenddfxf2 (double d)
dl.d = d;
/*printf ("dfxf in: %g\n", d);*/
if (!dl.l.upper && !dl.l.lower)
return 0;
ldl.l.upper = SIGND (dl);
if ((dl.l.upper & ~SIGNBIT) == 0 && !dl.l.lower)
{
ldl.l.middle = 0;
ldl.l.lower = 0;
return ldl.ld;
}
exp = EXPD (dl) - EXCESSD + EXCESSX;
ldl.l.upper |= exp << 16;
ldl.l.middle = HIDDENX;
@ -427,14 +434,17 @@ __truncxfdf2 (long double ld)
ldl.ld = ld;
/*printf ("xfdf in: %s\n", dumpxf (ld));*/
if (!ldl.l.upper && !ldl.l.middle && !ldl.l.lower)
return 0;
dl.l.upper = SIGNX (ldl);
if ((ldl.l.upper & ~SIGNBIT) == 0 && !ldl.l.middle && !ldl.l.lower)
{
dl.l.lower = 0;
return dl.d;
}
exp = EXPX (ldl) - EXCESSX + EXCESSD;
/* ??? quick and dirty: keep `exp' sane */
if (exp >= EXPDMASK)
exp = EXPDMASK - 1;
dl.l.upper = SIGNX (ldl);
dl.l.upper |= exp << (32 - (EXPDBITS + 1));
/* +1-1: add one for sign bit, but take one off for explicit-integer-bit */
dl.l.upper |= (ldl.l.middle & MANTXMASK) >> (EXPDBITS + 1 - 1);

View File

@ -1285,7 +1285,12 @@ Ladddf$b:
| Return b (if a is zero)
movel d2,d0
movel d3,d1
bra 1f
bne 1f | Check if b is -0
cmpl IMM (0x80000000),d0
bne 1f
andl IMM (0x80000000),d7 | Use the sign of a
clrl d0
bra Ladddf$ret
Ladddf$a:
movel a6@(8),d0
movel a6@(12),d1
@ -2570,16 +2575,13 @@ SYM (__addsf3):
#endif
movel a6@(8),d0 | get first operand
movel a6@(12),d1 | get second operand
movel d0,d6 | get d0's sign bit '
movel d0,a0 | get d0's sign bit '
addl d0,d0 | check and clear sign bit of a
beq Laddsf$b | if zero return second operand
movel d1,d7 | save b's sign bit '
movel d1,a1 | save b's sign bit '
addl d1,d1 | get rid of sign bit
beq Laddsf$a | if zero return first operand
movel d6,a0 | save signs in address registers
movel d7,a1 | so we can use d6 and d7
| Get the exponents and check for denormalized and/or infinity.
movel IMM (0x00ffffff),d4 | mask to get fraction
@ -2950,7 +2952,12 @@ Laddsf$b$den:
Laddsf$b:
| Return b (if a is zero).
movel a6@(12),d0
bra 1f
cmpl IMM (0x80000000),d0 | Check if b is -0
bne 1f
movel a0,d7
andl IMM (0x80000000),d7 | Use the sign of a
clrl d0
bra Laddsf$ret
Laddsf$a:
| Return a (if b is zero).
movel a6@(8),d0