summary refs log tree commit diff
path: root/lisc
diff options
context:
space:
mode:
Diffstat (limited to 'lisc')
-rw-r--r--lisc/emit.c9
-rw-r--r--lisc/isel.c14
-rw-r--r--lisc/lisc.h5
-rw-r--r--lisc/tools/slot.c18
4 files changed, 23 insertions, 23 deletions
diff --git a/lisc/emit.c b/lisc/emit.c
index ce39168..1f2060b 100644
--- a/lisc/emit.c
+++ b/lisc/emit.c
@@ -283,17 +283,16 @@ eins(Ins i, Fn *fn, FILE *f)
 static int
 framesz(Fn *fn)
 {
-	enum { N = sizeof (Fn){0}.svec / sizeof (Fn){0}.svec[0] };
 	int i, a, f;
 
 	f = 0;
-	for (i=N-1, a=1<<i; i>=0; i--, a/=2)
+	for (i=NAlign-1, a=1<<i; i>=0; i--, a/=2)
 		if (f == 0 || f - a == fn->svec[i])
 			f = fn->svec[i];
-	a = 1 << (N-2);
-	while (f % (2 * a) != a)
+	a = 1 << (NAlign-2);
+	while ((f + a) % (2 * a) != a)
 		f += a - f % a;
-	return f * 16 / (1 << (N-1));
+	return f * 16 / (1 << (NAlign-1));
 }
 
 void
diff --git a/lisc/isel.c b/lisc/isel.c
index af21bcb..70550ff 100644
--- a/lisc/isel.c
+++ b/lisc/isel.c
@@ -359,7 +359,6 @@ seljmp(Blk *b, Fn *fn)
 int
 slota(int sz, int al /* log2 */, int *sa)
 {
-	enum { N = sizeof (Fn){0}.svec / sizeof (Fn){0}.svec[0] };
 	int j, k, s, l, a, ret;
 
 	a = 1 << al;
@@ -372,18 +371,18 @@ slota(int sz, int al /* log2 */, int *sa)
 		 * todo, could sophisticate
 		 */
 		l = (l + a-1) & ~(a-1);
-		s = sa[N-1] + l;
+		s = sa[NAlign-1] + l;
 		ret = s;
-		for (j=0, k=1; j<N; j++, k*=2) {
+		for (j=0, k=1; j<NAlign; j++, k*=2) {
 			l = (l + k-1) & ~(k-1);
-			sa[j] = sa[N-1] + l;
+			sa[j] = sa[NAlign-1] + l;
 		}
 	} else {
 		j = al;
 		s = sa[j] + a;
 		ret = s;
 	Shift:
-		if (j < N-1 && s < sa[j+1])
+		if (j < NAlign-1 && s < sa[j+1])
 			/* ........-----------...
 			 * ^       ^          ^
 			 * sa[j]  sa[j]+a    sa[j+1]
@@ -400,7 +399,7 @@ slota(int sz, int al /* log2 */, int *sa)
 			if (sa[k] == sa[j])
 				sa[k] = s;
 
-		if (j < N-1 && s > sa[j+1]) {
+		if (j < NAlign-1 && s > sa[j+1]) {
 			/* we were in a bigger hole,
 			 * it needs to shift further
 			 */
@@ -436,7 +435,8 @@ isel(Fn *fn)
 			sz = fn->con[i->arg[0].val].val;
 			if (sz < 0 || sz >= INT_MAX-3)
 				diag("isel: invalid alloc size");
-			sz = (sz + 3) / 4;
+			n = 16 / (1 << (NAlign-1));
+			sz = (sz + n-1) / n;
 			al = i->op - OAlloc;
 			s = slota(sz, al, fn->svec);
 			fn->tmp[i->to.val].spill = s;
diff --git a/lisc/lisc.h b/lisc/lisc.h
index ce32bb5..d924701 100644
--- a/lisc/lisc.h
+++ b/lisc/lisc.h
@@ -69,6 +69,7 @@ enum {
 	NPred   = 15,
 	NBlk    = 128,
 	NIns    = 256,
+	NAlign  = 3,
 
 	BITS    = 4,
 	NBit    = 64,
@@ -141,7 +142,7 @@ enum Op {
 	OLoadsb,
 	OLoadub,
 	OAlloc,
-	OAlloc1 = OAlloc + 2,
+	OAlloc1 = OAlloc + NAlign-1,
 	OCopy,
 	NPubOp,
 
@@ -244,7 +245,7 @@ struct Fn {
 	int ncon;
 	int nblk;
 	Blk **rpo;
-	int svec[3];
+	int svec[NAlign];
 };
 
 
diff --git a/lisc/tools/slot.c b/lisc/tools/slot.c
index 4b97be7..caee851 100644
--- a/lisc/tools/slot.c
+++ b/lisc/tools/slot.c
@@ -14,7 +14,7 @@
 
 #define VARL 1
 
-enum { N = 3 };
+enum { NAlign = 3 };
 
 static int
 slota(int sz, int al, int *sa)
@@ -31,18 +31,18 @@ slota(int sz, int al, int *sa)
 		 * todo, could sophisticate
 		 */
 		l = (l + a-1) & ~(a-1);
-		s = sa[N-1] + l;
+		s = sa[NAlign-1] + l;
 		ret = s;
-		for (j=0, k=1; j<N; j++, k*=2) {
+		for (j=0, k=1; j<NAlign; j++, k*=2) {
 			l = (l + k-1) & ~(k-1);
-			sa[j] = sa[N-1] + l;
+			sa[j] = sa[NAlign-1] + l;
 		}
 	} else {
 		j = al;
 		s = sa[j] + a;
 		ret = s;
 	Shift:
-		if (j < N-1 && s < sa[j+1])
+		if (j < NAlign-1 && s < sa[j+1])
 			/* ........-----------...
 			 * ^       ^          ^
 			 * sa[j]  sa[j]+a    sa[j+1]
@@ -59,7 +59,7 @@ slota(int sz, int al, int *sa)
 			if (sa[k] == sa[j])
 				sa[k] = s;
 
-		if (j < N-1 && s > sa[j+1]) {
+		if (j < NAlign-1 && s > sa[j+1]) {
 			/* we were in a bigger hole,
 			 * it needs to shift further
 			 */
@@ -75,7 +75,7 @@ enum { S = 300 };
 int
 main(int ac, char *av[])
 {
-	int sa[N] = {0, 0, 2};
+	int sa[NAlign] = {0, 0, 2};
 	char stk[S] = {0}, buf[4] = {0};
 	unsigned seed;
 	int i, a, l, s, itr;
@@ -97,7 +97,7 @@ main(int ac, char *av[])
 			printf("\n");
 		do
 			a = rand() % 4;
-		while (a >= N);
+		while (a >= NAlign);
 		if ((float)rand()/RAND_MAX < 0.1 && VARL) {
 			l = rand() % (S/20);
 			printf("[(%02d) %02d %d] ", itr, l, a);
@@ -135,7 +135,7 @@ end:
 	for (i=0; i<S; i++)
 		printf("%02d ", stk[i]);
 	printf("\n\n");
-	for (i=0; i<N; i++)
+	for (i=0; i<NAlign; i++)
 		printf("sa[%d] = %d\n", i, sa[i]);
 	exit(ret);
 }