13e12c5d1SDavid du Colombier #include "l.h"
23e12c5d1SDavid du Colombier
33e12c5d1SDavid du Colombier void
listinit(void)43e12c5d1SDavid du Colombier listinit(void)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier
73e12c5d1SDavid du Colombier fmtinstall('A', Aconv);
83e12c5d1SDavid du Colombier fmtinstall('D', Dconv);
93e12c5d1SDavid du Colombier fmtinstall('P', Pconv);
103e12c5d1SDavid du Colombier fmtinstall('S', Sconv);
113e12c5d1SDavid du Colombier fmtinstall('N', Nconv);
123e12c5d1SDavid du Colombier }
133e12c5d1SDavid du Colombier
143e12c5d1SDavid du Colombier void
prasm(Prog * p)153e12c5d1SDavid du Colombier prasm(Prog *p)
163e12c5d1SDavid du Colombier {
173e12c5d1SDavid du Colombier print("%P\n", p);
183e12c5d1SDavid du Colombier }
193e12c5d1SDavid du Colombier
203e12c5d1SDavid du Colombier int
Pconv(Fmt * fp)21*9a747e4fSDavid du Colombier Pconv(Fmt *fp)
223e12c5d1SDavid du Colombier {
23219b2ee8SDavid du Colombier char str[STRINGSZ], *s;
243e12c5d1SDavid du Colombier Prog *p;
253e12c5d1SDavid du Colombier int a;
263e12c5d1SDavid du Colombier
27*9a747e4fSDavid du Colombier p = va_arg(fp->args, Prog*);
283e12c5d1SDavid du Colombier curp = p;
293e12c5d1SDavid du Colombier a = p->as;
30219b2ee8SDavid du Colombier if(a == ADATA || a == ADYNT || a == AINIT)
313e12c5d1SDavid du Colombier sprint(str, "(%ld) %A %D/%d,%D",
323e12c5d1SDavid du Colombier p->line, a, &p->from, p->reg, &p->to);
33219b2ee8SDavid du Colombier else{
34219b2ee8SDavid du Colombier s = str;
35219b2ee8SDavid du Colombier s += sprint(s, "(%ld)", p->line);
36219b2ee8SDavid du Colombier if(p->mark & NOSCHED)
37219b2ee8SDavid du Colombier s += sprint(s, "*");
383e12c5d1SDavid du Colombier if(p->reg == NREG)
39219b2ee8SDavid du Colombier sprint(s, " %A %D,%D",
40219b2ee8SDavid du Colombier a, &p->from, &p->to);
413e12c5d1SDavid du Colombier else
423e12c5d1SDavid du Colombier if(p->from.type != D_FREG)
43219b2ee8SDavid du Colombier sprint(s, " %A %D,R%d,%D",
44219b2ee8SDavid du Colombier a, &p->from, p->reg, &p->to);
453e12c5d1SDavid du Colombier else
46219b2ee8SDavid du Colombier sprint(s, " %A %D,F%d,%D",
47219b2ee8SDavid du Colombier a, &p->from, p->reg, &p->to);
48219b2ee8SDavid du Colombier }
49*9a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier
523e12c5d1SDavid du Colombier int
Aconv(Fmt * fp)53*9a747e4fSDavid du Colombier Aconv(Fmt *fp)
543e12c5d1SDavid du Colombier {
553e12c5d1SDavid du Colombier char *s;
563e12c5d1SDavid du Colombier int a;
573e12c5d1SDavid du Colombier
58*9a747e4fSDavid du Colombier a = va_arg(fp->args, int);
593e12c5d1SDavid du Colombier s = "???";
60219b2ee8SDavid du Colombier if(a >= AXXX && a < ALAST)
613e12c5d1SDavid du Colombier s = anames[a];
62*9a747e4fSDavid du Colombier return fmtstrcpy(fp, s);
633e12c5d1SDavid du Colombier }
643e12c5d1SDavid du Colombier
653e12c5d1SDavid du Colombier int
Dconv(Fmt * fp)66*9a747e4fSDavid du Colombier Dconv(Fmt *fp)
673e12c5d1SDavid du Colombier {
683e12c5d1SDavid du Colombier char str[STRINGSZ];
693e12c5d1SDavid du Colombier Adr *a;
703e12c5d1SDavid du Colombier long v;
713e12c5d1SDavid du Colombier
72*9a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
733e12c5d1SDavid du Colombier switch(a->type) {
743e12c5d1SDavid du Colombier
753e12c5d1SDavid du Colombier default:
763e12c5d1SDavid du Colombier sprint(str, "GOK-type(%d)", a->type);
773e12c5d1SDavid du Colombier break;
783e12c5d1SDavid du Colombier
793e12c5d1SDavid du Colombier case D_NONE:
803e12c5d1SDavid du Colombier str[0] = 0;
813e12c5d1SDavid du Colombier if(a->name != D_NONE || a->reg != NREG || a->sym != S)
823e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(NONE)", a, a->reg);
833e12c5d1SDavid du Colombier break;
843e12c5d1SDavid du Colombier
853e12c5d1SDavid du Colombier case D_CONST:
863e12c5d1SDavid du Colombier sprint(str, "$%N", a);
873e12c5d1SDavid du Colombier if(a->reg != NREG)
883e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(CONST)", a, a->reg);
893e12c5d1SDavid du Colombier break;
903e12c5d1SDavid du Colombier
91219b2ee8SDavid du Colombier case D_OCONST:
92219b2ee8SDavid du Colombier sprint(str, "$*$%N", a);
93219b2ee8SDavid du Colombier if(a->reg != NREG)
94219b2ee8SDavid du Colombier sprint(str, "%N(R%d)(CONST)", a, a->reg);
95219b2ee8SDavid du Colombier break;
96219b2ee8SDavid du Colombier
973e12c5d1SDavid du Colombier case D_OREG:
983e12c5d1SDavid du Colombier if(a->reg != NREG)
993e12c5d1SDavid du Colombier sprint(str, "%N(R%d)", a, a->reg);
1003e12c5d1SDavid du Colombier else
1013e12c5d1SDavid du Colombier sprint(str, "%N", a);
1023e12c5d1SDavid du Colombier break;
1033e12c5d1SDavid du Colombier
1043e12c5d1SDavid du Colombier case D_REG:
1053e12c5d1SDavid du Colombier sprint(str, "R%d", a->reg);
1063e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1073e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1083e12c5d1SDavid du Colombier break;
1093e12c5d1SDavid du Colombier
1103e12c5d1SDavid du Colombier case D_MREG:
1113e12c5d1SDavid du Colombier sprint(str, "M%d", a->reg);
1123e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1133e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1143e12c5d1SDavid du Colombier break;
1153e12c5d1SDavid du Colombier
1163e12c5d1SDavid du Colombier case D_FREG:
1173e12c5d1SDavid du Colombier sprint(str, "F%d", a->reg);
1183e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1193e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1203e12c5d1SDavid du Colombier break;
1213e12c5d1SDavid du Colombier
1223e12c5d1SDavid du Colombier case D_FCREG:
1233e12c5d1SDavid du Colombier sprint(str, "FC%d", a->reg);
1243e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1253e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1263e12c5d1SDavid du Colombier break;
1273e12c5d1SDavid du Colombier
1283e12c5d1SDavid du Colombier case D_LO:
1297dd7cddfSDavid du Colombier sprint(str, "LO");
1303e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1317dd7cddfSDavid du Colombier sprint(str, "%N(LO)(REG)", a);
1323e12c5d1SDavid du Colombier break;
1333e12c5d1SDavid du Colombier
1343e12c5d1SDavid du Colombier case D_HI:
1357dd7cddfSDavid du Colombier sprint(str, "HI");
1363e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1377dd7cddfSDavid du Colombier sprint(str, "%N(HI)(REG)", a);
1383e12c5d1SDavid du Colombier break;
1393e12c5d1SDavid du Colombier
1403e12c5d1SDavid du Colombier case D_BRANCH: /* botch */
1413e12c5d1SDavid du Colombier if(curp->cond != P) {
1423e12c5d1SDavid du Colombier v = curp->cond->pc;
1433e12c5d1SDavid du Colombier if(v >= INITTEXT)
1443e12c5d1SDavid du Colombier v -= INITTEXT-HEADR;
1453e12c5d1SDavid du Colombier if(a->sym != S)
1463e12c5d1SDavid du Colombier sprint(str, "%s+%.5lux(BRANCH)", a->sym->name, v);
1473e12c5d1SDavid du Colombier else
1483e12c5d1SDavid du Colombier sprint(str, "%.5lux(BRANCH)", v);
1493e12c5d1SDavid du Colombier } else
1503e12c5d1SDavid du Colombier if(a->sym != S)
1513e12c5d1SDavid du Colombier sprint(str, "%s+%ld(APC)", a->sym->name, a->offset);
1523e12c5d1SDavid du Colombier else
1533e12c5d1SDavid du Colombier sprint(str, "%ld(APC)", a->offset);
1543e12c5d1SDavid du Colombier break;
1553e12c5d1SDavid du Colombier
1563e12c5d1SDavid du Colombier case D_FCONST:
1573e12c5d1SDavid du Colombier sprint(str, "$%e", ieeedtod(a->ieee));
1583e12c5d1SDavid du Colombier break;
1593e12c5d1SDavid du Colombier
1603e12c5d1SDavid du Colombier case D_SCONST:
1613e12c5d1SDavid du Colombier sprint(str, "$\"%S\"", a->sval);
1623e12c5d1SDavid du Colombier break;
1633e12c5d1SDavid du Colombier }
164*9a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
1653e12c5d1SDavid du Colombier }
1663e12c5d1SDavid du Colombier
1673e12c5d1SDavid du Colombier int
Nconv(Fmt * fp)168*9a747e4fSDavid du Colombier Nconv(Fmt *fp)
1693e12c5d1SDavid du Colombier {
1703e12c5d1SDavid du Colombier char str[STRINGSZ];
1713e12c5d1SDavid du Colombier Adr *a;
1723e12c5d1SDavid du Colombier Sym *s;
1733e12c5d1SDavid du Colombier
174*9a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
1753e12c5d1SDavid du Colombier s = a->sym;
1763e12c5d1SDavid du Colombier switch(a->name) {
1773e12c5d1SDavid du Colombier default:
1783e12c5d1SDavid du Colombier sprint(str, "GOK-name(%d)", a->name);
1793e12c5d1SDavid du Colombier break;
1803e12c5d1SDavid du Colombier
1813e12c5d1SDavid du Colombier case D_NONE:
1823e12c5d1SDavid du Colombier sprint(str, "%ld", a->offset);
1833e12c5d1SDavid du Colombier break;
1843e12c5d1SDavid du Colombier
1853e12c5d1SDavid du Colombier case D_EXTERN:
186219b2ee8SDavid du Colombier if(s == S)
187219b2ee8SDavid du Colombier sprint(str, "%ld(SB)", a->offset);
188219b2ee8SDavid du Colombier else
1893e12c5d1SDavid du Colombier sprint(str, "%s+%ld(SB)", s->name, a->offset);
1903e12c5d1SDavid du Colombier break;
1913e12c5d1SDavid du Colombier
1923e12c5d1SDavid du Colombier case D_STATIC:
193219b2ee8SDavid du Colombier if(s == S)
194219b2ee8SDavid du Colombier sprint(str, "<>+%ld(SB)", a->offset);
195219b2ee8SDavid du Colombier else
1963e12c5d1SDavid du Colombier sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
1973e12c5d1SDavid du Colombier break;
1983e12c5d1SDavid du Colombier
1993e12c5d1SDavid du Colombier case D_AUTO:
200219b2ee8SDavid du Colombier if(s == S)
201219b2ee8SDavid du Colombier sprint(str, "%ld(SP)", a->offset);
202219b2ee8SDavid du Colombier else
2033e12c5d1SDavid du Colombier sprint(str, "%s-%ld(SP)", s->name, -a->offset);
2043e12c5d1SDavid du Colombier break;
2053e12c5d1SDavid du Colombier
2063e12c5d1SDavid du Colombier case D_PARAM:
207219b2ee8SDavid du Colombier if(s == S)
208219b2ee8SDavid du Colombier sprint(str, "%ld(FP)", a->offset);
209219b2ee8SDavid du Colombier else
2103e12c5d1SDavid du Colombier sprint(str, "%s+%ld(FP)", s->name, a->offset);
2113e12c5d1SDavid du Colombier break;
2123e12c5d1SDavid du Colombier }
2137dd7cddfSDavid du Colombier
214*9a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
2153e12c5d1SDavid du Colombier }
2163e12c5d1SDavid du Colombier
2173e12c5d1SDavid du Colombier int
Sconv(Fmt * fp)218*9a747e4fSDavid du Colombier Sconv(Fmt *fp)
2193e12c5d1SDavid du Colombier {
2203e12c5d1SDavid du Colombier int i, c;
2213e12c5d1SDavid du Colombier char str[STRINGSZ], *p, *a;
2223e12c5d1SDavid du Colombier
223*9a747e4fSDavid du Colombier a = va_arg(fp->args, char*);
2243e12c5d1SDavid du Colombier p = str;
2253e12c5d1SDavid du Colombier for(i=0; i<sizeof(long); i++) {
2263e12c5d1SDavid du Colombier c = a[i] & 0xff;
2273e12c5d1SDavid du Colombier if(c >= 'a' && c <= 'z' ||
2283e12c5d1SDavid du Colombier c >= 'A' && c <= 'Z' ||
2293e12c5d1SDavid du Colombier c >= '0' && c <= '9' ||
2303e12c5d1SDavid du Colombier c == ' ' || c == '%') {
2313e12c5d1SDavid du Colombier *p++ = c;
2323e12c5d1SDavid du Colombier continue;
2333e12c5d1SDavid du Colombier }
2343e12c5d1SDavid du Colombier *p++ = '\\';
2353e12c5d1SDavid du Colombier switch(c) {
2363e12c5d1SDavid du Colombier case 0:
2373e12c5d1SDavid du Colombier *p++ = 'z';
2383e12c5d1SDavid du Colombier continue;
2393e12c5d1SDavid du Colombier case '\\':
2403e12c5d1SDavid du Colombier case '"':
2413e12c5d1SDavid du Colombier *p++ = c;
2423e12c5d1SDavid du Colombier continue;
2433e12c5d1SDavid du Colombier case '\n':
2443e12c5d1SDavid du Colombier *p++ = 'n';
2453e12c5d1SDavid du Colombier continue;
2463e12c5d1SDavid du Colombier case '\t':
2473e12c5d1SDavid du Colombier *p++ = 't';
2483e12c5d1SDavid du Colombier continue;
2493e12c5d1SDavid du Colombier }
2503e12c5d1SDavid du Colombier *p++ = (c>>6) + '0';
2513e12c5d1SDavid du Colombier *p++ = ((c>>3) & 7) + '0';
2523e12c5d1SDavid du Colombier *p++ = (c & 7) + '0';
2533e12c5d1SDavid du Colombier }
2543e12c5d1SDavid du Colombier *p = 0;
255*9a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
2563e12c5d1SDavid du Colombier }
2573e12c5d1SDavid du Colombier
2583e12c5d1SDavid du Colombier void
diag(char * fmt,...)2597dd7cddfSDavid du Colombier diag(char *fmt, ...)
2603e12c5d1SDavid du Colombier {
2613e12c5d1SDavid du Colombier char buf[STRINGSZ], *tn;
2627dd7cddfSDavid du Colombier va_list arg;
2633e12c5d1SDavid du Colombier
2643e12c5d1SDavid du Colombier tn = "??none??";
2653e12c5d1SDavid du Colombier if(curtext != P && curtext->from.sym != S)
2663e12c5d1SDavid du Colombier tn = curtext->from.sym->name;
2677dd7cddfSDavid du Colombier va_start(arg, fmt);
268*9a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg);
2697dd7cddfSDavid du Colombier va_end(arg);
2703e12c5d1SDavid du Colombier print("%s: %s\n", tn, buf);
2713e12c5d1SDavid du Colombier
2723e12c5d1SDavid du Colombier nerrors++;
2733e12c5d1SDavid du Colombier if(nerrors > 10) {
2743e12c5d1SDavid du Colombier print("too many errors\n");
2753e12c5d1SDavid du Colombier errorexit();
2763e12c5d1SDavid du Colombier }
2773e12c5d1SDavid du Colombier }
278