From: ggn Date: Sun, 6 Mar 2022 19:37:58 +0000 (+0200) Subject: .equr overhaul part 2: added equr evaluation during parsing. So far the gpu/dsp test... X-Git-Tag: v2.2.0~7 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=commitdiff_plain;h=216bfb25e0ce4afb65bb37347cc46b4c52c2220d .equr overhaul part 2: added equr evaluation during parsing. So far the gpu/dsp test seems to assemble fine --- diff --git a/procln.c b/procln.c index ae2b2b8..3b674c5 100644 --- a/procln.c +++ b/procln.c @@ -435,62 +435,72 @@ corresponding register bool to true. Whenever it's undef'ed, set it to false. When checking to see if it's already been equated, issue a warning. */ - // Check for register to equate to - if ((*tok >= KW_R0) && (*tok <= KW_R31)) + if (rgpu || rdsp) { -// sy->sattre = EQUATEDREG | RISCSYM; // Mark as equated register - sy->sattre = EQUATEDREG; // Mark as equated register - riscreg = (*tok); - - // Default is current state of "regbank" - registerbank = regbank; - - // Check for "," override notation - if ((tok[1] == ',') && (tok[2] == CONST)) + // GPU/DSP architectures need some special TLC for now + // Check for register to equate to + if ((*tok >= KW_R0) && (*tok <= KW_R31)) { - // Advance token pointer to the constant - tok += 3; - - // Anything other than a 0 or a 1 will result in "No Bank" - if (*(uint64_t *)tok == 0) - registerbank = BANK_0; - else if (*(uint64_t *)tok == 1) - registerbank = BANK_1; - - // Advance half-way through the 64-bit const. - // The code below, expecting a regular token, - // will advance past the second half. + // sy->sattre = EQUATEDREG | RISCSYM; // Mark as equated register + sy->sattre = EQUATEDREG; // Mark as equated register + riscreg = *tok; + + // Default is current state of "regbank" + registerbank = regbank; + + // Check for "," override notation + if ((tok[1] == ',') && (tok[2] == CONST)) + { + // Advance token pointer to the constant + tok += 3; + + // Anything other than a 0 or a 1 will result in "No Bank" + if (*(uint64_t*)tok == 0) + registerbank = BANK_0; + else if (*(uint64_t*)tok == 1) + registerbank = BANK_1; + + // Advance half-way through the 64-bit const. + // The code below, expecting a regular token, + // will advance past the second half. + tok++; + } + + sy->sattre |= registerbank; // Store register bank + eattr = ABS | DEFINED | GLOBAL; + eval = riscreg; tok++; } - - sy->sattre |= registerbank; // Store register bank - eattr = ABS | DEFINED | GLOBAL; - eval = riscreg; - tok++; - } - // Checking for a register symbol - else if (tok[0] == SYMBOL) - { - sy2 = lookup(string[tok[1]], LABEL, j); - - // Make sure symbol is a valid equreg - if (!sy2 || !(sy2->sattre & EQUATEDREG)) + // Checking for a register symbol + else if (tok[0] == SYMBOL) { - error("invalid GPU/DSP .equr/.regequ definition"); - goto loop; + sy2 = lookup(string[tok[1]], LABEL, j); + + // Make sure symbol is a valid equreg + if (!sy2 || !(sy2->sattre & EQUATEDREG)) + { + error("invalid GPU/DSP .equr/.regequ definition"); + goto loop; + } + else + { + eattr = ABS | DEFINED | GLOBAL; // Copy symbol's attributes + sy->sattre = sy2->sattre; + eval = (sy2->svalue & 0xFFFFF0FF); + tok += 2; + } } else { - eattr = ABS | DEFINED | GLOBAL; // Copy symbols attributes - sy->sattre = sy2->sattre; - eval = (sy2->svalue & 0xFFFFF0FF); - tok += 2; + error("invalid GPU/DSP .equr/.regequ definition"); + goto loop; } } else { - error("invalid GPU/DSP .equr/.regequ definition"); - goto loop; + sy->sattre = EQUATEDREG; // Mark as equated register + riscreg = *tok; + tok++; } } else if (equtyp == REG) diff --git a/token.c b/token.c index 811ae85..3e42501 100644 --- a/token.c +++ b/token.c @@ -974,6 +974,7 @@ int TokenizeLine(void) int stuffnull; // 1:terminate SYMBOL '\0' at *nullspot uint8_t c1; int stringNum = 0; // Pointer to string locations in tokenized line + SYM* sy; // For looking up symbols (.equr) retry: @@ -1203,6 +1204,18 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); } // If not tokenized keyword OR token was not found if ((j < 0) || (state < 0)) { + // Last attempt: let's see if this is an equated register + sy = lookup(nullspot, LABEL, 0); + if (sy) + { + if (sy->sattre & EQUATEDREG) + { + *tk.u32++ = sy->svalue; + stuffnull = 0; + continue; + } + } + // Ok, that failed, let's store the symbol instead *tk.u32++ = SYMBOL; string[stringNum] = nullspot; *tk.u32++ = stringNum;