MCAsmLexer &Lexer = getLexer();
int64_t Imm1, Imm2;
- if ((Parser.getTok().isNot(AsmToken::Hash) &&
- Parser.getTok().isNot(AsmToken::Dollar))
- || Lexer.peekTok().is(AsmToken::Colon))
+ SMLoc S = Parser.getTok().getLoc();
+
+ // 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;
- SMLoc S = Parser.getTok().getLoc();
+ // 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 (or dollar)
- Parser.Lex();
+ // Eat the hash (dollar)
+ Parser.Lex();
+ }
SMLoc Sx1, Ex1;
Sx1 = Parser.getTok().getLoc();
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();
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)) {
@ 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
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]