1e887ea33SDavid du Colombier #define EXTERN
2e887ea33SDavid du Colombier #include "gc.h"
3e887ea33SDavid du Colombier
4e887ea33SDavid du Colombier void
listinit(void)5e887ea33SDavid du Colombier listinit(void)
6e887ea33SDavid du Colombier {
7e887ea33SDavid du Colombier
8e887ea33SDavid du Colombier fmtinstall('A', Aconv);
9e887ea33SDavid du Colombier fmtinstall('B', Bconv);
10e887ea33SDavid du Colombier fmtinstall('P', Pconv);
11e887ea33SDavid du Colombier fmtinstall('S', Sconv);
12e887ea33SDavid du Colombier fmtinstall('D', Dconv);
13e887ea33SDavid du Colombier fmtinstall('R', Rconv);
14e887ea33SDavid du Colombier }
15e887ea33SDavid du Colombier
16e887ea33SDavid du Colombier int
Bconv(Fmt * fp)17e887ea33SDavid du Colombier Bconv(Fmt *fp)
18e887ea33SDavid du Colombier {
19e887ea33SDavid du Colombier char str[STRINGSZ], ss[STRINGSZ], *s;
20e887ea33SDavid du Colombier Bits bits;
21e887ea33SDavid du Colombier int i;
22e887ea33SDavid du Colombier
23e887ea33SDavid du Colombier str[0] = 0;
24e887ea33SDavid du Colombier bits = va_arg(fp->args, Bits);
25e887ea33SDavid du Colombier while(bany(&bits)) {
26e887ea33SDavid du Colombier i = bnum(bits);
27e887ea33SDavid du Colombier if(str[0])
28e887ea33SDavid du Colombier strcat(str, " ");
29e887ea33SDavid du Colombier if(var[i].sym == S) {
30e887ea33SDavid du Colombier sprint(ss, "$%lld", var[i].offset);
31e887ea33SDavid du Colombier s = ss;
32e887ea33SDavid du Colombier } else
33e887ea33SDavid du Colombier s = var[i].sym->name;
34e887ea33SDavid du Colombier if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
35e887ea33SDavid du Colombier break;
36e887ea33SDavid du Colombier strcat(str, s);
37e887ea33SDavid du Colombier bits.b[i/32] &= ~(1L << (i%32));
38e887ea33SDavid du Colombier }
39e887ea33SDavid du Colombier return fmtstrcpy(fp, str);
40e887ea33SDavid du Colombier }
41e887ea33SDavid du Colombier
42e887ea33SDavid du Colombier int
Pconv(Fmt * fp)43e887ea33SDavid du Colombier Pconv(Fmt *fp)
44e887ea33SDavid du Colombier {
45e887ea33SDavid du Colombier char str[STRINGSZ];
46e887ea33SDavid du Colombier Prog *p;
47e887ea33SDavid du Colombier
48e887ea33SDavid du Colombier p = va_arg(fp->args, Prog*);
49e887ea33SDavid du Colombier if(p->as == ADATA)
50*40d01547SDavid du Colombier snprint(str, sizeof(str), " %A %D/%d,%D",
51e887ea33SDavid du Colombier p->as, &p->from, p->from.scale, &p->to);
52e887ea33SDavid du Colombier else if(p->as == ATEXT)
53*40d01547SDavid du Colombier snprint(str, sizeof(str), " %A %D,%d,%D",
54e887ea33SDavid du Colombier p->as, &p->from, p->from.scale, &p->to);
55e887ea33SDavid du Colombier else
56*40d01547SDavid du Colombier snprint(str, sizeof(str), " %A %D,%D",
57e887ea33SDavid du Colombier p->as, &p->from, &p->to);
58e887ea33SDavid du Colombier return fmtstrcpy(fp, str);
59e887ea33SDavid du Colombier }
60e887ea33SDavid du Colombier
61e887ea33SDavid du Colombier int
Aconv(Fmt * fp)62e887ea33SDavid du Colombier Aconv(Fmt *fp)
63e887ea33SDavid du Colombier {
64e887ea33SDavid du Colombier int i;
65e887ea33SDavid du Colombier
66e887ea33SDavid du Colombier i = va_arg(fp->args, int);
67e887ea33SDavid du Colombier return fmtstrcpy(fp, anames[i]);
68e887ea33SDavid du Colombier }
69e887ea33SDavid du Colombier
70e887ea33SDavid du Colombier int
Dconv(Fmt * fp)71e887ea33SDavid du Colombier Dconv(Fmt *fp)
72e887ea33SDavid du Colombier {
73e887ea33SDavid du Colombier char str[40], s[20];
74e887ea33SDavid du Colombier Adr *a;
75e887ea33SDavid du Colombier int i;
76e887ea33SDavid du Colombier
77e887ea33SDavid du Colombier a = va_arg(fp->args, Adr*);
78e887ea33SDavid du Colombier i = a->type;
79*40d01547SDavid du Colombier if(i >= D_INDIR && i < D_CONST2) {
80e887ea33SDavid du Colombier if(a->offset)
81*40d01547SDavid du Colombier snprint(str, sizeof(str), "%lld(%R)", a->offset, i-D_INDIR);
82e887ea33SDavid du Colombier else
83*40d01547SDavid du Colombier snprint(str, sizeof(str), "(%R)", i-D_INDIR);
84e887ea33SDavid du Colombier goto brk;
85e887ea33SDavid du Colombier }
86e887ea33SDavid du Colombier switch(i) {
87e887ea33SDavid du Colombier
88e887ea33SDavid du Colombier default:
89e887ea33SDavid du Colombier if(a->offset)
90*40d01547SDavid du Colombier snprint(str, sizeof(str), "$%lld,%R", a->offset, i);
91e887ea33SDavid du Colombier else
92*40d01547SDavid du Colombier snprint(str, sizeof(str), "%R", i);
93e887ea33SDavid du Colombier break;
94e887ea33SDavid du Colombier
95e887ea33SDavid du Colombier case D_NONE:
96e887ea33SDavid du Colombier str[0] = 0;
97e887ea33SDavid du Colombier break;
98e887ea33SDavid du Colombier
99e887ea33SDavid du Colombier case D_BRANCH:
100*40d01547SDavid du Colombier snprint(str, sizeof(str), "%lld(PC)", a->offset-pc);
101e887ea33SDavid du Colombier break;
102e887ea33SDavid du Colombier
103e887ea33SDavid du Colombier case D_EXTERN:
104*40d01547SDavid du Colombier snprint(str, sizeof(str), "%s+%lld(SB)", a->sym->name, a->offset);
105e887ea33SDavid du Colombier break;
106e887ea33SDavid du Colombier
107e887ea33SDavid du Colombier case D_STATIC:
108*40d01547SDavid du Colombier snprint(str, sizeof(str), "%s<>+%lld(SB)", a->sym->name,
109e887ea33SDavid du Colombier a->offset);
110e887ea33SDavid du Colombier break;
111e887ea33SDavid du Colombier
112e887ea33SDavid du Colombier case D_AUTO:
113*40d01547SDavid du Colombier snprint(str, sizeof(str), "%s+%lld(SP)", a->sym->name, a->offset);
114e887ea33SDavid du Colombier break;
115e887ea33SDavid du Colombier
116e887ea33SDavid du Colombier case D_PARAM:
117e887ea33SDavid du Colombier if(a->sym)
118*40d01547SDavid du Colombier snprint(str, sizeof(str), "%s+%lld(FP)", a->sym->name, a->offset);
119e887ea33SDavid du Colombier else
120*40d01547SDavid du Colombier snprint(str, sizeof(str), "%lld(FP)", a->offset);
121e887ea33SDavid du Colombier break;
122e887ea33SDavid du Colombier
123e887ea33SDavid du Colombier case D_CONST:
124*40d01547SDavid du Colombier snprint(str, sizeof(str), "$%lld", a->offset);
125e887ea33SDavid du Colombier break;
126e887ea33SDavid du Colombier
127e887ea33SDavid du Colombier case D_FCONST:
128*40d01547SDavid du Colombier snprint(str, sizeof(str), "$(%.17e)", a->dval);
129e887ea33SDavid du Colombier break;
130e887ea33SDavid du Colombier
131e887ea33SDavid du Colombier case D_SCONST:
132*40d01547SDavid du Colombier snprint(str, sizeof(str), "$\"%S\"", a->sval);
133e887ea33SDavid du Colombier break;
134e887ea33SDavid du Colombier
135e887ea33SDavid du Colombier case D_ADDR:
136e887ea33SDavid du Colombier a->type = a->index;
137e887ea33SDavid du Colombier a->index = D_NONE;
138*40d01547SDavid du Colombier snprint(str, sizeof(str), "$%D", a);
139e887ea33SDavid du Colombier a->index = a->type;
140e887ea33SDavid du Colombier a->type = D_ADDR;
141e887ea33SDavid du Colombier goto conv;
142e887ea33SDavid du Colombier }
143e887ea33SDavid du Colombier brk:
144e887ea33SDavid du Colombier if(a->index != D_NONE) {
145*40d01547SDavid du Colombier fmtstrcpy(fp, str);
146*40d01547SDavid du Colombier snprint(s, sizeof(s), "(%R*%d)", (int)a->index, (int)a->scale);
147*40d01547SDavid du Colombier return fmtstrcpy(fp, s);
148e887ea33SDavid du Colombier }
149e887ea33SDavid du Colombier conv:
150e887ea33SDavid du Colombier return fmtstrcpy(fp, str);
151e887ea33SDavid du Colombier }
152e887ea33SDavid du Colombier
153e887ea33SDavid du Colombier char* regstr[] =
154e887ea33SDavid du Colombier {
155e887ea33SDavid du Colombier "AL", /* [D_AL] */
156e887ea33SDavid du Colombier "CL",
157e887ea33SDavid du Colombier "DL",
158e887ea33SDavid du Colombier "BL",
159e887ea33SDavid du Colombier "SPB",
160e887ea33SDavid du Colombier "BPB",
161e887ea33SDavid du Colombier "SIB",
162e887ea33SDavid du Colombier "DIB",
163e887ea33SDavid du Colombier "R8B",
164e887ea33SDavid du Colombier "R9B",
165e887ea33SDavid du Colombier "R10B",
166e887ea33SDavid du Colombier "R11B",
167e887ea33SDavid du Colombier "R12B",
168e887ea33SDavid du Colombier "R13B",
169e887ea33SDavid du Colombier "R14B",
170e887ea33SDavid du Colombier "R15B",
171e887ea33SDavid du Colombier
172e887ea33SDavid du Colombier "AX", /* [D_AX] */
173e887ea33SDavid du Colombier "CX",
174e887ea33SDavid du Colombier "DX",
175e887ea33SDavid du Colombier "BX",
176e887ea33SDavid du Colombier "SP",
177e887ea33SDavid du Colombier "BP",
178e887ea33SDavid du Colombier "SI",
179e887ea33SDavid du Colombier "DI",
180e887ea33SDavid du Colombier "R8",
181e887ea33SDavid du Colombier "R9",
182e887ea33SDavid du Colombier "R10",
183e887ea33SDavid du Colombier "R11",
184e887ea33SDavid du Colombier "R12",
185e887ea33SDavid du Colombier "R13",
186e887ea33SDavid du Colombier "R14",
187e887ea33SDavid du Colombier "R15",
188e887ea33SDavid du Colombier
189e887ea33SDavid du Colombier "AH",
190e887ea33SDavid du Colombier "CH",
191e887ea33SDavid du Colombier "DH",
192e887ea33SDavid du Colombier "BH",
193e887ea33SDavid du Colombier
194*40d01547SDavid du Colombier "Y0", /* [D_Y0] */
195*40d01547SDavid du Colombier "Y1",
196*40d01547SDavid du Colombier "Y2",
197*40d01547SDavid du Colombier "Y3",
198*40d01547SDavid du Colombier "Y4",
199*40d01547SDavid du Colombier "Y5",
200*40d01547SDavid du Colombier "Y6",
201*40d01547SDavid du Colombier "Y7",
202e887ea33SDavid du Colombier
203*40d01547SDavid du Colombier "Y8",
204*40d01547SDavid du Colombier "Y9",
205*40d01547SDavid du Colombier "Y10",
206*40d01547SDavid du Colombier "Y11",
207*40d01547SDavid du Colombier "Y12",
208*40d01547SDavid du Colombier "Y13",
209*40d01547SDavid du Colombier "Y14",
210*40d01547SDavid du Colombier "Y15",
211e887ea33SDavid du Colombier
212e887ea33SDavid du Colombier "X0",
213e887ea33SDavid du Colombier "X1",
214e887ea33SDavid du Colombier "X2",
215e887ea33SDavid du Colombier "X3",
216e887ea33SDavid du Colombier "X4",
217e887ea33SDavid du Colombier "X5",
218e887ea33SDavid du Colombier "X6",
219e887ea33SDavid du Colombier "X7",
220e887ea33SDavid du Colombier "X8",
221e887ea33SDavid du Colombier "X9",
222e887ea33SDavid du Colombier "X10",
223e887ea33SDavid du Colombier "X11",
224e887ea33SDavid du Colombier "X12",
225e887ea33SDavid du Colombier "X13",
226e887ea33SDavid du Colombier "X14",
227e887ea33SDavid du Colombier "X15",
228e887ea33SDavid du Colombier
229e887ea33SDavid du Colombier "CS", /* [D_CS] */
230e887ea33SDavid du Colombier "SS",
231e887ea33SDavid du Colombier "DS",
232e887ea33SDavid du Colombier "ES",
233e887ea33SDavid du Colombier "FS",
234e887ea33SDavid du Colombier "GS",
235e887ea33SDavid du Colombier
236e887ea33SDavid du Colombier "GDTR", /* [D_GDTR] */
237e887ea33SDavid du Colombier "IDTR", /* [D_IDTR] */
238e887ea33SDavid du Colombier "LDTR", /* [D_LDTR] */
239e887ea33SDavid du Colombier "MSW", /* [D_MSW] */
240e887ea33SDavid du Colombier "TASK", /* [D_TASK] */
241e887ea33SDavid du Colombier
242e887ea33SDavid du Colombier "CR0", /* [D_CR] */
243e887ea33SDavid du Colombier "CR1",
244e887ea33SDavid du Colombier "CR2",
245e887ea33SDavid du Colombier "CR3",
246e887ea33SDavid du Colombier "CR4",
247e887ea33SDavid du Colombier "CR5",
248e887ea33SDavid du Colombier "CR6",
249e887ea33SDavid du Colombier "CR7",
250e887ea33SDavid du Colombier "CR8",
251e887ea33SDavid du Colombier "CR9",
252e887ea33SDavid du Colombier "CR10",
253e887ea33SDavid du Colombier "CR11",
254e887ea33SDavid du Colombier "CR12",
255e887ea33SDavid du Colombier "CR13",
256e887ea33SDavid du Colombier "CR14",
257e887ea33SDavid du Colombier "CR15",
258e887ea33SDavid du Colombier
259e887ea33SDavid du Colombier "DR0", /* [D_DR] */
260e887ea33SDavid du Colombier "DR1",
261e887ea33SDavid du Colombier "DR2",
262e887ea33SDavid du Colombier "DR3",
263e887ea33SDavid du Colombier "DR4",
264e887ea33SDavid du Colombier "DR5",
265e887ea33SDavid du Colombier "DR6",
266e887ea33SDavid du Colombier "DR7",
267e887ea33SDavid du Colombier
268e887ea33SDavid du Colombier "TR0", /* [D_TR] */
269e887ea33SDavid du Colombier "TR1",
270e887ea33SDavid du Colombier "TR2",
271e887ea33SDavid du Colombier "TR3",
272e887ea33SDavid du Colombier "TR4",
273e887ea33SDavid du Colombier "TR5",
274e887ea33SDavid du Colombier "TR6",
275e887ea33SDavid du Colombier "TR7",
276e887ea33SDavid du Colombier
277e887ea33SDavid du Colombier "NONE", /* [D_NONE] */
278e887ea33SDavid du Colombier };
279e887ea33SDavid du Colombier
280e887ea33SDavid du Colombier int
Rconv(Fmt * fp)281e887ea33SDavid du Colombier Rconv(Fmt *fp)
282e887ea33SDavid du Colombier {
283e887ea33SDavid du Colombier char str[20];
284e887ea33SDavid du Colombier int r;
285e887ea33SDavid du Colombier
286e887ea33SDavid du Colombier r = va_arg(fp->args, int);
287e887ea33SDavid du Colombier if(r >= D_AL && r <= D_NONE)
288*40d01547SDavid du Colombier snprint(str, sizeof(str), "%s", regstr[r-D_AL]);
289*40d01547SDavid du Colombier else if(r >= D_Y0 && r <= D_Y15)
290*40d01547SDavid du Colombier snprint(str, sizeof(str), "Y%d", r-D_Y0);
291*40d01547SDavid du Colombier else if(r >= D_M0 && r <= D_M7)
292*40d01547SDavid du Colombier snprint(str, sizeof(str), "M%d", r-D_M0);
293e887ea33SDavid du Colombier else
294*40d01547SDavid du Colombier snprint(str, sizeof(str), "gok(%d)", r);
295e887ea33SDavid du Colombier
296e887ea33SDavid du Colombier return fmtstrcpy(fp, str);
297e887ea33SDavid du Colombier }
298e887ea33SDavid du Colombier
299e887ea33SDavid du Colombier int
Sconv(Fmt * fp)300e887ea33SDavid du Colombier Sconv(Fmt *fp)
301e887ea33SDavid du Colombier {
302e887ea33SDavid du Colombier int i, c;
303e887ea33SDavid du Colombier char str[30], *p, *a;
304e887ea33SDavid du Colombier
305e887ea33SDavid du Colombier a = va_arg(fp->args, char*);
306e887ea33SDavid du Colombier p = str;
307e887ea33SDavid du Colombier for(i=0; i<sizeof(double); i++) {
308e887ea33SDavid du Colombier c = a[i] & 0xff;
309e887ea33SDavid du Colombier if(c >= 'a' && c <= 'z' ||
310e887ea33SDavid du Colombier c >= 'A' && c <= 'Z' ||
311e887ea33SDavid du Colombier c >= '0' && c <= '9') {
312e887ea33SDavid du Colombier *p++ = c;
313e887ea33SDavid du Colombier continue;
314e887ea33SDavid du Colombier }
315e887ea33SDavid du Colombier *p++ = '\\';
316e887ea33SDavid du Colombier switch(c) {
317e887ea33SDavid du Colombier default:
318e887ea33SDavid du Colombier if(c < 040 || c >= 0177)
319e887ea33SDavid du Colombier break; /* not portable */
320e887ea33SDavid du Colombier p[-1] = c;
321e887ea33SDavid du Colombier continue;
322e887ea33SDavid du Colombier case 0:
323e887ea33SDavid du Colombier *p++ = 'z';
324e887ea33SDavid du Colombier continue;
325e887ea33SDavid du Colombier case '\\':
326e887ea33SDavid du Colombier case '"':
327e887ea33SDavid du Colombier *p++ = c;
328e887ea33SDavid du Colombier continue;
329e887ea33SDavid du Colombier case '\n':
330e887ea33SDavid du Colombier *p++ = 'n';
331e887ea33SDavid du Colombier continue;
332e887ea33SDavid du Colombier case '\t':
333e887ea33SDavid du Colombier *p++ = 't';
334e887ea33SDavid du Colombier continue;
335e887ea33SDavid du Colombier }
336e887ea33SDavid du Colombier *p++ = (c>>6) + '0';
337e887ea33SDavid du Colombier *p++ = ((c>>3) & 7) + '0';
338e887ea33SDavid du Colombier *p++ = (c & 7) + '0';
339e887ea33SDavid du Colombier }
340e887ea33SDavid du Colombier *p = 0;
341e887ea33SDavid du Colombier return fmtstrcpy(fp, str);
342e887ea33SDavid du Colombier }
343