xref: /inferno-os/libkern/nan-spim.c (revision 4eb166cf184c1f102fb79e31b1465ea3e2021c39)
1*4eb166cfSCharles.Forsyth #include <lib9.h>
2*4eb166cfSCharles.Forsyth 
3*4eb166cfSCharles.Forsyth #define	NANEXP	(2047<<20)
4*4eb166cfSCharles.Forsyth #define	NANMASK	(2047<<20)
5*4eb166cfSCharles.Forsyth #define	NANSIGN	(1<<31)
6*4eb166cfSCharles.Forsyth 
7*4eb166cfSCharles.Forsyth double
NaN(void)8*4eb166cfSCharles.Forsyth NaN(void)
9*4eb166cfSCharles.Forsyth {
10*4eb166cfSCharles.Forsyth 	union
11*4eb166cfSCharles.Forsyth 	{
12*4eb166cfSCharles.Forsyth 		double	d;
13*4eb166cfSCharles.Forsyth 		long	x[2];
14*4eb166cfSCharles.Forsyth 	} a;
15*4eb166cfSCharles.Forsyth 
16*4eb166cfSCharles.Forsyth 	a.x[1] = NANEXP;
17*4eb166cfSCharles.Forsyth 	a.x[0] = 1;
18*4eb166cfSCharles.Forsyth 	return a.d;
19*4eb166cfSCharles.Forsyth }
20*4eb166cfSCharles.Forsyth 
21*4eb166cfSCharles.Forsyth int
isNaN(double d)22*4eb166cfSCharles.Forsyth isNaN(double d)
23*4eb166cfSCharles.Forsyth {
24*4eb166cfSCharles.Forsyth 	union
25*4eb166cfSCharles.Forsyth 	{
26*4eb166cfSCharles.Forsyth 		double	d;
27*4eb166cfSCharles.Forsyth 		long	x[2];
28*4eb166cfSCharles.Forsyth 	} a;
29*4eb166cfSCharles.Forsyth 
30*4eb166cfSCharles.Forsyth 	a.d = d;
31*4eb166cfSCharles.Forsyth 	if((a.x[1] & NANMASK) != NANEXP)
32*4eb166cfSCharles.Forsyth 		return 0;
33*4eb166cfSCharles.Forsyth 	return !isInf(d, 0);
34*4eb166cfSCharles.Forsyth }
35*4eb166cfSCharles.Forsyth 
36*4eb166cfSCharles.Forsyth double
Inf(int sign)37*4eb166cfSCharles.Forsyth Inf(int sign)
38*4eb166cfSCharles.Forsyth {
39*4eb166cfSCharles.Forsyth 	union
40*4eb166cfSCharles.Forsyth 	{
41*4eb166cfSCharles.Forsyth 		double	d;
42*4eb166cfSCharles.Forsyth 		long	x[2];
43*4eb166cfSCharles.Forsyth 	} a;
44*4eb166cfSCharles.Forsyth 
45*4eb166cfSCharles.Forsyth 	a.x[1] = NANEXP;
46*4eb166cfSCharles.Forsyth 	a.x[0] = 0;
47*4eb166cfSCharles.Forsyth 	if(sign < 0)
48*4eb166cfSCharles.Forsyth 		a.x[1] |= NANSIGN;
49*4eb166cfSCharles.Forsyth 	return a.d;
50*4eb166cfSCharles.Forsyth }
51*4eb166cfSCharles.Forsyth 
52*4eb166cfSCharles.Forsyth int
isInf(double d,int sign)53*4eb166cfSCharles.Forsyth isInf(double d, int sign)
54*4eb166cfSCharles.Forsyth {
55*4eb166cfSCharles.Forsyth 	union
56*4eb166cfSCharles.Forsyth 	{
57*4eb166cfSCharles.Forsyth 		double	d;
58*4eb166cfSCharles.Forsyth 		long	x[2];
59*4eb166cfSCharles.Forsyth 	} a;
60*4eb166cfSCharles.Forsyth 
61*4eb166cfSCharles.Forsyth 	a.d = d;
62*4eb166cfSCharles.Forsyth 	if(a.x[0] != 0)
63*4eb166cfSCharles.Forsyth 		return 0;
64*4eb166cfSCharles.Forsyth 	if(a.x[1] == NANEXP)
65*4eb166cfSCharles.Forsyth 		return sign >= 0;
66*4eb166cfSCharles.Forsyth 	if(a.x[1] == (NANEXP|NANSIGN))
67*4eb166cfSCharles.Forsyth 		return sign <= 0;
68*4eb166cfSCharles.Forsyth 	return 0;
69*4eb166cfSCharles.Forsyth }
70