summaryrefslogtreecommitdiff
path: root/lisc
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-08-19 10:47:27 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-09-15 23:01:32 -0400
commite361a51248ca4cdea89395d53b24e98d9b1805a2 (patch)
treef53642319f05ed5ac2174a9f85b1a0f264f71be6 /lisc
parent61d07bbb147018cffd2120754c1f3f4f20f3f4dc (diff)
downloadroux-e361a51248ca4cdea89395d53b24e98d9b1805a2.tar.gz
new NAlign constant and fix frame size computation
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);
}