char *cast;
int32 l, fl, j;
int i, c;
+ Adr *a;
memset(buf.dbuf, 0, n+Dbufslop);
for(p = datap; p != P; p = p->link) {
- curp = p;
- if(!p->from.sym->reachable)
- diag("unreachable symbol in datblk - %s", p->from.sym->name);
- if(p->from.sym->type == SMACHO)
+ a = &p->from;
+
+ l = a->sym->value + a->offset - s;
+ if(l >= n)
continue;
- l = p->from.sym->value + p->from.offset - s;
- c = p->from.scale;
+
+ c = a->scale;
i = 0;
if(l < 0) {
if(l+c <= 0)
continue;
- while(l < 0) {
- l++;
- i++;
- }
+ i = -l;
+ l = 0;
}
- if(l >= n)
+
+ curp = p;
+ if(!a->sym->reachable)
+ diag("unreachable symbol in datblk - %s", a->sym->name);
+ if(a->sym->type == SMACHO)
continue;
+
if(p->as != AINIT && p->as != ADYNT) {
for(j=l+(c-i)-1; j>=l; j--)
if(buf.dbuf[j]) {
case 4:
fl = ieeedtof(&p->to.ieee);
cast = (char*)&fl;
- if(debug['a'] && i == 0) {
- Bprint(&bso, pcstr, l+s+INITDAT);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", cast[fnuxi4[j]] & 0xff);
- Bprint(&bso, "\t%P\n", curp);
- }
for(; i<c; i++) {
buf.dbuf[l] = cast[fnuxi4[i]];
l++;
break;
case 8:
cast = (char*)&p->to.ieee;
- if(debug['a'] && i == 0) {
- Bprint(&bso, pcstr, l+s+INITDAT);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", cast[fnuxi8[j]] & 0xff);
- Bprint(&bso, "\t%P\n", curp);
- }
for(; i<c; i++) {
buf.dbuf[l] = cast[fnuxi8[i]];
l++;
break;
case D_SCONST:
- if(debug['a'] && i == 0) {
- Bprint(&bso, pcstr, l+s+INITDAT);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff);
- Bprint(&bso, "\t%P\n", curp);
- }
for(; i<c; i++) {
buf.dbuf[l] = p->to.scon[i];
l++;
diag("bad nuxi %d %d\n%P", c, i, curp);
break;
case 1:
- if(debug['a'] && i == 0) {
- Bprint(&bso, pcstr, l+s+INITDAT);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", cast[inuxi1[j]] & 0xff);
- Bprint(&bso, "\t%P\n", curp);
- }
for(; i<c; i++) {
buf.dbuf[l] = cast[inuxi1[i]];
l++;
}
break;
case 2:
- if(debug['a'] && i == 0) {
- Bprint(&bso, pcstr, l+s+INITDAT);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", cast[inuxi2[j]] & 0xff);
- Bprint(&bso, "\t%P\n", curp);
- }
for(; i<c; i++) {
buf.dbuf[l] = cast[inuxi2[i]];
l++;
}
break;
case 4:
- if(debug['a'] && i == 0) {
- Bprint(&bso, pcstr, l+s+INITDAT);
- for(j=0; j<c; j++)
- Bprint(&bso, "%.2ux", cast[inuxi4[j]] & 0xff);
- Bprint(&bso, "\t%P\n", curp);
- }
for(; i<c; i++) {
buf.dbuf[l] = cast[inuxi4[i]];
l++;
break;
}
}
+
write(cout, buf.dbuf, n);
+ if(!debug['a'])
+ return;
+
+ /*
+ * a second pass just to print the asm
+ */
+ for(p = datap; p != P; p = p->link) {
+ a = &p->from;
+
+ l = a->sym->value + a->offset - s;
+ if(l < 0 || l >= n)
+ continue;
+
+ c = a->scale;
+ i = 0;
+
+ switch(p->to.type) {
+ case D_FCONST:
+ switch(c) {
+ default:
+ case 4:
+ fl = ieeedtof(&p->to.ieee);
+ cast = (char*)&fl;
+ Bprint(&bso, pcstr, l+s+INITDAT);
+ for(j=0; j<c; j++)
+ Bprint(&bso, "%.2ux", cast[fnuxi4[j]] & 0xff);
+ Bprint(&bso, "\t%P\n", curp);
+ break;
+ case 8:
+ cast = (char*)&p->to.ieee;
+ Bprint(&bso, pcstr, l+s+INITDAT);
+ for(j=0; j<c; j++)
+ Bprint(&bso, "%.2ux", cast[fnuxi8[j]] & 0xff);
+ Bprint(&bso, "\t%P\n", curp);
+ break;
+ }
+ break;
+
+ case D_SCONST:
+ Bprint(&bso, pcstr, l+s+INITDAT);
+ for(j=0; j<c; j++)
+ Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff);
+ Bprint(&bso, "\t%P\n", curp);
+ break;
+
+ default:
+ fl = p->to.offset;
+ if(p->to.type == D_SIZE)
+ fl += p->to.sym->size;
+ if(p->to.type == D_ADDR) {
+ if(p->to.index != D_STATIC && p->to.index != D_EXTERN)
+ diag("DADDR type%P", p);
+ if(p->to.sym) {
+ if(p->to.sym->type == SUNDEF)
+ ckoff(p->to.sym, fl);
+ fl += p->to.sym->value;
+ if(p->to.sym->type != STEXT && p->to.sym->type != SUNDEF)
+ fl += INITDAT;
+ if(dlm)
+ dynreloc(p->to.sym, l+s+INITDAT, 1);
+ }
+ }
+ cast = (char*)&fl;
+ switch(c) {
+ default:
+ diag("bad nuxi %d %d\n%P", c, i, curp);
+ break;
+ case 1:
+ Bprint(&bso, pcstr, l+s+INITDAT);
+ for(j=0; j<c; j++)
+ Bprint(&bso, "%.2ux", cast[inuxi1[j]] & 0xff);
+ Bprint(&bso, "\t%P\n", curp);
+ break;
+ case 2:
+ Bprint(&bso, pcstr, l+s+INITDAT);
+ for(j=0; j<c; j++)
+ Bprint(&bso, "%.2ux", cast[inuxi2[j]] & 0xff);
+ Bprint(&bso, "\t%P\n", curp);
+ break;
+ case 4:
+ Bprint(&bso, pcstr, l+s+INITDAT);
+ for(j=0; j<c; j++)
+ Bprint(&bso, "%.2ux", cast[inuxi4[j]] & 0xff);
+ Bprint(&bso, "\t%P\n", curp);
+ break;
+ }
+ break;
+ }
+ }
}
int32
if(debug['Q'])
print("\n%P s/%R/%R/\n", p, from, to);
- if(p->from.type == from)
+ if(p->from.type == from) {
p->from.type = to;
- if(p->to.type == from)
+ p->ft = 0;
+ }
+ if(p->to.type == from) {
p->to.type = to;
+ p->tt = 0;
+ }
- if(p->from.index == from)
+ if(p->from.index == from) {
p->from.index = to;
- if(p->to.index == from)
+ p->ft = 0;
+ }
+ if(p->to.index == from) {
p->to.index = to;
+ p->tt = 0;
+ }
from += D_INDIR;
- if(p->from.type == from)
+ if(p->from.type == from) {
p->from.type = to+D_INDIR;
- if(p->to.type == from)
+ p->ft = 0;
+ }
+ if(p->to.type == from) {
p->to.type = to+D_INDIR;
+ p->tt = 0;
+ }
if(debug['Q'])
print("%P\n", p);
if(pre)
*andptr++ = pre;
+
+if(p->ft != 0) {
+ ft = oclass(&p->from);
+ if(ft != p->ft) {
+ print("***** %d %d %D\n", p->ft, ft, &p->from);
+ p->ft = ft;
+ }
+}
+if(p->tt != 0) {
+ tt = oclass(&p->to);
+ if(tt != p->tt) {
+ print("***** %d %d %D\n", p->tt, tt, &p->to);
+ p->tt = tt;
+ }
+}
+
+// if(p->ft == 0)
+ p->ft = oclass(&p->from);
+// if(p->tt == 0)
+ p->tt = oclass(&p->to);
+
+ ft = p->ft * Ymax;
+ tt = p->tt * Ymax;
o = &optab[p->as];
- ft = oclass(&p->from) * Ymax;
- tt = oclass(&p->to) * Ymax;
t = o->ytab;
if(t == 0) {
diag("asmins: noproto %P", p);
diag("asmins: Zaut sb type ADDR");
p->from.type = p->from.index;
p->from.index = D_NONE;
+ p->ft = 0;
asmand(&p->from, reg[p->to.type]);
p->from.index = p->from.type;
p->from.type = D_ADDR;
+ p->ft = 0;
break;
case Zm_o: