ref: 08ce974ecaf47306a203be10b2247fc2e0b22113
parent: 001eb2aee8d88faa8186c858e503c6ea80b1e145
author: Ori Bernstein <orib@google.com>
date: Tue Jul 31 12:06:45 EDT 2012
Partially roll back registerization work.
--- a/6/isel.c
+++ b/6/isel.c
@@ -438,8 +438,9 @@
r = locreg(a->mode);
if (r->mode == ModeB)
g(s, Ixor, eax, eax, NULL);
+ else
+ g(s, Ixor, edx, edx, NULL);
g(s, Imov, a, c, NULL);
- g(s, Ixor, edx, edx, NULL);
g(s, Idiv, b, NULL);
if (exprop(n) == Odiv)
d = coreg(Reax, mode(n));
@@ -570,8 +571,9 @@
r = b;
break;
case Otrunc:
- r = selexpr(s, args[0]);
- r->mode = mode(n);
+ a = selexpr(s, args[0]);
+ r = locreg(mode(n));
+ g(s, Imov, a, r, NULL);
break;
case Ozwiden:
a = selexpr(s, args[0]);
@@ -666,13 +668,26 @@
* means that we need to do a movl when we really want a movzlq. Since
* we don't know the name of the reg to use, we need to sub it in when
* writing... */
- if (insn->op == Imovz) {
- if (insn->args[0]->mode == ModeL && insn->args[1]->mode == ModeQ) {
- if (insn->args[1]->reg.colour) {
- insn->op = Imov;
- insn->args[1] = coreg(insn->args[1]->reg.colour, ModeL);
+ switch (insn->op) {
+ case Imovz:
+ if (insn->args[0]->mode == ModeL && insn->args[1]->mode == ModeQ) {
+ if (insn->args[1]->reg.colour) {
+ insn->op = Imov;
+ insn->args[1] = coreg(insn->args[1]->reg.colour, ModeL);
+ }
}
- }
+ break;
+ case Imov:
+ if (insn->args[0]->type == Locreg && insn->args[1]->type == Locreg &&
+ insn->args[0]->reg.colour != Rnone && insn->args[1]->reg.colour != Rnone) {
+ if (insn->args[0]->mode != insn->args[1]->mode)
+ insn->args[0] = coreg(insn->args[1]->reg.colour, insn->args[1]->mode);
+ /* moving a reg to itself is dumb. */
+ if (insn->args[0]->reg.colour == insn->args[1]->reg.colour)
+ return;
+ }
+ default:
+ break;
}
p = insnfmts[insn->op];
i = 0;
--- a/6/simp.c
+++ b/6/simp.c
@@ -311,8 +311,7 @@
assert(e->type == Nexpr);
t = gentemp(simp, e, e->expr.type, &dcl);
- if (stacknode(e))
- declarelocal(simp, dcl);
+ declarelocal(simp, dcl);
return t;
}
@@ -1086,13 +1085,11 @@
static void declarelocal(Simp *s, Node *n)
{
assert(n->type == Ndecl);
- if (stacknode(n)) {
- s->stksz += size(n);
- s->stksz = align(s->stksz, min(size(n), Ptrsz));
- if (debug)
- printf("declare %s:%s(%zd) at %zd\n", declname(n), tystr(decltype(n)), n->decl.did, s->stksz);
- htput(s->locs, n, (void*)s->stksz);
- }
+ s->stksz += size(n);
+ s->stksz = align(s->stksz, min(size(n), Ptrsz));
+ if (debug)
+ printf("declare %s:%s(%zd) at %zd\n", declname(n), tystr(decltype(n)), n->decl.did, s->stksz);
+ htput(s->locs, n, (void*)s->stksz);
}
static void declarearg(Simp *s, Node *n)
--
⑨