summary refs log tree commit diff
path: root/lisc
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-10-25 21:18:33 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-10-30 13:20:42 -0400
commit32ad5e368a127fb0ca2c77c76d2245455db04e55 (patch)
treecd5b4339fe5c1173212c45b33150c49c485d8ac5 /lisc
parent05f120431dd840009c37f96209dae75ab6cd6327 (diff)
downloadroux-32ad5e368a127fb0ca2c77c76d2245455db04e55.tar.gz
prioritize reg. allocation of some temporaries
Diffstat (limited to 'lisc')
-rw-r--r--lisc/rega.c51
1 files changed, 32 insertions, 19 deletions
diff --git a/lisc/rega.c b/lisc/rega.c
index d6b39ec..83b598c 100644
--- a/lisc/rega.c
+++ b/lisc/rega.c
@@ -273,13 +273,37 @@ dopm(Blk *b, Ins *i, RMap *m)
 	return ir;
 }
 
+static int
+prio(Ref r1, Ref r2)
+{
+	/* trivial heuristic to begin with,
+	 * later we can use the distance to
+	 * the definition instruction
+	 */
+	(void) r2;
+	return *hint(r1.val) != -1;
+}
+
+static void
+insert(Ref *r, Ref **rs, int p)
+{
+	int i;
+
+	rs[i = p] = r;
+	while (i-- > 0 && prio(*r, *rs[i])) {
+		rs[i+1] = rs[i];
+		rs[i] = r;
+	}
+}
+
 static void
 doblk(Blk *b, RMap *cur)
 {
-	int t, x, r;
+	int x, r, nr;
 	ulong rs;
 	Ins *i;
 	Mem *m;
+	Ref *ra[4];
 
 	if (rtype(b->jmp.arg) == RTmp)
 		b->jmp.arg = ralloc(cur, b->jmp.arg.val);
@@ -312,32 +336,21 @@ doblk(Blk *b, RMap *cur)
 				r = 0;
 			break;
 		}
-		for (x=0; t=i->arg[x].val, x<2; x++)
+		for (x=0, nr=0; x<2; x++)
 			switch (rtype(i->arg[x])) {
 			case RAMem:
-				m = &mem[t & AMask];
+				m = &mem[i->arg[x].val & AMask];
 				if (rtype(m->base) == RTmp)
-					m->base = ralloc(cur, m->base.val);
+					insert(&m->base, ra, nr++);
 				if (rtype(m->index) == RTmp)
-					m->index = ralloc(cur, m->index.val);
+					insert(&m->index, ra, nr++);
 				break;
 			case RTmp:
-#if 0
-				/* <arch>
-				 *   on Intel, we attempt to
-				 *   use the same register
-				 *   for the return and one
-				 *   argument
-				 */
-			 	/* might not be a so good idea...
-				 */
-				if (r && !BGET(cur->b, r))
-				if (*hint(t) == -1)
-					*hint(t) = r;
-#endif
-				i->arg[x] = ralloc(cur, t);
+				insert(&i->arg[x], ra, nr++);
 				break;
 			}
+		for (r=0; r<nr; r++)
+			*ra[r] = ralloc(cur, ra[r]->val);
 	}
 }