/* -----------------------------------------------------------------------------
*
+ * (c) Lennart Augustsson
* (c) The GHC Team, 1998-2000
*
* Miscellaneous support for floating-point primitives
ASSERT(sizeof(int ) == 4 );
r = (StgDouble)((unsigned int)j_high);
- r *= exp2f(32);
+ r *= 4294967296.0; /* exp2f(32); */
r += (StgDouble)((unsigned int)j_low);
/* Now raise to the exponent */
return r;
}
+/* Special version for words */
+StgDouble
+__word_encodeDouble (W_ j, I_ e)
+{
+ StgDouble r;
+
+ r = (StgDouble)j;
+
+ /* Now raise to the exponent */
+ if ( r != 0.0 ) /* Lennart suggests this avoids a bug in MIPS's ldexp */
+ r = ldexp(r, e);
+
+ return r;
+}
+
/* Special version for small Integers */
StgDouble
__int_encodeDouble (I_ j, I_ e)
return r;
}
+/* Special version for small positive Integers */
+StgFloat
+__word_encodeFloat (W_ j, I_ e)
+{
+ StgFloat r;
+
+ r = (StgFloat)j;
+
+ /* Now raise to the exponent */
+ if ( r != 0.0 ) /* Lennart suggests this avoids a bug in MIPS's ldexp */
+ r = ldexp(r, e);
+
+ return r;
+}
+
/* This only supports IEEE floating point */
void
}
void
-__decodeDouble_2Int (I_ *man_high, I_ *man_low, I_ *exp, StgDouble dbl)
+__decodeDouble_2Int (I_ *man_sign, W_ *man_high, W_ *man_low, I_ *exp, StgDouble dbl)
{
/* Do some bit fiddling on IEEE */
unsigned int low, high; /* assuming 32 bit ints */
*exp = (I_) iexp;
*man_low = low;
*man_high = high;
- if (sign < 0) {
- *man_high = - *man_high;
- }
+ *man_sign = (sign < 0) ? -1 : 1;
}
}