<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri","sans-serif";}
@page WordSection1
{size:612.0pt 792.0pt;
margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">Hi Teresa,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">Thanks, that’s correct fix.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">Sam<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Teresa Johnson [mailto:tejohnson@google.com]
<br>
<b>Sent:</b> Wednesday, March 09, 2016 6:04 PM<br>
<b>To:</b> Kolton, Sam<br>
<b>Cc:</b> llvm-commits<br>
<b>Subject:</b> Re: [llvm] r263008 - [AMDGPU] Assembler: Support DPP instructions.<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">I'm getting the following error building this commit with clang:<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">/usr/local/google/home/tejohnson/llvm/llvm_15/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp:407:12: error: comparison of unsigned expression >= 0 is always true [-Werror,-Wtautological-compare]<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> if ((Imm >= 0x000) && (Imm <= 0x0ff)) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> ~~~ ^ ~~~~~<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">(went ahead and committed a fix in r263014)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Teresa<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Wed, Mar 9, 2016 at 4:29 AM, Sam Kolton via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<o:p></o:p></p>
<p class="MsoNormal">Author: skolton<br>
Date: Wed Mar 9 06:29:31 2016<br>
New Revision: 263008<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=263008&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=263008&view=rev</a><br>
Log:<br>
[AMDGPU] Assembler: Support DPP instructions.<br>
<br>
Supprot DPP syntax as used in SP3 (except several operands syntax).<br>
Added dpp-specific operands in td-files.<br>
Added DPP flag to TSFlags to determine if instruction is dpp in InstPrinter.<br>
Support for VOP2 DPP instructions in td-files.<br>
Some tests for DPP instructions.<br>
<br>
ToDo:<br>
- VOP2bInst:<br>
- vcc is considered as operand<br>
- AsmMatcher doesn't apply mnemonic aliases when parsing operands<br>
- v_mac_f32<br>
- v_nop<br>
- disable instructions with 64-bit operands<br>
- change dpp_ctrl assembler representation to conform sp3<br>
<br>
Review: <a href="http://reviews.llvm.org/D17804" target="_blank">http://reviews.llvm.org/D17804</a><br>
<br>
Added:<br>
llvm/trunk/test/MC/AMDGPU/vop_dpp.s<br>
Modified:<br>
llvm/trunk/include/llvm/IR/IntrinsicsAMDGPU.td<br>
llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp<br>
llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp<br>
llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h<br>
llvm/trunk/lib/Target/AMDGPU/SIDefines.h<br>
llvm/trunk/lib/Target/AMDGPU/SIInstrFormats.td<br>
llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.td<br>
llvm/trunk/lib/Target/AMDGPU/VIInstrFormats.td<br>
llvm/trunk/lib/Target/AMDGPU/VIInstructions.td<br>
llvm/trunk/test/CodeGen/AMDGPU/llvm.amdgcn.mov.dpp.ll<br>
<br>
Modified: llvm/trunk/include/llvm/IR/IntrinsicsAMDGPU.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicsAMDGPU.td?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicsAMDGPU.td?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/IntrinsicsAMDGPU.td (original)<br>
+++ llvm/trunk/include/llvm/IR/IntrinsicsAMDGPU.td Wed Mar 9 06:29:31 2016<br>
@@ -275,11 +275,11 @@ def int_amdgcn_buffer_wbinvl1_vol :<br>
// VI Intrinsics<br>
//===----------------------------------------------------------------------===//<br>
<br>
-// llvm.amdgcn.mov.dpp.i32 <src> <dpp_ctrl> <bound_ctrl> <bank_mask> <row_mask><br>
+// llvm.amdgcn.mov.dpp.i32 <src> <dpp_ctrl> <row_mask> <bank_mask> <bound_ctrl><br>
def int_amdgcn_mov_dpp :<br>
Intrinsic<[llvm_anyint_ty],<br>
- [LLVMMatchType<0>, llvm_i32_ty, llvm_i1_ty, llvm_i32_ty,<br>
- llvm_i32_ty], [IntrNoMem, IntrConvergent]>;<br>
+ [LLVMMatchType<0>, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,<br>
+ llvm_i1_ty], [IntrNoMem, IntrConvergent]>;<br>
<br>
def int_amdgcn_s_dcache_wb :<br>
GCCBuiltin<"__builtin_amdgcn_s_dcache_wb">,<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp Wed Mar 9 06:29:31 2016<br>
@@ -69,6 +69,10 @@ public:<br>
ImmTyTFE,<br>
ImmTyClamp,<br>
ImmTyOMod,<br>
+ ImmTyDppCtrl,<br>
+ ImmTyDppRowMask,<br>
+ ImmTyDppBankMask,<br>
+ ImmTyDppBoundCtrl,<br>
ImmTyDMask,<br>
ImmTyUNorm,<br>
ImmTyDA,<br>
@@ -144,7 +148,8 @@ public:<br>
bool defaultTokenHasSuffix() const {<br>
StringRef Token(Tok.Data, Tok.Length);<br>
<br>
- return Token.endswith("_e32") || Token.endswith("_e64");<br>
+ return Token.endswith("_e32") || Token.endswith("_e64") ||<br>
+ Token.endswith("_dpp");<br>
}<br>
<br>
bool isToken() const override {<br>
@@ -234,6 +239,18 @@ public:<br>
bool isSLC() const { return isImmTy(ImmTySLC); }<br>
bool isTFE() const { return isImmTy(ImmTyTFE); }<br>
<br>
+ bool isBankMask() const {<br>
+ return isImmTy(ImmTyDppBankMask);<br>
+ }<br>
+<br>
+ bool isRowMask() const {<br>
+ return isImmTy(ImmTyDppRowMask);<br>
+ }<br>
+<br>
+ bool isBoundCtrl() const {<br>
+ return isImmTy(ImmTyDppBoundCtrl);<br>
+ }<br>
+<br>
void setModifiers(unsigned Mods) {<br>
assert(isReg() || (isImm() && Imm.Modifiers == 0));<br>
if (isReg())<br>
@@ -391,6 +408,7 @@ public:<br>
bool isMubufOffset() const;<br>
bool isSMRDOffset() const;<br>
bool isSMRDLiteralOffset() const;<br>
+ bool isDPPCtrl() const;<br>
};<br>
<br>
class AMDGPUAsmParser : public MCTargetAsmParser {<br>
@@ -439,7 +457,6 @@ private:<br>
bool ParseSectionDirectiveHSARodataReadonlyAgent();<br>
<br>
public:<br>
-public:<br>
enum AMDGPUMatchResultTy {<br>
Match_PreferE32 = FIRST_TARGET_MATCH_RESULT_TY<br>
};<br>
@@ -538,6 +555,12 @@ public:<br>
void cvtMIMG(MCInst &Inst, const OperandVector &Operands);<br>
void cvtMIMGAtomic(MCInst &Inst, const OperandVector &Operands);<br>
OperandMatchResultTy parseVOP3OptionalOps(OperandVector &Operands);<br>
+<br>
+ OperandMatchResultTy parseDPPCtrlOps(OperandVector &Operands);<br>
+ OperandMatchResultTy parseDPPOptionalOps(OperandVector &Operands);<br>
+ void cvtDPP_mod(MCInst &Inst, const OperandVector &Operands);<br>
+ void cvtDPP_nomod(MCInst &Inst, const OperandVector &Operands);<br>
+ void cvtDPP(MCInst &Inst, const OperandVector &Operands, bool HasMods);<br>
};<br>
<br>
struct OptionalOperand {<br>
@@ -1147,7 +1170,6 @@ bool AMDGPUAsmParser::ParseInstruction(P<br>
AMDGPUAsmParser::OperandMatchResultTy<br>
AMDGPUAsmParser::parseIntWithPrefix(const char *Prefix, int64_t &Int,<br>
int64_t Default) {<br>
-<br>
// We are at the end of the statement, and this is a default argument, so<br>
// use a default value.<br>
if (getLexer().is(AsmToken::EndOfStatement)) {<br>
@@ -1227,13 +1249,15 @@ AMDGPUAsmParser::parseNamedBit(const cha<br>
<br>
typedef std::map<enum AMDGPUOperand::ImmTy, unsigned> OptionalImmIndexMap;<br>
<br>
-void addOptionalImmOperand(MCInst& Inst, const OperandVector& Operands, OptionalImmIndexMap& OptionalIdx, enum AMDGPUOperand::ImmTy ImmT) {<br>
+void addOptionalImmOperand(MCInst& Inst, const OperandVector& Operands,<br>
+ OptionalImmIndexMap& OptionalIdx,<br>
+ enum AMDGPUOperand::ImmTy ImmT, int64_t Default = 0) {<br>
auto i = OptionalIdx.find(ImmT);<br>
if (i != OptionalIdx.end()) {<br>
unsigned Idx = i->second;<br>
((AMDGPUOperand &)*Operands[Idx]).addImmOperands(Inst, 1);<br>
} else {<br>
- Inst.addOperand(MCOperand::createImm(0));<br>
+ Inst.addOperand(MCOperand::createImm(Default));<br>
}<br>
}<br>
<br>
@@ -1896,6 +1920,152 @@ void AMDGPUAsmParser::cvtMIMGAtomic(MCIn<br>
addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTySLC);<br>
}<br>
<br>
+//===----------------------------------------------------------------------===//<br>
+// dpp<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+bool AMDGPUOperand::isDPPCtrl() const {<br>
+ bool result = isImm() && getImmTy() == ImmTyDppCtrl && isUInt<9>(getImm());<br>
+ if (result) {<br>
+ int64_t Imm = getImm();<br>
+ return ((Imm >= 0x000) && (Imm <= 0x0ff)) ||<br>
+ ((Imm >= 0x101) && (Imm <= 0x10f)) ||<br>
+ ((Imm >= 0x111) && (Imm <= 0x11f)) ||<br>
+ ((Imm >= 0x121) && (Imm <= 0x12f)) ||<br>
+ (Imm == 0x130) ||<br>
+ (Imm == 0x134) ||<br>
+ (Imm == 0x138) ||<br>
+ (Imm == 0x13c) ||<br>
+ (Imm == 0x140) ||<br>
+ (Imm == 0x141) ||<br>
+ (Imm == 0x142) ||<br>
+ (Imm == 0x143);<br>
+ }<br>
+ return false;<br>
+}<br>
+<br>
+AMDGPUAsmParser::OperandMatchResultTy<br>
+AMDGPUAsmParser::parseDPPCtrlOps(OperandVector &Operands) {<br>
+ // ToDo: use same syntax as sp3 for dpp_ctrl<br>
+ SMLoc S = Parser.getTok().getLoc();<br>
+ StringRef Prefix;<br>
+ int64_t Int;<br>
+<br>
+ switch(getLexer().getKind()) {<br>
+ default: return MatchOperand_NoMatch;<br>
+ case AsmToken::Identifier: {<br>
+ Prefix = Parser.getTok().getString();<br>
+<br>
+ Parser.Lex();<br>
+ if (getLexer().isNot(AsmToken::Colon))<br>
+ return MatchOperand_ParseFail;<br>
+<br>
+ Parser.Lex();<br>
+ if (getLexer().isNot(AsmToken::Integer))<br>
+ return MatchOperand_ParseFail;<br>
+<br>
+ if (getParser().parseAbsoluteExpression(Int))<br>
+ return MatchOperand_ParseFail;<br>
+ break;<br>
+ }<br>
+ }<br>
+<br>
+ if (Prefix.equals("row_shl")) {<br>
+ Int |= 0x100;<br>
+ } else if (Prefix.equals("row_shr")) {<br>
+ Int |= 0x110;<br>
+ } else if (Prefix.equals("row_ror")) {<br>
+ Int |= 0x120;<br>
+ } else if (Prefix.equals("wave_shl")) {<br>
+ Int = 0x130;<br>
+ } else if (Prefix.equals("wave_rol")) {<br>
+ Int = 0x134;<br>
+ } else if (Prefix.equals("wave_shr")) {<br>
+ Int = 0x138;<br>
+ } else if (Prefix.equals("wave_ror")) {<br>
+ Int = 0x13C;<br>
+ } else if (Prefix.equals("row_mirror")) {<br>
+ Int = 0x140;<br>
+ } else if (Prefix.equals("row_half_mirror")) {<br>
+ Int = 0x141;<br>
+ } else if (Prefix.equals("row_bcast")) {<br>
+ if (Int == 15) {<br>
+ Int = 0x142;<br>
+ } else if (Int == 31) {<br>
+ Int = 0x143;<br>
+ }<br>
+ } else if (!Prefix.equals("quad_perm")) {<br>
+ return MatchOperand_NoMatch;<br>
+ }<br>
+ Operands.push_back(AMDGPUOperand::CreateImm(Int, S,<br>
+ AMDGPUOperand::ImmTyDppCtrl));<br>
+ return MatchOperand_Success;<br>
+}<br>
+<br>
+static const OptionalOperand DPPOptionalOps [] = {<br>
+ {"row_mask", AMDGPUOperand::ImmTyDppRowMask, false, 0xf, nullptr},<br>
+ {"bank_mask", AMDGPUOperand::ImmTyDppBankMask, false, 0xf, nullptr},<br>
+ {"bound_ctrl", AMDGPUOperand::ImmTyDppBoundCtrl, false, -1, nullptr}<br>
+};<br>
+<br>
+AMDGPUAsmParser::OperandMatchResultTy<br>
+AMDGPUAsmParser::parseDPPOptionalOps(OperandVector &Operands) {<br>
+ SMLoc S = Parser.getTok().getLoc();<br>
+ OperandMatchResultTy Res = parseOptionalOps(DPPOptionalOps, Operands);<br>
+ // XXX - sp3 use syntax "bound_ctrl:0" to indicate that bound_ctrl bit was set<br>
+ if (Res == MatchOperand_Success) {<br>
+ AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands.back());<br>
+ // If last operand was parsed as bound_ctrl we should replace it with correct value (1)<br>
+ if (Op.isImmTy(AMDGPUOperand::ImmTyDppBoundCtrl)) {<br>
+ Operands.pop_back();<br>
+ Operands.push_back(<br>
+ AMDGPUOperand::CreateImm(1, S, AMDGPUOperand::ImmTyDppBoundCtrl));<br>
+ return MatchOperand_Success;<br>
+ }<br>
+ }<br>
+ return Res;<br>
+}<br>
+<br>
+void AMDGPUAsmParser::cvtDPP_mod(MCInst &Inst, const OperandVector &Operands) {<br>
+ cvtDPP(Inst, Operands, true);<br>
+}<br>
+<br>
+void AMDGPUAsmParser::cvtDPP_nomod(MCInst &Inst, const OperandVector &Operands) {<br>
+ cvtDPP(Inst, Operands, false);<br>
+}<br>
+<br>
+void AMDGPUAsmParser::cvtDPP(MCInst &Inst, const OperandVector &Operands,<br>
+ bool HasMods) {<br>
+ OptionalImmIndexMap OptionalIdx;<br>
+<br>
+ unsigned I = 1;<br>
+ const MCInstrDesc &Desc = MII.get(Inst.getOpcode());<br>
+ for (unsigned J = 0; J < Desc.getNumDefs(); ++J) {<br>
+ ((AMDGPUOperand &)*Operands[I++]).addRegOperands(Inst, 1);<br>
+ }<br>
+<br>
+ for (unsigned E = Operands.size(); I != E; ++I) {<br>
+ AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[I]);<br>
+ // Add the register arguments<br>
+ if (!HasMods && Op.isReg()) {<br>
+ Op.addRegOperands(Inst, 1);<br>
+ } else if (HasMods && Op.isRegOrImmWithInputMods()) {<br>
+ Op.addRegOrImmWithInputModsOperands(Inst, 2);<br>
+ } else if (Op.isDPPCtrl()) {<br>
+ Op.addImmOperands(Inst, 1);<br>
+ } else if (Op.isImm()) {<br>
+ // Handle optional arguments<br>
+ OptionalIdx[Op.getImmTy()] = I;<br>
+ } else {<br>
+ llvm_unreachable("Invalid operand type");<br>
+ }<br>
+ }<br>
+<br>
+ // ToDo: fix default values for row_mask and bank_mask<br>
+ addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTyDppRowMask, 0xf);<br>
+ addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTyDppBankMask, 0xf);<br>
+ addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTyDppBoundCtrl);<br>
+}<br>
<br>
<br>
/// Force static initialization.<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp Wed Mar 9 06:29:31 2016<br>
@@ -28,6 +28,11 @@ void AMDGPUInstPrinter::printInst(const<br>
printAnnotation(OS, Annot);<br>
}<br>
<br>
+void AMDGPUInstPrinter::printU4ImmOperand(const MCInst *MI, unsigned OpNo,<br>
+ raw_ostream &O) {<br>
+ O << formatHex(MI->getOperand(OpNo).getImm() & 0xf);<br>
+}<br>
+<br>
void AMDGPUInstPrinter::printU8ImmOperand(const MCInst *MI, unsigned OpNo,<br>
raw_ostream &O) {<br>
O << formatHex(MI->getOperand(OpNo).getImm() & 0xff);<br>
@@ -43,6 +48,11 @@ void AMDGPUInstPrinter::printU32ImmOpera<br>
O << formatHex(MI->getOperand(OpNo).getImm() & 0xffffffff);<br>
}<br>
<br>
+void AMDGPUInstPrinter::printU4ImmDecOperand(const MCInst *MI, unsigned OpNo,<br>
+ raw_ostream &O) {<br>
+ O << formatDec(MI->getOperand(OpNo).getImm() & 0xf);<br>
+}<br>
+<br>
void AMDGPUInstPrinter::printU8ImmDecOperand(const MCInst *MI, unsigned OpNo,<br>
raw_ostream &O) {<br>
O << formatDec(MI->getOperand(OpNo).getImm() & 0xff);<br>
@@ -251,6 +261,8 @@ void AMDGPUInstPrinter::printVOPDst(cons<br>
raw_ostream &O) {<br>
if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3)<br>
O << "_e64 ";<br>
+ else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::DPP)<br>
+ O << "_dpp ";<br>
else<br>
O << "_e32 ";<br>
<br>
@@ -388,6 +400,63 @@ void AMDGPUInstPrinter::printOperandAndM<br>
O << '|';<br>
}<br>
<br>
+<br>
+void AMDGPUInstPrinter::printDPPCtrlOperand(const MCInst *MI, unsigned OpNo,<br>
+ raw_ostream &O) {<br>
+ unsigned Imm = MI->getOperand(OpNo).getImm();<br>
+ if ((Imm >= 0x000) && (Imm <= 0x0ff)) {<br>
+ O << " quad_perm:";<br>
+ printU8ImmDecOperand(MI, OpNo, O);<br>
+ } else if ((Imm >= 0x101) && (Imm <= 0x10f)) {<br>
+ O << " row_shl:";<br>
+ printU4ImmDecOperand(MI, OpNo, O);<br>
+ } else if ((Imm >= 0x111) && (Imm <= 0x11f)) {<br>
+ O << " row_shr:";<br>
+ printU4ImmDecOperand(MI, OpNo, O);<br>
+ } else if ((Imm >= 0x121) && (Imm <= 0x12f)) {<br>
+ O << " row_ror:";<br>
+ printU4ImmDecOperand(MI, OpNo, O);<br>
+ } else if (Imm == 0x130) {<br>
+ O << " wave_shl:1";<br>
+ } else if (Imm == 0x134) {<br>
+ O << " wave_rol:1";<br>
+ } else if (Imm == 0x138) {<br>
+ O << " wave_shr:1";<br>
+ } else if (Imm == 0x13c) {<br>
+ O << " wave_ror:1";<br>
+ } else if (Imm == 0x140) {<br>
+ O << " row_mirror:1";<br>
+ } else if (Imm == 0x141) {<br>
+ O << " row_half_mirror:1";<br>
+ } else if (Imm == 0x142) {<br>
+ O << " row_bcast:15";<br>
+ } else if (Imm == 0x143) {<br>
+ O << " row_bcast:31";<br>
+ } else {<br>
+ llvm_unreachable("Invalid dpp_ctrl value");<br>
+ }<br>
+}<br>
+<br>
+void AMDGPUInstPrinter::printRowMaskOperand(const MCInst *MI, unsigned OpNo,<br>
+ raw_ostream &O) {<br>
+ O << " row_mask:";<br>
+ printU4ImmOperand(MI, OpNo, O);<br>
+}<br>
+<br>
+void AMDGPUInstPrinter::printBankMaskOperand(const MCInst *MI, unsigned OpNo,<br>
+ raw_ostream &O) {<br>
+ O << " bank_mask:";<br>
+ printU4ImmOperand(MI, OpNo, O);<br>
+}<br>
+<br>
+void AMDGPUInstPrinter::printBoundCtrlOperand(const MCInst *MI, unsigned OpNo,<br>
+ raw_ostream &O) {<br>
+ unsigned Imm = MI->getOperand(OpNo).getImm();<br>
+ if (Imm) {<br>
+ O << " bound_ctrl:0"; // XXX - this syntax is used in sp3<br>
+ }<br>
+}<br>
+<br>
void AMDGPUInstPrinter::printInterpSlot(const MCInst *MI, unsigned OpNum,<br>
raw_ostream &O) {<br>
unsigned Imm = MI->getOperand(OpNum).getImm();<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h Wed Mar 9 06:29:31 2016<br>
@@ -33,8 +33,10 @@ public:<br>
const MCRegisterInfo &MRI);<br>
<br>
private:<br>
+ void printU4ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
void printU8ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
void printU16ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
+ void printU4ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
void printU8ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
void printU16ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
void printU32ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
@@ -61,6 +63,10 @@ private:<br>
void printImmediate64(uint64_t I, raw_ostream &O);<br>
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
void printOperandAndMods(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
+ void printDPPCtrlOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
+ void printRowMaskOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
+ void printBankMaskOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
+ void printBoundCtrlOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
static void printInterpSlot(const MCInst *MI, unsigned OpNum, raw_ostream &O);<br>
void printMemOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);<br>
static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/SIDefines.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIDefines.h?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIDefines.h?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/SIDefines.h (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/SIDefines.h Wed Mar 9 06:29:31 2016<br>
@@ -29,16 +29,17 @@ enum {<br>
VOP2 = 1 << 11,<br>
VOP3 = 1 << 12,<br>
VOPC = 1 << 13,<br>
+ DPP = 1 << 14,<br>
<br>
- MUBUF = 1 << 14,<br>
- MTBUF = 1 << 15,<br>
- SMRD = 1 << 16,<br>
- DS = 1 << 17,<br>
- MIMG = 1 << 18,<br>
- FLAT = 1 << 19,<br>
- WQM = 1 << 20,<br>
- VGPRSpill = 1 << 21,<br>
- VOPAsmPrefer32Bit = 1 << 22<br>
+ MUBUF = 1 << 15,<br>
+ MTBUF = 1 << 16,<br>
+ SMRD = 1 << 17,<br>
+ DS = 1 << 18,<br>
+ MIMG = 1 << 19,<br>
+ FLAT = 1 << 20,<br>
+ WQM = 1 << 21,<br>
+ VGPRSpill = 1 << 22,<br>
+ VOPAsmPrefer32Bit = 1 << 23<br>
};<br>
}<br>
<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/SIInstrFormats.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIInstrFormats.td?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIInstrFormats.td?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/SIInstrFormats.td (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/SIInstrFormats.td Wed Mar 9 06:29:31 2016<br>
@@ -31,6 +31,7 @@ class InstSI <dag outs, dag ins, string<br>
field bits<1> VOP2 = 0;<br>
field bits<1> VOP3 = 0;<br>
field bits<1> VOPC = 0;<br>
+ field bits<1> DPP = 0;<br>
<br>
field bits<1> MUBUF = 0;<br>
field bits<1> MTBUF = 0;<br>
@@ -63,16 +64,17 @@ class InstSI <dag outs, dag ins, string<br>
let TSFlags{11} = VOP2;<br>
let TSFlags{12} = VOP3;<br>
let TSFlags{13} = VOPC;<br>
+ let TSFlags{14} = DPP;<br>
<br>
- let TSFlags{14} = MUBUF;<br>
- let TSFlags{15} = MTBUF;<br>
- let TSFlags{16} = SMRD;<br>
- let TSFlags{17} = DS;<br>
- let TSFlags{18} = MIMG;<br>
- let TSFlags{19} = FLAT;<br>
- let TSFlags{20} = WQM;<br>
- let TSFlags{21} = VGPRSpill;<br>
- let TSFlags{22} = VOPAsmPrefer32Bit;<br>
+ let TSFlags{15} = MUBUF;<br>
+ let TSFlags{16} = MTBUF;<br>
+ let TSFlags{17} = SMRD;<br>
+ let TSFlags{18} = DS;<br>
+ let TSFlags{19} = MIMG;<br>
+ let TSFlags{20} = FLAT;<br>
+ let TSFlags{21} = WQM;<br>
+ let TSFlags{22} = VGPRSpill;<br>
+ let TSFlags{23} = VOPAsmPrefer32Bit;<br>
<br>
let SchedRW = [Write32Bit];<br>
<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.td?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.td?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.td (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.td Wed Mar 9 06:29:31 2016<br>
@@ -534,6 +534,22 @@ def SMRDLiteralOffsetMatchClass : SMRDOf<br>
"isSMRDLiteralOffset"<br>
>;<br>
<br>
+def DPPCtrlMatchClass : AsmOperandClass {<br>
+ let Name = "DPPCtrl";<br>
+ let PredicateMethod = "isDPPCtrl";<br>
+ let ParserMethod = "parseDPPCtrlOps";<br>
+ let RenderMethod = "addImmOperands";<br>
+ let IsOptional = 0;<br>
+}<br>
+<br>
+class DPPOptionalMatchClass <string OpName>: AsmOperandClass {<br>
+ let Name = "DPPOptional"#OpName;<br>
+ let PredicateMethod = "is"#OpName;<br>
+ let ParserMethod = "parseDPPOptionalOps";<br>
+ let RenderMethod = "addImmOperands";<br>
+ let IsOptional = 1;<br>
+}<br>
+<br>
class OptionalImmAsmOperand <string OpName> : AsmOperandClass {<br>
let Name = "Imm"#OpName;<br>
let PredicateMethod = "isImm";<br>
@@ -668,6 +684,26 @@ def lwe : NamedBitOperand<"LWE"> {<br>
let ParserMatchClass = NamedBitMatchClass<"LWE">;<br>
}<br>
<br>
+def dpp_ctrl : Operand <i32> {<br>
+ let PrintMethod = "printDPPCtrlOperand";<br>
+ let ParserMatchClass = DPPCtrlMatchClass;<br>
+}<br>
+<br>
+def row_mask : Operand <i32> {<br>
+ let PrintMethod = "printRowMaskOperand";<br>
+ let ParserMatchClass = DPPOptionalMatchClass<"RowMask">;<br>
+}<br>
+<br>
+def bank_mask : Operand <i32> {<br>
+ let PrintMethod = "printBankMaskOperand";<br>
+ let ParserMatchClass = DPPOptionalMatchClass<"BankMask">;<br>
+}<br>
+<br>
+def bound_ctrl : Operand <i1> {<br>
+ let PrintMethod = "printBoundCtrlOperand";<br>
+ let ParserMatchClass = DPPOptionalMatchClass<"BoundCtrl">;<br>
+}<br>
+<br>
} // End OperandType = "OPERAND_IMMEDIATE"<br>
<br>
<br>
@@ -1280,24 +1316,25 @@ class getInsDPP <RegisterClass Src0RC, R<br>
!if (!eq(HasModifiers, 1),<br>
// VOP1_DPP with modifiers<br>
(ins InputModsNoDefault:$src0_modifiers, Src0RC:$src0,<br>
- i32imm:$dpp_ctrl, i1imm:$bound_ctrl,<br>
- i32imm:$bank_mask, i32imm:$row_mask)<br>
+ dpp_ctrl:$dpp_ctrl, row_mask:$row_mask,<br>
+ bank_mask:$bank_mask, bound_ctrl:$bound_ctrl)<br>
/* else */,<br>
// VOP1_DPP without modifiers<br>
- (ins Src0RC:$src0, i32imm:$dpp_ctrl, i1imm:$bound_ctrl,<br>
- i32imm:$bank_mask, i32imm:$row_mask)<br>
+ (ins Src0RC:$src0, dpp_ctrl:$dpp_ctrl, row_mask:$row_mask,<br>
+ bank_mask:$bank_mask, bound_ctrl:$bound_ctrl)<br>
/* endif */)<br>
- /* NumSrcArgs == 2 */,<br>
+ /* NumSrcArgs == 2 */,<br>
!if (!eq(HasModifiers, 1),<br>
// VOP2_DPP with modifiers<br>
(ins InputModsNoDefault:$src0_modifiers, Src0RC:$src0,<br>
- InputModsNoDefault:$src1_modifiers, Src1RC:$src1,<br>
- i32imm:$dpp_ctrl, i1imm:$bound_ctrl,<br>
- i32imm:$bank_mask, i32imm:$row_mask)<br>
+ InputModsNoDefault:$src1_modifiers, Src1RC:$src1,<br>
+ dpp_ctrl:$dpp_ctrl, row_mask:$row_mask,<br>
+ bank_mask:$bank_mask, bound_ctrl:$bound_ctrl)<br>
/* else */,<br>
// VOP2_DPP without modifiers<br>
- (ins Src0RC:$src0, Src1RC:$src1, i32imm:$dpp_ctrl, i1imm:$bound_ctrl,<br>
- i32imm:$bank_mask, i32imm:$row_mask)<br>
+ (ins Src0RC:$src0, Src1RC:$src1, dpp_ctrl:$dpp_ctrl,<br>
+ row_mask:$row_mask, bank_mask:$bank_mask,<br>
+ bound_ctrl:$bound_ctrl)<br>
/* endif */));<br>
}<br>
<br>
@@ -1338,8 +1375,8 @@ class getAsmDPP <bit HasDst, int NumSrcA<br>
" $src1_modifiers,"));<br>
string args = !if(!eq(HasModifiers, 0),<br>
getAsm32<0, NumSrcArgs, DstVT>.ret,<br>
- src0#src1);<br>
- string ret = " "#dst#args#", $dpp_ctrl, "#"$bound_ctrl, "#"$bank_mask, "#"$row_mask";<br>
+ ", "#src0#src1);<br>
+ string ret = dst#args#" $dpp_ctrl $row_mask $bank_mask $bound_ctrl";<br>
}<br>
<br>
class VOPProfile <list<ValueType> _ArgVT> {<br>
@@ -1351,7 +1388,7 @@ class VOPProfile <list<ValueType> _ArgVT<br>
field ValueType Src1VT = ArgVT[2];<br>
field ValueType Src2VT = ArgVT[3];<br>
field RegisterOperand DstRC = getVALUDstForVT<DstVT>.ret;<br>
- field RegisterClass DstRCDPP = !if(!eq(DstVT.Size, 64), VReg_64, VGPR_32);<br>
+ field RegisterOperand DstRCDPP = getVALUDstForVT<DstVT>.ret;<br>
field RegisterOperand Src0RC32 = getVOPSrc0ForVT<Src0VT>.ret;<br>
field RegisterClass Src1RC32 = getVOPSrc1ForVT<Src1VT>.ret;<br>
field RegisterOperand Src0RC64 = getVOP3SrcForVT<Src0VT>.ret;<br>
@@ -1497,8 +1534,14 @@ def VOP_MAC : VOPProfile <[f32, f32, f32<br>
let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1, VGPR_32:$src2);<br>
let Ins64 = getIns64<Src0RC64, Src1RC64, RegisterOperand<VGPR_32>, 3,<br>
HasModifiers>.ret;<br>
+ let InsDPP = (ins InputModsNoDefault:$src0_modifiers, Src0RC32:$src0,<br>
+ InputModsNoDefault:$src1_modifiers, Src1RC32:$src1,<br>
+ VGPR_32:$src2, // stub argument<br>
+ dpp_ctrl:$dpp_ctrl, row_mask:$row_mask,<br>
+ bank_mask:$bank_mask, bound_ctrl:$bound_ctrl);<br>
let Asm32 = getAsm32<1, 2, f32>.ret;<br>
let Asm64 = getAsm64<1, 2, HasModifiers, f32>.ret;<br>
+ let AsmDPP = getAsmDPP<1, 2, HasModifiers, f32>.ret;<br>
}<br>
def VOP_F64_F64_F64_F64 : VOPProfile <[f64, f64, f64, f64]>;<br>
def VOP_I32_I32_I32_I32 : VOPProfile <[i32, i32, i32, i32]>;<br>
@@ -1607,9 +1650,9 @@ multiclass VOP1_m <vop1 op, string opNam<br>
<br>
class VOP1_DPP <vop1 op, string opName, VOPProfile p> :<br>
VOP1_DPPe <op.VI>,<br>
- VOP_DPP <p.OutsDPP, p.InsDPP, opName#p.AsmDPP, []> {<br>
+ VOP_DPP <p.OutsDPP, p.InsDPP, opName#p.AsmDPP, [], p.HasModifiers> {<br>
let AssemblerPredicates = [isVI];<br>
- let src0_modifiers = !if(p.HasModifiers, ?, 0);<br>
+ let src0_modifiers = !if(p.HasModifiers, ?, 0);<br>
let src1_modifiers = 0;<br>
}<br>
<br>
@@ -1667,6 +1710,14 @@ multiclass VOP2_m <vop2 op, string opNam<br>
<br>
}<br>
<br>
+class VOP2_DPP <vop2 op, string opName, VOPProfile p> :<br>
+ VOP2_DPPe <op.VI>,<br>
+ VOP_DPP <p.OutsDPP, p.InsDPP, opName#p.AsmDPP, [], p.HasModifiers> {<br>
+ let AssemblerPredicates = [isVI];<br>
+ let src0_modifiers = !if(p.HasModifiers, ?, 0);<br>
+ let src1_modifiers = !if(p.HasModifiers, ?, 0);<br>
+}<br>
+<br>
class VOP3DisableFields <bit HasSrc1, bit HasSrc2, bit HasModifiers> {<br>
<br>
bits<2> src0_modifiers = !if(HasModifiers, ?, 0);<br>
@@ -1929,6 +1980,8 @@ multiclass VOP2_Helper <vop2 op, string<br>
<br>
defm _e64 : VOP3_2_m <op, p.Outs, p.Ins64, opName#p.Asm64, pat64, opName,<br>
revOp, p.HasModifiers>;<br>
+<br>
+ def _dpp : VOP2_DPP <op, opName, p>;<br>
}<br>
<br>
multiclass VOP2Inst <vop2 op, string opName, VOPProfile P,<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/VIInstrFormats.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/VIInstrFormats.td?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/VIInstrFormats.td?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/VIInstrFormats.td (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/VIInstrFormats.td Wed Mar 9 06:29:31 2016<br>
@@ -169,9 +169,12 @@ class VOP3be_vi <bits<10> op> : Enc64 {<br>
let Inst{63} = src2_modifiers{0};<br>
}<br>
<br>
-class VOP_DPP <dag outs, dag ins, string asm, list<dag> pattern> :<br>
+class VOP_DPP <dag outs, dag ins, string asm, list<dag> pattern, bit HasMods = 0> :<br>
VOPAnyCommon <outs, ins, asm, pattern> {<br>
+ let DPP = 1;<br>
let Size = 8;<br>
+<br>
+ let AsmMatchConverter = !if(!eq(HasMods,1), "cvtDPP_mod", "cvtDPP_nomod");<br>
}<br>
<br>
class VOP_DPPe : Enc64 {<br>
@@ -203,7 +206,7 @@ class VOP1_DPPe <bits<8> op> : VOP_DPPe<br>
let Inst{31-25} = 0x3f; //encoding<br>
}<br>
<br>
-class VOP2_DPPe <bits<6> op> : Enc32 {<br>
+class VOP2_DPPe <bits<6> op> : VOP_DPPe {<br>
bits<8> vdst;<br>
bits<8> src1;<br>
<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/VIInstructions.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/VIInstructions.td?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/VIInstructions.td?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/VIInstructions.td (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/VIInstructions.td Wed Mar 9 06:29:31 2016<br>
@@ -121,10 +121,10 @@ def : Pat <<br>
//===----------------------------------------------------------------------===//<br>
<br>
def : Pat <<br>
- (int_amdgcn_mov_dpp i32:$src, imm:$dpp_ctrl, imm:$bound_ctrl,<br>
- imm:$bank_mask, imm:$row_mask),<br>
- (V_MOV_B32_dpp $src, (as_i32imm $dpp_ctrl), (as_i1imm $bound_ctrl),<br>
- (as_i32imm $bank_mask), (as_i32imm $row_mask))<br>
+ (int_amdgcn_mov_dpp i32:$src, imm:$dpp_ctrl, imm:$row_mask, imm:$bank_mask,<br>
+ imm:$bound_ctrl),<br>
+ (V_MOV_B32_dpp $src, (as_i32imm $dpp_ctrl), (as_i32imm $row_mask),<br>
+ (as_i32imm $bank_mask), (as_i1imm $bound_ctrl))<br>
>;<br>
<br>
//===----------------------------------------------------------------------===//<br>
<br>
Modified: llvm/trunk/test/CodeGen/AMDGPU/llvm.amdgcn.mov.dpp.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/llvm.amdgcn.mov.dpp.ll?rev=263008&r1=263007&r2=263008&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/llvm.amdgcn.mov.dpp.ll?rev=263008&r1=263007&r2=263008&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/AMDGPU/llvm.amdgcn.mov.dpp.ll (original)<br>
+++ llvm/trunk/test/CodeGen/AMDGPU/llvm.amdgcn.mov.dpp.ll Wed Mar 9 06:29:31 2016<br>
@@ -1,13 +1,13 @@<br>
; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs -show-mc-encoding < %s | FileCheck -check-prefix=VI %s<br>
<br>
; VI-LABEL: {{^}}dpp_test:<br>
-; VI: v_mov_b32 v0, v0, 1, -1, 1, 1 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x08,0x11]<br>
+; VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0x1 bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x08,0x11]<br>
define void @dpp_test(i32 addrspace(1)* %out, i32 %in) {<br>
- %tmp0 = call i32 @llvm.amdgcn.mov.dpp.i32(i32 %in, i32 1, i1 1, i32 1, i32 1) #0<br>
+ %tmp0 = call i32 @llvm.amdgcn.mov.dpp.i32(i32 %in, i32 1, i32 1, i32 1, i1 1) #0<br>
store i32 %tmp0, i32 addrspace(1)* %out<br>
ret void<br>
}<br>
<br>
-declare i32 @llvm.amdgcn.mov.dpp.i32(i32, i32, i1, i32, i32) #0<br>
+declare i32 @llvm.amdgcn.mov.dpp.i32(i32, i32, i32, i32, i1) #0<br>
<br>
attributes #0 = { nounwind readnone convergent }<br>
<br>
Added: llvm/trunk/test/MC/AMDGPU/vop_dpp.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AMDGPU/vop_dpp.s?rev=263008&view=auto" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AMDGPU/vop_dpp.s?rev=263008&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/AMDGPU/vop_dpp.s (added)<br>
+++ llvm/trunk/test/MC/AMDGPU/vop_dpp.s Wed Mar 9 06:29:31 2016<br>
@@ -0,0 +1,143 @@<br>
+// RUN: llvm-mc -arch=amdgcn -mcpu=tonga -show-encoding %s | FileCheck %s --check-prefix=GCN --check-prefix=CIVI --check-prefix=VI<br>
+// RUN: not llvm-mc -arch=amdgcn -show-encoding %s 2>&1 | FileCheck %s --check-prefix=NOSI --check-prefix=NOSICI<br>
+// RUN: not llvm-mc -arch=amdgcn -mcpu=SI -show-encoding %s 2>&1 | FileCheck %s --check-prefix=NOSI --check-prefix=NOSICI<br>
+// RUN: not llvm-mc -arch=amdgcn -mcpu=bonaire -show-encoding %s 2>&1 | FileCheck %s --check-prefix=NOSICI<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Check dpp_ctrl values<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:37 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x25,0x00,0xff]<br>
+v_mov_b32 v0, v0 quad_perm:37<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 row_shl:1 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x01,0xff]<br>
+v_mov_b32 v0, v0 row_shl:1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 row_shr:15 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x1f,0x01,0xff]<br>
+v_mov_b32 v0, v0 row_shr:0xf<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 row_ror:12 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x2c,0x01,0xff]<br>
+v_mov_b32 v0, v0 row_ror:0xc<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 wave_shl:1 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x30,0x01,0xff]<br>
+v_mov_b32 v0, v0 wave_shl:1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 wave_rol:1 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x34,0x01,0xff]<br>
+v_mov_b32 v0, v0 wave_rol:1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 wave_shr:1 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x38,0x01,0xff]<br>
+v_mov_b32 v0, v0 wave_shr:1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 wave_ror:1 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x3c,0x01,0xff]<br>
+v_mov_b32 v0, v0 wave_ror:1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 row_mirror:1 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x40,0x01,0xff]<br>
+v_mov_b32 v0, v0 row_mirror:1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 row_half_mirror:1 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x41,0x01,0xff]<br>
+v_mov_b32 v0, v0 row_half_mirror:1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 row_bcast:15 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x42,0x01,0xff]<br>
+v_mov_b32 v0, v0 row_bcast:15<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 row_bcast:31 row_mask:0xf bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x43,0x01,0xff]<br>
+v_mov_b32 v0, v0 row_bcast:31<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Check optional fields<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x08,0xa1]<br>
+v_mov_b32 v0, v0 quad_perm:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0xa bank_mask:0xf ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x00,0xaf]<br>
+v_mov_b32 v0, v0 quad_perm:1 row_mask:0xa<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0xf bank_mask:0x1 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x00,0xf1]<br>
+v_mov_b32 v0, v0 quad_perm:1 bank_mask:0x1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0xf bank_mask:0xf bound_ctrl:0 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x08,0xff]<br>
+v_mov_b32 v0, v0 quad_perm:1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0xa bank_mask:0x1 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x00,0xa1]<br>
+v_mov_b32 v0, v0 quad_perm:1 row_mask:0xa bank_mask:0x1<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0xa bank_mask:0xf bound_ctrl:0 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x08,0xaf]<br>
+v_mov_b32 v0, v0 quad_perm:1 row_mask:0xa bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_mov_b32_dpp v0, v0 quad_perm:1 row_mask:0xf bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x02,0x00,0x7e,0x00,0x01,0x08,0xf1]<br>
+v_mov_b32 v0, v0 quad_perm:1 bank_mask:0x1 bound_ctrl:0<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Check VOP1 opcodes<br>
+//===----------------------------------------------------------------------===//<br>
+// ToDo: v_nop<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_cvt_u32_f32_dpp v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x0e,0x00,0x7e,0x00,0x01,0x09,0xa1]<br>
+v_cvt_u32_f32 v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_fract_f32_dpp v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x36,0x00,0x7e,0x00,0x01,0x09,0xa1]<br>
+v_fract_f32 v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_sin_f32_dpp v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x52,0x00,0x7e,0x00,0x01,0x09,0xa1]<br>
+v_sin_f32 v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Check VOP2 opcodes<br>
+//===----------------------------------------------------------------------===//<br>
+// ToDo: VOP2bInst instructions: v_add_u32, v_sub_u32 ... (vcc and ApplyMnemonic in AsmMatcherEmitter.cpp)<br>
+// ToDo: v_mac_f32 (VOP_MAC)<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_add_f32_dpp v0, v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x00,0x00,0x02,0x00,0x01,0x09,0xa1]<br>
+v_add_f32 v0, v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_min_f32_dpp v0, v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x00,0x00,0x14,0x00,0x01,0x09,0xa1]<br>
+v_min_f32 v0, v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_and_b32_dpp v0, v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x00,0x00,0x26,0x00,0x01,0x09,0xa1]<br>
+v_and_b32 v0, v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Check modifiers<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_add_f32_dpp v0, -v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x00,0x00,0x02,0x00,0x01,0x19,0xa1]<br>
+v_add_f32 v0, -v0, v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_add_f32_dpp v0, v0, |v0| row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x00,0x00,0x02,0x00,0x01,0x89,0xa1]<br>
+v_add_f32 v0, v0, |v0| row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_add_f32_dpp v0, -v0, |v0| row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x00,0x00,0x02,0x00,0x01,0x99,0xa1]<br>
+v_add_f32 v0, -v0, |v0| row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
+<br>
+// NOSICI: error:<br>
+// VI: v_add_f32_dpp v0, |v0|, -v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0 ; encoding: [0xfa,0x00,0x00,0x02,0x00,0x01,0x69,0xa1]<br>
+v_add_f32 v0, |v0|, -v0 row_shl:1 row_mask:0xa bank_mask:0x1 bound_ctrl:0<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<div>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td nowrap="" style="border:none;border-top:solid #D50F25 1.5pt;padding:0cm 0cm 0cm 0cm">
<p class="MsoNormal"><span style="font-family:"Arial","sans-serif";color:#555555">Teresa Johnson |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #3369E8 1.5pt;padding:0cm 0cm 0cm 0cm">
<p class="MsoNormal"><span style="font-family:"Arial","sans-serif";color:#555555"> Software Engineer |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #009939 1.5pt;padding:0cm 0cm 0cm 0cm">
<p class="MsoNormal"><span style="font-family:"Arial","sans-serif";color:#555555"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #EEB211 1.5pt;padding:0cm 0cm 0cm 0cm">
<p class="MsoNormal"><span style="font-family:"Arial","sans-serif";color:#555555"> 408-460-2413<o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>