replace RMem refs with an OAddr opertation

This commit is contained in:
Quentin Carbonneaux 2015-08-16 12:12:19 -04:00
parent 16fe5c1366
commit ca8c320dec
4 changed files with 10 additions and 15 deletions

View file

@ -81,7 +81,6 @@ eref(Ref r, Fn *fn, FILE *f)
assert(r.val < Tmp0);
fprintf(f, "%%%s", rtoa(r.val));
break;
case RMem:
case RSlot:
fprintf(f, "-%d(%%rbp)", 4 * r.val);
break;
@ -106,7 +105,6 @@ emem(Ref r, Fn *fn, FILE *f)
switch (rtype(r)) {
default:
diag("emit: invalid memory reference");
case RMem:
case RSlot:
eref(r, fn, f);
break;
@ -186,10 +184,6 @@ eins(Ins i, Fn *fn, FILE *f)
val, rsub[i.to.val][SWord]);
break;
}
}
if (rtype(i.arg[0]) == RMem) {
assert(rtype(i.to)==RTmp && i.to.val<EAX);
eop("lea", i.arg[0], i.to, fn, f);
} else if (!req(i.arg[0], i.to))
eop("mov", i.arg[0], i.to, fn, f);
break;
@ -228,6 +222,11 @@ eins(Ins i, Fn *fn, FILE *f)
if (!req(i.to, R))
eop("mov", TMP(RSP), i.to, fn ,f);
break;
case OAddr:
if (rtype(i.arg[0]) != RSlot)
diag("emit: invalid addr instruction");
eop("lea", i.arg[0], i.to, fn, f);
break;
case OSwap:
eop("xchg", i.arg[0], i.arg[1], fn, f);
break;