diff options
-rw-r--r-- | docs/LangRef.html | 15 | ||||
-rw-r--r-- | lib/AsmParser/LLParser.cpp | 9 | ||||
-rw-r--r-- | lib/AsmParser/LLToken.h | 1 | ||||
-rw-r--r-- | lib/VMCore/AsmWriter.cpp | 2 |
4 files changed, 22 insertions, 5 deletions
diff --git a/docs/LangRef.html b/docs/LangRef.html index 01acce8dd8..0699857bb1 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -2894,8 +2894,19 @@ call void asm sideeffect "eieio", ""() call void asm alignstack "eieio", ""() </pre> -<p>If both keywords appear the '<tt>sideeffect</tt>' keyword must come - first.</p> +<p>Inline asms also support using non-standard assembly dialects. The standard + dialect is ATT, which is assumed when the '<tt>nsdialect</tt>' keyword is not + present. When the '<tt>nsdialect</tt>' keyword is present, the dialect is + assumed to be Intel. Currently, ATT and Intel are the only supported + dialects. An example is:</p> + +<pre class="doc_code"> +call void asm nsdialect "eieio", ""() +</pre> + +<p>If multiple keywords appear the '<tt>sideeffect</tt>' keyword must come + first, the '<tt>alignstack</tt>' keyword second and the + '<tt>nsdialect</tt>' keyword last.</p> <!-- <p>TODO: The format of the asm and constraints string still need to be diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 271691b85c..30c5596077 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -2069,16 +2069,18 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) { case lltok::kw_asm: { // ValID ::= 'asm' SideEffect? AlignStack? STRINGCONSTANT ',' STRINGCONSTANT - bool HasSideEffect, AlignStack; + bool HasSideEffect, AlignStack, NSDialect; Lex.Lex(); if (ParseOptionalToken(lltok::kw_sideeffect, HasSideEffect) || ParseOptionalToken(lltok::kw_alignstack, AlignStack) || + ParseOptionalToken(lltok::kw_nsdialect, NSDialect) || ParseStringConstant(ID.StrVal) || ParseToken(lltok::comma, "expected comma in inline asm expression") || ParseToken(lltok::StringConstant, "expected constraint string")) return true; ID.StrVal2 = Lex.getStrVal(); - ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack)<<1); + ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack)<<1) | + (unsigned(NSDialect)<<2); ID.Kind = ValID::t_InlineAsm; return false; } @@ -2495,7 +2497,8 @@ bool LLParser::ConvertValIDToValue(Type *Ty, ValID &ID, Value *&V, PTy ? dyn_cast<FunctionType>(PTy->getElementType()) : 0; if (!FTy || !InlineAsm::Verify(FTy, ID.StrVal2)) return Error(ID.Loc, "invalid type for inline asm constraint string"); - V = InlineAsm::get(FTy, ID.StrVal, ID.StrVal2, ID.UIntVal&1, ID.UIntVal>>1); + V = InlineAsm::get(FTy, ID.StrVal, ID.StrVal2, ID.UIntVal&1, + (ID.UIntVal>>1)&1, (ID.UIntVal>>2)&1); return false; } case ValID::t_MDNode: diff --git a/lib/AsmParser/LLToken.h b/lib/AsmParser/LLToken.h index c2683ffc59..2cea1bb1f1 100644 --- a/lib/AsmParser/LLToken.h +++ b/lib/AsmParser/LLToken.h @@ -72,6 +72,7 @@ namespace lltok { kw_asm, kw_sideeffect, kw_alignstack, + kw_nsdialect, kw_gc, kw_c, diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index c09c69b6e8..f937ebdd32 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -1029,6 +1029,8 @@ static void WriteAsOperandInternal(raw_ostream &Out, const Value *V, Out << "sideeffect "; if (IA->isAlignStack()) Out << "alignstack "; + if (IA->getDialect() != 0) + Out << "nsdialect "; Out << '"'; PrintEscapedString(IA->getAsmString(), Out); Out << "\", \""; |