shithub: mc

Download patch

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)
--