summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/MIRParser
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser')
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.cpp4
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.h5
-rw-r--r--llvm/lib/CodeGen/MIRParser/MIParser.cpp6
3 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
index 0933ae138f2..3383d1f5cf5 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
@@ -64,7 +64,9 @@ static Cursor lexIdentifier(Cursor C, MIToken &Token) {
auto Range = C;
while (isIdentifierChar(C.peek()))
C.advance();
- Token = MIToken(MIToken::Identifier, Range.upto(C));
+ auto Identifier = Range.upto(C);
+ Token = MIToken(Identifier == "_" ? MIToken::underscore : MIToken::Identifier,
+ Identifier);
return C;
}
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h
index df8b6cb2026..f9cc97cb34e 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.h
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.h
@@ -34,6 +34,7 @@ struct MIToken {
// Tokens with no info.
comma,
equal,
+ underscore,
// Identifier tokens
Identifier,
@@ -58,7 +59,9 @@ public:
bool isError() const { return Kind == Error; }
- bool isRegister() const { return Kind == NamedRegister; }
+ bool isRegister() const {
+ return Kind == NamedRegister || Kind == underscore;
+ }
bool is(TokenKind K) const { return Kind == K; }
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index 33f306945cb..07aac674ffb 100644
--- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -174,6 +174,9 @@ bool MIParser::parseInstruction(unsigned &OpCode) {
bool MIParser::parseRegister(unsigned &Reg) {
switch (Token.kind()) {
+ case MIToken::underscore:
+ Reg = 0;
+ break;
case MIToken::NamedRegister: {
StringRef Name = Token.stringValue().drop_front(1); // Drop the '%'
if (getRegisterByName(Name, Reg))
@@ -211,6 +214,7 @@ bool MIParser::parseImmediateOperand(MachineOperand &Dest) {
bool MIParser::parseMachineOperand(MachineOperand &Dest) {
switch (Token.kind()) {
+ case MIToken::underscore:
case MIToken::NamedRegister:
return parseRegisterOperand(Dest);
case MIToken::IntegerLiteral:
@@ -245,6 +249,8 @@ bool MIParser::parseInstrName(StringRef InstrName, unsigned &OpCode) {
void MIParser::initNames2Regs() {
if (!Names2Regs.empty())
return;
+ // The '%noreg' register is the register 0.
+ Names2Regs.insert(std::make_pair("noreg", 0));
const auto *TRI = MF.getSubtarget().getRegisterInfo();
assert(TRI && "Expected target register info");
for (unsigned I = 0, E = TRI->getNumRegs(); I < E; ++I) {
OpenPOWER on IntegriCloud