*/
/*
-** $Id: fsdiv.c 3513 2004-10-01 14:49:51Z vrokas $
+** $Id$
*/
/* (c)2000/2001: hacked a little by johan.knol@iduna.nl for sdcc */
/* divide two floats */
float __fsdiv (float a1, float a2) _FS_REENTRANT
{
- FS_STATIC volatile union float_long fl1, fl2;
+ volatile union float_long fl1, fl2;
long result;
unsigned long mask;
long mant1, mant2;
- int exp ;
+ int exp;
char sign;
fl1.f = a1;
/* divide by zero??? */
if (!fl2.l)
- /* return NaN or -NaN */
- return (-1.0);
+ {/* return NaN or -NaN */
+ fl2.l = 0x7FC00000;
+ return (fl2.f);
+ }
/* numerator zero??? */
if (!fl1.l)
result &= ~HIDDEN;
/* pack up and go home */
- fl1.l = PACK (sign ? 1ul<<31 : 0, (unsigned long) exp, result);
+ if (exp >= 0x100)
+ fl1.l = (sign ? SIGNBIT : 0) | 0x7F800000;
+ else if (exp < 0)
+ fl1.l = 0;
+ else
+ fl1.l = PACK (sign ? SIGNBIT : 0 , exp, result);
return (fl1.f);
}