xref: /plan9/sys/src/9/port/fpi.h (revision 6f1905eb1326e6145a15c8ecfc60c3b9791adc25)
1*6f1905ebSDavid du Colombier #ifndef nil
2*6f1905ebSDavid du Colombier #include <u.h>
3*6f1905ebSDavid du Colombier #endif
4*6f1905ebSDavid du Colombier 
5d11907f1SDavid du Colombier typedef long Word;
64e3613abSDavid du Colombier typedef long long Vlong;
7d11907f1SDavid du Colombier typedef unsigned long Single;
8*6f1905ebSDavid du Colombier 
9*6f1905ebSDavid du Colombier /* use u.h's FPdbleword */
10*6f1905ebSDavid du Colombier #define Double	FPdbleword
11*6f1905ebSDavid du Colombier #define h hi
12*6f1905ebSDavid du Colombier #define l lo
13d11907f1SDavid du Colombier 
14d11907f1SDavid du Colombier enum {
15d11907f1SDavid du Colombier 	FractBits	= 28,
16d11907f1SDavid du Colombier 	CarryBit	= 0x10000000,
17d11907f1SDavid du Colombier 	HiddenBit	= 0x08000000,
18d11907f1SDavid du Colombier 	MsBit		= HiddenBit,
19d11907f1SDavid du Colombier 	NGuardBits	= 3,
20d11907f1SDavid du Colombier 	GuardMask	= 0x07,
21d11907f1SDavid du Colombier 	LsBit		= (1<<NGuardBits),
22d11907f1SDavid du Colombier 
23d11907f1SDavid du Colombier 	SingleExpBias	= 127,
24d11907f1SDavid du Colombier 	SingleExpMax	= 255,
25d11907f1SDavid du Colombier 	DoubleExpBias	= 1023,
26d11907f1SDavid du Colombier 	DoubleExpMax	= 2047,
27d11907f1SDavid du Colombier 
28d11907f1SDavid du Colombier 	ExpBias		= DoubleExpBias,
29d11907f1SDavid du Colombier 	ExpInfinity	= DoubleExpMax,
30d11907f1SDavid du Colombier };
31d11907f1SDavid du Colombier 
32d11907f1SDavid du Colombier typedef struct {
334e3613abSDavid du Colombier 	/* order matters: must start with s, e, l, h in that order */
34d11907f1SDavid du Colombier 	unsigned char s;
35d11907f1SDavid du Colombier 	short e;
364e3613abSDavid du Colombier 	/* double bits */
37d11907f1SDavid du Colombier 	long l;				/* 0000FFFFFFFFFFFFFFFFFFFFFFFFFGGG */
38d11907f1SDavid du Colombier 	long h;				/* 0000HFFFFFFFFFFFFFFFFFFFFFFFFFFF */
39d11907f1SDavid du Colombier } Internal;
40d11907f1SDavid du Colombier 
41d11907f1SDavid du Colombier #define IsWeird(n)	((n)->e >= ExpInfinity)
42d11907f1SDavid du Colombier #define	IsInfinity(n)	(IsWeird(n) && (n)->h == HiddenBit && (n)->l == 0)
43d11907f1SDavid du Colombier #define	SetInfinity(n)	((n)->e = ExpInfinity, (n)->h = HiddenBit, (n)->l = 0)
44d11907f1SDavid du Colombier #define IsNaN(n)	(IsWeird(n) && (((n)->h & ~HiddenBit) || (n)->l))
45d11907f1SDavid du Colombier #define	SetQNaN(n)	((n)->s = 0, (n)->e = ExpInfinity, 		\
46d11907f1SDavid du Colombier 			 (n)->h = HiddenBit|(LsBit<<1), (n)->l = 0)
47d11907f1SDavid du Colombier #define IsZero(n)	((n)->e == 1 && (n)->h == 0 && (n)->l == 0)
48d11907f1SDavid du Colombier #define SetZero(n)	((n)->e = 1, (n)->h = 0, (n)->l = 0)
49d11907f1SDavid du Colombier 
50d11907f1SDavid du Colombier /*
51d11907f1SDavid du Colombier  * fpi.c
52d11907f1SDavid du Colombier  */
53d11907f1SDavid du Colombier extern void fpiround(Internal *);
54d11907f1SDavid du Colombier extern void fpiadd(Internal *, Internal *, Internal *);
55d11907f1SDavid du Colombier extern void fpisub(Internal *, Internal *, Internal *);
56d11907f1SDavid du Colombier extern void fpimul(Internal *, Internal *, Internal *);
57d11907f1SDavid du Colombier extern void fpidiv(Internal *, Internal *, Internal *);
58d11907f1SDavid du Colombier extern int fpicmp(Internal *, Internal *);
59d11907f1SDavid du Colombier extern void fpinormalise(Internal*);
60d11907f1SDavid du Colombier 
61d11907f1SDavid du Colombier /*
62d11907f1SDavid du Colombier  * fpimem.c
63d11907f1SDavid du Colombier  */
64d11907f1SDavid du Colombier extern void fpis2i(Internal *, void *);
65d11907f1SDavid du Colombier extern void fpid2i(Internal *, void *);
66d11907f1SDavid du Colombier extern void fpiw2i(Internal *, void *);
674e3613abSDavid du Colombier extern void fpiv2i(Internal *, void *);
68d11907f1SDavid du Colombier extern void fpii2s(void *, Internal *);
69d11907f1SDavid du Colombier extern void fpii2d(void *, Internal *);
70d11907f1SDavid du Colombier extern void fpii2w(Word *, Internal *);
714e3613abSDavid du Colombier extern void fpii2v(Vlong *, Internal *);
72