shithub: mc

Download patch

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