};
static Optab* opindex[ALAST+1];
-static vlong vaddr(Link*, Addr*, Reloc*);
+static vlong vaddr(Link*, Prog*, Addr*, Reloc*);
// isextern reports whether s describes an external symbol that must avoid pc-relative addressing.
// This happens on systems like Solaris that call .so functions instead of system calls.
vlong v;
Reloc rel, *r;
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
if(rel.siz != 0) {
if(rel.siz != 4)
ctxt->diag("bad reloc");
vlong v;
Reloc rel, *r;
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
if(rel.siz != 0) {
r = addrel(ctxt->cursym);
*r = rel;
*/
static vlong
-vaddr(Link *ctxt, Addr *a, Reloc *r)
+vaddr(Link *ctxt, Prog *p, Addr *a, Reloc *r)
{
int t;
vlong v;
LSym *s;
+ USED(p);
+
if(r != nil)
memset(r, 0, sizeof *r);
}
static void
-asmandsz(Link *ctxt, Addr *a, int r, int rex, int m64)
+asmandsz(Link *ctxt, Prog *p, Addr *a, int r, int rex, int m64)
{
int32 v;
int t, scale;
Reloc rel;
USED(m64);
+ USED(p);
+
rex &= (0x40 | Rxr);
v = a->offset;
t = a->type;
if(!isextern(a->sym))
goto bad;
t = D_NONE;
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
break;
case D_AUTO:
case D_PARAM:
case D_STATIC:
case D_EXTERN:
t = D_NONE;
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
break;
case D_AUTO:
case D_PARAM:
} else
t -= D_INDIR;
if(t == D_TLS)
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
ctxt->rexflag |= (regrex[t] & Rxb) | rex;
if(t == D_NONE || (D_CS <= t && t <= D_GS) || t == D_TLS) {
}
static void
-asmand(Link *ctxt, Addr *a, Addr *ra)
+asmand(Link *ctxt, Prog *p, Addr *a, Addr *ra)
{
- asmandsz(ctxt, a, reg[ra->type], regrex[ra->type], 0);
+ asmandsz(ctxt, p, a, reg[ra->type], regrex[ra->type], 0);
}
static void
-asmando(Link *ctxt, Addr *a, int o)
+asmando(Link *ctxt, Prog *p, Addr *a, int o)
{
- asmandsz(ctxt, a, o, 0, 0);
+ asmandsz(ctxt, p, a, o, 0, 0);
}
static void
case Zlitm_r:
for(; op = o->op[z]; z++)
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
break;
case Zmb_r:
/* fall through */
case Zm_r:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
break;
case Zm2_r:
*ctxt->andptr++ = op;
*ctxt->andptr++ = o->op[z+1];
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
break;
case Zm_r_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
break;
case Zm_r_xm_nr:
ctxt->rexflag = 0;
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
break;
case Zm_r_i_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
*ctxt->andptr++ = p->to.offset;
break;
case Zm_r_3d:
*ctxt->andptr++ = 0x0f;
*ctxt->andptr++ = 0x0f;
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
*ctxt->andptr++ = op;
break;
case Zibm_r:
while ((op = o->op[z++]) != 0)
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
*ctxt->andptr++ = p->to.offset;
break;
ctxt->diag("asmins: Zaut sb type ADDR");
p->from.type = p->from.index;
p->from.index = D_NONE;
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
p->from.index = p->from.type;
p->from.type = D_ADDR;
break;
case Zm_o:
*ctxt->andptr++ = op;
- asmando(ctxt, &p->from, o->op[z+1]);
+ asmando(ctxt, p, &p->from, o->op[z+1]);
break;
case Zr_m:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, &p->from);
+ asmand(ctxt, p, &p->to, &p->from);
break;
case Zr_m_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->to, &p->from);
+ asmand(ctxt, p, &p->to, &p->from);
break;
case Zr_m_xm_nr:
ctxt->rexflag = 0;
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->to, &p->from);
+ asmand(ctxt, p, &p->to, &p->from);
break;
case Zr_m_i_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->to, &p->from);
+ asmand(ctxt, p, &p->to, &p->from);
*ctxt->andptr++ = p->from.offset;
break;
case Zo_m:
*ctxt->andptr++ = op;
- asmando(ctxt, &p->to, o->op[z+1]);
+ asmando(ctxt, p, &p->to, o->op[z+1]);
break;
case Zcallindreg:
// fallthrough
case Zo_m64:
*ctxt->andptr++ = op;
- asmandsz(ctxt, &p->to, o->op[z+1], 0, 1);
+ asmandsz(ctxt, p, &p->to, o->op[z+1], 0, 1);
break;
case Zm_ibo:
*ctxt->andptr++ = op;
- asmando(ctxt, &p->from, o->op[z+1]);
- *ctxt->andptr++ = vaddr(ctxt, &p->to, nil);
+ asmando(ctxt, p, &p->from, o->op[z+1]);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->to, nil);
break;
case Zibo_m:
*ctxt->andptr++ = op;
- asmando(ctxt, &p->to, o->op[z+1]);
- *ctxt->andptr++ = vaddr(ctxt, &p->from, nil);
+ asmando(ctxt, p, &p->to, o->op[z+1]);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->from, nil);
break;
case Zibo_m_xm:
z = mediaop(ctxt, o, op, t[3], z);
- asmando(ctxt, &p->to, o->op[z+1]);
- *ctxt->andptr++ = vaddr(ctxt, &p->from, nil);
+ asmando(ctxt, p, &p->to, o->op[z+1]);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->from, nil);
break;
case Z_ib:
else
a = &p->to;
*ctxt->andptr++ = op;
- *ctxt->andptr++ = vaddr(ctxt, a, nil);
+ *ctxt->andptr++ = vaddr(ctxt, p, a, nil);
break;
case Zib_rp:
ctxt->rexflag |= regrex[p->to.type] & (Rxb|0x40);
*ctxt->andptr++ = op + reg[p->to.type];
- *ctxt->andptr++ = vaddr(ctxt, &p->from, nil);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->from, nil);
break;
case Zil_rp:
ctxt->rexflag |= regrex[p->to.type] & Rxb;
*ctxt->andptr++ = op + reg[p->to.type];
if(o->prefix == Pe) {
- v = vaddr(ctxt, &p->from, nil);
+ v = vaddr(ctxt, p, &p->from, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
case Zo_iw:
*ctxt->andptr++ = op;
if(p->from.type != D_NONE){
- v = vaddr(ctxt, &p->from, nil);
+ v = vaddr(ctxt, p, &p->from, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
break;
case Ziq_rp:
- v = vaddr(ctxt, &p->from, &rel);
+ v = vaddr(ctxt, p, &p->from, &rel);
l = v>>32;
if(l == 0 && rel.siz != 8){
//p->mark |= 0100;
//p->mark |= 0100;
//print("sign: %llux %P\n", v, p);
*ctxt->andptr ++ = 0xc7;
- asmando(ctxt, &p->to, 0);
+ asmando(ctxt, p, &p->to, 0);
put4(ctxt, v);
}else{ /* need all 8 */
//print("all: %llux %P\n", v, p);
case Zib_rr:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, &p->to);
- *ctxt->andptr++ = vaddr(ctxt, &p->from, nil);
+ asmand(ctxt, p, &p->to, &p->to);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->from, nil);
break;
case Z_il:
a = &p->to;
*ctxt->andptr++ = op;
if(o->prefix == Pe) {
- v = vaddr(ctxt, a, nil);
+ v = vaddr(ctxt, p, a, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
*ctxt->andptr++ = op;
if(t[2] == Zilo_m) {
a = &p->from;
- asmando(ctxt, &p->to, o->op[z+1]);
+ asmando(ctxt, p, &p->to, o->op[z+1]);
} else {
a = &p->to;
- asmando(ctxt, &p->from, o->op[z+1]);
+ asmando(ctxt, p, &p->from, o->op[z+1]);
}
if(o->prefix == Pe) {
- v = vaddr(ctxt, a, nil);
+ v = vaddr(ctxt, p, a, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
case Zil_rr:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, &p->to);
+ asmand(ctxt, p, &p->to, &p->to);
if(o->prefix == Pe) {
- v = vaddr(ctxt, &p->from, nil);
+ v = vaddr(ctxt, p, &p->from, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
case Zclr:
ctxt->rexflag &= ~Pw;
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, &p->to);
+ asmand(ctxt, p, &p->to, &p->to);
break;
case Zcall:
break;
case Zbyte:
- v = vaddr(ctxt, &p->from, &rel);
+ v = vaddr(ctxt, p, &p->from, &rel);
if(rel.siz != 0) {
rel.siz = op;
r = addrel(ctxt->cursym);
// We certainly don't want to exchange
// with AX if the op is MUL or DIV.
*ctxt->andptr++ = 0x87; /* xchg lhs,bx */
- asmando(ctxt, &p->from, reg[D_BX]);
+ asmando(ctxt, p, &p->from, reg[D_BX]);
subreg(&pp, z, D_BX);
doasm(ctxt, &pp);
*ctxt->andptr++ = 0x87; /* xchg lhs,bx */
- asmando(ctxt, &p->from, reg[D_BX]);
+ asmando(ctxt, p, &p->from, reg[D_BX]);
} else {
*ctxt->andptr++ = 0x90 + reg[z]; /* xchg lsh,ax */
subreg(&pp, z, D_AX);
if(z >= D_BP && z <= D_DI) {
if(isax(&p->from)) {
*ctxt->andptr++ = 0x87; /* xchg rhs,bx */
- asmando(ctxt, &p->to, reg[D_BX]);
+ asmando(ctxt, p, &p->to, reg[D_BX]);
subreg(&pp, z, D_BX);
doasm(ctxt, &pp);
*ctxt->andptr++ = 0x87; /* xchg rhs,bx */
- asmando(ctxt, &p->to, reg[D_BX]);
+ asmando(ctxt, p, &p->to, reg[D_BX]);
} else {
*ctxt->andptr++ = 0x90 + reg[z]; /* xchg rsh,ax */
subreg(&pp, z, D_AX);
case 1: /* r,m */
*ctxt->andptr++ = t[0];
- asmando(ctxt, &p->to, t[1]);
+ asmando(ctxt, p, &p->to, t[1]);
break;
case 2: /* m,r */
*ctxt->andptr++ = t[0];
- asmando(ctxt, &p->from, t[1]);
+ asmando(ctxt, p, &p->from, t[1]);
break;
case 3: /* r,m - 2op */
*ctxt->andptr++ = t[0];
*ctxt->andptr++ = t[1];
- asmando(ctxt, &p->to, t[2]);
+ asmando(ctxt, p, &p->to, t[2]);
ctxt->rexflag |= regrex[p->from.type] & (Rxr|0x40);
break;
case 4: /* m,r - 2op */
*ctxt->andptr++ = t[0];
*ctxt->andptr++ = t[1];
- asmando(ctxt, &p->from, t[2]);
+ asmando(ctxt, p, &p->from, t[2]);
ctxt->rexflag |= regrex[p->to.type] & (Rxr|0x40);
break;
*ctxt->andptr++ = 0xb5;
break;
}
- asmand(ctxt, &p->from, &p->to);
+ asmand(ctxt, p, &p->from, &p->to);
break;
case 6: /* double shift */
case D_CONST:
*ctxt->andptr++ = 0x0f;
*ctxt->andptr++ = t[0];
- asmandsz(ctxt, &p->to, reg[(int)p->from.index], regrex[(int)p->from.index], 0);
+ asmandsz(ctxt, p, &p->to, reg[(int)p->from.index], regrex[(int)p->from.index], 0);
*ctxt->andptr++ = p->from.offset;
break;
case D_CL:
case D_CX:
*ctxt->andptr++ = 0x0f;
*ctxt->andptr++ = t[1];
- asmandsz(ctxt, &p->to, reg[(int)p->from.index], regrex[(int)p->from.index], 0);
+ asmandsz(ctxt, p, &p->to, reg[(int)p->from.index], regrex[(int)p->from.index], 0);
break;
}
break;
pp.from.index = D_NONE;
ctxt->rexflag |= Pw;
*ctxt->andptr++ = 0x8B;
- asmand(ctxt, &pp.from, &p->to);
+ asmand(ctxt, p, &pp.from, &p->to);
break;
case Hsolaris: // TODO(rsc): Delete Hsolaris from list. Should not use this code. See progedit in obj6.c.
ctxt->rexflag |= Pw;
*ctxt->andptr++ = 0x64; // FS
*ctxt->andptr++ = 0x8B;
- asmand(ctxt, &pp.from, &p->to);
+ asmand(ctxt, p, &pp.from, &p->to);
break;
case Hwindows:
ctxt->rexflag |= Pw;
*ctxt->andptr++ = 0x65; // GS
*ctxt->andptr++ = 0x8B;
- asmand(ctxt, &pp.from, &p->to);
+ asmand(ctxt, p, &pp.from, &p->to);
break;
}
break;
{0}
};
-static int32 vaddr(Link*, Addr*, Reloc*);
+static int32 vaddr(Link*, Prog*, Addr*, Reloc*);
// single-instruction no-ops of various lengths.
// constructed by hand and disassembled with gdb to verify.
vlong v;
Reloc rel, *r;
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
if(rel.siz != 0) {
if(rel.siz != 4)
ctxt->diag("bad reloc");
}
static int32
-vaddr(Link *ctxt, Addr *a, Reloc *r)
+vaddr(Link *ctxt, Prog *p, Addr *a, Reloc *r)
{
int t;
int32 v;
LSym *s;
+ USED(p);
+
if(r != nil)
memset(r, 0, sizeof *r);
}
static void
-asmand(Link *ctxt, Addr *a, int r)
+asmand(Link *ctxt, Prog *p, Addr *a, int r)
{
int32 v;
int t, scale;
Reloc rel;
+
+ USED(p);
v = a->offset;
t = a->type;
case D_STATIC:
case D_EXTERN:
t = D_NONE;
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
break;
case D_AUTO:
case D_PARAM:
case D_STATIC:
case D_EXTERN:
t = D_NONE;
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
break;
case D_AUTO:
case D_PARAM:
} else
t -= D_INDIR;
if(t == D_TLS)
- v = vaddr(ctxt, a, &rel);
+ v = vaddr(ctxt, p, a, &rel);
if(t == D_NONE || (D_CS <= t && t <= D_GS) || t == D_TLS) {
*ctxt->andptr++ = (0 << 6) | (5 << 0) | (r << 3);
case Zlitm_r:
for(; op = o->op[z]; z++)
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
break;
case Zm_r:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
break;
case Zm2_r:
*ctxt->andptr++ = op;
*ctxt->andptr++ = o->op[z+1];
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
break;
case Zm_r_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
break;
case Zm_r_i_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
*ctxt->andptr++ = p->to.offset;
break;
case Zibm_r:
while ((op = o->op[z++]) != 0)
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
*ctxt->andptr++ = p->to.offset;
break;
p->from.type = p->from.index;
p->from.index = D_NONE;
p->ft = 0;
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
p->from.index = p->from.type;
p->from.type = D_ADDR;
p->ft = 0;
case Zm_o:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, o->op[z+1]);
+ asmand(ctxt, p, &p->from, o->op[z+1]);
break;
case Zr_m:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, reg[p->from.type]);
+ asmand(ctxt, p, &p->to, reg[p->from.type]);
break;
case Zr_m_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->to, reg[p->from.type]);
+ asmand(ctxt, p, &p->to, reg[p->from.type]);
break;
case Zr_m_i_xm:
mediaop(ctxt, o, op, t[3], z);
- asmand(ctxt, &p->to, reg[p->from.type]);
+ asmand(ctxt, p, &p->to, reg[p->from.type]);
*ctxt->andptr++ = p->from.offset;
break;
// fallthrough
case Zo_m:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, o->op[z+1]);
+ asmand(ctxt, p, &p->to, o->op[z+1]);
break;
case Zm_ibo:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->from, o->op[z+1]);
- *ctxt->andptr++ = vaddr(ctxt, &p->to, nil);
+ asmand(ctxt, p, &p->from, o->op[z+1]);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->to, nil);
break;
case Zibo_m:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, o->op[z+1]);
- *ctxt->andptr++ = vaddr(ctxt, &p->from, nil);
+ asmand(ctxt, p, &p->to, o->op[z+1]);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->from, nil);
break;
case Z_ib:
a = &p->from;
else
a = &p->to;
- v = vaddr(ctxt, a, nil);
+ v = vaddr(ctxt, p, a, nil);
*ctxt->andptr++ = op;
*ctxt->andptr++ = v;
break;
case Zib_rp:
*ctxt->andptr++ = op + reg[p->to.type];
- *ctxt->andptr++ = vaddr(ctxt, &p->from, nil);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->from, nil);
break;
case Zil_rp:
*ctxt->andptr++ = op + reg[p->to.type];
if(o->prefix == Pe) {
- v = vaddr(ctxt, &p->from, nil);
+ v = vaddr(ctxt, p, &p->from, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
case Zib_rr:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, reg[p->to.type]);
- *ctxt->andptr++ = vaddr(ctxt, &p->from, nil);
+ asmand(ctxt, p, &p->to, reg[p->to.type]);
+ *ctxt->andptr++ = vaddr(ctxt, p, &p->from, nil);
break;
case Z_il:
a = &p->to;
*ctxt->andptr++ = op;
if(o->prefix == Pe) {
- v = vaddr(ctxt, a, nil);
+ v = vaddr(ctxt, p, a, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
*ctxt->andptr++ = op;
if(t[2] == Zilo_m) {
a = &p->from;
- asmand(ctxt, &p->to, o->op[z+1]);
+ asmand(ctxt, p, &p->to, o->op[z+1]);
} else {
a = &p->to;
- asmand(ctxt, &p->from, o->op[z+1]);
+ asmand(ctxt, p, &p->from, o->op[z+1]);
}
if(o->prefix == Pe) {
- v = vaddr(ctxt, a, nil);
+ v = vaddr(ctxt, p, a, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
case Zil_rr:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, reg[p->to.type]);
+ asmand(ctxt, p, &p->to, reg[p->to.type]);
if(o->prefix == Pe) {
- v = vaddr(ctxt, &p->from, nil);
+ v = vaddr(ctxt, p, &p->from, nil);
*ctxt->andptr++ = v;
*ctxt->andptr++ = v>>8;
}
case Zclr:
*ctxt->andptr++ = op;
- asmand(ctxt, &p->to, reg[p->to.type]);
+ asmand(ctxt, p, &p->to, reg[p->to.type]);
break;
case Zcall:
break;
case Zbyte:
- v = vaddr(ctxt, &p->from, &rel);
+ v = vaddr(ctxt, p, &p->from, &rel);
if(rel.siz != 0) {
rel.siz = op;
r = addrel(ctxt->cursym);
if(z >= D_BP && z <= D_DI) {
if((breg = byteswapreg(ctxt, &p->to)) != D_AX) {
*ctxt->andptr++ = 0x87; /* xchg lhs,bx */
- asmand(ctxt, &p->from, reg[breg]);
+ asmand(ctxt, p, &p->from, reg[breg]);
subreg(&pp, z, breg);
doasm(ctxt, &pp);
*ctxt->andptr++ = 0x87; /* xchg lhs,bx */
- asmand(ctxt, &p->from, reg[breg]);
+ asmand(ctxt, p, &p->from, reg[breg]);
} else {
*ctxt->andptr++ = 0x90 + reg[z]; /* xchg lsh,ax */
subreg(&pp, z, D_AX);
if(z >= D_BP && z <= D_DI) {
if((breg = byteswapreg(ctxt, &p->from)) != D_AX) {
*ctxt->andptr++ = 0x87; /* xchg rhs,bx */
- asmand(ctxt, &p->to, reg[breg]);
+ asmand(ctxt, p, &p->to, reg[breg]);
subreg(&pp, z, breg);
doasm(ctxt, &pp);
*ctxt->andptr++ = 0x87; /* xchg rhs,bx */
- asmand(ctxt, &p->to, reg[breg]);
+ asmand(ctxt, p, &p->to, reg[breg]);
} else {
*ctxt->andptr++ = 0x90 + reg[z]; /* xchg rsh,ax */
subreg(&pp, z, D_AX);
case 1: /* r,m */
*ctxt->andptr++ = t[4];
- asmand(ctxt, &p->to, t[5]);
+ asmand(ctxt, p, &p->to, t[5]);
break;
case 2: /* m,r */
*ctxt->andptr++ = t[4];
- asmand(ctxt, &p->from, t[5]);
+ asmand(ctxt, p, &p->from, t[5]);
break;
case 3: /* r,m - 2op */
*ctxt->andptr++ = t[4];
*ctxt->andptr++ = t[5];
- asmand(ctxt, &p->to, t[6]);
+ asmand(ctxt, p, &p->to, t[6]);
break;
case 4: /* m,r - 2op */
*ctxt->andptr++ = t[4];
*ctxt->andptr++ = t[5];
- asmand(ctxt, &p->from, t[6]);
+ asmand(ctxt, p, &p->from, t[6]);
break;
case 5: /* load full pointer, trash heap */
*ctxt->andptr++ = 0xb5;
break;
}
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
break;
case 6: /* double shift */
case D_CONST:
*ctxt->andptr++ = 0x0f;
*ctxt->andptr++ = t[4];
- asmand(ctxt, &p->to, reg[p->from.index]);
+ asmand(ctxt, p, &p->to, reg[p->from.index]);
*ctxt->andptr++ = p->from.offset;
break;
case D_CL:
case D_CX:
*ctxt->andptr++ = 0x0f;
*ctxt->andptr++ = t[5];
- asmand(ctxt, &p->to, reg[p->from.index]);
+ asmand(ctxt, p, &p->to, reg[p->from.index]);
break;
}
break;
} else
*ctxt->andptr++ = t[4];
*ctxt->andptr++ = t[5];
- asmand(ctxt, &p->from, reg[p->to.type]);
+ asmand(ctxt, p, &p->from, reg[p->to.type]);
break;
case 8: /* mov tls, r */
pp.from.scale = 0;
*ctxt->andptr++ = 0x65; // GS
*ctxt->andptr++ = 0x8B;
- asmand(ctxt, &pp.from, reg[p->to.type]);
+ asmand(ctxt, p, &pp.from, reg[p->to.type]);
break;
case Hplan9:
pp.from.offset = 0;
pp.from.index = D_NONE;
*ctxt->andptr++ = 0x8B;
- asmand(ctxt, &pp.from, reg[p->to.type]);
+ asmand(ctxt, p, &pp.from, reg[p->to.type]);
break;
case Hwindows:
pp.from.scale = 0;
*ctxt->andptr++ = 0x64; // FS
*ctxt->andptr++ = 0x8B;
- asmand(ctxt, &pp.from, reg[p->to.type]);
+ asmand(ctxt, p, &pp.from, reg[p->to.type]);
break;
}
break;