zapreg(Node *n)
{
if(n->reg != D_NONE) {
+ //prtree(n, "zapreg");
regfree(n);
n->reg = D_NONE;
}
t = nn;
else
t = regpair(Z, n);
+ //print("dr=%d ", dr); prtree(t, "t");
c = Z;
d = Z;
if(!nodreg(&nod1, t->left, D_AX)) {
}else if(reg[D_DX] == 0)
fatal(Z, "vlong mul DX botch");
}
+ //prtree(t, "t1"); print("reg/ax = %d reg/dx = %d\n", reg[D_AX], reg[D_DX]);
if(m)
sugen(l, t, 8);
else
loadpair(l, t);
+ //prtree(t, "t2"); print("reg/ax = %d reg/dx = %d\n", reg[D_AX], reg[D_DX]);
if(t->left->reg != D_AX) {
c = &nod3;
regsalloc(c, t->left);
gmove(t->left, &nod1);
zapreg(t->left);
}
+ //print("reg/ax = %d reg/dx = %d\n", reg[D_AX], reg[D_DX]);
if(t->right->reg != D_DX) {
d = &nod4;
regsalloc(d, t->right);
gmove(&nod2, d);
- gmove(t->right, &nod2);
+ if(t->right->reg == D_AX && c != nil){
+ /* need previous value of AX in DX */
+ gmove(c, &nod2);
+ }else
+ gmove(t->right, &nod2);
zapreg(t->right);
}
if(c != Z || d != Z) {
}
else
s = t;
+ reg[D_AX]++; /* don't allow biggen to allocate AX or DX (smashed by MUL) as temp */
+ reg[D_DX]++;
if(r->op == OCONST) {
if(hi64v(r) == 0)
biggen(s, r, Z, 0, mulc32, nil);
else
biggen(s, r, Z, 0, mull, nil);
instpair(t, Z);
+ reg[D_AX]--;
+ reg[D_DX]--;
if(c != Z) {
gmove(&nod1, t->left);
gmove(&nod3, &nod1);
gmove(&nod2, t->right);
gmove(&nod4, &nod2);
}
+
if(r->op == OREGPAIR)
freepair(r);
if(!m)
storepair(t, l, 0);
if(l == &nod5)
regfree(l);
+
if(!dr) {
if(nn != Z)
storepair(t, nn, 1);