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;
|
ilast->mAsmInsType = ins;
|
||||||
mScanner->NextToken();
|
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;
|
ilast->mAsmInsMode = ASMIM_IMPLIED;
|
||||||
else if (mScanner->mToken == TK_HASH)
|
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)
|
if (mScanner->mToken != TK_EOL && mScanner->mToken != TK_CLOSE_BRACE)
|
||||||
{
|
{
|
||||||
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "End of line expected");
|
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "End of line expected");
|
||||||
|
|
Loading…
Reference in New Issue