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;
}