summary refs log tree commit diff
path: root/lisc
diff options
context:
space:
mode:
Diffstat (limited to 'lisc')
-rw-r--r--lisc/rega.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/lisc/rega.c b/lisc/rega.c
index 6d1d174..5d2b9f5 100644
--- a/lisc/rega.c
+++ b/lisc/rega.c
@@ -212,8 +212,8 @@ static Ins *
 dopm(Blk *b, Ins *i, RMap *m)
 {
 	RMap m0;
-	int n, r, r1, t;
-	Ins *i1, *ip;
+	int n, r, r1, t, nins;
+	Ins *i1, *ib, *ip, *ir;
 
 	m0 = *m;
 	i1 = i+1;
@@ -251,14 +251,22 @@ dopm(Blk *b, Ins *i, RMap *m)
 		r = RBASE(ip->arg[0].val);
 		if (rfind(m, r) == -1)
 			radd(m, r, r);
-		*ip = (Ins){ONop, R, {R, R}};
 	}
 	pmgen();
 #ifdef TEST_PMOV
 	return 0;
 #endif
-	assert(curi-insb <= i1-i);
-	return memcpy(i, insb, (curi-insb) * sizeof(Ins));
+	nins = curi-insb;
+	ib = alloc((b->nins + nins - (i1-i)) * sizeof(Ins));
+	memcpy(ip = ib, b->ins, (i - b->ins) * sizeof(Ins));
+	ip += i - b->ins;
+	memcpy(ir = ip, insb, nins * sizeof(Ins));
+	ip += nins;
+	memcpy(ip, i1, (&b->ins[b->nins] - i1) * sizeof(Ins));
+	b->nins += nins - (i1-i);
+	free(b->ins);
+	b->ins = ib;
+	return ir;
 }
 
 /* register allocation