scc

simple C compiler
git clone git://git.2f30.org/scc
Log | Files | Refs | README | LICENSE

commit 4fafd289207621b7b95e606825acfe80404c5017
parent 7e5eb0d9f025aab0d247d0566f1a970cdb18ece9
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Mon, 16 Mar 2015 13:50:50 +0000

Fix push() in cgen

Push() was marking as pushed the static node that is used for
registers, but it was not the node that was pushed. There were
another problems, mainly related to pair register, because
each element can represent different nodes.

Diffstat:
Mcc2/cgen.c | 26++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/cc2/cgen.c b/cc2/cgen.c @@ -11,6 +11,13 @@ static Node *reguse[NREGS]; static char upper[] = {[DE] = D, [HL] = H, [BC] = B, [IY] = IYH}; static char lower[] = {[DE] = E, [HL] = L, [BC] = C, [IY] = IYL}; +static char pair[] = { + [A] = A, + [H] = HL, [L] = HL, + [B] = BC, [C] = BC, + [D] = DE, [E] = DE, + [IYL] = IY, [IYH] = IY +}; Node reg_E = { @@ -162,10 +169,17 @@ move(Node *np) } static void -push(Node *np) +push(uint8_t reg) { - code(PUSH, NULL, np); - np->op = PUSHED; + Node *np; + + if (reg < NREGS) + reg = pair[reg]; + if ((np = reguse[lower[reg]]) != NULL) + np->op = PUSHED; + if ((np = reguse[upper[reg]]) != NULL) + np->op = PUSHED; + code(PUSH, NULL, regs[reg]); } static void @@ -174,12 +188,12 @@ accum(Node *np) switch (np->type.size) { case 1: if (reguse[A]) - push(reguse[A]); + push(A); moveto(np, A); break; case 2: if (reguse[H] || reguse[L]) - push(&reg_HL); + push(HL); moveto(np, HL); break; case 4: @@ -192,7 +206,7 @@ static void index(Node *np) { if (reguse[H] || reguse[L]) - push(&reg_HL); + push(HL); code(LDI, &reg_HL, np); reguse[H] = reguse[L] = np; np->op = INDEX;