From: ggn Date: Sun, 6 Mar 2022 21:42:43 +0000 (+0200) Subject: .equr overhaul part 3: store and handle banks in .equr evaluation X-Git-Tag: v2.2.0~6 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=commitdiff_plain;h=f23a0935e11c9a1ad61e4b4ee4a1e63fbd7b3e00 .equr overhaul part 3: store and handle banks in .equr evaluation --- diff --git a/error.c b/error.c index 2a3df96..4402610 100644 --- a/error.c +++ b/error.c @@ -20,6 +20,7 @@ char * interror_msg[] = { "Can't find generated code in section", // Error #6 "Fixup (loc) out of range" // Error #7 "Absolute top filename found" // Error #8 + "" }; // Exported variables diff --git a/expr.c b/expr.c index 4525754..be0f347 100644 --- a/expr.c +++ b/expr.c @@ -467,15 +467,15 @@ int expr(TOKEN * otk, uint64_t * a_value, WORD * a_attr, SYM ** a_esym) // return ERROR; } - // Check register bank usage - if (symbol->sattre & EQUATEDREG) - { - if ((regbank == BANK_0) && (symbol->sattre & BANK_1) && !altbankok) - warn("equated symbol '%s' cannot be used in register bank 0", symbol->sname); - - if ((regbank == BANK_1) && (symbol->sattre & BANK_0) && !altbankok) - warn("equated symbol '%s' cannot be used in register bank 1", symbol->sname); - } + // Check register bank usage (moved to EvaluateRegisterFromTokenStream())) + //if (symbol->sattre & EQUATEDREG) + //{ + // if ((regbank == BANK_0) && (symbol->sattre & BANK_1) && !altbankok) + // warn("equated symbol '%s' cannot be used in register bank 0", symbol->sname); + // + // if ((regbank == BANK_1) && (symbol->sattre & BANK_0) && !altbankok) + // warn("equated symbol '%s' cannot be used in register bank 1", symbol->sname); + //} *evalTokenBuffer.u32++ = SYMBOL; #if 0 diff --git a/riscasm.c b/riscasm.c index fb6c5ce..f16abe0 100644 --- a/riscasm.c +++ b/riscasm.c @@ -201,9 +201,23 @@ static int EvaluateRegisterFromTokenStream(uint32_t fixup) { // Firstly, check to see if it's a register token and return that. No // need to invoke expr() for easy cases like this. - if (*tok >= KW_R0 && *tok <= KW_R31) + int reg = *tok & 255; + if (reg >= KW_R0 && reg <= KW_R31) { - int reg = *tok - KW_R0; + // Check register bank usage in the case of .equr register + // (encoded as bits 30 and 31 in *tok). + // (I still think that this is superfluous and should be taken out, see my note in token.c) + if (*tok & 0x80000000) + { + // Oops, with all the evaluation in token.c we now lost the equated symbol reference, so we + // don't know its name or anything else. Oh well... + if ((regbank == BANK_0) && (*tok & 0x40000000) && !altbankok) + return error("equated symbol cannot be used in register bank 0"); + + if ((regbank == BANK_1) && !(*tok & 0x40000000) && !altbankok) + return error("equated symbol cannot be used in register bank 1"); + } + reg -= KW_R0; tok++; return reg; } @@ -230,12 +244,15 @@ static int EvaluateRegisterFromTokenStream(uint32_t fixup) return 0; } + // We shouldn't get here, that should not be legal + interror(9); + // If we got a register in range (0-31), return it - if (eattr & RISCREG) - return (int)eval - KW_R0; + //if (eattr & RISCREG) + // return (int)eval - KW_R0; - // Otherwise, it's out of range & we flag an error - return error(reg_err); + //// Otherwise, it's out of range & we flag an error + //return error(reg_err); } // @@ -454,35 +471,38 @@ int GenerateRISCCode(int state) if ((tok[1] == '+') || (tok[1] == '-')) { // Trying to make indexed call - if ((*tok == KW_R14) || (*tok == KW_R15)) - indexed = (*tok - KW_R0); + // Note: no bank check for .equr symbol here, but the original code for .equr + // below also didn't check for banks. Even more reasons to throw away + // bank checks. + if (((*tok & 0xff) == KW_R14) || ((*tok &0xff) == KW_R15)) + indexed = ((*tok & 0xff) - KW_R0); else return IllegalIndexedRegister(*tok); } - if (*tok == SYMBOL) - { - sy = lookup(string[tok[1]], LABEL, 0); - - if (!sy) - { - error(reg_err); - return ERROR; - } - - if (sy->sattre & EQUATEDREG) - { - if ((tok[2] == '+') || (tok[2] == '-')) - { - if ((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) { - indexed = (sy->svalue - KW_R0); - tok++; - } - else - return IllegalIndexedRegisterEqur(sy); - } - } - } + //if (*tok == SYMBOL) + //{ + // sy = lookup(string[tok[1]], LABEL, 0); + // + // if (!sy) + // { + // error(reg_err); + // return ERROR; + // } + // + // if (sy->sattre & EQUATEDREG) + // { + // if ((tok[2] == '+') || (tok[2] == '-')) + // { + // if ((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) { + // indexed = (sy->svalue - KW_R0); + // tok++; + // } + // else + // return IllegalIndexedRegisterEqur(sy); + // } + // } + //} if (!indexed) { @@ -499,7 +519,7 @@ int GenerateRISCCode(int state) parm = (WORD)(reg1 - 14 + 58); tok++; - if ((*tok >= KW_R0) && (*tok <= KW_R31)) + if (((*tok & 0xff) >= KW_R0) && ((*tok & 0xff) <= KW_R31)) indexed = 1; if (*tok == SYMBOL) @@ -575,29 +595,31 @@ int GenerateRISCCode(int state) tok++; indexed = 0; - if (((*tok == KW_R14) || (*tok == KW_R15)) && (tok[1] != ')')) - indexed = *tok - KW_R0; - - if (*tok == SYMBOL) - { - sy = lookup(string[tok[1]], LABEL, 0); - - if (!sy) - { - error(reg_err); - return ERROR; - } - - if (sy->sattre & EQUATEDREG) - { - if (((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) - && (tok[2] != ')')) - { - indexed = (sy->svalue - KW_R0); - tok++; - } - } - } + // Again, no bank checks here or in the original code. + // This check has more holes than a very hole-y thing. + if ((((*tok & 0xff) == KW_R14) || ((*tok & 0xff) == KW_R15)) && (tok[1] != ')')) + indexed = (*tok & 0xff) - KW_R0; + + //if (*tok == SYMBOL) + //{ + // sy = lookup(string[tok[1]], LABEL, 0); + // + // if (!sy) + // { + // error(reg_err); + // return ERROR; + // } + // + // if (sy->sattre & EQUATEDREG) + // { + // if (((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) + // && (tok[2] != ')')) + // { + // indexed = (sy->svalue - KW_R0); + // tok++; + // } + // } + //} if (!indexed) { @@ -614,7 +636,7 @@ int GenerateRISCCode(int state) parm = (WORD)(reg2 - 14 + 60); tok++; - if ((*tok >= KW_R0) && (*tok <= KW_R31)) + if (((*tok & 0xff) >= KW_R0) && ((*tok & 0xff) <= KW_R31)) indexed = 1; if (*tok == SYMBOL) diff --git a/token.c b/token.c index 3e42501..162e739 100644 --- a/token.c +++ b/token.c @@ -1205,12 +1205,31 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); } if ((j < 0) || (state < 0)) { // Last attempt: let's see if this is an equated register + char temp = *ln; + *ln = 0; sy = lookup(nullspot, LABEL, 0); + *ln = temp; if (sy) { if (sy->sattre & EQUATEDREG) { - *tk.u32++ = sy->svalue; + uint32_t register_token = sy->svalue; + if (rgpu || rdsp) + { + // If we are in GPU or DSP mode then mark the register bank. + // We will use it during EvaluateRegisterFromTokenStream() + // when we check if we can use the equated register with the currently + // selected bank. + // Note (ggn): I find all this superfluous. Do we really want to be so + // protective? Plus, the current implementation happily skips + // these checks on .equr that are set during fixups - oops! + register_token |= 0x80000000; // Mark that this is an .equr + if (sy->sattre & BANK_1) + { + register_token |= 0x40000000; // Mark bank 1 + } + } + *tk.u32++ = register_token; stuffnull = 0; continue; }