xref: /plan9-contrib/sys/src/9/vt4/fpi.h (revision d6dfd9ef91cf0fa8514a249d5f2a550978c19369)
1 typedef long Word;
2 typedef unsigned long Single;
3 typedef struct {
4 	unsigned long h;
5 	unsigned long l;
6 } Double;
7 
8 enum {
9 	FractBits	= 28,
10 	CarryBit	= 0x10000000,
11 	HiddenBit	= 0x08000000,
12 	MsBit		= HiddenBit,
13 	NGuardBits	= 3,
14 	GuardMask	= 0x07,
15 	LsBit		= (1<<NGuardBits),
16 
17 	SingleExpBias	= 127,
18 	SingleExpMax	= 255,
19 	DoubleExpBias	= 1023,
20 	DoubleExpMax	= 2047,
21 
22 	ExpBias		= DoubleExpBias,
23 	ExpInfinity	= DoubleExpMax,
24 };
25 
26 typedef struct {
27 	unsigned char s;
28 	short e;
29 	long l;				/* 0000FFFFFFFFFFFFFFFFFFFFFFFFFGGG */
30 	long h;				/* 0000HFFFFFFFFFFFFFFFFFFFFFFFFFFF */
31 } Internal;
32 
33 #define IsWeird(n)	((n)->e >= ExpInfinity)
34 #define	IsInfinity(n)	(IsWeird(n) && (n)->h == HiddenBit && (n)->l == 0)
35 #define	SetInfinity(n)	((n)->e = ExpInfinity, (n)->h = HiddenBit, (n)->l = 0)
36 #define IsNaN(n)	(IsWeird(n) && (((n)->h & ~HiddenBit) || (n)->l))
37 #define	SetQNaN(n)	((n)->s = 0, (n)->e = ExpInfinity, 		\
38 			 (n)->h = HiddenBit|(LsBit<<1), (n)->l = 0)
39 #define IsZero(n)	((n)->e == 1 && (n)->h == 0 && (n)->l == 0)
40 #define SetZero(n)	((n)->e = 1, (n)->h = 0, (n)->l = 0)
41 
42 /*
43  * fpi.c
44  */
45 extern void fpiround(Internal *);
46 extern void fpiadd(Internal *, Internal *, Internal *);
47 extern void fpisub(Internal *, Internal *, Internal *);
48 extern void fpimul(Internal *, Internal *, Internal *);
49 extern void fpidiv(Internal *, Internal *, Internal *);
50 extern int fpicmp(Internal *, Internal *);
51 extern void fpinormalise(Internal*);
52 
53 /*
54  * fpimem.c
55  */
56 extern void fpis2i(Internal *, void *);
57 extern void fpid2i(Internal *, void *);
58 extern void fpiw2i(Internal *, void *);
59 extern void fpii2s(void *, Internal *);
60 extern void fpii2d(void *, Internal *);
61 extern void fpii2w(Word *, Internal *);
62