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