17dd7cddfSDavid du Colombier #define EXTERN
27dd7cddfSDavid du Colombier #include "gc.h"
37dd7cddfSDavid du Colombier
47dd7cddfSDavid du Colombier void
listinit(void)57dd7cddfSDavid du Colombier listinit(void)
67dd7cddfSDavid du Colombier {
77dd7cddfSDavid du Colombier
87dd7cddfSDavid du Colombier fmtinstall('A', Aconv);
97dd7cddfSDavid du Colombier fmtinstall('P', Pconv);
107dd7cddfSDavid du Colombier fmtinstall('S', Sconv);
117dd7cddfSDavid du Colombier fmtinstall('N', Nconv);
127dd7cddfSDavid du Colombier fmtinstall('D', Dconv);
137dd7cddfSDavid du Colombier fmtinstall('B', Bconv);
147dd7cddfSDavid du Colombier }
157dd7cddfSDavid du Colombier
167dd7cddfSDavid 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)
447dd7cddfSDavid du Colombier {
45*6891d857SDavid du Colombier char str[STRINGSZ], *s;
467dd7cddfSDavid du Colombier Prog *p;
477dd7cddfSDavid du Colombier int a;
487dd7cddfSDavid du Colombier
499a747e4fSDavid du Colombier p = va_arg(fp->args, Prog*);
507dd7cddfSDavid du Colombier a = p->as;
517dd7cddfSDavid du Colombier if(a == ADATA)
527dd7cddfSDavid du Colombier sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to);
53*6891d857SDavid du Colombier else if(p->as == ATEXT)
54e288d156SDavid du Colombier sprint(str, " %A %D,%d,%D", a, &p->from, p->reg, &p->to);
55*6891d857SDavid du Colombier else {
56*6891d857SDavid du Colombier s = seprint(str, str+sizeof(str), " %A %D", a, &p->from);
57*6891d857SDavid du Colombier if(p->reg != NREG)
58*6891d857SDavid du Colombier s = seprint(s, str+sizeof(str), ",%c%d", p->from.type==D_FREG? 'F': 'R', p->reg);
59*6891d857SDavid du Colombier if(p->from3.type != D_NONE)
60*6891d857SDavid du Colombier s = seprint(s, str+sizeof(str), ",%D", &p->from3);
61*6891d857SDavid du Colombier seprint(s, s+sizeof(str), ",%D", &p->to);
62*6891d857SDavid du Colombier }
639a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
647dd7cddfSDavid du Colombier }
657dd7cddfSDavid du Colombier
667dd7cddfSDavid du Colombier int
Aconv(Fmt * fp)679a747e4fSDavid du Colombier Aconv(Fmt *fp)
687dd7cddfSDavid du Colombier {
697dd7cddfSDavid du Colombier char *s;
707dd7cddfSDavid du Colombier int a;
717dd7cddfSDavid du Colombier
729a747e4fSDavid du Colombier a = va_arg(fp->args, int);
737dd7cddfSDavid du Colombier s = "???";
74*6891d857SDavid du Colombier if(a >= AXXX && a <= ALAST)
757dd7cddfSDavid du Colombier s = anames[a];
769a747e4fSDavid du Colombier return fmtstrcpy(fp, s);
777dd7cddfSDavid du Colombier }
787dd7cddfSDavid du Colombier
797dd7cddfSDavid du Colombier int
Dconv(Fmt * fp)809a747e4fSDavid du Colombier Dconv(Fmt *fp)
817dd7cddfSDavid du Colombier {
827dd7cddfSDavid du Colombier char str[STRINGSZ];
837dd7cddfSDavid du Colombier Adr *a;
847dd7cddfSDavid du Colombier
859a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
867dd7cddfSDavid du Colombier switch(a->type) {
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier default:
897dd7cddfSDavid du Colombier sprint(str, "GOK-type(%d)", a->type);
907dd7cddfSDavid du Colombier break;
917dd7cddfSDavid du Colombier
927dd7cddfSDavid du Colombier case D_NONE:
937dd7cddfSDavid du Colombier str[0] = 0;
947dd7cddfSDavid du Colombier if(a->name != D_NONE || a->reg != NREG || a->sym != S)
957dd7cddfSDavid du Colombier sprint(str, "%N(R%d)(NONE)", a, a->reg);
967dd7cddfSDavid du Colombier break;
977dd7cddfSDavid du Colombier
987dd7cddfSDavid du Colombier case D_CONST:
997dd7cddfSDavid du Colombier if(a->reg != NREG)
1007dd7cddfSDavid du Colombier sprint(str, "$%N(R%d)", a, a->reg);
1017dd7cddfSDavid du Colombier else
1027dd7cddfSDavid du Colombier sprint(str, "$%N", a);
1037dd7cddfSDavid du Colombier break;
1047dd7cddfSDavid du Colombier
1057dd7cddfSDavid du Colombier case D_OREG:
1067dd7cddfSDavid du Colombier if(a->reg != NREG)
1077dd7cddfSDavid du Colombier sprint(str, "%N(R%d)", a, a->reg);
1087dd7cddfSDavid du Colombier else
1097dd7cddfSDavid du Colombier sprint(str, "%N", a);
1107dd7cddfSDavid du Colombier break;
1117dd7cddfSDavid du Colombier
1127dd7cddfSDavid du Colombier case D_REG:
1137dd7cddfSDavid du Colombier sprint(str, "R%d", a->reg);
1147dd7cddfSDavid du Colombier if(a->name != D_NONE || a->sym != S)
1157dd7cddfSDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
1167dd7cddfSDavid du Colombier break;
1177dd7cddfSDavid du Colombier
1187dd7cddfSDavid du Colombier case D_FREG:
1197dd7cddfSDavid du Colombier sprint(str, "F%d", a->reg);
1207dd7cddfSDavid du Colombier if(a->name != D_NONE || a->sym != S)
1217dd7cddfSDavid du Colombier sprint(str, "%N(F%d)(REG)", a, a->reg);
1227dd7cddfSDavid du Colombier break;
1237dd7cddfSDavid du Colombier
1247dd7cddfSDavid du Colombier case D_CREG:
1257dd7cddfSDavid du Colombier sprint(str, "C%d", a->reg);
1267dd7cddfSDavid du Colombier if(a->name != D_NONE || a->sym != S)
1277dd7cddfSDavid du Colombier sprint(str, "%N(C%d)(REG)", a, a->reg);
1287dd7cddfSDavid du Colombier break;
1297dd7cddfSDavid du Colombier
1307dd7cddfSDavid du Colombier case D_BRANCH:
1317dd7cddfSDavid du Colombier sprint(str, "%ld(PC)", a->offset-pc);
1327dd7cddfSDavid du Colombier break;
1337dd7cddfSDavid du Colombier
1347dd7cddfSDavid du Colombier case D_FCONST:
1357dd7cddfSDavid du Colombier sprint(str, "$%.17e", a->dval);
1367dd7cddfSDavid du Colombier break;
1377dd7cddfSDavid du Colombier
1387dd7cddfSDavid du Colombier case D_SCONST:
1397dd7cddfSDavid du Colombier sprint(str, "$\"%S\"", a->sval);
1407dd7cddfSDavid du Colombier break;
1417dd7cddfSDavid du Colombier }
1429a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
1437dd7cddfSDavid du Colombier }
1447dd7cddfSDavid du Colombier
1457dd7cddfSDavid du Colombier int
Sconv(Fmt * fp)1469a747e4fSDavid du Colombier Sconv(Fmt *fp)
1477dd7cddfSDavid du Colombier {
1487dd7cddfSDavid du Colombier int i, c;
1497dd7cddfSDavid du Colombier char str[STRINGSZ], *p, *a;
1507dd7cddfSDavid du Colombier
1519a747e4fSDavid du Colombier a = va_arg(fp->args, char*);
1527dd7cddfSDavid du Colombier p = str;
1537dd7cddfSDavid du Colombier for(i=0; i<NSNAME; i++) {
1547dd7cddfSDavid du Colombier c = a[i] & 0xff;
1557dd7cddfSDavid du Colombier if(c >= 'a' && c <= 'z' ||
1567dd7cddfSDavid du Colombier c >= 'A' && c <= 'Z' ||
1577dd7cddfSDavid du Colombier c >= '0' && c <= '9' ||
1587dd7cddfSDavid du Colombier c == ' ' || c == '%') {
1597dd7cddfSDavid du Colombier *p++ = c;
1607dd7cddfSDavid du Colombier continue;
1617dd7cddfSDavid du Colombier }
1627dd7cddfSDavid du Colombier *p++ = '\\';
1637dd7cddfSDavid du Colombier switch(c) {
1647dd7cddfSDavid du Colombier case 0:
1657dd7cddfSDavid du Colombier *p++ = 'z';
1667dd7cddfSDavid du Colombier continue;
1677dd7cddfSDavid du Colombier case '\\':
1687dd7cddfSDavid du Colombier case '"':
1697dd7cddfSDavid du Colombier *p++ = c;
1707dd7cddfSDavid du Colombier continue;
1717dd7cddfSDavid du Colombier case '\n':
1727dd7cddfSDavid du Colombier *p++ = 'n';
1737dd7cddfSDavid du Colombier continue;
1747dd7cddfSDavid du Colombier case '\t':
1757dd7cddfSDavid du Colombier *p++ = 't';
1767dd7cddfSDavid du Colombier continue;
1777dd7cddfSDavid du Colombier case '\r':
1787dd7cddfSDavid du Colombier *p++ = 'r';
1797dd7cddfSDavid du Colombier continue;
1807dd7cddfSDavid du Colombier case '\f':
1817dd7cddfSDavid du Colombier *p++ = 'f';
1827dd7cddfSDavid du Colombier continue;
1837dd7cddfSDavid du Colombier }
1847dd7cddfSDavid du Colombier *p++ = (c>>6) + '0';
1857dd7cddfSDavid du Colombier *p++ = ((c>>3) & 7) + '0';
1867dd7cddfSDavid du Colombier *p++ = (c & 7) + '0';
1877dd7cddfSDavid du Colombier }
1887dd7cddfSDavid du Colombier *p = 0;
1899a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
1907dd7cddfSDavid du Colombier }
1917dd7cddfSDavid du Colombier
1927dd7cddfSDavid du Colombier int
Nconv(Fmt * fp)1939a747e4fSDavid du Colombier Nconv(Fmt *fp)
1947dd7cddfSDavid du Colombier {
1957dd7cddfSDavid du Colombier char str[STRINGSZ];
1967dd7cddfSDavid du Colombier Adr *a;
1977dd7cddfSDavid du Colombier Sym *s;
198*6891d857SDavid du Colombier int i, l, b, n;
1997dd7cddfSDavid du Colombier
2009a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
2017dd7cddfSDavid du Colombier s = a->sym;
2027dd7cddfSDavid du Colombier if(s == S) {
203*6891d857SDavid du Colombier if(a->offset > 64 || -a->offset > 64) {
204*6891d857SDavid du Colombier n = 0;
205*6891d857SDavid du Colombier l = a->offset & 1;
206*6891d857SDavid du Colombier for(i=0; i<32; i++){
207*6891d857SDavid du Colombier b = (a->offset >> i) & 1;
208*6891d857SDavid du Colombier if(b != l)
209*6891d857SDavid du Colombier n++;
210*6891d857SDavid du Colombier l = b;
211*6891d857SDavid du Colombier }
212*6891d857SDavid du Colombier if(n < 2) {
213*6891d857SDavid du Colombier sprint(str, "%#lux", a->offset);
214*6891d857SDavid du Colombier goto out;
215*6891d857SDavid du Colombier }
216*6891d857SDavid du Colombier }
2177dd7cddfSDavid du Colombier sprint(str, "%ld", a->offset);
2187dd7cddfSDavid du Colombier goto out;
2197dd7cddfSDavid du Colombier }
2207dd7cddfSDavid du Colombier switch(a->name) {
2217dd7cddfSDavid du Colombier default:
2227dd7cddfSDavid du Colombier sprint(str, "GOK-name(%d)", a->name);
2237dd7cddfSDavid du Colombier break;
2247dd7cddfSDavid du Colombier
2257dd7cddfSDavid du Colombier case D_EXTERN:
2267dd7cddfSDavid du Colombier sprint(str, "%s+%ld(SB)", s->name, a->offset);
2277dd7cddfSDavid du Colombier break;
2287dd7cddfSDavid du Colombier
2297dd7cddfSDavid du Colombier case D_STATIC:
2307dd7cddfSDavid du Colombier sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
2317dd7cddfSDavid du Colombier break;
2327dd7cddfSDavid du Colombier
2337dd7cddfSDavid du Colombier case D_AUTO:
2347dd7cddfSDavid du Colombier sprint(str, "%s-%ld(SP)", s->name, -a->offset);
2357dd7cddfSDavid du Colombier break;
2367dd7cddfSDavid du Colombier
2377dd7cddfSDavid du Colombier case D_PARAM:
2387dd7cddfSDavid du Colombier sprint(str, "%s+%ld(FP)", s->name, a->offset);
2397dd7cddfSDavid du Colombier break;
2407dd7cddfSDavid du Colombier }
2417dd7cddfSDavid du Colombier out:
2429a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
2437dd7cddfSDavid du Colombier }
244