ref: b584afc229761ee1e36f523ea33e717ea0ef2586
parent: e22a6ae23cdf560dffb4df84e01c57de1224cdb6
author: Roberto E. Vargas Caballero <[email protected]>
date: Fri Mar 20 07:43:50 EDT 2015
Remove individual register variables These variables are not needed because we have an array where we put all the register data. This patch allows to write more efficient code because all the operations are done calculating offset in a static array.
--- a/cc2/cgen.c
+++ b/cc2/cgen.c
@@ -18,78 +18,69 @@
[IYL] = IY, [IYH] = IY, [IY] = IY
};
-Node
-reg_E = {
- .op = REG,
- .reg = E
-},
-reg_D = {
- .op = REG,
- .reg = D
-},
-reg_H = {
- .op = REG,
- .reg = H
-},
-reg_L = {
- .op = REG,
- .reg = L
-},
-reg_C = {
- .op= REG,
- .reg = C
-},
-reg_B = {
- .op= REG,
- .reg = B
-},
-reg_A = {
- .op= REG,
- .reg = A
-},
-reg_IYL = {
- .op = REG,
- .reg = IYL
-},
-reg_IYH = {
- .op = REG,
- .reg = IYH
-},
-reg_DE = {
- .op = REG,
- .reg = DE
-},
-reg_HL = {
- .op = REG,
- .reg = HL
-},
-reg_BC = {
- .op = REG,
- .reg = BC
-},
-reg_IX = {
- .op = REG,
- .reg = IX
-},
-reg_IY = {
- .op = REG,
- .reg = IY
-},
-reg_SP = {
- .op = REG,
- .reg = SP
+Node regs[] = {
+ [E] = {
+ .op = REG,
+ .reg = E
+ },
+ [D] = {
+ .op = REG,
+ .reg = D
+ },
+ [H] = {
+ .op = REG,
+ .reg = H
+ },
+ [L] = {
+ .op = REG,
+ .reg = L
+ },
+ [C] = {
+ .op= REG,
+ .reg = C
+ },
+ [B] = {
+ .op= REG,
+ .reg = B
+ },
+ [A] = {
+ .op= REG,
+ .reg = A
+ },
+ [IYL] = {
+ .op = REG,
+ .reg = IYL
+ },
+ [IYH] = {
+ .op = REG,
+ .reg = IYH
+ },
+ [DE] = {
+ .op = REG,
+ .reg = DE
+ },
+ [HL] = {
+ .op = REG,
+ .reg = HL
+ },
+ [BC] = {
+ .op = REG,
+ .reg = BC
+ },
+ [IX] = {
+ .op = REG,
+ .reg = IX
+ },
+ [IY] = {
+ .op = REG,
+ .reg = IY
+ },
+ [SP] = {
+ .op = REG,
+ .reg = SP
+ }
};
-Node *regs[] = {
- [A] = ®_A,
- [B] = ®_B, [C] = ®_C,
- [D] = ®_D, [E] = ®_E,
- [H] = ®_H, [L] = ®_L,
- [IYL] = ®_IYL, [IYH] = ®_IYH,
- [HL] = ®_HL, [DE] = ®_DE, [BC]= ®_BC,
- [IX] = ®_IX, [IY] = ®_IY, [SP] = ®_SP
-};
-
static uint8_t
allocreg(Node *np)
{
@@ -130,7 +121,7 @@
if (!sym->dirty)
goto freereg;
- r = regs[reg];
+ r = ®s[reg];
switch (np->type.size) {
case 1:
code(LDL, np, r);
@@ -154,7 +145,7 @@
static void
moveto(Node *np, uint8_t reg)
{
- Node *r = regs[reg], *u = reguse[reg];
+ Node *r = ®s[reg], *u = reguse[reg];
char op = np->op;
if (u) {
@@ -188,8 +179,8 @@
code(LDL, r, np);
break;
case AUTO:
- code(LDL, regs[lower[reg]], np);
- code(LDH, regs[upper[reg]], np);
+ code(LDL, ®s[lower[reg]], np);
+ code(LDH, ®s[upper[reg]], np);
break;
default:
abort();
@@ -243,7 +234,7 @@
spill(HL);
}
}
- code(LDI, ®_HL, np);
+ code(LDI, ®s[HL], np);
np->op = INDEX;
reguse[HL] = reguse[H] = reguse[L] = np;
}
@@ -418,15 +409,15 @@
char frame = size != 0 || odebug;
if (frame) {
- code(PUSH, NULL, ®_IX);
- code(MOV, ®_IX, ®_SP);
+ code(PUSH, NULL, ®s[IX]);
+ code(MOV, ®s[IX], ®s[SP]);
if (size > 6) {
- code(MOV, ®_HL, imm(-size));
- code(ADD, ®_HL, ®_SP);
- code(MOV, ®_SP, ®_HL);
+ code(MOV, ®s[HL], imm(-size));
+ code(ADD, ®s[HL], ®s[SP]);
+ code(MOV, ®s[SP], ®s[HL]);
} else {
for (i = size; i != 0; i-= 2)
- code(PUSH, NULL, ®_HL);
+ code(PUSH, NULL, ®s[HL]);
}
}
@@ -433,8 +424,8 @@
apply(applycgen);
if (frame) {
- code(MOV, ®_SP, ®_IX);
- code(POP, ®_IX, NULL);
+ code(MOV, ®s[SP], ®s[IX]);
+ code(POP, ®s[IX], NULL);
code(RET, NULL, NULL);
}
}