ref: 0011cdc42c4acb7784a64211faeeb49c885ff744
parent: 96b369805d1308ad934947ebea72306c337e6e17
parent: 6270260b03df40c9e2230079bafbf574238acc34
author: Ori Bernstein <[email protected]>
date: Mon Jul 23 18:02:51 EDT 2012
Merge branch 'master' of git+ssh://mimir.eigenstate.org/git/ori/mc2
--- a/8/isel.c
+++ b/8/isel.c
@@ -334,8 +334,8 @@
}
} else {
l = selexpr(s, e);
- if (l->type == Locreg)
- l = locmem(0, l, Rnone, m);
+ l = inr(s, l);
+ l = locmem(0, l, Rnone, m);
}
return l;
}
@@ -537,6 +537,14 @@
case Oasn: /* relabel */
die("Unimplemented op %s", opstr(exprop(n)));
break;
+ case Oset:
+ assert(exprop(args[0]) == Ovar);
+ b = selexpr(s, args[1]);
+ a = selexpr(s, args[0]);
+ b = inri(s, b);
+ g(s, Imov, b, a, NULL);
+ r = b;
+ break;
case Ostor: /* reg -> mem */
b = selexpr(s, args[1]);
a = memloc(s, args[0], mode(args[0]));
@@ -545,9 +553,9 @@
r = b;
break;
case Oload: /* mem -> reg */
- b = memloc(s, args[0], mode(n));
+ a = memloc(s, args[0], mode(n));
r = locreg(mode(n));
- g(s, Imov, b, r, NULL);
+ g(s, Imov, a, r, NULL);
break;
case Ocall:
r = gencall(s, n);
--- a/8/simp.c
+++ b/8/simp.c
@@ -128,7 +128,10 @@
Node *n;
assert(a != NULL && b != NULL);
- n = mkexpr(a->line, Ostor, a, b, NULL);
+ if (exprop(a) == Ovar)
+ n = mkexpr(a->line, Oset, a, b, NULL);
+ else
+ n = mkexpr(a->line, Ostor, a, b, NULL);
return n;
}
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -656,7 +656,7 @@
case Olbl: /* :lbl -> void* */
settype(st, n, mktyptr(n->line, mkty(-1, Tyvoid)));
case Obad: case Ocjmp:
- case Oload: case Ostor:
+ case Oload: case Ostor: case Oset:
case Oslbase: case Osllen:
case Oblit: case Numops:
die("Should not see %s in fe", opstr(exprop(n)));
--- a/parse/ops.def
+++ b/parse/ops.def
@@ -54,7 +54,8 @@
/* backend-only */
O(Ocjmp, 1) /* conditional jump */
O(Oload, 1) /* load from memory */
-O(Ostor, 1) /* store to memory */
+O(Ostor, 1) /* store through to memory */
+O(Oset, 1) /* store to var */
O(Osllen, 1) /* size of slice */
O(Oslbase, 1) /* base of sice */
O(Oblit, 1) /* block copy of memory */
--- /dev/null
+++ b/test/structptr.myr
@@ -1,0 +1,15 @@
+type pair = struct
+ a : int
+ b : int
+;;
+
+const frob = {s
+ s.a = 12
+ s.b = 30
+}
+
+const main = {
+ var s : pair
+ frob(&s)
+ -> s.a + s.b
+}
--- a/test/tests
+++ b/test/tests
@@ -21,6 +21,7 @@
B bsr E 5
B struct1 E 12
B struct E 42
+B structptr E 42
B structasn E 42
B structret E 42
B array E 7