11 xdefine("etext", STEXT, 0L);
12 xdefine("a6base", STEXT, 0L);
14 for(p = firstp; p != P; p = p->link) {
18 if((q = p->pcond) != P)
26 if((v < -8 && v >= -32768L) || (v > 8 && v < 32768L)) {
28 p->from.type = I_INDIR | (D_A0+7);
38 p->from.type = D_QUICK;
47 Bprint(&bso, "%5.2f span\n", cputime());
50 for(p = firstp; p != P; p = p->link) {
55 m = mmsize[o->optype];
65 if(p->from.type != D_NONE)
66 m += andsize(p, &p->from);
67 if(p->to.type == D_BRANCH) {
76 if(p->to.type != D_NONE)
77 m += andsize(p, &p->to);
85 Bprint(&bso, "%5.2f span %d\n", cputime(), n);
88 diag("span must be looping");
92 for(p = firstp; p != P; p = p->link) {
95 if((m = p->mark) & 0100) {
103 if(v < -32768L || v >= 32768L) {
104 c += 6; /* only jsr and jmp can do this */
106 if(v < -128 || v >= 128)
124 INITDAT = rnd(c, INITRND);
125 if(INITDAT != idat) {
129 xdefine("etext", STEXT, c);
130 xdefine("a6base", STEXT, INITDAT+A6OFFSET);
132 Bprint(&bso, "etext = %lux\n", c);
134 for(p = textp; p != P; p = p->pcond)
135 p->from.sym->value = p->pc;
136 textsize = c - INITTEXT;
140 xdefine(char *p, int t, long v)
145 if(s->type == 0 || s->type == SXREF) {
149 if(s->type == STEXT && s->value == 0)
154 andsize(Prog *p, Adr *ap)
166 if((n&070) != 020) /* D_INDIR */
172 if((t&I_MASK) == I_ADDR)
187 case I_INDIR|D_CONST:
189 if(v < -32768L || v >= 32768L)
195 if(ap->sym->type == STEXT) {
200 v = ap->sym->value + ap->offset - A6OFFSET;
203 if(v < -32768L || v >= 32768L)
222 if(t >= D_A0 && t <= D_A0+8)
225 if(t >= D_A0 && t <= D_A0+8)
251 putsymb(Sym *s, int t, long v)
262 CPUT(t+0x80); /* 0x80 is variable length */
264 if(t == 'Z' || t == 'z') {
266 for(i=1; n[i] != 0 || n[i+1] != 0; i += 2) {
279 symsize += 4 + 1 + i + 1;
282 if(t == 'z' || t == 'Z') {
283 Bprint(&bso, "%c %.8lux ", t, v);
284 for(i=1; n[i] != 0 || n[i+1] != 0; i+=2) {
285 f = ((n[i]&0xff) << 8) | (n[i+1]&0xff);
286 Bprint(&bso, "/%x", f);
292 Bprint(&bso, "%c %.8lux %s<%d>\n", t, v, n, s->version);
294 Bprint(&bso, "%c %.8lux %s\n", t, v, n);
306 s = lookup("etext", 0);
308 putsymb(s, 'T', s->value);
309 s = lookup("a6base", 0);
311 putsymb(s, 'D', s->value);
313 for(h=0; h<NHASH; h++)
314 for(s=hash[h]; s!=S; s=s->link)
317 putsymb(s, 'D', s->value+INITDAT);
321 putsymb(s, 'B', s->value+INITDAT);
325 putsymb(s, 'f', s->value);
329 for(p=textp; p!=P; p=p->pcond) {
334 /* filenames first */
335 for(a=p->to.autom; a; a=a->link)
336 if(a->type == D_FILE)
337 putsymb(a->asym, 'z', a->aoffset);
339 if(a->type == D_FILE1)
340 putsymb(a->asym, 'Z', a->aoffset);
342 putsymb(s, 'T', s->value);
344 /* auto and param after */
345 for(a=p->to.autom; a; a=a->link)
346 if(a->type == D_AUTO)
347 putsymb(a->asym, 'a', -a->aoffset);
349 if(a->type == D_PARAM)
350 putsymb(a->asym, 'p', a->aoffset);
352 if(debug['v'] || debug['n'])
353 Bprint(&bso, "symsize = %lud\n", symsize);
368 for(p = firstp; p != P; p = p->link) {
369 if(p->stkoff == oldsp || p->as == ATEXT || p->as == ANOP) {
373 Bprint(&bso, "%6lux %4ld%P\n",
374 p->pc, p->stkoff, p);
378 Bprint(&bso, "\t\t%6ld", spsize);
379 v = (p->pc - oldpc) / MINLC;
384 CPUT(s+128); /* 129-255 +pc */
386 Bprint(&bso, " pc+%d*2(%d)", s, s+128);
390 v = p->stkoff - oldsp;
392 oldpc = p->pc + MINLC;
393 if(v & 3 || v > 64L*4L || v < -64L*4L) {
394 CPUT(0); /* 0 vvvv +sp */
398 Bprint(&bso, " sp+%ld*1(%d,%ld)\n",
401 Bprint(&bso, " sp%ld*1(%d,%ld)\n",
403 Bprint(&bso, "%6lux %4ld%P\n",
404 p->pc, p->stkoff, p);
411 CPUT(0+s); /* 1-64 +sp */
413 Bprint(&bso, " sp+%d*4(%d)\n", s, 0+s);
414 Bprint(&bso, "%6lux %4ld%P\n",
415 p->pc, p->stkoff, p);
418 CPUT(64-s); /* 65-128 -sp */
420 Bprint(&bso, " sp%d*4(%d)\n", s, 64-s);
421 Bprint(&bso, "%6lux %4ld%P\n",
422 p->pc, p->stkoff, p);
432 if(debug['v'] || debug['G'])
433 Bprint(&bso, "stsize = %ld\n", spsize);
446 for(p = firstp; p != P; p = p->link) {
447 if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) {
451 Bprint(&bso, "%6lux %P\n",
456 Bprint(&bso, "\t\t%6ld", lcsize);
457 v = (p->pc - oldpc) / MINLC;
462 CPUT(s+128); /* 129-255 +pc */
464 Bprint(&bso, " pc+%ld*%d(%ld)", s, MINLC, s+128);
470 oldpc = p->pc + MINLC;
471 if(s > 64 || s < -64) {
472 CPUT(0); /* 0 vv +lc */
479 Bprint(&bso, " lc+%ld(%d,%ld)\n",
482 Bprint(&bso, " lc%ld(%d,%ld)\n",
484 Bprint(&bso, "%6lux %P\n",
491 CPUT(0+s); /* 1-64 +lc */
493 Bprint(&bso, " lc+%ld(%ld)\n", s, 0+s);
494 Bprint(&bso, "%6lux %P\n",
498 CPUT(64-s); /* 65-128 -lc */
500 Bprint(&bso, " lc%ld(%ld)\n", s, 64-s);
501 Bprint(&bso, "%6lux %P\n",
512 if(debug['v'] || debug['L'])
513 Bprint(&bso, "lcsize = %ld\n", lcsize);