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:
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(®_HL);
+ push(HL);
moveto(np, HL);
break;
case 4:
@@ -192,7 +206,7 @@ static void
index(Node *np)
{
if (reguse[H] || reguse[L])
- push(®_HL);
+ push(HL);
code(LDI, ®_HL, np);
reguse[H] = reguse[L] = np;
np->op = INDEX;