.equr overhaul part 1: remove gpu/dsp only restriction, make sure things still work (they do, but exported equrs do not match, which is weird considering they shouldn't be exported in the first place)

This commit is contained in:
ggn 2022-03-06 20:07:19 +02:00 committed by Shamus Hammons
parent 0de5c6860b
commit c77f5e305e
3 changed files with 7 additions and 39 deletions

5
expr.c
View File

@ -494,13 +494,8 @@ be converted from a linked list into an array).
*a_value = (symbol->sattr & DEFINED ? symbol->svalue : 0);
*a_attr = (WORD)(symbol->sattr & ~GLOBAL);
/*
All that extra crap that was put into the svalue when doing the equr stuff is
thrown away right here. What the hell is it for?
*/
if (symbol->sattre & EQUATEDREG)
{
*a_value &= 0x1F;
*a_attr |= RISCREG; // Mark it as a register, 'cause it is
*a_esym = symbol;
}

View File

@ -434,32 +434,16 @@ have an array of bools with 64 entries. Whenever a register is equated, set the
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 that we are in a RISC section
if (!rgpu && !rdsp)
{
error(".equr/.regequ must be defined in .gpu/.dsp section");
goto loop;
}
// Check for register to equate to
if ((*tok >= KW_R0) && (*tok <= KW_R31))
{
// sy->sattre = EQUATEDREG | RISCSYM; // Mark as equated register
sy->sattre = EQUATEDREG; // Mark as equated register
riscreg = (*tok - KW_R0);
//is there any reason to do this, since we're putting this in svalue?
//i'm thinking, no. Let's test that out! :-D
// sy->sattre |= (riscreg << 8); // Store register number
//everything seems to build fine without it... We'll leave it here Just In Case(tm)
riscreg = (*tok);
#define DEBODGE_REGBANK
#ifdef DEBODGE_REGBANK
// Default is current state of "regbank"
registerbank = regbank;
#else
// Default is no register bank specified
registerbank = BANK_N;
#endif
// Check for ",<bank #>" override notation
if ((tok[1] == ',') && (tok[2] == CONST))
@ -479,18 +463,7 @@ When checking to see if it's already been equated, issue a warning.
tok++;
}
#ifdef DEBODGE_REGBANK
sy->sattre |= registerbank; // Store register bank
#else
// What needs to happen here is to prime registerbank with regbank, then use
// registerbank down below for the bank marking.
#warning "!!! regbank <-> registerbank confusion here !!!"
// The question here is why, if we're allowed to override the ".regbankN" rules
// above, then why is it using the one set by the directive in the extended
// attributes and not in what ends up in symbol->svalue?
// ".regbankN" is not an original Madmac directive, so it's suspect
sy->sattre |= regbank; // Store register bank
#endif
eattr = ABS | DEFINED | GLOBAL;
eval = riscreg;
tok++;

View File

@ -231,8 +231,8 @@ static int EvaluateRegisterFromTokenStream(uint32_t fixup)
}
// If we got a register in range (0-31), return it
if (eval <= 31)
return (int)eval;
if (eattr & RISCREG)
return (int)eval - KW_R0;
// Otherwise, it's out of range & we flag an error
return error(reg_err);
@ -474,8 +474,8 @@ int GenerateRISCCode(int state)
{
if ((tok[2] == '+') || (tok[2] == '-'))
{
if ((sy->svalue & 0x1F) == 14 || (sy->svalue & 0x1F) == 15) {
indexed = (sy->svalue & 0x1F);
if ((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) {
indexed = (sy->svalue - KW_R0);
tok++;
}
else
@ -590,10 +590,10 @@ int GenerateRISCCode(int state)
if (sy->sattre & EQUATEDREG)
{
if (((sy->svalue & 0x1F) == 14 || (sy->svalue & 0x1F) == 15)
if (((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15)
&& (tok[2] != ')'))
{
indexed = (sy->svalue & 0x1F);
indexed = (sy->svalue - KW_R0);
tok++;
}
}