diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index db847e640b7cd..9774b5491ef11 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -4764,6 +4764,15 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode, // Nothing custom, so do general case parsing. SMLoc S, E; + auto parseOptionalShiftExtend = [&](AsmToken SavedTok) { + if (parseOptionalToken(AsmToken::Comma)) { + ParseStatus Res = tryParseOptionalShiftExtend(Operands); + if (!Res.isNoMatch()) + return Res.isFailure(); + getLexer().UnLex(SavedTok); + } + return false; + }; switch (getLexer().getKind()) { default: { SMLoc S = getLoc(); @@ -4773,7 +4782,7 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode, SMLoc E = SMLoc::getFromPointer(getLoc().getPointer() - 1); Operands.push_back(AArch64Operand::CreateImm(Expr, S, E, getContext())); - return false; + return parseOptionalShiftExtend(getTok()); } case AsmToken::LBrac: { Operands.push_back( @@ -4895,14 +4904,7 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode, Operands.push_back(AArch64Operand::CreateImm(ImmVal, S, E, getContext())); // Parse an optional shift/extend modifier. - AsmToken SavedTok = Tok; - if (parseOptionalToken(AsmToken::Comma)) { - ParseStatus Res = tryParseOptionalShiftExtend(Operands); - if (!Res.isNoMatch()) - return Res.isFailure(); - getLexer().UnLex(SavedTok); - } - return false; + return parseOptionalShiftExtend(Tok); } case AsmToken::Equal: { SMLoc Loc = getLoc(); diff --git a/llvm/test/MC/AArch64/arm64-optional-hash.s b/llvm/test/MC/AArch64/arm64-optional-hash.s index 71e2fda217d52..247d941b029a5 100644 --- a/llvm/test/MC/AArch64/arm64-optional-hash.s +++ b/llvm/test/MC/AArch64/arm64-optional-hash.s @@ -8,6 +8,10 @@ ; CHECK: adds x3, x4, #1024, lsl #12 ; encoding: [0x83,0x00,0x50,0xb1] adds x3, x4, 1024, lsl 12 +; CHECK-COUNT-2: mov x3, #327680 ; encoding: [0xa3,0x00,0xa0,0xd2] +movz x3, (0x54321) >> 16, lsl 16 +movz x3, (0x54321 >> 16), lsl 16 + ; Optional extend ; CHECK: add sp, x2, x3 ; encoding: [0x5f,0x60,0x23,0x8b] add sp, x2, x3, uxtx 0