ref: cbe4b116989c0bfec49b9ae7a1d9a85ead6648ae
dir: /sys/src/9/teg2/fpi.h/
typedef long Word; typedef unsigned long Single; typedef struct { unsigned long l; unsigned long h; } Double; enum { FractBits = 28, CarryBit = 0x10000000, HiddenBit = 0x08000000, MsBit = HiddenBit, NGuardBits = 3, GuardMask = 0x07, LsBit = (1<<NGuardBits), SingleExpBias = 127, SingleExpMax = 255, DoubleExpBias = 1023, DoubleExpMax = 2047, ExpBias = DoubleExpBias, ExpInfinity = DoubleExpMax, }; typedef struct { unsigned char s; short e; long l; /* 0000FFFFFFFFFFFFFFFFFFFFFFFFFGGG */ long h; /* 0000HFFFFFFFFFFFFFFFFFFFFFFFFFFF */ } Internal; #define IsWeird(n) ((n)->e >= ExpInfinity) #define IsInfinity(n) (IsWeird(n) && (n)->h == HiddenBit && (n)->l == 0) #define SetInfinity(n) ((n)->e = ExpInfinity, (n)->h = HiddenBit, (n)->l = 0) #define IsNaN(n) (IsWeird(n) && (((n)->h & ~HiddenBit) || (n)->l)) #define SetQNaN(n) ((n)->s = 0, (n)->e = ExpInfinity, \ (n)->h = HiddenBit|(LsBit<<1), (n)->l = 0) #define IsZero(n) ((n)->e == 1 && (n)->h == 0 && (n)->l == 0) #define SetZero(n) ((n)->e = 1, (n)->h = 0, (n)->l = 0) /* * fpi.c */ extern void fpiround(Internal *); extern void fpiadd(Internal *, Internal *, Internal *); extern void fpisub(Internal *, Internal *, Internal *); extern void fpimul(Internal *, Internal *, Internal *); extern void fpidiv(Internal *, Internal *, Internal *); extern int fpicmp(Internal *, Internal *); extern void fpinormalise(Internal*); /* * fpimem.c */ extern void fpis2i(Internal *, void *); extern void fpid2i(Internal *, void *); extern void fpiw2i(Internal *, void *); extern void fpii2s(void *, Internal *); extern void fpii2d(void *, Internal *); extern void fpii2w(Word *, Internal *);