174a4d8c2SCharles.Forsyth #define EXTERN
274a4d8c2SCharles.Forsyth #include "gc.h"
374a4d8c2SCharles.Forsyth
474a4d8c2SCharles.Forsyth void
listinit(void)574a4d8c2SCharles.Forsyth listinit(void)
674a4d8c2SCharles.Forsyth {
774a4d8c2SCharles.Forsyth
874a4d8c2SCharles.Forsyth fmtinstall('A', Aconv);
974a4d8c2SCharles.Forsyth fmtinstall('P', Pconv);
1074a4d8c2SCharles.Forsyth fmtinstall('S', Sconv);
1174a4d8c2SCharles.Forsyth fmtinstall('N', Nconv);
1274a4d8c2SCharles.Forsyth fmtinstall('B', Bconv);
1374a4d8c2SCharles.Forsyth fmtinstall('D', Dconv);
1474a4d8c2SCharles.Forsyth fmtinstall('R', Rconv);
1574a4d8c2SCharles.Forsyth }
1674a4d8c2SCharles.Forsyth
1774a4d8c2SCharles.Forsyth int
Bconv(Fmt * fp)1874a4d8c2SCharles.Forsyth Bconv(Fmt *fp)
1974a4d8c2SCharles.Forsyth {
2074a4d8c2SCharles.Forsyth char str[STRINGSZ], ss[STRINGSZ], *s;
2174a4d8c2SCharles.Forsyth Bits bits;
2274a4d8c2SCharles.Forsyth int i;
2374a4d8c2SCharles.Forsyth
2474a4d8c2SCharles.Forsyth str[0] = 0;
2574a4d8c2SCharles.Forsyth bits = va_arg(fp->args, Bits);
2674a4d8c2SCharles.Forsyth while(bany(&bits)) {
2774a4d8c2SCharles.Forsyth i = bnum(bits);
2874a4d8c2SCharles.Forsyth if(str[0])
2974a4d8c2SCharles.Forsyth strcat(str, " ");
3074a4d8c2SCharles.Forsyth if(var[i].sym == S) {
3174a4d8c2SCharles.Forsyth sprint(ss, "$%ld", var[i].offset);
3274a4d8c2SCharles.Forsyth s = ss;
3374a4d8c2SCharles.Forsyth } else
3474a4d8c2SCharles.Forsyth s = var[i].sym->name;
3574a4d8c2SCharles.Forsyth if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
3674a4d8c2SCharles.Forsyth break;
3774a4d8c2SCharles.Forsyth strcat(str, s);
3874a4d8c2SCharles.Forsyth bits.b[i/32] &= ~(1L << (i%32));
3974a4d8c2SCharles.Forsyth }
4074a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
4174a4d8c2SCharles.Forsyth }
4274a4d8c2SCharles.Forsyth
4374a4d8c2SCharles.Forsyth int
Pconv(Fmt * fp)4474a4d8c2SCharles.Forsyth Pconv(Fmt *fp)
4574a4d8c2SCharles.Forsyth {
4674a4d8c2SCharles.Forsyth char str[STRINGSZ];
4774a4d8c2SCharles.Forsyth Prog *p;
4874a4d8c2SCharles.Forsyth int a;
4974a4d8c2SCharles.Forsyth
5074a4d8c2SCharles.Forsyth p = va_arg(fp->args, Prog*);
5174a4d8c2SCharles.Forsyth a = p->as;
5274a4d8c2SCharles.Forsyth if(a == AMOVM) {
5374a4d8c2SCharles.Forsyth if(p->from.type == D_CONST)
5474a4d8c2SCharles.Forsyth sprint(str, " %A %R,%D", a, &p->from, &p->to);
5574a4d8c2SCharles.Forsyth else
5674a4d8c2SCharles.Forsyth if(p->to.type == D_CONST)
5774a4d8c2SCharles.Forsyth sprint(str, " %A %D,%R", a, &p->from, &p->to);
5874a4d8c2SCharles.Forsyth else
5974a4d8c2SCharles.Forsyth sprint(str, " %A %D,%D", a, &p->from, &p->to);
6074a4d8c2SCharles.Forsyth } else
6174a4d8c2SCharles.Forsyth if(a == ADATA)
6274a4d8c2SCharles.Forsyth sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to);
6374a4d8c2SCharles.Forsyth else
6474a4d8c2SCharles.Forsyth if(p->reg == NREG)
6574a4d8c2SCharles.Forsyth sprint(str, " %A %D,%D", a, &p->from, &p->to);
6674a4d8c2SCharles.Forsyth else
6774a4d8c2SCharles.Forsyth if(p->from.type != D_FREG)
6874a4d8c2SCharles.Forsyth sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to);
6974a4d8c2SCharles.Forsyth else
7074a4d8c2SCharles.Forsyth sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to);
7174a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
7274a4d8c2SCharles.Forsyth }
7374a4d8c2SCharles.Forsyth
7474a4d8c2SCharles.Forsyth int
Aconv(Fmt * fp)7574a4d8c2SCharles.Forsyth Aconv(Fmt *fp)
7674a4d8c2SCharles.Forsyth {
7774a4d8c2SCharles.Forsyth char *s;
7874a4d8c2SCharles.Forsyth int a;
7974a4d8c2SCharles.Forsyth
8074a4d8c2SCharles.Forsyth a = va_arg(fp->args, int);
81*45a20ab7Sforsyth s = "?";
8274a4d8c2SCharles.Forsyth if(a >= AXXX && a < ALAST)
8374a4d8c2SCharles.Forsyth s = anames[a];
8474a4d8c2SCharles.Forsyth return fmtstrcpy(fp, s);
8574a4d8c2SCharles.Forsyth }
8674a4d8c2SCharles.Forsyth
8774a4d8c2SCharles.Forsyth int
Dconv(Fmt * fp)8874a4d8c2SCharles.Forsyth Dconv(Fmt *fp)
8974a4d8c2SCharles.Forsyth {
9074a4d8c2SCharles.Forsyth char str[STRINGSZ];
9174a4d8c2SCharles.Forsyth Adr *a;
9274a4d8c2SCharles.Forsyth
9374a4d8c2SCharles.Forsyth a = va_arg(fp->args, Adr*);
9474a4d8c2SCharles.Forsyth switch(a->type) {
9574a4d8c2SCharles.Forsyth
9674a4d8c2SCharles.Forsyth default:
9774a4d8c2SCharles.Forsyth sprint(str, "GOK-type(%d)", a->type);
9874a4d8c2SCharles.Forsyth break;
9974a4d8c2SCharles.Forsyth
10074a4d8c2SCharles.Forsyth case D_EXTERN:
10174a4d8c2SCharles.Forsyth case D_STATIC:
10274a4d8c2SCharles.Forsyth sprint(str, "%N", a);
10374a4d8c2SCharles.Forsyth break;
10474a4d8c2SCharles.Forsyth
10574a4d8c2SCharles.Forsyth case D_NONE:
10674a4d8c2SCharles.Forsyth str[0] = 0;
10774a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->reg != NREG || a->sym != S)
10874a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)(NONE)", a, a->reg);
10974a4d8c2SCharles.Forsyth break;
11074a4d8c2SCharles.Forsyth
11174a4d8c2SCharles.Forsyth case D_CONST:
11274a4d8c2SCharles.Forsyth if(a->reg != NREG)
11374a4d8c2SCharles.Forsyth sprint(str, "$%N(R%d)", a, a->reg);
11474a4d8c2SCharles.Forsyth else
11574a4d8c2SCharles.Forsyth sprint(str, "$%N", a);
11674a4d8c2SCharles.Forsyth break;
11774a4d8c2SCharles.Forsyth
11874a4d8c2SCharles.Forsyth case D_OREG:
11974a4d8c2SCharles.Forsyth if(a->reg != NREG)
12074a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)", a, a->reg);
12174a4d8c2SCharles.Forsyth else
12274a4d8c2SCharles.Forsyth sprint(str, "%N", a);
12374a4d8c2SCharles.Forsyth break;
12474a4d8c2SCharles.Forsyth
12574a4d8c2SCharles.Forsyth case D_REG:
12674a4d8c2SCharles.Forsyth sprint(str, "R%d", a->reg);
12774a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
12874a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)(REG)", a, a->reg);
12974a4d8c2SCharles.Forsyth break;
13074a4d8c2SCharles.Forsyth
13174a4d8c2SCharles.Forsyth case D_FREG:
13274a4d8c2SCharles.Forsyth sprint(str, "F%d", a->reg);
13374a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
13474a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)(REG)", a, a->reg);
13574a4d8c2SCharles.Forsyth break;
13674a4d8c2SCharles.Forsyth
13774a4d8c2SCharles.Forsyth case D_PSR:
13874a4d8c2SCharles.Forsyth sprint(str, "PSR");
13974a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
14074a4d8c2SCharles.Forsyth sprint(str, "%N(PSR)(REG)", a);
14174a4d8c2SCharles.Forsyth break;
14274a4d8c2SCharles.Forsyth
14374a4d8c2SCharles.Forsyth case D_BRANCH:
14474a4d8c2SCharles.Forsyth sprint(str, "%ld(PC)", a->offset-pc);
14574a4d8c2SCharles.Forsyth break;
14674a4d8c2SCharles.Forsyth
14774a4d8c2SCharles.Forsyth case D_FCONST:
14874a4d8c2SCharles.Forsyth sprint(str, "$%.17e", a->dval);
14974a4d8c2SCharles.Forsyth break;
15074a4d8c2SCharles.Forsyth
15174a4d8c2SCharles.Forsyth case D_SCONST:
15274a4d8c2SCharles.Forsyth sprint(str, "$\"%S\"", a->sval);
15374a4d8c2SCharles.Forsyth break;
15474a4d8c2SCharles.Forsyth }
15574a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
15674a4d8c2SCharles.Forsyth }
15774a4d8c2SCharles.Forsyth
15874a4d8c2SCharles.Forsyth int
Rconv(Fmt * fp)15974a4d8c2SCharles.Forsyth Rconv(Fmt *fp)
16074a4d8c2SCharles.Forsyth {
16174a4d8c2SCharles.Forsyth char str[STRINGSZ];
16274a4d8c2SCharles.Forsyth Adr *a;
16374a4d8c2SCharles.Forsyth int i, v;
16474a4d8c2SCharles.Forsyth
16574a4d8c2SCharles.Forsyth a = va_arg(fp->args, Adr*);
16674a4d8c2SCharles.Forsyth sprint(str, "GOK-reglist");
16774a4d8c2SCharles.Forsyth switch(a->type) {
16874a4d8c2SCharles.Forsyth case D_CONST:
16974a4d8c2SCharles.Forsyth if(a->reg != NREG)
17074a4d8c2SCharles.Forsyth break;
17174a4d8c2SCharles.Forsyth if(a->sym != S)
17274a4d8c2SCharles.Forsyth break;
17374a4d8c2SCharles.Forsyth v = a->offset;
17474a4d8c2SCharles.Forsyth strcpy(str, "");
17574a4d8c2SCharles.Forsyth for(i=0; i<NREG; i++) {
17674a4d8c2SCharles.Forsyth if(v & (1<<i)) {
17774a4d8c2SCharles.Forsyth if(str[0] == 0)
17874a4d8c2SCharles.Forsyth strcat(str, "[R");
17974a4d8c2SCharles.Forsyth else
18074a4d8c2SCharles.Forsyth strcat(str, ",R");
18174a4d8c2SCharles.Forsyth sprint(strchr(str, 0), "%d", i);
18274a4d8c2SCharles.Forsyth }
18374a4d8c2SCharles.Forsyth }
18474a4d8c2SCharles.Forsyth strcat(str, "]");
18574a4d8c2SCharles.Forsyth }
18674a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
18774a4d8c2SCharles.Forsyth }
18874a4d8c2SCharles.Forsyth
18974a4d8c2SCharles.Forsyth int
Sconv(Fmt * fp)19074a4d8c2SCharles.Forsyth Sconv(Fmt *fp)
19174a4d8c2SCharles.Forsyth {
19274a4d8c2SCharles.Forsyth int i, c;
19374a4d8c2SCharles.Forsyth char str[STRINGSZ], *p, *a;
19474a4d8c2SCharles.Forsyth
19574a4d8c2SCharles.Forsyth a = va_arg(fp->args, char*);
19674a4d8c2SCharles.Forsyth p = str;
19774a4d8c2SCharles.Forsyth for(i=0; i<NSNAME; i++) {
19874a4d8c2SCharles.Forsyth c = a[i] & 0xff;
19974a4d8c2SCharles.Forsyth if(c >= 'a' && c <= 'z' ||
20074a4d8c2SCharles.Forsyth c >= 'A' && c <= 'Z' ||
20174a4d8c2SCharles.Forsyth c >= '0' && c <= '9' ||
20274a4d8c2SCharles.Forsyth c == ' ' || c == '%') {
20374a4d8c2SCharles.Forsyth *p++ = c;
20474a4d8c2SCharles.Forsyth continue;
20574a4d8c2SCharles.Forsyth }
20674a4d8c2SCharles.Forsyth *p++ = '\\';
20774a4d8c2SCharles.Forsyth switch(c) {
20874a4d8c2SCharles.Forsyth case 0:
20974a4d8c2SCharles.Forsyth *p++ = 'z';
21074a4d8c2SCharles.Forsyth continue;
21174a4d8c2SCharles.Forsyth case '\\':
21274a4d8c2SCharles.Forsyth case '"':
21374a4d8c2SCharles.Forsyth *p++ = c;
21474a4d8c2SCharles.Forsyth continue;
21574a4d8c2SCharles.Forsyth case '\n':
21674a4d8c2SCharles.Forsyth *p++ = 'n';
21774a4d8c2SCharles.Forsyth continue;
21874a4d8c2SCharles.Forsyth case '\t':
21974a4d8c2SCharles.Forsyth *p++ = 't';
22074a4d8c2SCharles.Forsyth continue;
22174a4d8c2SCharles.Forsyth case '\r':
22274a4d8c2SCharles.Forsyth *p++ = 'r';
22374a4d8c2SCharles.Forsyth continue;
22474a4d8c2SCharles.Forsyth case '\f':
22574a4d8c2SCharles.Forsyth *p++ = 'f';
22674a4d8c2SCharles.Forsyth continue;
22774a4d8c2SCharles.Forsyth }
22874a4d8c2SCharles.Forsyth *p++ = (c>>6) + '0';
22974a4d8c2SCharles.Forsyth *p++ = ((c>>3) & 7) + '0';
23074a4d8c2SCharles.Forsyth *p++ = (c & 7) + '0';
23174a4d8c2SCharles.Forsyth }
23274a4d8c2SCharles.Forsyth *p = 0;
23374a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
23474a4d8c2SCharles.Forsyth }
23574a4d8c2SCharles.Forsyth
23674a4d8c2SCharles.Forsyth int
Nconv(Fmt * fp)23774a4d8c2SCharles.Forsyth Nconv(Fmt *fp)
23874a4d8c2SCharles.Forsyth {
23974a4d8c2SCharles.Forsyth char str[STRINGSZ];
24074a4d8c2SCharles.Forsyth Adr *a;
24174a4d8c2SCharles.Forsyth Sym *s;
24274a4d8c2SCharles.Forsyth
24374a4d8c2SCharles.Forsyth a = va_arg(fp->args, Adr*);
24474a4d8c2SCharles.Forsyth s = a->sym;
24574a4d8c2SCharles.Forsyth if(s == S) {
24674a4d8c2SCharles.Forsyth sprint(str, "%ld", a->offset);
24774a4d8c2SCharles.Forsyth goto out;
24874a4d8c2SCharles.Forsyth }
24974a4d8c2SCharles.Forsyth switch(a->name) {
25074a4d8c2SCharles.Forsyth default:
25174a4d8c2SCharles.Forsyth sprint(str, "GOK-name(%d)", a->name);
25274a4d8c2SCharles.Forsyth break;
25374a4d8c2SCharles.Forsyth
25474a4d8c2SCharles.Forsyth case D_NONE:
25574a4d8c2SCharles.Forsyth sprint(str, "%ld", a->offset);
25674a4d8c2SCharles.Forsyth break;
25774a4d8c2SCharles.Forsyth
25874a4d8c2SCharles.Forsyth case D_EXTERN:
25974a4d8c2SCharles.Forsyth sprint(str, "%s+%ld(SB)", s->name, a->offset);
26074a4d8c2SCharles.Forsyth break;
26174a4d8c2SCharles.Forsyth
26274a4d8c2SCharles.Forsyth case D_STATIC:
26374a4d8c2SCharles.Forsyth sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
26474a4d8c2SCharles.Forsyth break;
26574a4d8c2SCharles.Forsyth
26674a4d8c2SCharles.Forsyth case D_AUTO:
26774a4d8c2SCharles.Forsyth sprint(str, "%s-%ld(SP)", s->name, -a->offset);
26874a4d8c2SCharles.Forsyth break;
26974a4d8c2SCharles.Forsyth
27074a4d8c2SCharles.Forsyth case D_PARAM:
27174a4d8c2SCharles.Forsyth sprint(str, "%s+%ld(FP)", s->name, a->offset);
27274a4d8c2SCharles.Forsyth break;
27374a4d8c2SCharles.Forsyth }
27474a4d8c2SCharles.Forsyth out:
27574a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
27674a4d8c2SCharles.Forsyth }
277