xref: /plan9-contrib/sys/src/cmd/unix/drawterm/libc/nan64.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier /*
2*8ccd4a63SDavid du Colombier  * 64-bit IEEE not-a-number routines.
3*8ccd4a63SDavid du Colombier  * This is big/little-endian portable assuming that
4*8ccd4a63SDavid du Colombier  * the 64-bit doubles and 64-bit integers have the
5*8ccd4a63SDavid du Colombier  * same byte ordering.
6*8ccd4a63SDavid du Colombier  */
7*8ccd4a63SDavid du Colombier 
8*8ccd4a63SDavid du Colombier #include <u.h>
9*8ccd4a63SDavid du Colombier #include <libc.h>
10*8ccd4a63SDavid du Colombier #include "nan.h"
11*8ccd4a63SDavid du Colombier 
12*8ccd4a63SDavid du Colombier // typedef unsigned long long uvlong;
13*8ccd4a63SDavid du Colombier // typedef unsigned long ulong;
14*8ccd4a63SDavid du Colombier 
15*8ccd4a63SDavid du Colombier static uvlong uvnan    = 0x7FF0000000000001ULL;
16*8ccd4a63SDavid du Colombier static uvlong uvinf    = 0x7FF0000000000000ULL;
17*8ccd4a63SDavid du Colombier static uvlong uvneginf = 0xFFF0000000000000ULL;
18*8ccd4a63SDavid du Colombier 
19*8ccd4a63SDavid du Colombier double
20*8ccd4a63SDavid du Colombier __NaN(void)
21*8ccd4a63SDavid du Colombier {
22*8ccd4a63SDavid du Colombier 	return *(double*)(void*)&uvnan;
23*8ccd4a63SDavid du Colombier }
24*8ccd4a63SDavid du Colombier 
25*8ccd4a63SDavid du Colombier int
26*8ccd4a63SDavid du Colombier __isNaN(double d)
27*8ccd4a63SDavid du Colombier {
28*8ccd4a63SDavid du Colombier 	uvlong x = *(uvlong*)(void*)&d;
29*8ccd4a63SDavid du Colombier 	return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0);
30*8ccd4a63SDavid du Colombier }
31*8ccd4a63SDavid du Colombier 
32*8ccd4a63SDavid du Colombier double
33*8ccd4a63SDavid du Colombier __Inf(int sign)
34*8ccd4a63SDavid du Colombier {
35*8ccd4a63SDavid du Colombier 	if(sign < 0)
36*8ccd4a63SDavid du Colombier 		return *(double*)(void*)&uvinf;
37*8ccd4a63SDavid du Colombier 	else
38*8ccd4a63SDavid du Colombier 		return *(double*)(void*)&uvneginf;
39*8ccd4a63SDavid du Colombier }
40*8ccd4a63SDavid du Colombier 
41*8ccd4a63SDavid du Colombier int
42*8ccd4a63SDavid du Colombier __isInf(double d, int sign)
43*8ccd4a63SDavid du Colombier {
44*8ccd4a63SDavid du Colombier 	uvlong x;
45*8ccd4a63SDavid du Colombier 
46*8ccd4a63SDavid du Colombier 	x = *(uvlong*)(void*)&d;
47*8ccd4a63SDavid du Colombier 	if(sign == 0)
48*8ccd4a63SDavid du Colombier 		return x==uvinf || x==uvneginf;
49*8ccd4a63SDavid du Colombier 	else if(sign > 0)
50*8ccd4a63SDavid du Colombier 		return x==uvinf;
51*8ccd4a63SDavid du Colombier 	else
52*8ccd4a63SDavid du Colombier 		return x==uvneginf;
53*8ccd4a63SDavid du Colombier }
54*8ccd4a63SDavid du Colombier 
55*8ccd4a63SDavid du Colombier 
56