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