From fe3db46fe073ecaf0e1dc4b5be899e335f4e83a8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 23 Feb 2006 23:36:53 +0000 Subject: [PATCH] Parse the %*# constraint modifiers git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26341 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/InlineAsm.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/VMCore/InlineAsm.cpp b/lib/VMCore/InlineAsm.cpp index cdb8c46e95f..b36d2128a61 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) {