shithub: mc

Download patch

ref: 6d91fe2e02b75dbefeab67bea522458246d5c654
parent: 60e882bf8cc56a93b0d98581dbc1cd0091ad7e9d
author: Ori Bernstein <[email protected]>
date: Sun Jul 29 23:18:06 EDT 2012

Use 'imul' instead of 'mul'.

    Faster, and it takes arbitrary registers. W00t.

--- a/8/insns.def
+++ b/8/insns.def
@@ -27,6 +27,7 @@
 
 Insn(Iadd,      "\tadd%t %x,%r\n",              Use(.l={1,2}),                  Def(.l={2}))
 Insn(Isub,      "\tsub%t %x,%r\n",              Use(.l={1,2}),                  Def(.l={2}))
+Insn(Iimul,     "\timul%t %v,%r\n",             Use(.l={1,2}),                  Def(.l={2}))
 Insn(Imul,      "\tmul%t %r\n",                 Use(.l={1},.r={Reax}),          Def(.r={Reax,Redx}))
 Insn(Idiv,      "\tdiv%t %r\n",                 Use(.l={1},.r={Reax,Redx}),     Def(.r={Reax,Redx}))
 Insn(Ineg,      "\tneg%t %r\n",                 Use(.l={1}),                    Def(.l={1}))
--- a/8/isel.c
+++ b/8/isel.c
@@ -438,18 +438,7 @@
         case Obor:      r = binop(s, Ior,  args[0], args[1]); break;
         case Oband:     r = binop(s, Iand, args[0], args[1]); break;
         case Obxor:     r = binop(s, Ixor, args[0], args[1]); break;
-
-        case Omul:
-            /* these get clobbered by the mul insn */
-            a = selexpr(s, args[0]);
-            b = selexpr(s, args[1]);
-            b = inr(s, b);
-            c = coreg(Reax, mode(n));
-            r = locreg(a->mode);
-            g(s, Imov, a, c, NULL);
-            g(s, Imul, b, NULL);
-            g(s, Imov, coreg(Reax, mode(n)), r, NULL);
-            break;
+        case Omul:      r = binop(s, Iimul, args[0], args[1]); break;
         case Odiv:
         case Omod:
             /* these get clobbered by the div insn */
@@ -563,6 +552,7 @@
         case Oload: /* mem -> reg */
             a = memloc(s, args[0], mode(n));
             r = locreg(mode(n));
+            /* FIXME: we should be moving the correct 'coreg' */
             g(s, Imov, a, r, NULL);
             break;
         case Ocall:
@@ -591,8 +581,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]);
--- a/parse/bitset.c
+++ b/parse/bitset.c
@@ -23,6 +23,7 @@
     p = zalloc(sz * sizeof(size_t));
     for (i = 0; i < a->nchunks; i++)
         p[i] = a->chunks[i];
+    free(a->chunks);
     a->chunks = p;
     a->nchunks = sz;
 
@@ -29,6 +30,7 @@
     p = zalloc(sz * sizeof(size_t));
     for (i = 0; i < b->nchunks; i++)
         p[i] = b->chunks[i];
+    free(b->chunks);
     b->chunks = p;
     b->nchunks = sz;
 }