xref: /plan9/sys/src/cmd/5c/list.c (revision 0591a7c1821da27d40a0fa8bed7304fc2fa2b020)
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