mirror of http://shamusworld.gotdns.org/git/rmac
.equr overhaul part 2: added equr evaluation during parsing. So far the gpu/dsp test seems to assemble fine
This commit is contained in:
parent
c77f5e305e
commit
216bfb25e0
94
procln.c
94
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 ",<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
13
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;
|
||||
|
|
Loading…
Reference in New Issue