17dd7cddfSDavid du Colombier #define EXTERN
23e12c5d1SDavid du Colombier #include "gc.h"
33e12c5d1SDavid du Colombier
43e12c5d1SDavid du Colombier void
listinit(void)53e12c5d1SDavid du Colombier listinit(void)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier
83e12c5d1SDavid du Colombier fmtinstall('A', Aconv);
93e12c5d1SDavid du Colombier fmtinstall('P', Pconv);
103e12c5d1SDavid du Colombier fmtinstall('S', Sconv);
113e12c5d1SDavid du Colombier fmtinstall('N', Nconv);
123e12c5d1SDavid du Colombier fmtinstall('D', Dconv);
133e12c5d1SDavid du Colombier fmtinstall('B', Bconv);
143e12c5d1SDavid du Colombier }
153e12c5d1SDavid du Colombier
163e12c5d1SDavid du Colombier int
Bconv(Fmt * fp)179a747e4fSDavid du Colombier Bconv(Fmt *fp)
187dd7cddfSDavid du Colombier {
197dd7cddfSDavid du Colombier char str[STRINGSZ], ss[STRINGSZ], *s;
207dd7cddfSDavid du Colombier Bits bits;
217dd7cddfSDavid du Colombier int i;
227dd7cddfSDavid du Colombier
237dd7cddfSDavid du Colombier str[0] = 0;
249a747e4fSDavid du Colombier bits = va_arg(fp->args, Bits);
257dd7cddfSDavid du Colombier while(bany(&bits)) {
267dd7cddfSDavid du Colombier i = bnum(bits);
277dd7cddfSDavid du Colombier if(str[0])
287dd7cddfSDavid du Colombier strcat(str, " ");
297dd7cddfSDavid du Colombier if(var[i].sym == S) {
307dd7cddfSDavid du Colombier sprint(ss, "$%ld", var[i].offset);
317dd7cddfSDavid du Colombier s = ss;
327dd7cddfSDavid du Colombier } else
337dd7cddfSDavid du Colombier s = var[i].sym->name;
347dd7cddfSDavid du Colombier if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
357dd7cddfSDavid du Colombier break;
367dd7cddfSDavid du Colombier strcat(str, s);
377dd7cddfSDavid du Colombier bits.b[i/32] &= ~(1L << (i%32));
387dd7cddfSDavid du Colombier }
399a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
407dd7cddfSDavid du Colombier }
417dd7cddfSDavid du Colombier
427dd7cddfSDavid du Colombier int
Pconv(Fmt * fp)439a747e4fSDavid du Colombier Pconv(Fmt *fp)
443e12c5d1SDavid du Colombier {
453e12c5d1SDavid du Colombier char str[STRINGSZ];
463e12c5d1SDavid du Colombier Prog *p;
473e12c5d1SDavid du Colombier int a;
483e12c5d1SDavid du Colombier
499a747e4fSDavid du Colombier p = va_arg(fp->args, Prog*);
503e12c5d1SDavid du Colombier a = p->as;
513e12c5d1SDavid du Colombier if(a == ADATA)
523e12c5d1SDavid du Colombier sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to);
533e12c5d1SDavid du Colombier else
54*e288d156SDavid du Colombier if(p->as == ATEXT)
55*e288d156SDavid du Colombier sprint(str, " %A %D,%d,%D", a, &p->from, p->reg, &p->to);
56*e288d156SDavid du Colombier else
573e12c5d1SDavid du Colombier if(p->reg == NREG)
583e12c5d1SDavid du Colombier sprint(str, " %A %D,%D", a, &p->from, &p->to);
593e12c5d1SDavid du Colombier else
603e12c5d1SDavid du Colombier if(p->from.type != D_FREG)
613e12c5d1SDavid du Colombier sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to);
623e12c5d1SDavid du Colombier else
633e12c5d1SDavid du Colombier sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to);
649a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
653e12c5d1SDavid du Colombier }
663e12c5d1SDavid du Colombier
673e12c5d1SDavid du Colombier int
Aconv(Fmt * fp)689a747e4fSDavid du Colombier Aconv(Fmt *fp)
693e12c5d1SDavid du Colombier {
703e12c5d1SDavid du Colombier char *s;
713e12c5d1SDavid du Colombier int a;
723e12c5d1SDavid du Colombier
739a747e4fSDavid du Colombier a = va_arg(fp->args, int);
743e12c5d1SDavid du Colombier s = "???";
753e12c5d1SDavid du Colombier if(a >= AXXX && a <= AEND)
763e12c5d1SDavid du Colombier s = anames[a];
779a747e4fSDavid du Colombier return fmtstrcpy(fp, s);
783e12c5d1SDavid du Colombier }
793e12c5d1SDavid du Colombier
803e12c5d1SDavid du Colombier int
Dconv(Fmt * fp)819a747e4fSDavid du Colombier Dconv(Fmt *fp)
823e12c5d1SDavid du Colombier {
833e12c5d1SDavid du Colombier char str[STRINGSZ];
843e12c5d1SDavid du Colombier Adr *a;
853e12c5d1SDavid du Colombier
869a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
873e12c5d1SDavid du Colombier switch(a->type) {
883e12c5d1SDavid du Colombier
893e12c5d1SDavid du Colombier default:
903e12c5d1SDavid du Colombier sprint(str, "GOK-type(%d)", a->type);
913e12c5d1SDavid du Colombier break;
923e12c5d1SDavid du Colombier
933e12c5d1SDavid du Colombier case D_NONE:
943e12c5d1SDavid du Colombier str[0] = 0;
953e12c5d1SDavid du Colombier if(a->name != D_NONE || a->reg != NREG || a->sym != S)
963e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(NONE)", a, a->reg);
973e12c5d1SDavid du Colombier break;
983e12c5d1SDavid du Colombier
993e12c5d1SDavid du Colombier case D_CONST:
1003e12c5d1SDavid du Colombier if(a->reg != NREG)
1013e12c5d1SDavid du Colombier sprint(str, "$%N(R%d)", a, a->reg);
1023e12c5d1SDavid du Colombier else
1033e12c5d1SDavid du Colombier sprint(str, "$%N", a);
1043e12c5d1SDavid du Colombier break;
1053e12c5d1SDavid du Colombier
1063e12c5d1SDavid du Colombier case D_OREG:
1073e12c5d1SDavid du Colombier if(a->reg != NREG)
1083e12c5d1SDavid du Colombier sprint(str, "%N(R%d)", a, a->reg);
1093e12c5d1SDavid du Colombier else
1103e12c5d1SDavid du Colombier sprint(str, "%N", a);
1113e12c5d1SDavid du Colombier break;
1123e12c5d1SDavid du Colombier
1133e12c5d1SDavid du Colombier case D_REG:
1143e12c5d1SDavid du Colombier sprint(str, "R%d", a->reg);
1153e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1163e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1173e12c5d1SDavid du Colombier break;
1183e12c5d1SDavid du Colombier
1193e12c5d1SDavid du Colombier case D_FREG:
1203e12c5d1SDavid du Colombier sprint(str, "F%d", a->reg);
1213e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1223e12c5d1SDavid du Colombier sprint(str, "%N(F%d)(REG)", a, a->reg);
1233e12c5d1SDavid du Colombier break;
1243e12c5d1SDavid du Colombier
1253e12c5d1SDavid du Colombier case D_CREG:
1263e12c5d1SDavid du Colombier sprint(str, "C%d", a->reg);
1273e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1283e12c5d1SDavid du Colombier sprint(str, "%N(C%d)(REG)", a, a->reg);
1293e12c5d1SDavid du Colombier break;
1303e12c5d1SDavid du Colombier
1313e12c5d1SDavid du Colombier case D_BRANCH:
1323e12c5d1SDavid du Colombier sprint(str, "%ld(PC)", a->offset-pc);
1333e12c5d1SDavid du Colombier break;
1343e12c5d1SDavid du Colombier
1353e12c5d1SDavid du Colombier case D_FCONST:
136219b2ee8SDavid du Colombier sprint(str, "$%.17e", a->dval);
1373e12c5d1SDavid du Colombier break;
1383e12c5d1SDavid du Colombier
1393e12c5d1SDavid du Colombier case D_SCONST:
1403e12c5d1SDavid du Colombier sprint(str, "$\"%S\"", a->sval);
1413e12c5d1SDavid du Colombier break;
1423e12c5d1SDavid du Colombier }
1439a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
1443e12c5d1SDavid du Colombier }
1453e12c5d1SDavid du Colombier
1463e12c5d1SDavid du Colombier int
Sconv(Fmt * fp)1479a747e4fSDavid du Colombier Sconv(Fmt *fp)
1483e12c5d1SDavid du Colombier {
1493e12c5d1SDavid du Colombier int i, c;
1503e12c5d1SDavid du Colombier char str[STRINGSZ], *p, *a;
1513e12c5d1SDavid du Colombier
1529a747e4fSDavid du Colombier a = va_arg(fp->args, char*);
1533e12c5d1SDavid du Colombier p = str;
1543e12c5d1SDavid du Colombier for(i=0; i<NSNAME; i++) {
1553e12c5d1SDavid du Colombier c = a[i] & 0xff;
1563e12c5d1SDavid du Colombier if(c >= 'a' && c <= 'z' ||
1573e12c5d1SDavid du Colombier c >= 'A' && c <= 'Z' ||
1583e12c5d1SDavid du Colombier c >= '0' && c <= '9' ||
1593e12c5d1SDavid du Colombier c == ' ' || c == '%') {
1603e12c5d1SDavid du Colombier *p++ = c;
1613e12c5d1SDavid du Colombier continue;
1623e12c5d1SDavid du Colombier }
1633e12c5d1SDavid du Colombier *p++ = '\\';
1643e12c5d1SDavid du Colombier switch(c) {
1653e12c5d1SDavid du Colombier case 0:
1663e12c5d1SDavid du Colombier *p++ = 'z';
1673e12c5d1SDavid du Colombier continue;
1683e12c5d1SDavid du Colombier case '\\':
1693e12c5d1SDavid du Colombier case '"':
1703e12c5d1SDavid du Colombier *p++ = c;
1713e12c5d1SDavid du Colombier continue;
1723e12c5d1SDavid du Colombier case '\n':
1733e12c5d1SDavid du Colombier *p++ = 'n';
1743e12c5d1SDavid du Colombier continue;
1753e12c5d1SDavid du Colombier case '\t':
1763e12c5d1SDavid du Colombier *p++ = 't';
1773e12c5d1SDavid du Colombier continue;
1783e12c5d1SDavid du Colombier case '\r':
1793e12c5d1SDavid du Colombier *p++ = 'r';
1803e12c5d1SDavid du Colombier continue;
1813e12c5d1SDavid du Colombier case '\f':
1823e12c5d1SDavid du Colombier *p++ = 'f';
1833e12c5d1SDavid du Colombier continue;
1843e12c5d1SDavid du Colombier }
1853e12c5d1SDavid du Colombier *p++ = (c>>6) + '0';
1863e12c5d1SDavid du Colombier *p++ = ((c>>3) & 7) + '0';
1873e12c5d1SDavid du Colombier *p++ = (c & 7) + '0';
1883e12c5d1SDavid du Colombier }
1893e12c5d1SDavid du Colombier *p = 0;
1909a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
1913e12c5d1SDavid du Colombier }
1923e12c5d1SDavid du Colombier
1933e12c5d1SDavid du Colombier int
Nconv(Fmt * fp)1949a747e4fSDavid du Colombier Nconv(Fmt *fp)
1953e12c5d1SDavid du Colombier {
1963e12c5d1SDavid du Colombier char str[STRINGSZ];
1973e12c5d1SDavid du Colombier Adr *a;
1983e12c5d1SDavid du Colombier Sym *s;
1993e12c5d1SDavid du Colombier
2009a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
2013e12c5d1SDavid du Colombier s = a->sym;
2023e12c5d1SDavid du Colombier if(s == S) {
2033e12c5d1SDavid du Colombier sprint(str, "%ld", a->offset);
2043e12c5d1SDavid du Colombier goto out;
2053e12c5d1SDavid du Colombier }
2063e12c5d1SDavid du Colombier switch(a->name) {
2073e12c5d1SDavid du Colombier default:
2083e12c5d1SDavid du Colombier sprint(str, "GOK-name(%d)", a->name);
2093e12c5d1SDavid du Colombier break;
2103e12c5d1SDavid du Colombier
2113e12c5d1SDavid du Colombier case D_EXTERN:
2123e12c5d1SDavid du Colombier sprint(str, "%s+%ld(SB)", s->name, a->offset);
2133e12c5d1SDavid du Colombier break;
2143e12c5d1SDavid du Colombier
2153e12c5d1SDavid du Colombier case D_STATIC:
2163e12c5d1SDavid du Colombier sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
2173e12c5d1SDavid du Colombier break;
2183e12c5d1SDavid du Colombier
2193e12c5d1SDavid du Colombier case D_AUTO:
2203e12c5d1SDavid du Colombier sprint(str, "%s-%ld(SP)", s->name, -a->offset);
2213e12c5d1SDavid du Colombier break;
2223e12c5d1SDavid du Colombier
2233e12c5d1SDavid du Colombier case D_PARAM:
2243e12c5d1SDavid du Colombier sprint(str, "%s+%ld(FP)", s->name, a->offset);
2253e12c5d1SDavid du Colombier break;
2263e12c5d1SDavid du Colombier }
2273e12c5d1SDavid du Colombier out:
2289a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
2293e12c5d1SDavid du Colombier }
230