[llvm-commits] [llvm] r165057 - in /llvm/trunk: include/llvm/MC/MCParser/MCParsedAsmOperand.h lib/Target/X86/AsmParser/X86AsmParser.cpp

Chad Rosier mcrosier at apple.com
Tue Oct 2 14:49:07 PDT 2012


Author: mcrosier
Date: Tue Oct  2 16:49:07 2012
New Revision: 165057

URL: http://llvm.org/viewvc/llvm-project?rev=165057&view=rev
Log:
[ms-inline asm] Add basic support for wildcard MCParsedAsmOperands.  This type
of operand is specific to MS-style inline assembly and should not be generated
when parsing normal assembly.

The purpose of the wildcard operands are to allow the AsmParser to match
multiple instructions (i.e., MCInsts) to a given ms-style asm statement.  For
the time being the matcher just returns the first match.  This patch only
implements wildcard matches for memory operands.  Support for register
wildcards will be added in the near future.

Modified:
    llvm/trunk/include/llvm/MC/MCParser/MCParsedAsmOperand.h
    llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp

Modified: llvm/trunk/include/llvm/MC/MCParser/MCParsedAsmOperand.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCParsedAsmOperand.h?rev=165057&r1=165056&r2=165057&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCParser/MCParsedAsmOperand.h (original)
+++ llvm/trunk/include/llvm/MC/MCParser/MCParsedAsmOperand.h Tue Oct  2 16:49:07 2012
@@ -34,6 +34,13 @@
   /// isMem - Is this a memory operand?
   virtual bool isMem() const = 0;
 
+  /// isMSAsmWildcard - Is this a wildcard operand?  This is specific to
+  /// MS-style inline assembly and should never happen in normal assembly.
+  virtual bool isMSAsmWildcard() const { return false; }
+
+  /// setMSAsmWildcard - Convert the operand into a wildcard.
+  virtual void setMSAsmWildcard(unsigned Size) { }
+
   /// getStartLoc - Get the location of the first token of this operand.
   virtual SMLoc getStartLoc() const = 0;
   /// getEndLoc - Get the location of the last token of this operand.

Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=165057&r1=165056&r2=165057&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Tue Oct  2 16:49:07 2012
@@ -158,7 +158,8 @@
     Token,
     Register,
     Immediate,
-    Memory
+    Memory,
+    MSAsmWildcard
   } Kind;
 
   SMLoc StartLoc, EndLoc;
@@ -185,6 +186,10 @@
       unsigned Scale;
       unsigned Size;
     } Mem;
+
+    struct {
+      unsigned Size;
+    } MSAsm;
   };
 
   X86Operand(KindTy K, SMLoc Start, SMLoc End)
@@ -318,25 +323,32 @@
 
   bool isMem() const { return Kind == Memory; }
   bool isMem8() const {
-    return Kind == Memory && (!Mem.Size || Mem.Size == 8);
+    return (Kind == Memory && (!Mem.Size || Mem.Size == 8)) ||
+      (Kind == MSAsmWildcard && MSAsm.Size == 8);
   }
   bool isMem16() const {
-    return Kind == Memory && (!Mem.Size || Mem.Size == 16);
+    return (Kind == Memory && (!Mem.Size || Mem.Size == 16)) ||
+      (Kind == MSAsmWildcard && MSAsm.Size == 16);
   }
   bool isMem32() const {
-    return Kind == Memory && (!Mem.Size || Mem.Size == 32);
+    return (Kind == Memory && (!Mem.Size || Mem.Size == 32)) ||
+      (Kind == MSAsmWildcard && MSAsm.Size == 32);
   }
   bool isMem64() const {
-    return Kind == Memory && (!Mem.Size || Mem.Size == 64);
+    return (Kind == Memory && (!Mem.Size || Mem.Size == 64)) ||
+      (Kind == MSAsmWildcard && MSAsm.Size == 64);
   }
   bool isMem80() const {
-    return Kind == Memory && (!Mem.Size || Mem.Size == 80);
+    return (Kind == Memory && (!Mem.Size || Mem.Size == 80)) ||
+      (Kind == MSAsmWildcard && MSAsm.Size == 80);
   }
   bool isMem128() const {
-    return Kind == Memory && (!Mem.Size || Mem.Size == 128);
+    return (Kind == Memory && (!Mem.Size || Mem.Size == 128)) ||
+      (Kind == MSAsmWildcard && MSAsm.Size == 128);
   }
   bool isMem256() const {
-    return Kind == Memory && (!Mem.Size || Mem.Size == 256);
+    return (Kind == Memory && (!Mem.Size || Mem.Size == 256)) ||
+      (Kind == MSAsmWildcard && MSAsm.Size == 256);
   }
 
   bool isMemVX32() const {
@@ -363,6 +375,12 @@
 
   bool isReg() const { return Kind == Register; }
 
+  bool isMSAsmWildcard() const { return Kind == MSAsmWildcard; }
+  void setMSAsmWildcard(unsigned Size) {
+    Kind = MSAsmWildcard;
+    this->MSAsm.Size = Size;
+  }
+
   void addExpr(MCInst &Inst, const MCExpr *Expr) const {
     // Add as immediates when possible.
     if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))





More information about the llvm-commits mailing list