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('B', Bconv);
137dd7cddfSDavid du Colombier fmtinstall('D', Dconv);
1459cc4ca5SDavid du Colombier fmtinstall('R', Rconv);
157dd7cddfSDavid du Colombier }
167dd7cddfSDavid du Colombier
177dd7cddfSDavid du Colombier int
Bconv(Fmt * fp)189a747e4fSDavid du Colombier Bconv(Fmt *fp)
197dd7cddfSDavid du Colombier {
207dd7cddfSDavid du Colombier char str[STRINGSZ], ss[STRINGSZ], *s;
217dd7cddfSDavid du Colombier Bits bits;
227dd7cddfSDavid du Colombier int i;
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier str[0] = 0;
259a747e4fSDavid du Colombier bits = va_arg(fp->args, Bits);
267dd7cddfSDavid du Colombier while(bany(&bits)) {
277dd7cddfSDavid du Colombier i = bnum(bits);
287dd7cddfSDavid du Colombier if(str[0])
297dd7cddfSDavid du Colombier strcat(str, " ");
307dd7cddfSDavid du Colombier if(var[i].sym == S) {
31*0591a7c1SDavid du Colombier snprint(ss, sizeof(ss), "$%ld", var[i].offset);
327dd7cddfSDavid du Colombier s = ss;
337dd7cddfSDavid du Colombier } else
347dd7cddfSDavid du Colombier s = var[i].sym->name;
357dd7cddfSDavid du Colombier if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
367dd7cddfSDavid du Colombier break;
377dd7cddfSDavid du Colombier strcat(str, s);
387dd7cddfSDavid du Colombier bits.b[i/32] &= ~(1L << (i%32));
397dd7cddfSDavid du Colombier }
409a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier char *extra [] = {
447dd7cddfSDavid du Colombier ".EQ", ".NE", ".CS", ".CC",
457dd7cddfSDavid du Colombier ".MI", ".PL", ".VS", ".VC",
467dd7cddfSDavid du Colombier ".HI", ".LS", ".GE", ".LT",
477dd7cddfSDavid du Colombier ".GT", ".LE", "", ".NV",
487dd7cddfSDavid du Colombier };
497dd7cddfSDavid du Colombier
507dd7cddfSDavid du Colombier int
Pconv(Fmt * fp)519a747e4fSDavid du Colombier Pconv(Fmt *fp)
527dd7cddfSDavid du Colombier {
5359cc4ca5SDavid du Colombier char str[STRINGSZ], sc[20];
547dd7cddfSDavid du Colombier Prog *p;
557dd7cddfSDavid du Colombier int a, s;
567dd7cddfSDavid du Colombier
579a747e4fSDavid du Colombier p = va_arg(fp->args, Prog*);
587dd7cddfSDavid du Colombier a = p->as;
5959cc4ca5SDavid du Colombier s = p->scond;
6059cc4ca5SDavid du Colombier strcpy(sc, extra[s & C_SCOND]);
6159cc4ca5SDavid du Colombier if(s & C_SBIT)
6259cc4ca5SDavid du Colombier strcat(sc, ".S");
6359cc4ca5SDavid du Colombier if(s & C_PBIT)
6459cc4ca5SDavid du Colombier strcat(sc, ".P");
6559cc4ca5SDavid du Colombier if(s & C_WBIT)
6659cc4ca5SDavid du Colombier strcat(sc, ".W");
6759cc4ca5SDavid du Colombier if(s & C_UBIT) /* ambiguous with FBIT */
6859cc4ca5SDavid du Colombier strcat(sc, ".U");
6959cc4ca5SDavid du Colombier if(a == AMOVM) {
7059cc4ca5SDavid du Colombier if(p->from.type == D_CONST)
71*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A%s %R,%D", a, sc, &p->from, &p->to);
7259cc4ca5SDavid du Colombier else
7359cc4ca5SDavid du Colombier if(p->to.type == D_CONST)
74*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A%s %D,%R", a, sc, &p->from, &p->to);
7559cc4ca5SDavid du Colombier else
76*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A%s %D,%D", a, sc, &p->from, &p->to);
7759cc4ca5SDavid du Colombier } else
787dd7cddfSDavid du Colombier if(a == ADATA)
79*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A %D/%d,%D", a, &p->from, p->reg, &p->to);
807dd7cddfSDavid du Colombier else
81e288d156SDavid du Colombier if(p->as == ATEXT)
82*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A %D,%d,%D", a, &p->from, p->reg, &p->to);
83e288d156SDavid du Colombier else
847dd7cddfSDavid du Colombier if(p->reg == NREG)
85*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A%s %D,%D", a, sc, &p->from, &p->to);
867dd7cddfSDavid du Colombier else
877dd7cddfSDavid du Colombier if(p->from.type != D_FREG)
88*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A%s %D,R%d,%D", a, sc, &p->from, p->reg, &p->to);
897dd7cddfSDavid du Colombier else
90*0591a7c1SDavid du Colombier snprint(str, sizeof(str), " %A%s %D,F%d,%D", a, sc, &p->from, p->reg, &p->to);
919a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
927dd7cddfSDavid du Colombier }
937dd7cddfSDavid du Colombier
947dd7cddfSDavid du Colombier int
Aconv(Fmt * fp)959a747e4fSDavid du Colombier Aconv(Fmt *fp)
967dd7cddfSDavid du Colombier {
977dd7cddfSDavid du Colombier char *s;
987dd7cddfSDavid du Colombier int a;
997dd7cddfSDavid du Colombier
1009a747e4fSDavid du Colombier a = va_arg(fp->args, int);
1017dd7cddfSDavid du Colombier s = "???";
1027dd7cddfSDavid du Colombier if(a >= AXXX && a < ALAST)
1037dd7cddfSDavid du Colombier s = anames[a];
1049a747e4fSDavid du Colombier return fmtstrcpy(fp, s);
1057dd7cddfSDavid du Colombier }
1067dd7cddfSDavid du Colombier
1077dd7cddfSDavid du Colombier int
Dconv(Fmt * fp)1089a747e4fSDavid du Colombier Dconv(Fmt *fp)
1097dd7cddfSDavid du Colombier {
1107dd7cddfSDavid du Colombier char str[STRINGSZ];
1117dd7cddfSDavid du Colombier Adr *a;
11259cc4ca5SDavid du Colombier char *op;
11359cc4ca5SDavid du Colombier int v;
1147dd7cddfSDavid du Colombier
1159a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
1167dd7cddfSDavid du Colombier switch(a->type) {
1177dd7cddfSDavid du Colombier
1187dd7cddfSDavid du Colombier default:
119*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "GOK-type(%d)", a->type);
1207dd7cddfSDavid du Colombier break;
1217dd7cddfSDavid du Colombier
1227dd7cddfSDavid du Colombier case D_NONE:
1237dd7cddfSDavid du Colombier str[0] = 0;
1247dd7cddfSDavid du Colombier if(a->name != D_NONE || a->reg != NREG || a->sym != S)
125*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%N(R%d)(NONE)", a, a->reg);
1267dd7cddfSDavid du Colombier break;
1277dd7cddfSDavid du Colombier
1287dd7cddfSDavid du Colombier case D_CONST:
1297dd7cddfSDavid du Colombier if(a->reg != NREG)
130*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "$%N(R%d)", a, a->reg);
1317dd7cddfSDavid du Colombier else
132*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "$%N", a);
1337dd7cddfSDavid du Colombier break;
1347dd7cddfSDavid du Colombier
13559cc4ca5SDavid du Colombier case D_SHIFT:
13659cc4ca5SDavid du Colombier v = a->offset;
13759cc4ca5SDavid du Colombier op = "<<>>->@>" + (((v>>5) & 3) << 1);
13859cc4ca5SDavid du Colombier if(v & (1<<4))
139*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "R%d%c%cR%d", v&15, op[0], op[1], (v>>8)&15);
14059cc4ca5SDavid du Colombier else
141*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "R%d%c%c%d", v&15, op[0], op[1], (v>>7)&31);
14259cc4ca5SDavid du Colombier if(a->reg != NREG)
14359cc4ca5SDavid du Colombier sprint(str+strlen(str), "(R%d)", a->reg);
14459cc4ca5SDavid du Colombier break;
14559cc4ca5SDavid du Colombier
1467dd7cddfSDavid du Colombier case D_OREG:
1477dd7cddfSDavid du Colombier if(a->reg != NREG)
148*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%N(R%d)", a, a->reg);
1497dd7cddfSDavid du Colombier else
150*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%N", a);
1517dd7cddfSDavid du Colombier break;
1527dd7cddfSDavid du Colombier
1537dd7cddfSDavid du Colombier case D_REG:
154*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "R%d", a->reg);
1557dd7cddfSDavid du Colombier if(a->name != D_NONE || a->sym != S)
156*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%N(R%d)(REG)", a, a->reg);
1577dd7cddfSDavid du Colombier break;
1587dd7cddfSDavid du Colombier
1597dd7cddfSDavid du Colombier case D_FREG:
160*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "F%d", a->reg);
1617dd7cddfSDavid du Colombier if(a->name != D_NONE || a->sym != S)
162*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%N(R%d)(REG)", a, a->reg);
1637dd7cddfSDavid du Colombier break;
1647dd7cddfSDavid du Colombier
1657dd7cddfSDavid du Colombier case D_PSR:
166*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "PSR");
1677dd7cddfSDavid du Colombier if(a->name != D_NONE || a->sym != S)
168*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%N(PSR)(REG)", a);
1697dd7cddfSDavid du Colombier break;
1707dd7cddfSDavid du Colombier
1717dd7cddfSDavid du Colombier case D_BRANCH:
172*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%ld(PC)", a->offset-pc);
1737dd7cddfSDavid du Colombier break;
1747dd7cddfSDavid du Colombier
1757dd7cddfSDavid du Colombier case D_FCONST:
176*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "$%.17e", a->dval);
1777dd7cddfSDavid du Colombier break;
1787dd7cddfSDavid du Colombier
1797dd7cddfSDavid du Colombier case D_SCONST:
180*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "$\"%S\"", a->sval);
1817dd7cddfSDavid du Colombier break;
1827dd7cddfSDavid du Colombier }
1839a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
1847dd7cddfSDavid du Colombier }
1857dd7cddfSDavid du Colombier
1867dd7cddfSDavid du Colombier int
Rconv(Fmt * fp)1879a747e4fSDavid du Colombier Rconv(Fmt *fp)
18859cc4ca5SDavid du Colombier {
189*0591a7c1SDavid du Colombier char str[STRINGSZ], *p, *e;
19059cc4ca5SDavid du Colombier Adr *a;
19159cc4ca5SDavid du Colombier int i, v;
19259cc4ca5SDavid du Colombier
1939a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
194*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "GOK-reglist");
19559cc4ca5SDavid du Colombier switch(a->type) {
19659cc4ca5SDavid du Colombier case D_CONST:
19759cc4ca5SDavid du Colombier if(a->reg != NREG)
19859cc4ca5SDavid du Colombier break;
19959cc4ca5SDavid du Colombier if(a->sym != S)
20059cc4ca5SDavid du Colombier break;
20159cc4ca5SDavid du Colombier v = a->offset;
202*0591a7c1SDavid du Colombier p = str;
203*0591a7c1SDavid du Colombier e = str+sizeof(str);
20459cc4ca5SDavid du Colombier for(i=0; i<NREG; i++) {
20559cc4ca5SDavid du Colombier if(v & (1<<i)) {
206*0591a7c1SDavid du Colombier if(p == str)
207*0591a7c1SDavid du Colombier p = seprint(p, e, "[R%d", i);
20859cc4ca5SDavid du Colombier else
209*0591a7c1SDavid du Colombier p = seprint(p, e, ",R%d", i);
21059cc4ca5SDavid du Colombier }
21159cc4ca5SDavid du Colombier }
212*0591a7c1SDavid du Colombier seprint(p, e, "]");
21359cc4ca5SDavid du Colombier }
2149a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
21559cc4ca5SDavid du Colombier }
21659cc4ca5SDavid du Colombier
21759cc4ca5SDavid du Colombier int
Sconv(Fmt * fp)2189a747e4fSDavid du Colombier Sconv(Fmt *fp)
2197dd7cddfSDavid du Colombier {
2207dd7cddfSDavid du Colombier int i, c;
2217dd7cddfSDavid du Colombier char str[STRINGSZ], *p, *a;
2227dd7cddfSDavid du Colombier
2239a747e4fSDavid du Colombier a = va_arg(fp->args, char*);
2247dd7cddfSDavid du Colombier p = str;
2257dd7cddfSDavid du Colombier for(i=0; i<NSNAME; i++) {
2267dd7cddfSDavid du Colombier c = a[i] & 0xff;
2277dd7cddfSDavid du Colombier if(c >= 'a' && c <= 'z' ||
2287dd7cddfSDavid du Colombier c >= 'A' && c <= 'Z' ||
2297dd7cddfSDavid du Colombier c >= '0' && c <= '9' ||
2307dd7cddfSDavid du Colombier c == ' ' || c == '%') {
2317dd7cddfSDavid du Colombier *p++ = c;
2327dd7cddfSDavid du Colombier continue;
2337dd7cddfSDavid du Colombier }
2347dd7cddfSDavid du Colombier *p++ = '\\';
2357dd7cddfSDavid du Colombier switch(c) {
2367dd7cddfSDavid du Colombier case 0:
2377dd7cddfSDavid du Colombier *p++ = 'z';
2387dd7cddfSDavid du Colombier continue;
2397dd7cddfSDavid du Colombier case '\\':
2407dd7cddfSDavid du Colombier case '"':
2417dd7cddfSDavid du Colombier *p++ = c;
2427dd7cddfSDavid du Colombier continue;
2437dd7cddfSDavid du Colombier case '\n':
2447dd7cddfSDavid du Colombier *p++ = 'n';
2457dd7cddfSDavid du Colombier continue;
2467dd7cddfSDavid du Colombier case '\t':
2477dd7cddfSDavid du Colombier *p++ = 't';
2487dd7cddfSDavid du Colombier continue;
2497dd7cddfSDavid du Colombier case '\r':
2507dd7cddfSDavid du Colombier *p++ = 'r';
2517dd7cddfSDavid du Colombier continue;
2527dd7cddfSDavid du Colombier case '\f':
2537dd7cddfSDavid du Colombier *p++ = 'f';
2547dd7cddfSDavid du Colombier continue;
2557dd7cddfSDavid du Colombier }
2567dd7cddfSDavid du Colombier *p++ = (c>>6) + '0';
2577dd7cddfSDavid du Colombier *p++ = ((c>>3) & 7) + '0';
2587dd7cddfSDavid du Colombier *p++ = (c & 7) + '0';
2597dd7cddfSDavid du Colombier }
2607dd7cddfSDavid du Colombier *p = 0;
2619a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
2627dd7cddfSDavid du Colombier }
2637dd7cddfSDavid du Colombier
2647dd7cddfSDavid du Colombier int
Nconv(Fmt * fp)2659a747e4fSDavid du Colombier Nconv(Fmt *fp)
2667dd7cddfSDavid du Colombier {
2677dd7cddfSDavid du Colombier char str[STRINGSZ];
2687dd7cddfSDavid du Colombier Adr *a;
2697dd7cddfSDavid du Colombier Sym *s;
2707dd7cddfSDavid du Colombier
2719a747e4fSDavid du Colombier a = va_arg(fp->args, Adr*);
2727dd7cddfSDavid du Colombier s = a->sym;
2737dd7cddfSDavid du Colombier if(s == S) {
274*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%ld", a->offset);
2757dd7cddfSDavid du Colombier goto out;
2767dd7cddfSDavid du Colombier }
2777dd7cddfSDavid du Colombier switch(a->name) {
2787dd7cddfSDavid du Colombier default:
279*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "GOK-name(%d)", a->name);
2807dd7cddfSDavid du Colombier break;
2817dd7cddfSDavid du Colombier
2827dd7cddfSDavid du Colombier case D_NONE:
283*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%ld", a->offset);
2847dd7cddfSDavid du Colombier break;
2857dd7cddfSDavid du Colombier
2867dd7cddfSDavid du Colombier case D_EXTERN:
287*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%s+%ld(SB)", s->name, a->offset);
2887dd7cddfSDavid du Colombier break;
2897dd7cddfSDavid du Colombier
2907dd7cddfSDavid du Colombier case D_STATIC:
291*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%s<>+%ld(SB)", s->name, a->offset);
2927dd7cddfSDavid du Colombier break;
2937dd7cddfSDavid du Colombier
2947dd7cddfSDavid du Colombier case D_AUTO:
295*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%s-%ld(SP)", s->name, -a->offset);
2967dd7cddfSDavid du Colombier break;
2977dd7cddfSDavid du Colombier
2987dd7cddfSDavid du Colombier case D_PARAM:
299*0591a7c1SDavid du Colombier snprint(str, sizeof(str), "%s+%ld(FP)", s->name, a->offset);
3007dd7cddfSDavid du Colombier break;
3017dd7cddfSDavid du Colombier }
3027dd7cddfSDavid du Colombier out:
3039a747e4fSDavid du Colombier return fmtstrcpy(fp, str);
3047dd7cddfSDavid du Colombier }
305