[llvm-commits] [llvm] r123169 - /llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Daniel Dunbar daniel at zuster.org
Mon Jan 10 04:24:52 PST 2011


Author: ddunbar
Date: Mon Jan 10 06:24:52 2011
New Revision: 123169

URL: http://llvm.org/viewvc/llvm-project?rev=123169&view=rev
Log:
MC/ARM/AsmParser: Split out SplitMnemonicAndCC().

Modified:
    llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=123169&r1=123168&r2=123169&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Jan 10 06:24:52 2011
@@ -866,19 +866,20 @@
   }
 }
 
-/// Parse an arm instruction mnemonic followed by its operands.
-bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc,
-                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
-  // Create the leading tokens for the mnemonic, split by '.' characters.
-  size_t Start = 0, Next = Name.find('.');
-  StringRef Head = Name.slice(Start, Next);
+// FIXME: Would be nice to autogen this.
+static unsigned SplitMnemonicAndCC(StringRef &Mnemonic) {
+  // Ignore some mnemonics we know aren't predicated forms.
+  if (Mnemonic == "movs" ||
+      Mnemonic == "vmls" ||
+      Mnemonic == "vnmls")
+    return ARMCC::AL;
 
-  // Determine the predicate, if any.
+  // Otherwise, determine the predicate.
   //
   // FIXME: We need a way to check whether a prefix supports predication,
   // otherwise we will end up with an ambiguity for instructions that happen to
   // end with a predicate name.
-  unsigned CC = StringSwitch<unsigned>(Head.substr(Head.size()-2))
+  unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
     .Case("eq", ARMCC::EQ)
     .Case("ne", ARMCC::NE)
     .Case("hs", ARMCC::HS)
@@ -895,20 +896,31 @@
     .Case("le", ARMCC::LE)
     .Case("al", ARMCC::AL)
     .Default(~0U);
-
-  if (CC == ~0U ||
-      (CC == ARMCC::LS && (Head == "vmls" || Head == "vnmls"))) {
-    CC = ARMCC::AL;
-  } else {
-    Head = Head.slice(0, Head.size() - 2);
+  if (CC != ~0U) {
+    Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
+    return CC;
   }
 
+  return ARMCC::AL;
+}
+
+/// Parse an arm instruction mnemonic followed by its operands.
+bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc,
+                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
+  // Create the leading tokens for the mnemonic, split by '.' characters.
+  size_t Start = 0, Next = Name.find('.');
+  StringRef Head = Name.slice(Start, Next);
+
+  // Determine the predicate, if any.
+  unsigned CC = SplitMnemonicAndCC(Head);
+
   Operands.push_back(ARMOperand::CreateToken(Head, NameLoc));
 
-  if (Head != "trap")
-    // FIXME: Should only add this operand for predicated instructions
+  // FIXME: Should only add this operand for predicated instructions
+  if (Head != "trap") {
     Operands.push_back(ARMOperand::CreateCondCode(ARMCC::CondCodes(CC),
                                                   NameLoc));
+  }
 
   // Add the remaining tokens in the mnemonic.
   while (Next != StringRef::npos) {





More information about the llvm-commits mailing list