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 fmtinstall('A', Aconv);
83e12c5d1SDavid du Colombier fmtinstall('P', Pconv);
93e12c5d1SDavid du Colombier fmtinstall('S', Sconv);
103e12c5d1SDavid du Colombier fmtinstall('N', Nconv);
113e12c5d1SDavid du Colombier fmtinstall('B', Bconv);
123e12c5d1SDavid du Colombier fmtinstall('D', Dconv);
133e12c5d1SDavid du Colombier }
143e12c5d1SDavid du Colombier
153e12c5d1SDavid du Colombier int
Bconv(Fmt * fp)169a747e4fSDavid du Colombier Bconv(Fmt *fp)
177dd7cddfSDavid du Colombier {
187dd7cddfSDavid du Colombier char str[STRINGSZ], ss[STRINGSZ], *s;
197dd7cddfSDavid du Colombier Bits bits;
207dd7cddfSDavid du Colombier int i;
217dd7cddfSDavid du Colombier
227dd7cddfSDavid du Colombier str[0] = 0;
239a747e4fSDavid du Colombier bits = va_arg(fp->args, Bits);
247dd7cddfSDavid du Colombier while(bany(&bits)) {
257dd7cddfSDavid du Colombier i = bnum(bits);
267dd7cddfSDavid du Colombier if(str[0])
277dd7cddfSDavid du Colombier strcat(str, " ");
287dd7cddfSDavid du Colombier if(var[i].sym == S) {
297dd7cddfSDavid du Colombier sprint(ss, "$%ld", var[i].offset);
307dd7cddfSDavid du Colombier s = ss;
317dd7cddfSDavid du Colombier } else
327dd7cddfSDavid du Colombier s = var[i].sym->name;
337dd7cddfSDavid du Colombier if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
347dd7cddfSDavid du Colombier break;
357dd7cddfSDavid du Colombier strcat(str, s);
367dd7cddfSDavid du Colombier bits.b[i/32] &= ~(1L << (i%32));
377dd7cddfSDavid du Colombier }
389a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier
417dd7cddfSDavid du Colombier int
Pconv(Fmt * fp)429a747e4fSDavid du Colombier Pconv(Fmt *fp)
433e12c5d1SDavid du Colombier {
443e12c5d1SDavid du Colombier char str[STRINGSZ];
453e12c5d1SDavid du Colombier Prog *p;
463e12c5d1SDavid du Colombier int a;
473e12c5d1SDavid du Colombier
489a747e4fSDavid du Colombier p = va_arg(fp->args, Prog*);
493e12c5d1SDavid du Colombier a = p->as;
503e12c5d1SDavid du Colombier if(a == ADATA)
513e12c5d1SDavid du Colombier sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to);
523e12c5d1SDavid du Colombier else
53*e288d156SDavid du Colombier if(p->as == ATEXT)
54*e288d156SDavid du Colombier sprint(str, " %A %D,%d,%D", a, &p->from, p->reg, &p->to);
55*e288d156SDavid du Colombier else
563e12c5d1SDavid du Colombier if(p->reg == NREG)
573e12c5d1SDavid du Colombier sprint(str, " %A %D,%D", a, &p->from, &p->to);
583e12c5d1SDavid du Colombier else
593e12c5d1SDavid du Colombier if(p->from.type != D_FREG)
603e12c5d1SDavid du Colombier sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to);
613e12c5d1SDavid du Colombier else
623e12c5d1SDavid du Colombier sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to);
639a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
643e12c5d1SDavid du Colombier }
653e12c5d1SDavid du Colombier
663e12c5d1SDavid du Colombier int
Aconv(Fmt * fp)679a747e4fSDavid du Colombier Aconv(Fmt *fp)
683e12c5d1SDavid du Colombier {
693e12c5d1SDavid du Colombier char *s;
703e12c5d1SDavid du Colombier int a;
713e12c5d1SDavid du Colombier
729a747e4fSDavid du Colombier a = va_arg(fp->args, int);
733e12c5d1SDavid du Colombier s = "???";
74219b2ee8SDavid du Colombier if(a >= AXXX && a < ALAST)
753e12c5d1SDavid du Colombier s = anames[a];
769a747e4fSDavid du Colombier return fmtstrcpy(fp, s);
773e12c5d1SDavid du Colombier }
783e12c5d1SDavid du Colombier
793e12c5d1SDavid du Colombier int
Dconv(Fmt * fp)809a747e4fSDavid du Colombier Dconv(Fmt *fp)
813e12c5d1SDavid du Colombier {
823e12c5d1SDavid du Colombier char str[STRINGSZ];
833e12c5d1SDavid du Colombier Adr *a;
843e12c5d1SDavid du Colombier
859a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
863e12c5d1SDavid du Colombier switch(a->type) {
873e12c5d1SDavid du Colombier
883e12c5d1SDavid du Colombier default:
893e12c5d1SDavid du Colombier sprint(str, "GOK-type(%d)", a->type);
903e12c5d1SDavid du Colombier break;
913e12c5d1SDavid du Colombier
923e12c5d1SDavid du Colombier case D_NONE:
933e12c5d1SDavid du Colombier str[0] = 0;
943e12c5d1SDavid du Colombier if(a->name != D_NONE || a->reg != NREG || a->sym != S)
953e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(NONE)", a, a->reg);
963e12c5d1SDavid du Colombier break;
973e12c5d1SDavid du Colombier
983e12c5d1SDavid du Colombier case D_CONST:
993e12c5d1SDavid du Colombier if(a->reg != NREG)
1003e12c5d1SDavid du Colombier sprint(str, "$%N(R%d)", a, a->reg);
1013e12c5d1SDavid du Colombier else
1023e12c5d1SDavid du Colombier sprint(str, "$%N", a);
1033e12c5d1SDavid du Colombier break;
1043e12c5d1SDavid du Colombier
1053e12c5d1SDavid du Colombier case D_OREG:
1063e12c5d1SDavid du Colombier if(a->reg != NREG)
1073e12c5d1SDavid du Colombier sprint(str, "%N(R%d)", a, a->reg);
1083e12c5d1SDavid du Colombier else
1093e12c5d1SDavid du Colombier sprint(str, "%N", a);
1103e12c5d1SDavid du Colombier break;
1113e12c5d1SDavid du Colombier
1123e12c5d1SDavid du Colombier case D_REG:
1133e12c5d1SDavid du Colombier sprint(str, "R%d", a->reg);
1143e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1153e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1163e12c5d1SDavid du Colombier break;
1173e12c5d1SDavid du Colombier
1183e12c5d1SDavid du Colombier case D_FREG:
1193e12c5d1SDavid du Colombier sprint(str, "F%d", a->reg);
1203e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1213e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1223e12c5d1SDavid du Colombier break;
1233e12c5d1SDavid du Colombier
1243e12c5d1SDavid du Colombier case D_FCREG:
1253e12c5d1SDavid du Colombier sprint(str, "FCR%d", a->reg);
1263e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1273e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1283e12c5d1SDavid du Colombier break;
1293e12c5d1SDavid du Colombier
1303e12c5d1SDavid du Colombier case D_LO:
1317dd7cddfSDavid du Colombier sprint(str, "LO");
1323e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1337dd7cddfSDavid du Colombier sprint(str, "%N(LO)(REG)", a);
1343e12c5d1SDavid du Colombier break;
1353e12c5d1SDavid du Colombier
1363e12c5d1SDavid du Colombier case D_HI:
1377dd7cddfSDavid du Colombier sprint(str, "HI");
1383e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S)
1397dd7cddfSDavid du Colombier sprint(str, "%N(HI)(REG)", a);
1403e12c5d1SDavid du Colombier break;
1413e12c5d1SDavid du Colombier
1423e12c5d1SDavid du Colombier case D_BRANCH:
1433e12c5d1SDavid du Colombier sprint(str, "%ld(PC)", a->offset-pc);
1443e12c5d1SDavid du Colombier break;
1453e12c5d1SDavid du Colombier
1463e12c5d1SDavid du Colombier case D_FCONST:
147219b2ee8SDavid du Colombier sprint(str, "$%.17e", a->dval);
1483e12c5d1SDavid du Colombier break;
1493e12c5d1SDavid du Colombier
1503e12c5d1SDavid du Colombier case D_SCONST:
1513e12c5d1SDavid du Colombier sprint(str, "$\"%S\"", a->sval);
1523e12c5d1SDavid du Colombier break;
1533e12c5d1SDavid du Colombier }
1549a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
1553e12c5d1SDavid du Colombier }
1563e12c5d1SDavid du Colombier
1573e12c5d1SDavid du Colombier int
Sconv(Fmt * fp)1589a747e4fSDavid du Colombier Sconv(Fmt *fp)
1593e12c5d1SDavid du Colombier {
1603e12c5d1SDavid du Colombier int i, c;
1613e12c5d1SDavid du Colombier char str[STRINGSZ], *p, *a;
1623e12c5d1SDavid du Colombier
1639a747e4fSDavid du Colombier a = va_arg(fp->args, char*);
1643e12c5d1SDavid du Colombier p = str;
1653e12c5d1SDavid du Colombier for(i=0; i<NSNAME; i++) {
1663e12c5d1SDavid du Colombier c = a[i] & 0xff;
1673e12c5d1SDavid du Colombier if(c >= 'a' && c <= 'z' ||
1683e12c5d1SDavid du Colombier c >= 'A' && c <= 'Z' ||
1693e12c5d1SDavid du Colombier c >= '0' && c <= '9' ||
1703e12c5d1SDavid du Colombier c == ' ' || c == '%') {
1713e12c5d1SDavid du Colombier *p++ = c;
1723e12c5d1SDavid du Colombier continue;
1733e12c5d1SDavid du Colombier }
1743e12c5d1SDavid du Colombier *p++ = '\\';
1753e12c5d1SDavid du Colombier switch(c) {
1763e12c5d1SDavid du Colombier case 0:
1773e12c5d1SDavid du Colombier *p++ = 'z';
1783e12c5d1SDavid du Colombier continue;
1793e12c5d1SDavid du Colombier case '\\':
1803e12c5d1SDavid du Colombier case '"':
1813e12c5d1SDavid du Colombier *p++ = c;
1823e12c5d1SDavid du Colombier continue;
1833e12c5d1SDavid du Colombier case '\n':
1843e12c5d1SDavid du Colombier *p++ = 'n';
1853e12c5d1SDavid du Colombier continue;
1863e12c5d1SDavid du Colombier case '\t':
1873e12c5d1SDavid du Colombier *p++ = 't';
1883e12c5d1SDavid du Colombier continue;
1893e12c5d1SDavid du Colombier case '\r':
1903e12c5d1SDavid du Colombier *p++ = 'r';
1913e12c5d1SDavid du Colombier continue;
1923e12c5d1SDavid du Colombier case '\f':
1933e12c5d1SDavid du Colombier *p++ = 'f';
1943e12c5d1SDavid du Colombier continue;
1953e12c5d1SDavid du Colombier }
1963e12c5d1SDavid du Colombier *p++ = (c>>6) + '0';
1973e12c5d1SDavid du Colombier *p++ = ((c>>3) & 7) + '0';
1983e12c5d1SDavid du Colombier *p++ = (c & 7) + '0';
1993e12c5d1SDavid du Colombier }
2003e12c5d1SDavid du Colombier *p = 0;
2019a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
2023e12c5d1SDavid du Colombier }
2033e12c5d1SDavid du Colombier
2043e12c5d1SDavid du Colombier int
Nconv(Fmt * fp)2059a747e4fSDavid du Colombier Nconv(Fmt *fp)
2063e12c5d1SDavid du Colombier {
2073e12c5d1SDavid du Colombier char str[STRINGSZ];
2083e12c5d1SDavid du Colombier Adr *a;
2093e12c5d1SDavid du Colombier Sym *s;
2103e12c5d1SDavid du Colombier
2119a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
2123e12c5d1SDavid du Colombier s = a->sym;
2133e12c5d1SDavid du Colombier if(s == S) {
2143e12c5d1SDavid du Colombier sprint(str, "%ld", a->offset);
2153e12c5d1SDavid du Colombier goto out;
2163e12c5d1SDavid du Colombier }
2173e12c5d1SDavid du Colombier switch(a->name) {
2183e12c5d1SDavid du Colombier default:
2193e12c5d1SDavid du Colombier sprint(str, "GOK-name(%d)", a->name);
2203e12c5d1SDavid du Colombier break;
2213e12c5d1SDavid du Colombier
2223e12c5d1SDavid du Colombier case D_NONE:
2233e12c5d1SDavid du Colombier sprint(str, "%ld", a->offset);
2243e12c5d1SDavid du Colombier break;
2253e12c5d1SDavid du Colombier
2263e12c5d1SDavid du Colombier case D_EXTERN:
2273e12c5d1SDavid du Colombier sprint(str, "%s+%ld(SB)", s->name, a->offset);
2283e12c5d1SDavid du Colombier break;
2293e12c5d1SDavid du Colombier
2303e12c5d1SDavid du Colombier case D_STATIC:
2313e12c5d1SDavid du Colombier sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
2323e12c5d1SDavid du Colombier break;
2333e12c5d1SDavid du Colombier
2343e12c5d1SDavid du Colombier case D_AUTO:
2353e12c5d1SDavid du Colombier sprint(str, "%s-%ld(SP)", s->name, -a->offset);
2363e12c5d1SDavid du Colombier break;
2373e12c5d1SDavid du Colombier
2383e12c5d1SDavid du Colombier case D_PARAM:
2393e12c5d1SDavid du Colombier sprint(str, "%s+%ld(FP)", s->name, a->offset);
2403e12c5d1SDavid du Colombier break;
2413e12c5d1SDavid du Colombier }
2423e12c5d1SDavid du Colombier out:
2439a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
2443e12c5d1SDavid du Colombier }
245