]> granicus.if.org Git - clang/commitdiff
add a flag to output asm constraints so that we efficiently know
authorChris Lattner <sabre@nondot.org>
Sun, 3 May 2009 06:59:37 +0000 (06:59 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 3 May 2009 06:59:37 +0000 (06:59 +0000)
if there is an input constraint that is tied to it.

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

include/clang/Basic/TargetInfo.h

index eda49ef197d4cd6e34e9e00a6f1aaca421bbfee5..94fa0d4aea20d0cdd589fb4525494f6eaa43c1d5 100644 (file)
@@ -204,7 +204,8 @@ public:
       CI_None = 0x00,
       CI_AllowsMemory = 0x01,
       CI_AllowsRegister = 0x02,
-      CI_ReadWrite = 0x04   // "+r" output constraint (read and write).
+      CI_ReadWrite = 0x04,       // "+r" output constraint (read and write).
+      CI_HasMatchingInput = 0x08 // This output operand has a matching input.
     };
     unsigned Flags;
     int TiedOperand;
@@ -222,6 +223,14 @@ public:
     bool isReadWrite() const { return (Flags & CI_ReadWrite) != 0; }
     bool allowsRegister() const { return (Flags & CI_AllowsRegister) != 0; }
     bool allowsMemory() const { return (Flags & CI_AllowsMemory) != 0; }
+    
+    /// hasMatchingInput - Return true if this output operand has a matching
+    /// (tied) input operand.
+    bool hasMatchingInput() const { return (Flags & CI_HasMatchingInput) != 0; }
+    
+    /// hasTiedOperand() - Return true if this input operand is a matching
+    /// constraint that ties it to an output operand.  If this returns true,
+    /// then getTiedOperand will indicate which output operand this is tied to.
     bool hasTiedOperand() const { return TiedOperand != -1; }
     unsigned getTiedOperand() const {
       assert(hasTiedOperand() && "Has no tied operand!");
@@ -231,11 +240,13 @@ public:
     void setIsReadWrite() { Flags |= CI_ReadWrite; }
     void setAllowsMemory() { Flags |= CI_AllowsMemory; }
     void setAllowsRegister() { Flags |= CI_AllowsRegister; }
+    void setHasMatchingInput() { Flags |= CI_HasMatchingInput; }
     
     /// setTiedOperand - Indicate that this is an input operand that is tied to
     /// the specified output operand.  Copy over the various constraint
     /// information from the output.
     void setTiedOperand(unsigned N, ConstraintInfo &Output) {
+      Output.setHasMatchingInput();
       Flags = Output.Flags;
       TiedOperand = N;
       // Don't copy Name or constraint string.