diff options
author | Ori Bernstein <ori@eigenstate.org> | 2013-01-29 09:58:30 -0500 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2013-01-29 09:58:30 -0500 |
commit | b474f4b5e52fdabfec503d8666aefe35bdbdb7f1 (patch) | |
tree | 8e9cf94e0beb222cff83e4deb196b2cfba21f120 | |
parent | f6e81804fafb07980cde274e5350e081e61a6a28 (diff) | |
download | mc-b474f4b5e52fdabfec503d8666aefe35bdbdb7f1.tar.gz |
Stub in callee save registers.
Don't enable them since they're broken, but stub them in.
-rw-r--r-- | 6/asm.h | 3 | ||||
-rw-r--r-- | 6/isel.c | 46 | ||||
-rw-r--r-- | 6/ra.c | 2 |
3 files changed, 48 insertions, 3 deletions
@@ -4,7 +4,7 @@ #define Wordsz 4 /* the size of a "natural int" */ #define Ptrsz 8 /* the size of a machine word (ie, pointer size) */ #define K 14 /* the number of allocatable registers */ -#define Nsaved 14 /* number of registers saved in the ABI */ +#define Nsaved 13 /* number of registers saved in the ABI */ typedef size_t regid; @@ -195,7 +195,6 @@ void locprint(FILE *fd, Loc *l, char spec); void iprintf(FILE *fd, Insn *insn); /* emitting instructions */ -void g(Isel *s, AsmOp op, ...); Insn *mkinsn(AsmOp op, ...); /* register allocation */ @@ -131,7 +131,18 @@ static Insn *mkinsnv(AsmOp op, va_list ap) return i; } -static void g(Isel *s, AsmOp op, ...) +Insn *mkinsn(AsmOp op, ...) +{ + va_list ap; + Insn *i; + + va_start(ap, op); + i = mkinsnv(op, ap); + va_end(ap); + return i; +} + +void g(Isel *s, AsmOp op, ...) { va_list ap; Insn *i; @@ -749,18 +760,44 @@ static void isel(Isel *s, Node *n) } } +Reg savedregs[] = { + Rrcx, + Rrdx, + Rrbx, + Rrsi, + Rrdi, + Rr8, + Rr9, + Rr10, + Rr11, + Rr12, + Rr13, + Rr14, + Rr15 +}; + static void prologue(Isel *s, size_t sz) { Loc *rsp; Loc *rbp; Loc *stksz; + //size_t i; rsp = locphysreg(Rrsp); rbp = locphysreg(Rrbp); stksz = loclit(sz, ModeQ); + /* enter function */ g(s, Ipush, rbp, NULL); g(s, Imov, rsp, rbp, NULL); g(s, Isub, stksz, rsp, NULL); +#if 0 + /* save registers */ + for (i = 0; i < sizeof(savedregs)/sizeof(savedregs[0]); i++) { + s->calleesave[i] = locreg(ModeQ); + g(s, Imov, locphysreg(savedregs[i]), s->calleesave[i], NULL); + } +#endif + s->stksz = stksz; /* need to update if we spill */ } @@ -768,6 +805,7 @@ static void epilogue(Isel *s) { Loc *rsp, *rbp; Loc *ret; + //size_t i; rsp = locphysreg(Rrsp); rbp = locphysreg(Rrbp); @@ -775,6 +813,12 @@ static void epilogue(Isel *s) ret = loc(s, s->ret); g(s, Imov, ret, coreg(Rax, ret->mode), NULL); } +#if 0 + /* restore registers */ + for (i = 0; i < Nsaved; i++) + g(s, Imov, s->calleesave[i], locphysreg(savedregs[i]), NULL); + /* leave function */ +#endif g(s, Imov, rbp, rsp, NULL); g(s, Ipop, rbp, NULL); g(s, Iret, NULL); @@ -996,8 +996,10 @@ void regalloc(Isel *s) s->prepainted = mkbs(); s->shouldspill = mkbs(); s->neverspill = mkbs(); +#if 0 for (i = 0; i < Nsaved; i++) bsput(s->shouldspill, s->calleesave[i]->reg.id); +#endif for (i = 0; i < maxregid; i++) if (locmap[i]->reg.colour) bsput(s->prepainted, i); |