.equr overhaul part 2: added equr evaluation during parsing. So far the gpu/dsp test seems to assemble fine

This commit is contained in:
ggn 2022-03-06 21:37:58 +02:00 committed by Shamus Hammons
parent c77f5e305e
commit 216bfb25e0
2 changed files with 65 additions and 42 deletions

View File

@ -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 ",<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;
// sy->sattre = EQUATEDREG | RISCSYM; // Mark as equated register
sy->sattre = EQUATEDREG; // Mark as equated register
riscreg = *tok;
// 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;
// Default is current state of "regbank"
registerbank = regbank;
// Advance half-way through the 64-bit const.
// The code below, expecting a regular token,
// will advance past the second half.
// 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++;
}
// Checking for a register symbol
else if (tok[0] == SYMBOL)
{
sy2 = lookup(string[tok[1]], LABEL, j);
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))
// 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
{
error("invalid GPU/DSP .equr/.regequ definition");
goto loop;
}
else
{
eattr = ABS | DEFINED | GLOBAL; // Copy symbols attributes
sy->sattre = sy2->sattre;
eval = (sy2->svalue & 0xFFFFF0FF);
tok += 2;
}
}
else
{
error("invalid GPU/DSP .equr/.regequ definition");
goto loop;
sy->sattre = EQUATEDREG; // Mark as equated register
riscreg = *tok;
tok++;
}
}
else if (equtyp == REG)

13
token.c
View File

@ -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;