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 if(p->as == ABSR && q->pc < 32768L && q->pc >= 0)
109 if(v < -128 || v >= 128)
127 INITDAT = rnd(c, INITRND);
128 if(INITDAT != idat) {
132 xdefine("etext", STEXT, c);
133 xdefine("a6base", STEXT, INITDAT+A6OFFSET);
135 Bprint(&bso, "etext = %lux\n", c);
137 for(p = textp; p != P; p = p->pcond)
138 p->from.sym->value = p->pc;
139 textsize = c - INITTEXT;
143 xdefine(char *p, int t, long v)
148 if(s->type == 0 || s->type == SXREF) {
152 if(s->type == STEXT && s->value == 0)
157 andsize(Prog *p, Adr *ap)
164 if(ap->index != D_NONE) {
169 if(v < -32768L || v >= 32768L)
179 if(ap->sym->type == STEXT)
180 return n+4; /* see below */
181 v = ap->sym->value + ap->offset - A6OFFSET;
183 v += INITDAT + A6OFFSET;
187 if(v < -32768L || v >= 32768L)
197 if((n&070) != 020) /* D_INDIR */
201 if(v < -32768L || v >= 32768L)
202 return 6; /* switch to index1 mode */
205 if((t&I_MASK) == I_ADDR)
218 if(v < -32768L || v >= 32768L)
219 return 6; /* switch to index1 mode */
222 case I_INDIR|D_CONST:
228 if(ap->sym->type == STEXT)
229 return 4; /* too slow to get back into namelist */
230 v = ap->sym->value + ap->offset - A6OFFSET;
232 v += INITDAT + A6OFFSET;
239 if(v < -32768L || v >= 32768L)
258 if(t >= D_A0 && t <= D_A0+8)
261 if(t >= D_A0 && t <= D_A0+8)
287 putsymb(Sym *s, int t, long v)
298 CPUT(t+0x80); /* 0x80 is variable length */
300 if(t == 'Z' || t == 'z') {
302 for(i=1; n[i] != 0 || n[i+1] != 0; i += 2) {
315 symsize += 4 + 1 + i + 1;
318 if(t == 'z' || t == 'Z') {
319 Bprint(&bso, "%c %.8lux ", t, v);
320 for(i=1; n[i] != 0 || n[i+1] != 0; i+=2) {
321 f = ((n[i]&0xff) << 8) | (n[i+1]&0xff);
322 Bprint(&bso, "/%x", f);
328 Bprint(&bso, "%c %.8lux %s<%d>\n", t, v, n, s->version);
330 Bprint(&bso, "%c %.8lux %s\n", t, v, n);
342 s = lookup("etext", 0);
344 putsymb(s, 'T', s->value);
345 s = lookup("a6base", 0);
347 putsymb(s, 'D', s->value);
349 for(h=0; h<NHASH; h++)
350 for(s=hash[h]; s!=S; s=s->link)
353 putsymb(s, 'D', s->value+INITDAT);
357 putsymb(s, 'B', s->value+INITDAT);
361 putsymb(s, 'f', s->value);
365 for(p=textp; p!=P; p=p->pcond) {
370 /* filenames first */
371 for(a=p->to.autom; a; a=a->link)
372 if(a->type == D_FILE)
373 putsymb(a->asym, 'z', a->aoffset);
375 if(a->type == D_FILE1)
376 putsymb(a->asym, 'Z', a->aoffset);
378 putsymb(s, 'T', s->value);
380 /* auto and param after */
381 for(a=p->to.autom; a; a=a->link)
382 if(a->type == D_AUTO)
383 putsymb(a->asym, 'a', -a->aoffset);
385 if(a->type == D_PARAM)
386 putsymb(a->asym, 'p', a->aoffset);
388 if(debug['v'] || debug['n'])
389 Bprint(&bso, "symsize = %lud\n", symsize);
404 for(p = firstp; p != P; p = p->link) {
405 if(p->stkoff == oldsp || p->as == ATEXT || p->as == ANOP) {
409 Bprint(&bso, "%6lux %4ld%P\n",
410 p->pc, p->stkoff, p);
414 Bprint(&bso, "\t\t%6ld", spsize);
415 v = (p->pc - oldpc) / MINLC;
420 CPUT(s+128); /* 129-255 +pc */
422 Bprint(&bso, " pc+%d*2(%d)", s, s+128);
426 v = p->stkoff - oldsp;
428 oldpc = p->pc + MINLC;
429 if(v & 3 || v > 64L*4L || v < -64L*4L) {
430 CPUT(0); /* 0 vvvv +sp */
434 Bprint(&bso, " sp+%ld*1(%d,%ld)\n",
437 Bprint(&bso, " sp%ld*1(%d,%ld)\n",
439 Bprint(&bso, "%6lux %4ld%P\n",
440 p->pc, p->stkoff, p);
447 CPUT(0+s); /* 1-64 +sp */
449 Bprint(&bso, " sp+%d*4(%d)\n", s, 0+s);
450 Bprint(&bso, "%6lux %4ld%P\n",
451 p->pc, p->stkoff, p);
454 CPUT(64-s); /* 65-128 -sp */
456 Bprint(&bso, " sp%d*4(%d)\n", s, 64-s);
457 Bprint(&bso, "%6lux %4ld%P\n",
458 p->pc, p->stkoff, p);
468 if(debug['v'] || debug['G'])
469 Bprint(&bso, "stsize = %ld\n", spsize);
482 for(p = firstp; p != P; p = p->link) {
483 if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) {
487 Bprint(&bso, "%6lux %P\n",
492 Bprint(&bso, "\t\t%6ld", lcsize);
493 v = (p->pc - oldpc) / MINLC;
498 CPUT(s+128); /* 129-255 +pc */
500 Bprint(&bso, " pc+%ld*%d(%ld)", s, MINLC, s+128);
506 oldpc = p->pc + MINLC;
507 if(s > 64 || s < -64) {
508 CPUT(0); /* 0 vv +lc */
515 Bprint(&bso, " lc+%ld(%d,%ld)\n",
518 Bprint(&bso, " lc%ld(%d,%ld)\n",
520 Bprint(&bso, "%6lux %P\n",
527 CPUT(0+s); /* 1-64 +lc */
529 Bprint(&bso, " lc+%ld(%ld)\n", s, 0+s);
530 Bprint(&bso, "%6lux %P\n",
534 CPUT(64-s); /* 65-128 -lc */
536 Bprint(&bso, " lc%ld(%ld)\n", s, 64-s);
537 Bprint(&bso, "%6lux %P\n",
548 if(debug['v'] || debug['L'])
549 Bprint(&bso, "lcsize = %ld\n", lcsize);