From 4f4d4cce6f513a7fd3fdd2e0f6e2a795cfb9bb71 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Wed, 22 Jul 2015 07:09:12 -0400 Subject: rework spilling code for jump arguments --- lisc/lisc.h | 3 ++- lisc/spill.c | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) (limited to 'lisc') diff --git a/lisc/lisc.h b/lisc/lisc.h index e7e0cc8..941751d 100644 --- a/lisc/lisc.h +++ b/lisc/lisc.h @@ -32,7 +32,8 @@ enum { R13, R14, R15, - NReg = R15 - RAX + 1 + // NReg = R15 - RAX + 1 + NReg = 4 /* for test purposes */ }; enum { diff --git a/lisc/spill.c b/lisc/spill.c index 109bc2f..ad105e1 100644 --- a/lisc/spill.c +++ b/lisc/spill.c @@ -217,7 +217,7 @@ void spill(Fn *fn) { Blk *b, *s1, *s2, *hd; - int n, z, k, pl; + int n, z, pl; Bits v, w; Ins *i; int j; @@ -234,8 +234,6 @@ spill(Fn *fn) * the end of the block (put them in v) */ s1 = b->s1; s2 = b->s2; - // k = NReg - !req(b->jmp.arg, R); - k = 4 - !req(b->jmp.arg, R); v = (Bits){{0}}; hd = 0; if (s1 && s1->id <= n) @@ -249,16 +247,16 @@ spill(Fn *fn) for (z=0; zgen.t[z] & b->out.t[z]; j = bcnt(&v); - if (j < k) { + if (j < NReg) { w = b->out; for (z=0; z k) - v = limit(&v, k, 0); + } else if (j > NReg) + v = limit(&v, NReg, 0); } else if (s1) { v = s1->in; w = s1->in; @@ -273,9 +271,13 @@ spill(Fn *fn) } assert(bcnt(&w) <= NReg); assert(bcnt(&w) <= bcnt(&v)); - v = limit(&v, k, &w); + v = limit(&v, NReg, &w); } - assert(bcnt(&v) <= k); + assert(bcnt(&v) <= NReg); + if (rtype(b->jmp.arg) == RSym + && !BGET(v, b->jmp.arg.val) + && bcnt(&v) == NReg) + v = limit(&v, NReg-1, 0); b->out = v; /* 2. process the block instructions */ -- cgit 1.4.1