diff options
Diffstat (limited to 'lib/VMCore/InlineAsm.cpp')
-rw-r--r-- | lib/VMCore/InlineAsm.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/VMCore/InlineAsm.cpp b/lib/VMCore/InlineAsm.cpp index cdb8c46..b36d212 100644 --- a/lib/VMCore/InlineAsm.cpp +++ b/lib/VMCore/InlineAsm.cpp @@ -51,6 +51,7 @@ bool InlineAsm::ConstraintInfo::Parse(const std::string &Str, isEarlyClobber = false; isIndirectOutput = false; hasMatchingInput = false; + isCommutative = false; // Parse the prefix. if (*I == '~') { @@ -74,12 +75,21 @@ bool InlineAsm::ConstraintInfo::Parse(const std::string &Str, default: DoneWithModifiers = true; break; - case '&': + case '&': // Early clobber. if (Type != isOutput || // Cannot early clobber anything but output. isEarlyClobber) // Reject &&&&&& return true; isEarlyClobber = true; break; + case '%': // Commutative. + if (Type == isClobber || // Cannot commute clobbers. + isCommutative) // Reject %%%%% + return true; + isCommutative = true; + break; + case '#': // Comment. + case '*': // Register preferencing. + return true; // Not supported. } if (!DoneWithModifiers) { |