ref: 89b2b2847a7c0e350b7b9ec2de0a4f0eb9a01e59
parent: 50087f75b1112f310f5d345f48d50ed286ea8b2b
parent: 0c7ce826f6c84a98865b26749cbce9cc304a6d18
author: Ori Bernstein <[email protected]>
date: Thu Jun 7 12:35:19 EDT 2012
Merge branch 'master' of git+ssh://mimir.eigenstate.org/git/ori/mc2
--- a/8/isel.c
+++ b/8/isel.c
@@ -518,6 +518,34 @@
return eax;
}
+void blit(Isel *s, Loc a, Loc b, int sz)
+{
+ int i;
+ Reg sp, dp; /* pointers to src, dst */
+ Loc tmp, src, dst; /* source memory, dst memory */
+
+ sp = inr(s, a).reg;
+ dp = inr(s, b).reg;
+
+ /* Slightly funny loop condition: We might have trailing bytes
+ * that we can't blit word-wise. */
+ tmp = getreg(s, ModeL);
+ for (i = 0; i + 4 <= sz; i+= 4) {
+ locmem(&src, i, sp, Rnone, ModeL);
+ locmem(&dst, i, dp, Rnone, ModeL);
+ g(s, Imov, &src, &tmp, NULL);
+ g(s, Imov, &tmp, &dst, NULL);
+ }
+ /* now, the trailing bytes */
+ tmp = coreg(tmp, ModeB);
+ for (; i < sz; i++) {
+ locmem(&src, i, sp, Rnone, ModeB);
+ locmem(&dst, i, dp, Rnone, ModeB);
+ g(s, Imov, &src, &tmp, NULL);
+ g(s, Imov, &tmp, &dst, NULL);
+ }
+}
+
Loc selexpr(Isel *s, Node *n)
{
Loc a, b, c, r;
@@ -666,7 +694,12 @@
break;
case Olbl:
loclbl(&r, args[0]);
- break;
+ break;
+ case Oblit:
+ b = selexpr(s, args[0]);
+ a = selexpr(s, args[1]);
+ blit(s, a, b, args[2]->expr.args[0]->lit.intval);
+ break;
/* These operators should never show up in the reduced trees,
* since they should have been replaced with more primitive
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -382,7 +382,7 @@
case Oslice:
args[1] = rval(s, args[1]);
args[2] = rval(s, args[2]);
- t = mkexpr(-1, Osub, args[2], args[1]);
+ t = mkexpr(-1, Osub, args[2], args[1], NULL);
args[0] = slicebase(s, args[0], t);
r = n;
break;
@@ -415,31 +415,31 @@
t = lval(s, args[0]);
v = mkexpr(-1, Oadd, one, t, NULL);
r = mkexpr(-1, Ostor, t, v, NULL);
- lappend(&s->incqueue, &s->nqueue, t);
+ lappend(&s->incqueue, &s->nqueue, t);
break;
case Opredec:
t = lval(s, args[0]);
v = mkexpr(-1, Osub, one, t, NULL);
r = mkexpr(-1, Ostor, t, v, NULL);
- lappend(&s->incqueue, &s->nqueue, t);
+ lappend(&s->incqueue, &s->nqueue, t);
break;
/* expr(x++)
- * =>
+ * =>
* expr
- * x = x + 1
+ * x = x + 1
*/
case Opostinc:
r = lval(s, args[0]);
v = mkexpr(-1, Oadd, one, r, NULL);
t = mkexpr(-1, Ostor, r, v, NULL);
- lappend(&s->incqueue, &s->nqueue, t);
+ lappend(&s->incqueue, &s->nqueue, t);
break;
case Opostdec:
r = lval(s, args[0]);
v = mkexpr(-1, Osub, one, args[0], NULL);
t = mkexpr(-1, Ostor, r, v, NULL);
- lappend(&s->incqueue, &s->nqueue, t);
+ lappend(&s->incqueue, &s->nqueue, t);
break;
case Olit:
case Ovar:
@@ -458,8 +458,15 @@
break;
case Oasn:
t = lval(s, args[0]);
- v = rval(s, args[1]);
- r = mkexpr(-1, Ostor, t, v, NULL);
+ u = rval(s, args[1]);
+ if (size(n) > 4) {
+ t = mkexpr(-1, Oaddr, t, NULL);
+ u = mkexpr(-1, Oaddr, u, NULL);
+ v = mkexpr(-1, Olit, mkint(-1, size(n)), NULL);
+ r = mkexpr(-1, Oblit, t, u, v, NULL);
+ } else {
+ r = mkexpr(-1, Ostor, t, u, NULL);
+ }
break;
default:
for (i = 0; i < n->expr.nargs; i++)
@@ -478,7 +485,7 @@
{
assert(n->type == Ndecl);
if (debug)
- printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.sym->id, s->stksz + 4);
+ printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.sym->id, s->stksz);
htput(s->locs, (void*)n->decl.sym->id, (void*)(s->stksz + 4));
s->stksz += size(n);
}
@@ -486,10 +493,10 @@
void declarearg(Simp *s, Node *n)
{
assert(n->type == Ndecl);
+ s->argsz += size(n);
if (debug)
printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.sym->id, -(s->argsz + 8));
htput(s->locs, (void*)n->decl.sym->id, (void*)-(s->argsz + 8));
- s->argsz += size(n);
}
Node *simp(Simp *s, Node *n)
--- a/Makefile
+++ b/Makefile
@@ -4,5 +4,5 @@
-include config.mk
include mk/c.mk
-check:
+check: all
make -C test check
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -374,9 +374,10 @@
break;
case Olbl: /* :lbl -> void* */
settype(n, mktyptr(n->line, mkty(-1, Tyvoid)));
- case Obad: case Numops: case Ocjmp:
+ case Obad: case Ocjmp:
case Oload: case Ostor:
case Oslbase: case Osllen:
+ case Oblit: case Numops:
die("Should not see %s in fe", opstr(exprop(n)));
break;
}
--- a/parse/ops.def
+++ b/parse/ops.def
@@ -52,5 +52,6 @@
O(Ocjmp, 1) /* conditional jump */
O(Oload, 1) /* load from memory */
O(Ostor, 1) /* store to memory */
-O(Osllen, 1)
-O(Oslbase, 1)
+O(Osllen, 1) /* size of slice */
+O(Oslbase, 1) /* base of sice */
+O(Oblit, 1) /* block copy of memory */
--- /dev/null
+++ b/test/structasn.myr
@@ -1,0 +1,13 @@
+type pair = struct
+ a : int
+ b : int
+;;
+
+const main = {
+ var x : pair
+ var y : pair
+ x.a = 12
+ x.b = 30
+ y = x
+ -> y.a + y.b
+}
--- a/test/tests
+++ b/test/tests
@@ -12,3 +12,4 @@
fib E 21
slice E 7
float E 1
+structasn E 42