mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Fix yet another unseen regression caused by r223113
r223113 added support for ARM modified immediate assembly syntax. Which assumes all immediate operands are prefixed with a '#'. This assumption is wrong as per the ARMARM - which recommends that all '#' characters be treated optional. The current patch fixes this regression and adds a test case. A follow-up patch will expand the test coverage to other instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223381 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3d47855394
commit
61f3193001
@ -4418,15 +4418,31 @@ ARMAsmParser::parseModImm(OperandVector &Operands) {
|
||||
MCAsmLexer &Lexer = getLexer();
|
||||
int64_t Imm1, Imm2;
|
||||
|
||||
if ((Parser.getTok().isNot(AsmToken::Hash) &&
|
||||
Parser.getTok().isNot(AsmToken::Dollar))
|
||||
|| Lexer.peekTok().is(AsmToken::Colon))
|
||||
return MatchOperand_NoMatch;
|
||||
|
||||
SMLoc S = Parser.getTok().getLoc();
|
||||
|
||||
// Eat the hash (or dollar)
|
||||
Parser.Lex();
|
||||
// 1) A mod_imm operand can appear in the place of a register name:
|
||||
// add r0, #mod_imm
|
||||
// add r0, r0, #mod_imm
|
||||
// to correctly handle the latter, we bail out as soon as we see an
|
||||
// identifier.
|
||||
//
|
||||
// 2) Similarly, we do not want to parse into complex operands:
|
||||
// mov r0, #mod_imm
|
||||
// mov r0, :lower16:(_foo)
|
||||
if (Parser.getTok().is(AsmToken::Identifier) ||
|
||||
Parser.getTok().is(AsmToken::Colon))
|
||||
return MatchOperand_NoMatch;
|
||||
|
||||
// Hash (dollar) is optional as per the ARMARM
|
||||
if (Parser.getTok().is(AsmToken::Hash) ||
|
||||
Parser.getTok().is(AsmToken::Dollar)) {
|
||||
// Avoid parsing into complex operands (#:)
|
||||
if (Lexer.peekTok().is(AsmToken::Colon))
|
||||
return MatchOperand_NoMatch;
|
||||
|
||||
// Eat the hash (dollar)
|
||||
Parser.Lex();
|
||||
}
|
||||
|
||||
SMLoc Sx1, Ex1;
|
||||
Sx1 = Parser.getTok().getLoc();
|
||||
@ -4483,12 +4499,6 @@ ARMAsmParser::parseModImm(OperandVector &Operands) {
|
||||
return MatchOperand_ParseFail;
|
||||
}
|
||||
|
||||
if (Lexer.peekTok().isNot(AsmToken::Hash) &&
|
||||
Lexer.peekTok().isNot(AsmToken::Dollar)) {
|
||||
Error(Lexer.peekTok().getLoc(), "immediate operand expected");
|
||||
return MatchOperand_ParseFail;
|
||||
}
|
||||
|
||||
// Eat the comma
|
||||
Parser.Lex();
|
||||
|
||||
@ -4496,8 +4506,10 @@ ARMAsmParser::parseModImm(OperandVector &Operands) {
|
||||
SMLoc Sx2, Ex2;
|
||||
Sx2 = Parser.getTok().getLoc();
|
||||
|
||||
// Eat the hash (or dollar)
|
||||
Parser.Lex();
|
||||
// Eat the optional hash (dollar)
|
||||
if (Parser.getTok().is(AsmToken::Hash) ||
|
||||
Parser.getTok().is(AsmToken::Dollar))
|
||||
Parser.Lex();
|
||||
|
||||
const MCExpr *Imm2Exp;
|
||||
if (getParser().parseExpression(Imm2Exp, Ex2)) {
|
||||
|
@ -16,6 +16,9 @@ _func:
|
||||
@ ADC (immediate)
|
||||
@------------------------------------------------------------------------------
|
||||
adc r1, r2, #0xf
|
||||
adc r1, r2, $0xf
|
||||
adc r1, r2, 0xf
|
||||
adc r1, r2, 15
|
||||
adc r7, r8, #42, #2
|
||||
adc r7, r8, #-2147483638
|
||||
adc r7, r8, #40, #2
|
||||
@ -33,6 +36,9 @@ _func:
|
||||
adcseq r1, r2, #0xf00
|
||||
adceq r1, r2, #0xf00
|
||||
|
||||
@ CHECK: adc r1, r2, #15 @ encoding: [0x0f,0x10,0xa2,0xe2]
|
||||
@ CHECK: adc r1, r2, #15 @ encoding: [0x0f,0x10,0xa2,0xe2]
|
||||
@ CHECK: adc r1, r2, #15 @ encoding: [0x0f,0x10,0xa2,0xe2]
|
||||
@ CHECK: adc r1, r2, #15 @ encoding: [0x0f,0x10,0xa2,0xe2]
|
||||
@ CHECK: adc r7, r8, #-2147483638 @ encoding: [0x2a,0x71,0xa8,0xe2]
|
||||
@ CHECK: adc r7, r8, #-2147483638 @ encoding: [0x2a,0x71,0xa8,0xe2]
|
||||
|
@ -4,7 +4,7 @@
|
||||
.text
|
||||
bar:
|
||||
mov r0, =0x101
|
||||
@ CHECK: error: unexpected token in operand
|
||||
@ CHECK: error: unknown token in expression
|
||||
@ CHECK: mov r0, =0x101
|
||||
@ CHECK: ^
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user