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