diff options
author | Alex Lorenz <arphaman@gmail.com> | 2015-07-29 18:51:21 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2015-07-29 18:51:21 +0000 |
commit | fbe9c04c5f72cf3eca39793aafc92071ef13c046 (patch) | |
tree | 7f7de65b56c41854f8ab107689e8fde08453cf08 | |
parent | 57a9c7eba59ef9438296ec6387d8460b09069450 (diff) | |
download | bcm5719-llvm-fbe9c04c5f72cf3eca39793aafc92071ef13c046.tar.gz bcm5719-llvm-fbe9c04c5f72cf3eca39793aafc92071ef13c046.zip |
MIR Parser: Parse multiple LHS register machine operands.
llvm-svn: 243553
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 11 | ||||
-rw-r--r-- | llvm/test/CodeGen/MIR/AArch64/lit.local.cfg | 8 | ||||
-rw-r--r-- | llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir | 29 |
3 files changed, 44 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 2ef76114331..6c0cd9d6ef8 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -214,6 +214,8 @@ static const char *toString(MIToken::TokenKind TokenKind) { switch (TokenKind) { case MIToken::comma: return "','"; + case MIToken::equal: + return "'='"; case MIToken::lparen: return "'('"; case MIToken::rparen: @@ -234,18 +236,19 @@ bool MIParser::parse(MachineInstr *&MI) { lex(); // Parse any register operands before '=' - // TODO: Allow parsing of multiple operands before '=' MachineOperand MO = MachineOperand::CreateImm(0); SmallVector<MachineOperandWithLocation, 8> Operands; - if (Token.isRegister() || Token.isRegisterFlag()) { + while (Token.isRegister() || Token.isRegisterFlag()) { auto Loc = Token.location(); if (parseRegisterOperand(MO, /*IsDef=*/true)) return true; Operands.push_back(MachineOperandWithLocation(MO, Loc, Token.location())); - if (Token.isNot(MIToken::equal)) - return error("expected '='"); + if (Token.isNot(MIToken::comma)) + break; lex(); } + if (!Operands.empty() && expectAndConsume(MIToken::equal)) + return true; unsigned OpCode, Flags = 0; if (Token.isError() || parseInstruction(OpCode, Flags)) diff --git a/llvm/test/CodeGen/MIR/AArch64/lit.local.cfg b/llvm/test/CodeGen/MIR/AArch64/lit.local.cfg new file mode 100644 index 00000000000..f4f77c5aa31 --- /dev/null +++ b/llvm/test/CodeGen/MIR/AArch64/lit.local.cfg @@ -0,0 +1,8 @@ +import re + +if not 'AArch64' in config.root.targets: + config.unsupported = True + +# For now we don't test arm64-win32. +if re.search(r'cygwin|mingw32|win32|windows-gnu|windows-msvc', config.target_triple): + config.unsupported = True diff --git a/llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir b/llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir new file mode 100644 index 00000000000..d47c8ba47f6 --- /dev/null +++ b/llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir @@ -0,0 +1,29 @@ +# RUN: llc -mtriple=aarch64-none-linux-gnu -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s +# This test ensures that the MIR parser can parse multiple register machine +# operands before '='. + +--- | + + declare void @foo() + + define void @trivial_fp_func() { + entry: + call void @foo() + ret void + } + +... +--- +name: trivial_fp_func +body: + - id: 0 + name: entry + liveins: [ '%lr', '%fp', '%lr', '%fp' ] + instructions: + - '%sp = frame-setup STPXpre killed %fp, killed %lr, %sp, -2' + - '%fp = frame-setup ADDXri %sp, 0, 0' + - 'BL @foo, csr_aarch64_aapcs, implicit-def dead %lr, implicit %sp, implicit-def %sp' +# CHECK: %sp, %fp, %lr = LDPXpost %sp, 2 + - '%sp, %fp, %lr = LDPXpost %sp, 2' + - RET_ReallyLR +... |