2 * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
4 * $Id: floatExtreme.c,v 1.1 1998/04/10 10:54:28 simonm Exp $
6 * Stubs to check for extremities of (IEEE) floats,
7 * the tests have been (artfully) lifted from the hbc-0.9999.3 (lib/fltcode.c)
13 - avoid hard-wiring the fact that on an
14 Alpha we repr. a StgFloat as a double.
15 (introduce int equivalent of {ASSIGN,PK}_FLT? )
19 #include "ieee-flpt.h"
20 #include "floatExtreme.h"
30 #ifdef IEEE_FLOATING_POINT
33 isDoubleNaN(StgDouble d)
35 union { double d; int i[2]; } u;
43 hx |= (unsigned int)(lx|(-lx))>>31;
45 r = (int)((unsigned int)(hx))>>31;
50 isDoubleInfinite(StgDouble d)
52 union { double d; int i[2]; } u;
65 isDoubleDenormalized(StgDouble d)
67 union { double d; int i[2]; } u;
72 iexp = high & (0x7ff << 20);
77 isDoubleNegativeZero(StgDouble d)
79 union { double d; int i[2]; } u;
83 return (u.i[H] == 0x80000000 && u.i[L] == 0);
86 /* Same tests, this time for StgFloats. */
89 isFloatNaN(StgFloat f)
91 #if !defined(alpha_TARGET_OS)
92 /* StgFloat = double on alphas */
93 return (isDoubleNaN(f));
95 union { StgFloat f; int i; } u;
100 u.i = 0x7f800000 - u.i;
101 r = (int)(((unsigned int)(u.i))>>31);
107 isFloatInfinite(StgFloat f)
109 #if !defined(alpha_TARGET_OS)
110 /* StgFloat = double on alphas */
111 return (isDoubleInfinite(f));
114 union { StgFloat f; int i; } u;
124 isFloatDenormalized(StgFloat f)
126 #if !defined(alpha_TARGET_OS)
127 /* StgFloat = double on alphas */
128 return (isDoubleDenormalized(f));
131 union { StgFloat f; int i; } u;
134 iexp = u.i & (0xff << 23);
140 isFloatNegativeZero(StgFloat f)
142 #if !defined(alpha_TARGET_OS)
143 /* StgFloat = double on alphas */
144 return (isDoubleNegativeZero(f));
146 union { StgFloat f; int i; } u;
149 return (u.i == (int)0x80000000);
156 StgInt isDoubleNaN(d) StgDouble d; { return 0; }
157 StgInt isDoubleInfinite(d) StgDouble d; { return 0; }
158 StgInt isDoubleDenormalized(d) StgDouble d; { return 0; }
159 StgInt isDoubleNegativeZero(d) StgDouble d; { return 0; }
160 StgInt isFloatNaN(f) StgFloat f; { return 0; }
161 StgInt isFloatInfinite(f) StgFloat f; { return 0; }
162 StgInt isFloatDenormalized(f) StgFloat f; { return 0; }
163 StgInt isFloatNegativeZero(f) StgFloat f; { return 0; }