[ms-inline asm] Asm operands can map to one or more MCOperands. Therefore, add
authorChad Rosier <mcrosier@apple.com>
Mon, 3 Sep 2012 20:31:23 +0000 (20:31 +0000)
committerChad Rosier <mcrosier@apple.com>
Mon, 3 Sep 2012 20:31:23 +0000 (20:31 +0000)
the NumMCOperands argument to the GetMCInstOperandNum() function that is set
to the number of MCOperands this asm operand mapped to.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163124 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCTargetAsmParser.h
lib/Target/ARM/AsmParser/ARMAsmParser.cpp
lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
lib/Target/Mips/AsmParser/MipsAsmParser.cpp
lib/Target/X86/AsmParser/X86AsmParser.cpp
utils/TableGen/AsmMatcherEmitter.cpp

index 007ab41abc9e7349a71f1fd8148dbed43482d812..77b3e84254e3304567554a58b3e435656e3f50f7 100644 (file)
@@ -113,7 +113,8 @@ public:
 
   virtual unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
                            const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
-                                       unsigned OperandNum) = 0;
+                                       unsigned OperandNum,
+                                       unsigned &NumMCOperands) = 0;
 };
 
 } // End llvm namespace
index bdb20e85347830a4b5bb1f7c520388107fc9292a..51ba3c3b37c25c702582ed65a5bd711f09f73263 100644 (file)
@@ -265,8 +265,8 @@ public:
 
   unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
                            const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
-                               unsigned OperandNum) {
-    return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum);
+                               unsigned OperandNum, unsigned &NumMCOperands) {
+    return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum, NumMCOperands);
   }
 };
 } // end anonymous namespace
index e81943c77516319fa11217ba12709c62ae6f166d..6a63f17c6aed8ab3ae6dc472402e91df7dd5848d 100644 (file)
@@ -58,8 +58,9 @@ class MBlazeAsmParser : public MCTargetAsmParser {
 
   unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
                     const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
-                    unsigned OperandNum) {
-    return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum);
+                               unsigned OperandNum, unsigned &NumMCOperands) {
+    return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum,
+                                   NumMCOperands);
   }
 
 public:
index f463b7703c793b58641d3ed3b584a9f6db84f5d6..c33c4d2ccd764b14ed4de2b5a271a0b2720d1162 100644 (file)
@@ -40,7 +40,7 @@ class MipsAsmParser : public MCTargetAsmParser {
 
   unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
                     const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
-                               unsigned OperandNum);
+                               unsigned OperandNum, unsigned &NumMCOperands);
 
 public:
   MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
@@ -104,11 +104,12 @@ public:
 unsigned MipsAsmParser::
 GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
                     const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
-                    unsigned OperandNum) {
+                    unsigned OperandNum, unsigned &NumMCOperands) {
   assert (0 && "GetMCInstOperandNum() not supported by the Mips target.");
   // The Mips backend doesn't currently include the matcher implementation, so
   // the GetMCInstOperandNumImpl() is undefined.  This is a temporary
   // work around.
+  NumMCOperands = 0;
   return 0;
 }
 
index 6d6e7d1eea97d16a79fc3c78daaf1981bf295ef6..baf45893f1c7f671ce72e9a1be3f58aac40a7c2a 100644 (file)
@@ -75,8 +75,9 @@ private:
 
   unsigned GetMCInstOperandNum(unsigned Kind, MCInst &Inst,
                     const SmallVectorImpl<MCParsedAsmOperand*> &Operands,
-                    unsigned OperandNum) {
-    return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum);
+                               unsigned OperandNum, unsigned &NumMCOperands) {
+    return GetMCInstOperandNumImpl(Kind, Inst, Operands, OperandNum,
+                                   NumMCOperands);
   }
 
   /// isSrcOp - Returns true if operand is either (%rsi) or %ds:%(rsi)
index 2127c048c791a6a8a13f5bc0f97726b44a901487..a4744bad7ead8cfd34a1f4582e6ec341d7455b3a 100644 (file)
@@ -1703,8 +1703,10 @@ static void emitConvertToMCInst(CodeGenTarget &Target, StringRef ClassName,
   OpOS << "unsigned " << Target.getName() << ClassName << "::\n"
        << "GetMCInstOperandNumImpl(unsigned Kind, MCInst &Inst,\n"
        << "                        const SmallVectorImpl<MCParsedAsmOperand*> "
-       << "&Operands,\n                        unsigned OperandNum) {\n"
+       << "&Operands,\n                        unsigned OperandNum, unsigned "
+       << "&NumMCOperands) {\n"
        << "  assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n"
+       << "  NumMCOperands = 0;\n"
        << "  unsigned MCOperandNum = 0;\n"
        << "  uint8_t *Converter = ConversionTable[Kind];\n"
        << "  for (uint8_t *p = Converter; *p; p+= 2) {\n"
@@ -1712,6 +1714,10 @@ static void emitConvertToMCInst(CodeGenTarget &Target, StringRef ClassName,
        << "    switch (*p) {\n"
        << "    default: llvm_unreachable(\"invalid conversion entry!\");\n"
        << "    case CVT_Reg:\n"
+       << "      if (*(p + 1) == OperandNum) {\n"
+       << "        NumMCOperands = 1;\n"
+       << "        break;\n"
+       << "      }\n"
        << "      ++MCOperandNum;\n"
        << "      break;\n"
        << "    case CVT_Tied:\n"
@@ -1811,6 +1817,10 @@ static void emitConvertToMCInst(CodeGenTarget &Target, StringRef ClassName,
 
         // Add a handler for the operand number lookup.
         OpOS << "    case " << Name << ":\n"
+             << "      if (*(p + 1) == OperandNum) {\n"
+             << "        NumMCOperands = " << OpInfo.MINumOperands << ";\n"
+             << "        break;\n"
+             << "      }\n"
              << "      MCOperandNum += " << OpInfo.MINumOperands << ";\n"
              << "      break;\n";
         break;
@@ -1848,6 +1858,10 @@ static void emitConvertToMCInst(CodeGenTarget &Target, StringRef ClassName,
               << "      break;\n";
 
         OpOS << "    case " << Name << ":\n"
+             << "      if (*(p + 1) == OperandNum) {\n"
+             << "        NumMCOperands = 1;\n"
+             << "        break;\n"
+             << "      }\n"
              << "      ++MCOperandNum;\n"
              << "      break;\n";
         break;
@@ -1877,6 +1891,10 @@ static void emitConvertToMCInst(CodeGenTarget &Target, StringRef ClassName,
               << "      break;\n";
 
         OpOS << "    case " << Name << ":\n"
+             << "      if (*(p + 1) == OperandNum) {\n"
+             << "        NumMCOperands = 1;\n"
+             << "        break;\n"
+             << "      }\n"
              << "      ++MCOperandNum;\n"
              << "      break;\n";
       }
@@ -2583,7 +2601,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
   OS << "  unsigned GetMCInstOperandNumImpl(unsigned Kind, MCInst &Inst,\n     "
      << "                              const "
      << "SmallVectorImpl<MCParsedAsmOperand*> &Operands,\n                     "
-     << "          unsigned OperandNum);\n";
+     << "          unsigned OperandNum, unsigned &NumMCOperands);\n";
   OS << "  bool MnemonicIsValid(StringRef Mnemonic);\n";
   OS << "  unsigned MatchInstructionImpl(\n"
      << "    const SmallVectorImpl<MCParsedAsmOperand*> &Operands,\n"