Improve BYT operands in inline assembler
This commit is contained in:
parent
fafbbe82d1
commit
91c907be7e
|
@ -10738,7 +10738,61 @@ Expression* Parser::ParseAssembler(void)
|
|||
|
||||
ilast->mAsmInsType = ins;
|
||||
mScanner->NextToken();
|
||||
if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_CLOSE_BRACE)
|
||||
if (ins == ASMIT_BYTE)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
ilast->mAsmInsMode = ASMIM_IMMEDIATE;
|
||||
if (mScanner->mToken == TK_STRING)
|
||||
{
|
||||
if (mScanner->mTokenString[0])
|
||||
{
|
||||
int i = 0;
|
||||
while (mScanner->mTokenString[i])
|
||||
{
|
||||
Declaration* dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
||||
dec->mInteger = mCharMap[mScanner->mTokenString[i]];
|
||||
dec->mBase = TheUnsignedCharTypeDeclaration;
|
||||
Expression* exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
||||
exp->mDecValue = dec;
|
||||
exp->mDecType = dec->mBase;
|
||||
ilast->mLeft = exp;
|
||||
|
||||
i++;
|
||||
if (mScanner->mTokenString[i])
|
||||
{
|
||||
offset += AsmInsSize(ilast->mAsmInsType, ilast->mAsmInsMode);
|
||||
|
||||
ifinal = ilast;
|
||||
|
||||
ilast->mRight = new Expression(mScanner->mLocation, EX_ASSEMBLER);
|
||||
ilast = ilast->mRight;
|
||||
ilast->mAsmInsType = ASMIT_BYTE;
|
||||
ilast->mAsmInsMode = ASMIM_IMMEDIATE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
mErrors->Error(mScanner->mLocation, EERR_ASM_INVALID_INSTRUCTION, "Invalid assembler token");
|
||||
mScanner->NextToken();
|
||||
}
|
||||
else
|
||||
ilast->mLeft = ParseAssemblerOperand(vdasm, offset);
|
||||
if (ConsumeTokenIf(TK_COMMA))
|
||||
{
|
||||
offset += AsmInsSize(ilast->mAsmInsType, ilast->mAsmInsMode);
|
||||
|
||||
ifinal = ilast;
|
||||
|
||||
ilast->mRight = new Expression(mScanner->mLocation, EX_ASSEMBLER);
|
||||
ilast = ilast->mRight;
|
||||
ilast->mAsmInsType = ASMIT_BYTE;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_CLOSE_BRACE)
|
||||
ilast->mAsmInsMode = ASMIM_IMPLIED;
|
||||
else if (mScanner->mToken == TK_HASH)
|
||||
{
|
||||
|
@ -10832,9 +10886,6 @@ Expression* Parser::ParseAssembler(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (ilast->mAsmInsType == ASMIT_BYTE)
|
||||
ilast->mAsmInsMode = ASMIM_IMMEDIATE;
|
||||
|
||||
if (mScanner->mToken != TK_EOL && mScanner->mToken != TK_CLOSE_BRACE)
|
||||
{
|
||||
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "End of line expected");
|
||||
|
|
Loading…
Reference in New Issue