|
|
1.1 root 1: /* C compiler: MIPS float/double decoding */
2:
3: #include "c.h"
4:
5: struct real decode(ty, x) double x; {
6: struct real r;
7:
8: if (ty == D) {
9: #ifdef MIPSEL
10: struct d { unsigned fract2, fract1:20, exp:11, sign:1; }
11: #else
12: struct d { unsigned sign:1, exp:11, fract1:20, fract2; }
13: #endif
14: *p = (struct d *) &x;
15: r.sign = p->sign;
16: r.exp = x ? p->exp - 1023 : 0;
17: r.msb = (p->fract1<<12) | (p->fract2>>20);
18: r.lsb = p->fract2<<12;
19: } else {
20: float f = x;
21: #ifdef MIPSEL
22: struct f { unsigned fract:23, exp:8, sign:1; }
23: #else
24: struct f { unsigned sign:1, exp:8, fract:23; }
25: #endif
26: *p = (struct f *) &f;
27: r.sign = p->sign;
28: r.exp = f ? p->exp - 127 : 0;
29: r.msb = p->fract<<9;
30: r.lsb = 0;
31: }
32: return r;
33: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.