4 * the following routines depend on memory format, not the machine
8 fpis2i(Internal *i, void *v)
12 i->s = (*s & 0x80000000) ? 1: 0;
13 if((*s & ~0x80000000) == 0){
17 i->e = ((*s>>23) & 0x00FF) - SingleExpBias + ExpBias;
18 i->h = (*s & 0x007FFFFF)<<(1+NGuardBits);
27 fpid2i(Internal *i, void *v)
31 i->s = (d->h & 0x80000000) ? 1: 0;
32 i->e = (d->h>>20) & 0x07FF;
33 i->h = ((d->h & 0x000FFFFF)<<(4+NGuardBits))|((d->l>>25) & 0x7F);
34 i->l = (d->l & 0x01FFFFFF)<<NGuardBits;
42 fpiw2i(Internal *i, void *v)
44 Word w, word = *(Word*)v;
58 for (e = 0, w = word; w; w >>= 1, e++)
63 i->h = word>>(e - FractBits);
64 i->l = (word & ((1<<(e - FractBits)) - 1))<<(2*FractBits - e);
67 i->h = word<<(FractBits - e);
70 i->e = (e - 1) + ExpBias;
74 fpii2s(void *v, Internal *i)
77 Single *s = (Single*)v;
84 *s = i->s ? 0x80000000: 0;
87 if(e <= (ExpBias - SingleExpBias))
89 e = SingleExpBias - (ExpBias - e);
91 else if(e >= (ExpBias + (SingleExpMax-SingleExpBias))){
92 *s |= SingleExpMax<<23;
96 e = SingleExpBias + (e - ExpBias);
97 *s |= (e<<23)|(i->h>>(1+NGuardBits));
101 fpii2d(void *v, Internal *i)
103 Double *d = (Double*)v;
110 i->l = ((i->h & GuardMask)<<25)|(i->l>>NGuardBits);
112 d->h = i->s ? 0x80000000: 0;
113 d->h |= (i->e<<20)|((i->h & 0x00FFFFFF)>>4);
114 d->l = (i->h<<28)|i->l;
118 fpii2w(Word *word, Internal *i)
124 e = (i->e - ExpBias) + 1;
129 else if(e > FractBits)
130 w = (i->h<<(e - FractBits))|(i->l>>(2*FractBits - e));
132 w = i->h>>(FractBits-e);