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

Daniel Dunbar daniel at zuster.org
Tue Jan 11 07:59:53 PST 2011


Author: ddunbar
Date: Tue Jan 11 09:59:53 2011
New Revision: 123239

URL: http://llvm.org/viewvc/llvm-project?rev=123239&view=rev
Log:
McARM: Sketch some logic for determining when to add carry set and predication code operands based on the "canonical mnemonic".

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=123239&r1=123238&r2=123239&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Tue Jan 11 09:59:53 2011
@@ -930,6 +930,20 @@
 
   return Mnemonic;
 }
+
+/// \brief Given a canonical mnemonic, determine if the instruction ever allows
+/// inclusion of carry set or predication code operands.
+//
+// FIXME: It would be nice to autogen this.
+static void GetMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
+                                  bool &CanAcceptPredicationCode) {
+  CanAcceptCarrySet = false;
+
+  if (Mnemonic == "trap") {
+    CanAcceptPredicationCode = false;
+  } else {
+    CanAcceptPredicationCode = true;
+  }
 }
 
 /// Parse an arm instruction mnemonic followed by its operands.
@@ -946,10 +960,40 @@
 
   Operands.push_back(ARMOperand::CreateToken(Head, NameLoc));
 
-  // FIXME: Should only add this operand for predicated instructions
-  if (Head != "trap") {
-    Operands.push_back(ARMOperand::CreateCondCode(ARMCC::CondCodes(CC),
-                                                  NameLoc));
+  // Next, add the CCOut and ConditionCode operands, if needed.
+  //
+  // For mnemonics which can ever incorporate a carry setting bit or predication
+  // code, our matching model involves us always generating CCOut and
+  // ConditionCode operands to match the mnemonic "as written" and then we let
+  // the matcher deal with finding the right instruction or generating an
+  // appropriate error.
+  bool CanAcceptCarrySet, CanAcceptPredicationCode;
+  GetMnemonicAcceptInfo(Head, CanAcceptCarrySet, CanAcceptPredicationCode);
+
+  // Add the carry setting operand, if necessary.
+  //
+  // FIXME: It would be awesome if we could somehow invent a location such that
+  // match errors on this operand would print a nice diagnostic about how the
+  // 's' character in the mnemonic resulted in a CCOut operand.
+  if (CanAcceptCarrySet) {
+    Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0,
+                                               NameLoc));
+  } else {
+    // This mnemonic can't ever accept a carry set, but the user wrote one (or
+    // misspelled another mnemonic).
+
+    // FIXME: Issue a nice error.
+  }
+
+  // Add the predication code operand, if necessary.
+  if (CanAcceptPredicationCode) {
+    Operands.push_back(ARMOperand::CreateCondCode(
+                         ARMCC::CondCodes(PredicationCode), NameLoc));
+  } else {
+    // This mnemonic can't ever accept a predication code, but the user wrote
+    // one (or misspelled another mnemonic).
+
+    // FIXME: Issue a nice error.
   }
 
   // Add the remaining tokens in the mnemonic.





More information about the llvm-commits mailing list