]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/7l/list.c
audiohda: fix syntax error
[plan9front.git] / sys / src / cmd / 7l / list.c
1 #include "l.h"
2
3 void
4 listinit(void)
5 {
6
7         fmtinstall('A', Aconv);
8         fmtinstall('D', Dconv);
9         fmtinstall('P', Pconv);
10         fmtinstall('S', Sconv);
11         fmtinstall('N', Nconv);
12         fmtinstall('R', Rconv);
13 }
14
15 int
16 Pconv(Fmt *fp)
17 {
18         Prog *p;
19         int a;
20
21         p = va_arg(fp->args, Prog*);
22         curp = p;
23         a = p->as;
24         switch(a) {
25         case ADATA:
26         case AINIT:
27         case ADYNT:
28                 return fmtprint(fp, "(%ld)      %A      %D/%d,%D",
29                         p->line, a, &p->from, p->reg, &p->to);
30
31         default:
32                 if(p->reg == NREG && p->from3.type == D_NONE)
33                         return fmtprint(fp, "(%ld)      %A      %D,%D",
34                                 p->line, a, &p->from, &p->to);
35                 else if(p->from.type == D_FREG)
36                         return fmtprint(fp, "(%ld)      %A      %D,F%d,%D",
37                                 p->line, a, &p->from, p->reg, &p->to);
38
39                 fmtprint(fp, "(%ld)     %A      %D", p->line, a, &p->from);
40                 if(p->from3.type != D_NONE)
41                         fmtprint(fp, ",%D", &p->from3);
42                 if(p->reg != NREG)
43                         fmtprint(fp, ",R%d", p->reg);
44                 fmtprint(fp, ",%D", &p->to);
45                 return 0;
46         }
47 }
48
49 int
50 Aconv(Fmt *fp)
51 {
52         char *s;
53         int a;
54
55         a = va_arg(fp->args, int);
56         s = "???";
57         if(a >= AXXX && a < ALAST && anames[a])
58                 s = anames[a];
59         return fmtstrcpy(fp, s);
60 }
61
62 char*   strcond[16] =
63 {
64         "EQ",
65         "NE",
66         "HS",
67         "LO",
68         "MI",
69         "PL",
70         "VS",
71         "VC",
72         "HI",
73         "LS",
74         "GE",
75         "LT",
76         "GT",
77         "LE",
78         "AL",
79         "NV"
80 };
81
82 int
83 Dconv(Fmt *fp)
84 {
85         char *op;
86         Adr *a;
87         long v;
88         static char *extop[] = {".UB", ".UH", ".UW", ".UX", ".SB", ".SH", ".SW", ".SX"};
89
90         a = va_arg(fp->args, Adr*);
91         switch(a->type) {
92
93         default:
94                 return fmtprint(fp, "GOK-type(%d)", a->type);
95
96         case D_NONE:
97                 if(a->name != D_NONE || a->reg != NREG || a->sym != S)
98                         return fmtprint(fp, "%N(R%d)(NONE)", a, a->reg);
99                 return 0;
100
101         case D_CONST:
102                 if(a->reg == NREG || a->reg == REGZERO)
103                         return fmtprint(fp, "$%N", a);
104                 else
105                         return fmtprint(fp, "$%N(R%d)", a, a->reg);
106
107         case D_SHIFT:
108                 v = a->offset;
109                 op = "<<>>->@>" + (((v>>22) & 3) << 1);
110                 if(a->reg == NREG)
111                         return fmtprint(fp, "R%ld%c%c%ld",
112                                 (v>>16)&0x1F, op[0], op[1], (v>>10)&0x3F);
113                 else
114                         return fmtprint(fp, "R%ld%c%c%ld(R%d)",
115                                 (v>>16)&0x1F, op[0], op[1], (v>>10)&0x3F, a->reg);
116
117         case D_OCONST:
118                 if(a->reg != NREG)
119                         return fmtprint(fp, "$*$%N(R%d)(CONST)", a, a->reg);
120                 else
121                         return fmtprint(fp, "$*$%N", a);
122
123         case D_OREG:
124                 if(a->reg != NREG)
125                         return fmtprint(fp, "%N(R%d)", a, a->reg);
126                 else
127                         return fmtprint(fp, "%N", a);
128
129         case D_XPRE:
130                 if(a->reg != NREG)
131                         return fmtprint(fp, "%N(R%d)!", a, a->reg);
132                 else
133                         return fmtprint(fp, "%N!", a);
134
135         case D_XPOST:
136                 if(a->reg != NREG)
137                         return fmtprint(fp, "(R%d)%N!", a->reg, a);
138                 else
139                         return fmtprint(fp, "%N!", a);
140
141         case D_EXTREG:
142                 v = a->offset;
143                 if(v & (7<<10))
144                         return fmtprint(fp, "R%ld%s<<%ld", (v>>16)&31, extop[(v>>13)&7], (v>>10)&7);
145                 else
146                         return fmtprint(fp, "R%ld%s", (v>>16)&31, extop[(v>>13)&7]);
147
148         case D_ROFF:
149                 v = a->offset;
150                 if(v & (1<<16))
151                         return fmtprint(fp, "(R%d)[R%ld%s]", a->reg, v&31, extop[(v>>8)&7]);
152                 else
153                         return fmtprint(fp, "(R%d)(R%ld%s)", a->reg, v&31, extop[(v>>8)&7]);
154
155         case D_REG:
156                 if(a->name != D_NONE || a->sym != S)
157                         return fmtprint(fp, "%N(R%d)(REG)", a, a->reg);
158                 else
159                         return fmtprint(fp, "R%d", a->reg);
160
161         case D_SP:
162                 if(a->name != D_NONE || a->sym != S)
163                         return fmtprint(fp, "%N(R%d)(REG)", a, a->reg);
164                 else
165                         return fmtprint(fp, "SP");
166
167         case D_COND:
168                 return fmtprint(fp, "%s", strcond[a->reg & 0xF]);
169
170         case D_FREG:
171                 if(a->name != D_NONE || a->sym != S)
172                         return fmtprint(fp, "%N(R%d)(REG)", a, a->reg);
173                 else
174                         return fmtprint(fp, "F%d", a->reg);
175
176         case D_SPR:
177                 if(a->name != D_NONE || a->sym != S)
178                         return fmtprint(fp, "%N(SPR%lld)(REG)", a, a->offset);
179                 switch((ulong)a->offset){
180                 case D_FPSR:
181                         return fmtprint(fp, "FPSR");
182                 case D_FPCR:
183                         return fmtprint(fp, "FPCR");
184                 case D_NZCV:
185                         return fmtprint(fp, "NZCV");
186                 default:
187                         return fmtprint(fp, "SPR(%#llux)", a->offset);
188                 }
189
190         case D_BRANCH:  /* botch */
191                 if(curp->cond != P) {
192                         v = curp->cond->pc;
193                         if(a->sym != S)
194                                 return fmtprint(fp, "%s+%#.5lux(BRANCH)", a->sym->name, v);
195                         else
196                                 return fmtprint(fp, "%.5lux(BRANCH)", v);
197                 } else {
198                         if(a->sym != S)
199                                 return fmtprint(fp, "%s+%lld(APC)", a->sym->name, a->offset);
200                         else
201                                 return fmtprint(fp, "%lld(APC)", a->offset);
202                 }
203
204         case D_FCONST:
205                 return fmtprint(fp, "$%e", ieeedtod(a->ieee));
206
207         case D_SCONST:
208                 return fmtprint(fp, "$\"%S\"", a->sval);
209         }
210 }
211
212 int
213 Nconv(Fmt *fp)
214 {
215         Adr *a;
216         Sym *s;
217
218         a = va_arg(fp->args, Adr*);
219         s = a->sym;
220         switch(a->name) {
221         default:
222                 return fmtprint(fp, "GOK-name(%d)", a->name);
223
224         case D_NONE:
225                 return fmtprint(fp, "%lld", a->offset);
226
227         case D_EXTERN:
228                 if(s == S)
229                         return fmtprint(fp, "%lld(SB)", a->offset);
230                 else
231                         return fmtprint(fp, "%s+%lld(SB)", s->name, a->offset);
232
233         case D_STATIC:
234                 if(s == S)
235                         return fmtprint(fp, "<>+%lld(SB)", a->offset);
236                 else
237                         return fmtprint(fp, "%s<>+%lld(SB)", s->name, a->offset);
238
239         case D_AUTO:
240                 if(s == S)
241                         return fmtprint(fp, "%lld(SP)", a->offset);
242                 else
243                         return fmtprint(fp, "%s-%lld(SP)", s->name, -a->offset);
244
245         case D_PARAM:
246                 if(s == S)
247                         return fmtprint(fp, "%lld(FP)", a->offset);
248                 else
249                         return fmtprint(fp, "%s+%lld(FP)", s->name, a->offset);
250         }
251 }
252
253 int
254 Rconv(Fmt *fp)
255 {
256         char *s;
257         int a;
258
259         a = va_arg(fp->args, int);
260         s = "C_??";
261         if(a >= C_NONE && a <= C_NCLASS)
262                 s = cnames[a];
263         return fmtstrcpy(fp, s);
264 }
265
266 void
267 prasm(Prog *p)
268 {
269         print("%P\n", p);
270 }
271
272 int
273 Sconv(Fmt *fp)
274 {
275         int i, c;
276         char str[STRINGSZ], *p, *a;
277
278         a = va_arg(fp->args, char*);
279         p = str;
280         for(i=0; i<sizeof(long); i++) {
281                 c = a[i] & 0xff;
282                 if(c >= 'a' && c <= 'z' ||
283                    c >= 'A' && c <= 'Z' ||
284                    c >= '0' && c <= '9' ||
285                    c == ' ' || c == '%') {
286                         *p++ = c;
287                         continue;
288                 }
289                 *p++ = '\\';
290                 switch(c) {
291                 case 0:
292                         *p++ = 'z';
293                         continue;
294                 case '\\':
295                 case '"':
296                         *p++ = c;
297                         continue;
298                 case '\n':
299                         *p++ = 'n';
300                         continue;
301                 case '\t':
302                         *p++ = 't';
303                         continue;
304                 }
305                 *p++ = (c>>6) + '0';
306                 *p++ = ((c>>3) & 7) + '0';
307                 *p++ = (c & 7) + '0';
308         }
309         *p = 0;
310         return fmtstrcpy(fp, str);
311 }
312
313 void
314 diag(char *fmt, ...)
315 {
316         char buf[STRINGSZ], *tn;
317         va_list arg;
318
319         tn = "??none??";
320         if(curtext != P && curtext->from.sym != S)
321                 tn = curtext->from.sym->name;
322         va_start(arg, fmt);
323         vseprint(buf, buf+sizeof(buf), fmt, arg);
324         va_end(arg);
325         print("%s: %s\n", tn, buf);
326
327         nerrors++;
328         if(nerrors > 10) {
329                 print("too many errors\n");
330                 errorexit();
331         }
332 }