Blame


1 91c13e54 2004-02-29 devnull /*
2 91c13e54 2004-02-29 devnull * 64-bit IEEE not-a-number routines.
3 91c13e54 2004-02-29 devnull * This is big/little-endian portable assuming that
4 91c13e54 2004-02-29 devnull * the 64-bit doubles and 64-bit integers have the
5 91c13e54 2004-02-29 devnull * same byte ordering.
6 91c13e54 2004-02-29 devnull */
7 91c13e54 2004-02-29 devnull
8 e5aa96ac 2004-12-26 devnull #include "plan9.h"
9 e5aa96ac 2004-12-26 devnull #include "fmt.h"
10 e5aa96ac 2004-12-26 devnull #include "fmtdef.h"
11 91c13e54 2004-02-29 devnull
12 984e3531 2004-08-22 devnull #if defined (__APPLE__) || (__powerpc__)
13 91c13e54 2004-02-29 devnull #define _NEEDLL
14 91c13e54 2004-02-29 devnull #endif
15 91c13e54 2004-02-29 devnull
16 040d1d02 2004-09-23 devnull static uvlong uvnan = ((uvlong)0x7FF00000<<32)|0x00000001;
17 040d1d02 2004-09-23 devnull static uvlong uvinf = ((uvlong)0x7FF00000<<32)|0x00000000;
18 040d1d02 2004-09-23 devnull static uvlong uvneginf = ((uvlong)0xFFF00000<<32)|0x00000000;
19 91c13e54 2004-02-29 devnull
20 91c13e54 2004-02-29 devnull double
21 91c13e54 2004-02-29 devnull __NaN(void)
22 91c13e54 2004-02-29 devnull {
23 91c13e54 2004-02-29 devnull uvlong *p;
24 91c13e54 2004-02-29 devnull
25 91c13e54 2004-02-29 devnull /* gcc complains about "return *(double*)&uvnan;" */
26 91c13e54 2004-02-29 devnull p = &uvnan;
27 91c13e54 2004-02-29 devnull return *(double*)p;
28 91c13e54 2004-02-29 devnull }
29 91c13e54 2004-02-29 devnull
30 91c13e54 2004-02-29 devnull int
31 91c13e54 2004-02-29 devnull __isNaN(double d)
32 91c13e54 2004-02-29 devnull {
33 91c13e54 2004-02-29 devnull uvlong x;
34 91c13e54 2004-02-29 devnull double *p;
35 91c13e54 2004-02-29 devnull
36 91c13e54 2004-02-29 devnull p = &d;
37 91c13e54 2004-02-29 devnull x = *(uvlong*)p;
38 91c13e54 2004-02-29 devnull return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0);
39 91c13e54 2004-02-29 devnull }
40 91c13e54 2004-02-29 devnull
41 91c13e54 2004-02-29 devnull double
42 91c13e54 2004-02-29 devnull __Inf(int sign)
43 91c13e54 2004-02-29 devnull {
44 91c13e54 2004-02-29 devnull uvlong *p;
45 91c13e54 2004-02-29 devnull
46 91c13e54 2004-02-29 devnull if(sign < 0)
47 91c13e54 2004-02-29 devnull p = &uvinf;
48 91c13e54 2004-02-29 devnull else
49 91c13e54 2004-02-29 devnull p = &uvneginf;
50 91c13e54 2004-02-29 devnull return *(double*)p;
51 91c13e54 2004-02-29 devnull }
52 91c13e54 2004-02-29 devnull
53 91c13e54 2004-02-29 devnull int
54 91c13e54 2004-02-29 devnull __isInf(double d, int sign)
55 91c13e54 2004-02-29 devnull {
56 91c13e54 2004-02-29 devnull uvlong x;
57 91c13e54 2004-02-29 devnull double *p;
58 91c13e54 2004-02-29 devnull
59 91c13e54 2004-02-29 devnull p = &d;
60 91c13e54 2004-02-29 devnull x = *(uvlong*)p;
61 91c13e54 2004-02-29 devnull if(sign == 0)
62 91c13e54 2004-02-29 devnull return x==uvinf || x==uvneginf;
63 91c13e54 2004-02-29 devnull else if(sign > 0)
64 91c13e54 2004-02-29 devnull return x==uvinf;
65 91c13e54 2004-02-29 devnull else
66 91c13e54 2004-02-29 devnull return x==uvneginf;
67 91c13e54 2004-02-29 devnull }