Blame


1 a84cbb2a 2004-04-19 devnull #include <u.h>
2 a84cbb2a 2004-04-19 devnull #include <libc.h>
3 a84cbb2a 2004-04-19 devnull #include <bio.h>
4 a84cbb2a 2004-04-19 devnull #include <mach.h>
5 a84cbb2a 2004-04-19 devnull
6 a84cbb2a 2004-04-19 devnull /*
7 a84cbb2a 2004-04-19 devnull * Format floating point registers
8 a84cbb2a 2004-04-19 devnull *
9 a84cbb2a 2004-04-19 devnull * Register codes in format field:
10 a84cbb2a 2004-04-19 devnull * 'X' - print as 32-bit hexadecimal value
11 a84cbb2a 2004-04-19 devnull * 'F' - 64-bit double register when modif == 'F'; else 32-bit single reg
12 a84cbb2a 2004-04-19 devnull * 'f' - 32-bit ieee float
13 a84cbb2a 2004-04-19 devnull * '8' - big endian 80-bit ieee extended float
14 a84cbb2a 2004-04-19 devnull * '3' - little endian 80-bit ieee extended float with hole in bytes 8&9
15 a84cbb2a 2004-04-19 devnull */
16 a84cbb2a 2004-04-19 devnull int
17 a84cbb2a 2004-04-19 devnull fpformat(Map *map, Regdesc *rp, char *buf, uint n, uint modif)
18 a84cbb2a 2004-04-19 devnull {
19 a84cbb2a 2004-04-19 devnull char reg[12];
20 a84cbb2a 2004-04-19 devnull u32int r;
21 a84cbb2a 2004-04-19 devnull
22 a84cbb2a 2004-04-19 devnull switch(rp->format)
23 a84cbb2a 2004-04-19 devnull {
24 a84cbb2a 2004-04-19 devnull case 'X':
25 a84cbb2a 2004-04-19 devnull if (get4(map, rp->offset, &r) < 0)
26 a84cbb2a 2004-04-19 devnull return -1;
27 a84cbb2a 2004-04-19 devnull snprint(buf, n, "%lux", r);
28 a84cbb2a 2004-04-19 devnull break;
29 a84cbb2a 2004-04-19 devnull case 'F': /* first reg of double reg pair */
30 a84cbb2a 2004-04-19 devnull if (modif == 'F')
31 a84cbb2a 2004-04-19 devnull if ((rp->format=='F') || (((rp+1)->flags&RFLT) && (rp+1)->format == 'f')) {
32 a84cbb2a 2004-04-19 devnull if (get1(map, rp->offset, (uchar *)reg, 8) < 0)
33 a84cbb2a 2004-04-19 devnull return -1;
34 a84cbb2a 2004-04-19 devnull mach->ftoa64(buf, n, reg);
35 a84cbb2a 2004-04-19 devnull if (rp->format == 'F')
36 a84cbb2a 2004-04-19 devnull return 1;
37 a84cbb2a 2004-04-19 devnull return 2;
38 fa325e9b 2020-01-10 cross }
39 a84cbb2a 2004-04-19 devnull /* treat it like 'f' */
40 a84cbb2a 2004-04-19 devnull if (get1(map, rp->offset, (uchar *)reg, 4) < 0)
41 a84cbb2a 2004-04-19 devnull return -1;
42 a84cbb2a 2004-04-19 devnull mach->ftoa32(buf, n, reg);
43 a84cbb2a 2004-04-19 devnull break;
44 a84cbb2a 2004-04-19 devnull case 'f': /* 32 bit float */
45 a84cbb2a 2004-04-19 devnull if (get1(map, rp->offset, (uchar *)reg, 4) < 0)
46 a84cbb2a 2004-04-19 devnull return -1;
47 a84cbb2a 2004-04-19 devnull mach->ftoa32(buf, n, reg);
48 a84cbb2a 2004-04-19 devnull break;
49 a84cbb2a 2004-04-19 devnull case '3': /* little endian ieee 80 with hole in bytes 8&9 */
50 a84cbb2a 2004-04-19 devnull if (get1(map, rp->offset, (uchar *)reg, 10) < 0)
51 a84cbb2a 2004-04-19 devnull return -1;
52 a84cbb2a 2004-04-19 devnull memmove(reg+10, reg+8, 2); /* open hole */
53 a84cbb2a 2004-04-19 devnull memset(reg+8, 0, 2); /* fill it */
54 a84cbb2a 2004-04-19 devnull leieeeftoa80(buf, n, reg);
55 a84cbb2a 2004-04-19 devnull break;
56 a84cbb2a 2004-04-19 devnull case '8': /* big-endian ieee 80 */
57 a84cbb2a 2004-04-19 devnull if (get1(map, rp->offset, (uchar *)reg, 10) < 0)
58 a84cbb2a 2004-04-19 devnull return -1;
59 a84cbb2a 2004-04-19 devnull beieeeftoa80(buf, n, reg);
60 a84cbb2a 2004-04-19 devnull break;
61 a84cbb2a 2004-04-19 devnull default: /* unknown */
62 a84cbb2a 2004-04-19 devnull break;
63 a84cbb2a 2004-04-19 devnull }
64 a84cbb2a 2004-04-19 devnull return 1;
65 a84cbb2a 2004-04-19 devnull }