mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[ms-inline asm] Emit the (new) inline asm Non-Standard Dialect attribute.
llvm-svn: 163181
This commit is contained in:
parent
e90f78d5cd
commit
aaee8ac173
@ -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
|
||||
|
@ -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:
|
||||
|
@ -72,6 +72,7 @@ namespace lltok {
|
||||
kw_asm,
|
||||
kw_sideeffect,
|
||||
kw_alignstack,
|
||||
kw_nsdialect,
|
||||
kw_gc,
|
||||
kw_c,
|
||||
|
||||
|
@ -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 << "\", \"";
|
||||
|
Loading…
Reference in New Issue
Block a user