7 fmtinstall('A', Aconv);
8 fmtinstall('D', Dconv);
9 fmtinstall('P', Pconv);
10 fmtinstall('S', Sconv);
11 fmtinstall('N', Nconv);
12 fmtinstall('R', Rconv);
18 char str[STRINGSZ], *s;
22 p = va_arg(fp->args, Prog*);
28 s += sprint(s, "(%ld)", p->line);
29 if(p->reg == NREG && p->from3.type == D_NONE)
30 sprint(s, " %A %D,%D",
32 else if(p->from.type != D_FREG){
33 s += sprint(s, " %A %D", a, &p->from);
34 if(p->from3.type != D_NONE)
35 s += sprint(s, ",%D", &p->from3);
37 s += sprint(s, ",R%d", p->reg);
38 sprint(s, ",%D", &p->to);
40 sprint(s, " %A %D,F%d,%D",
41 a, &p->from, p->reg, &p->to);
47 sprint(str, "(%ld) %A %D/%d,%D",
48 p->line, a, &p->from, p->reg, &p->to);
51 return fmtstrcpy(fp, str);
60 a = va_arg(fp->args, int);
62 if(a >= AXXX && a < ALAST && anames[a])
64 return fmtstrcpy(fp, s);
94 static char *extop[] = {".UB", ".UH", ".UW", ".UX", ".SB", ".SH", ".SW", ".SX"};
96 a = va_arg(fp->args, Adr*);
100 sprint(str, "GOK-type(%d)", a->type);
105 if(a->name != D_NONE || a->reg != NREG || a->sym != S)
106 sprint(str, "%N(R%d)(NONE)", a, a->reg);
110 if(a->reg == NREG || a->reg == REGZERO)
111 sprint(str, "$%N", a);
113 sprint(str, "$%N(R%d)", a, a->reg);
118 op = "<<>>->@>" + (((v>>22) & 3) << 1);
119 sprint(str, "R%ld%c%c%ld", (v>>16)&0x1F, op[0], op[1], (v>>10)&0x3F);
121 sprint(str+strlen(str), "(R%d)", a->reg);
125 sprint(str, "$*$%N", a);
127 sprint(str, "%N(R%d)(CONST)", a, a->reg);
132 sprint(str, "%N(R%d)", a, a->reg);
134 sprint(str, "%N", a);
139 sprint(str, "%N(R%d)!", a, a->reg);
141 sprint(str, "%N!", a);
146 sprint(str, "(R%d)%N!", a->reg, a);
148 sprint(str, "%N!", a);
154 snprint(str, sizeof(str), "R%ld%s<<%ld", (v>>16)&31, extop[(v>>13)&7], (v>>10)&7);
156 snprint(str, sizeof(str), "R%ld%s", (v>>16)&31, extop[(v>>13)&7]);
162 snprint(str, sizeof(str), "(R%d)[R%ld%s]", a->reg, v&31, extop[(v>>8)&7]);
164 snprint(str, sizeof(str), "(R%d)(R%ld%s)", a->reg, v&31, extop[(v>>8)&7]);
168 sprint(str, "R%d", a->reg);
169 if(a->name != D_NONE || a->sym != S)
170 sprint(str, "%N(R%d)(REG)", a, a->reg);
174 if(a->name != D_NONE || a->sym != S)
175 sprint(str, "%N(R%d)(REG)", a, a->reg);
181 strcpy(str, strcond[a->reg & 0xF]);
185 sprint(str, "F%d", a->reg);
186 if(a->name != D_NONE || a->sym != S)
187 sprint(str, "%N(R%d)(REG)", a, a->reg);
191 switch((ulong)a->offset){
202 sprint(str, "SPR(%#llux)", a->offset);
205 if(a->name != D_NONE || a->sym != S)
206 sprint(str, "%N(SPR%lld)(REG)", a, a->offset);
209 case D_BRANCH: /* botch */
210 if(curp->cond != P) {
213 sprint(str, "%s+%#.5lux(BRANCH)", a->sym->name, v);
215 sprint(str, "%.5lux(BRANCH)", v);
218 sprint(str, "%s+%lld(APC)", a->sym->name, a->offset);
220 sprint(str, "%lld(APC)", a->offset);
224 sprint(str, "$%e", ieeedtod(a->ieee));
228 sprint(str, "$\"%S\"", a->sval);
231 return fmtstrcpy(fp, str);
241 a = va_arg(fp->args, Adr*);
245 sprint(str, "GOK-name(%d)", a->name);
249 sprint(str, "%lld", a->offset);
254 sprint(str, "%lld(SB)", a->offset);
256 sprint(str, "%s+%lld(SB)", s->name, a->offset);
261 sprint(str, "<>+%lld(SB)", a->offset);
263 sprint(str, "%s<>+%lld(SB)", s->name, a->offset);
268 sprint(str, "%lld(SP)", a->offset);
270 sprint(str, "%s-%lld(SP)", s->name, -a->offset);
275 sprint(str, "%lld(FP)", a->offset);
277 sprint(str, "%s+%lld(FP)", s->name, a->offset);
280 return fmtstrcpy(fp, str);
289 a = va_arg(fp->args, int);
291 if(a >= C_NONE && a <= C_NCLASS)
293 return fmtstrcpy(fp, s);
306 char str[STRINGSZ], *p, *a;
308 a = va_arg(fp->args, char*);
310 for(i=0; i<sizeof(long); i++) {
312 if(c >= 'a' && c <= 'z' ||
313 c >= 'A' && c <= 'Z' ||
314 c >= '0' && c <= '9' ||
315 c == ' ' || c == '%') {
336 *p++ = ((c>>3) & 7) + '0';
337 *p++ = (c & 7) + '0';
340 return fmtstrcpy(fp, str);
346 char buf[STRINGSZ], *tn;
350 if(curtext != P && curtext->from.sym != S)
351 tn = curtext->from.sym->name;
353 vseprint(buf, buf+sizeof(buf), fmt, arg);
355 print("%s: %s\n", tn, buf);
359 print("too many errors\n");