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 ",<bank #>" 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 ",<bank #>" 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)
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:
// 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;