diff options
| -rw-r--r-- | amd64/emit.c | 4 | ||||
| -rw-r--r-- | common.h | 1 | ||||
| -rw-r--r-- | ir.c | 34 | ||||
| -rw-r--r-- | ir.h | 1 | ||||
| -rw-r--r-- | main.c | 1 | ||||
| -rw-r--r-- | regalloc.c | 2 | ||||
| -rw-r--r-- | ssa.c | 1 | ||||
| -rw-r--r-- | test/fib.c | 2 |
8 files changed, 40 insertions, 6 deletions
diff --git a/amd64/emit.c b/amd64/emit.c index 74dcebe..5c9fb2a 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -416,10 +416,10 @@ static void Xmov(uchar **pcode, enum irclass k, struct oper dst, struct oper src {4|8, PMEM, PI32, "\xC7", EN_MI32}, /* MOV m32/64, imm */ { 8, PGPR, PU32, "\xB8", EN_OI, .norexw=1}, /* MOV r64, uimm */ { 8, PGPR, PI32, "\xC7", EN_RI32}, /* MOV r64, imm */ - {4, PFPR, PFPR, "\xF3\x0F\x10", EN_RR}, /* MOVSS xmm, xmm */ + {4, PFPR, PFPR, "\x0F\x28", EN_RR}, /* MOVPS xmm, xmm */ {4, PFPR, PMEM, "\xF3\x0F\x10", EN_RM}, /* MOVSS xmm, m32 */ {4, PMEM, PFPR, "\xF3\x0F\x11", EN_MR}, /* MOVSS m32, xmm */ - {8, PFPR, PFPR, "\xF2\x0F\x10", EN_RR}, /* MOVSD xmm, xmm */ + {8, PFPR, PFPR, "\x0F\x28", EN_RR}, /* MOVPS xmm, xmm */ {8, PFPR, PMEM, "\xF2\x0F\x10", EN_RM}, /* MOVSD xmm, m64 */ {8, PMEM, PFPR, "\xF2\x0F\x11", EN_MR}, /* MOVSS m64, xmm */ {4|8, PFPR, PGPR, "\x66\x0F\x6E", EN_RR}, /* MOVD/Q xmm, r64/32 */ @@ -127,6 +127,7 @@ struct option { bool p : 1, /* after parsing */ a : 1, /* after abi0 */ m : 1, /* after mem */ + o : 1, /* after optimizations */ i : 1, /* after isel */ l : 1, /* after liveness fixup */ r : 1; /* after regalloc */ @@ -427,7 +427,7 @@ delinstr(struct block *blk, int idx) memcpy(&instrtab[t], &instrfreelist, sizeof(int)); instrfreelist = t; deluses(t); - for (int i = idx; i < blk->ins.n-1; ++i) + for (int i = idx; i < blk->ins.n - 1; ++i) blk->ins.p[i] = blk->ins.p[i + 1]; --blk->ins.n; } @@ -440,12 +440,38 @@ delphi(struct block *blk, int idx) memcpy(&instrtab[t], &instrfreelist, sizeof(int)); instrfreelist = t; deluses(t); - for (int i = idx; i < blk->phi.n; ++i) + for (int i = idx; i < blk->phi.n - 1; ++i) blk->phi.p[i] = blk->phi.p[i + 1]; --blk->phi.n; } void +delnops(struct block *blk) +{ + int i, n, t; + /* delete trailing nops */ + while (blk->ins.n > 0 && instrtab[t = blk->ins.p[blk->ins.n - 1]].op == Onop) { + --blk->ins.n; + memcpy(&instrtab[t], &instrfreelist, sizeof(int)); + instrfreelist = t; + } + /* delete rest of nops */ + for (i = blk->ins.n - 2, n = 0; i >= 0; --i) { + if (instrtab[t = blk->ins.p[i]].op == Onop) { + memcpy(&instrtab[t], &instrfreelist, sizeof(int)); + instrfreelist = t; + ++n; + } else if (n) { + memmove(blk->ins.p+i+1, blk->ins.p+i+1+n, (blk->ins.n - n - i)*sizeof *blk->ins.p); + blk->ins.n -= n; + n = 0; + } + } + if (n) + memmove(blk->ins.p, blk->ins.p + n, (blk->ins.n -= n)*sizeof *blk->ins.p); +} + +void fillblkids(struct function *fn) { int i = 0; @@ -568,6 +594,10 @@ irfini(struct function *fn) lowerintrin(fn); mem2reg(fn); copyopt(fn); + if (ccopt.dbg.o) { + efmt("<< Before isel >>\n"); + irdump(fn); + } mctarg->isel(fn); regalloc(fn); if (!ccopt.dbg.any) @@ -237,6 +237,7 @@ void replcuses(union ref from, union ref to); void deluses(int ins); void delinstr(struct block *, int idx); void delphi(struct block *, int idx); +void delnops(struct block *blk); void fillblkids(struct function *); #define startbbvisit() (void)(++visitmark) #define wasvisited(blk) ((blk)->visit == visitmark) @@ -121,6 +121,7 @@ optparse(char **args) case 'p': ccopt.dbg.p = 1; break; case 'a': ccopt.dbg.a = 1; break; case 'i': ccopt.dbg.i = 1; break; + case 'o': ccopt.dbg.o = 1; break; case 'l': ccopt.dbg.l = 1; break; case 'r': ccopt.dbg.r = 1; break; case 'm': ccopt.dbg.m = 1; break; @@ -877,7 +877,7 @@ regalloc(struct function *fn) fillblkids(fn); if (ccopt.dbg.r) { - DBG("<< Before linear scan >>\n"); + efmt("<< Before linear scan >>\n"); irdump(fn); } @@ -26,6 +26,7 @@ copyopt(struct function *fn) deluses(var.i); } } + delnops(blk); } while ((blk = blk->lnext) != fn->entry); } @@ -1,6 +1,6 @@ unsigned fib(unsigned x) { unsigned r = 0, q = 1; - while (x-- > 1) { + for (; x > 1; --x) { unsigned s = r + q; r = q; q = s; |