diff options
Diffstat (limited to 'lib/Target/AMDGPU/VOPInstructions.td')
| -rw-r--r-- | lib/Target/AMDGPU/VOPInstructions.td | 182 |
1 files changed, 165 insertions, 17 deletions
diff --git a/lib/Target/AMDGPU/VOPInstructions.td b/lib/Target/AMDGPU/VOPInstructions.td index 7de7d90d27b3..677095a354be 100644 --- a/lib/Target/AMDGPU/VOPInstructions.td +++ b/lib/Target/AMDGPU/VOPInstructions.td @@ -1,9 +1,8 @@ //===-- VOPInstructions.td - Vector Instruction Defintions ----------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -91,6 +90,7 @@ class VOP3_Pseudo <string opName, VOPProfile P, list<dag> pattern = [], let VOP3_OPSEL = isVop3OpSel; let IsPacked = P.IsPacked; + let IsMAI = P.IsMAI; let AsmOperands = !if(isVop3OpSel, P.AsmVOP3OpSel, @@ -100,7 +100,6 @@ class VOP3_Pseudo <string opName, VOPProfile P, list<dag> pattern = [], let mayLoad = 0; let mayStore = 0; let hasSideEffects = 0; - let SubtargetPredicate = isGCN; // Because SGPRs may be allowed if there are multiple operands, we // need a post-isel hook to insert copies in order to avoid @@ -190,9 +189,15 @@ class VOP3a<VOPProfile P> : Enc64 { let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0); } -class VOP3a_si <bits<9> op, VOPProfile P> : VOP3a<P> { +class VOP3a_gfx6_gfx7<bits<9> op, VOPProfile p> : VOP3a<p> { + let Inst{11} = !if(p.HasClamp, clamp{0}, 0); let Inst{25-17} = op; - let Inst{11} = !if(P.HasClamp, clamp{0}, 0); +} + +class VOP3a_gfx10<bits<10> op, VOPProfile p> : VOP3a<p> { + let Inst{15} = !if(p.HasClamp, clamp{0}, 0); + let Inst{25-16} = op; + let Inst{31-26} = 0x35; } class VOP3a_vi <bits<10> op, VOPProfile P> : VOP3a<P> { @@ -200,9 +205,14 @@ class VOP3a_vi <bits<10> op, VOPProfile P> : VOP3a<P> { let Inst{15} = !if(P.HasClamp, clamp{0}, 0); } -class VOP3e_si <bits<9> op, VOPProfile P> : VOP3a_si <op, P> { +class VOP3e_gfx6_gfx7<bits<9> op, VOPProfile p> : VOP3a_gfx6_gfx7<op, p> { bits<8> vdst; - let Inst{7-0} = !if(P.EmitDst, vdst{7-0}, 0); + let Inst{7-0} = !if(p.EmitDst, vdst{7-0}, 0); +} + +class VOP3e_gfx10<bits<10> op, VOPProfile p> : VOP3a_gfx10<op, p> { + bits<8> vdst; + let Inst{7-0} = !if(p.EmitDst, vdst{7-0}, 0); } class VOP3e_vi <bits<10> op, VOPProfile P> : VOP3a_vi <op, P> { @@ -217,6 +227,13 @@ class VOP3OpSel_gfx9 <bits<10> op, VOPProfile P> : VOP3e_vi <op, P> { let Inst{14} = !if(P.HasDst, src0_modifiers{3}, 0); } +class VOP3OpSel_gfx10<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p> { + let Inst{11} = !if(p.HasSrc0, src0_modifiers{2}, 0); + let Inst{12} = !if(p.HasSrc1, src1_modifiers{2}, 0); + let Inst{13} = !if(p.HasSrc2, src2_modifiers{2}, 0); + let Inst{14} = !if(p.HasDst, src0_modifiers{3}, 0); +} + // NB: For V_INTERP* opcodes, src0 is encoded as src1 and vice versa class VOP3Interp_vi <bits<10> op, VOPProfile P> : VOP3e_vi <op, P> { bits<2> attrchan; @@ -236,6 +253,21 @@ class VOP3Interp_vi <bits<10> op, VOPProfile P> : VOP3e_vi <op, P> { let Inst{49-41} = src0; } +class VOP3Interp_gfx10<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p> { + bits<6> attr; + bits<2> attrchan; + bits<1> high; + + let Inst{8} = 0; + let Inst{9} = !if(p.HasSrc0Mods, src0_modifiers{1}, 0); + let Inst{37-32} = attr; + let Inst{39-38} = attrchan; + let Inst{40} = !if(p.HasHigh, high, 0); + let Inst{49-41} = src0; + let Inst{61} = 0; + let Inst{62} = !if(p.HasSrc0Mods, src0_modifiers{0}, 0); +} + class VOP3be <VOPProfile P> : Enc64 { bits<8> vdst; bits<2> src0_modifiers; @@ -295,10 +327,51 @@ class VOP3Pe <bits<10> op, VOPProfile P> : Enc64 { let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0); // neg (lo) } -class VOP3be_si <bits<9> op, VOPProfile P> : VOP3be<P> { +class VOP3Pe_MAI <bits<10> op, VOPProfile P> : Enc64 { + bits<8> vdst; + bits<10> src0; + bits<10> src1; + bits<9> src2; + bits<3> blgp; + bits<3> cbsz; + bits<4> abid; + bits<1> clamp; + + let Inst{7-0} = vdst; + + let Inst{10-8} = !if(P.HasSrc1, cbsz, 0); + let Inst{14-11} = !if(P.HasSrc1, abid, 0); + + let Inst{15} = !if(P.HasClamp, clamp{0}, 0); + + let Inst{25-16} = op; + let Inst{31-26} = 0x34; //encoding + let Inst{40-32} = !if(P.HasSrc0, src0{8-0}, 0); + let Inst{49-41} = !if(P.HasSrc1, src1{8-0}, 0); + let Inst{58-50} = !if(P.HasSrc2, src2, 0); + + let Inst{59} = !if(P.HasSrc0, src0{9}, 0); // acc(0) + let Inst{60} = !if(P.HasSrc1, src1{9}, 0); // acc(1) + + let Inst{63-61} = !if(P.HasSrc1, blgp, 0); +} + + +class VOP3Pe_gfx10 <bits<10> op, VOPProfile P> : VOP3Pe<op, P> { + let Inst{31-26} = 0x33; //encoding +} + +class VOP3be_gfx6_gfx7<bits<9> op, VOPProfile p> : VOP3be<p> { let Inst{25-17} = op; } +class VOP3be_gfx10<bits<10> op, VOPProfile p> : VOP3be<p> { + bits<1> clamp; + let Inst{15} = !if(p.HasClamp, clamp{0}, 0); + let Inst{25-16} = op; + let Inst{31-26} = 0x35; +} + class VOP3be_vi <bits<10> op, VOPProfile P> : VOP3be<P> { bits<1> clamp; let Inst{25-16} = op; @@ -393,7 +466,7 @@ class VOP_SDWA9Ae<VOPProfile P> : VOP_SDWA9e<P> { class VOP_SDWA9Be<VOPProfile P> : VOP_SDWA9e<P> { bits<8> sdst; // {vcc_sdst{0}, sdst{6-0}} - let Inst{46-40} = !if(P.EmitDst, sdst{6-0}, 0); + let Inst{46-40} = !if(P.EmitDst, sdst{6-0}, ?); let Inst{47} = !if(P.EmitDst, sdst{7}, 0); } @@ -456,9 +529,8 @@ class VOP_SDWA_Real <VOP_SDWA_Pseudo ps> : let TSFlags = ps.TSFlags; } -class VOP_SDWA9_Real <VOP_SDWA_Pseudo ps> : - InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands9, []>, - SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SDWA9> { +class Base_VOP_SDWA9_Real <VOP_SDWA_Pseudo ps> : + InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands9, []> { let isPseudo = 0; let isCodeGenOnly = 0; @@ -485,7 +557,20 @@ class VOP_SDWA9_Real <VOP_SDWA_Pseudo ps> : let TSFlags = ps.TSFlags; } -class VOP_DPPe<VOPProfile P> : Enc64 { +class VOP_SDWA9_Real <VOP_SDWA_Pseudo ps> : + Base_VOP_SDWA9_Real <ps >, + SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SDWA9>; + +class Base_VOP_SDWA10_Real<VOP_SDWA_Pseudo ps> : Base_VOP_SDWA9_Real<ps> { + let SubtargetPredicate = !if(ps.Pfl.HasExtSDWA9, HasSDWA10, DisableInst); + let AssemblerPredicate = !if(ps.Pfl.HasExtSDWA9, HasSDWA10, DisableInst); + let DecoderNamespace = "SDWA10"; +} + +class VOP_SDWA10_Real<VOP_SDWA_Pseudo ps> : + Base_VOP_SDWA10_Real<ps>, SIMCInstr<ps.PseudoInstr, SIEncodingFamily.SDWA10>; + +class VOP_DPPe<VOPProfile P, bit IsDPP16=0> : Enc64 { bits<2> src0_modifiers; bits<8> src0; bits<2> src1_modifiers; @@ -493,9 +578,11 @@ class VOP_DPPe<VOPProfile P> : Enc64 { bits<1> bound_ctrl; bits<4> bank_mask; bits<4> row_mask; + bit fi; let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0); let Inst{48-40} = dpp_ctrl; + let Inst{50} = !if(IsDPP16, fi, ?); let Inst{51} = bound_ctrl; let Inst{52} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0); // src0_neg let Inst{53} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0); // src0_abs @@ -533,8 +620,8 @@ class VOP_DPP_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : let AssemblerPredicate = !if(P.HasExtDPP, HasDPP, DisableInst); let AsmVariantName = !if(P.HasExtDPP, AMDGPUAsmVariants.DPP, AMDGPUAsmVariants.Disable); - let Constraints = !if(P.NumSrcArgs, "$old = $vdst", ""); - let DisableEncoding = !if(P.NumSrcArgs, "$old", ""); + let Constraints = !if(P.NumSrcArgs, P.TieRegDPP # " = $vdst", ""); + let DisableEncoding = !if(P.NumSrcArgs, P.TieRegDPP, ""); let DecoderNamespace = "DPP"; VOPProfile Pfl = P; @@ -568,6 +655,67 @@ class VOP_DPP_Real <VOP_DPP_Pseudo ps, int EncodingFamily> : let TSFlags = ps.TSFlags; } +class VOP_DPP <string OpName, VOPProfile P, bit IsDPP16, + dag InsDPP = !if(IsDPP16, P.InsDPP16, P.InsDPP), + string AsmDPP = !if(IsDPP16, P.AsmDPP16, P.AsmDPP)> : + InstSI <P.OutsDPP, InsDPP, OpName#AsmDPP, []>, + VOP_DPPe<P, IsDPP16> { + + let mayLoad = 0; + let mayStore = 0; + let hasSideEffects = 0; + let UseNamedOperandTable = 1; + + let VALU = 1; + let DPP = 1; + let Size = 8; + + let AsmMatchConverter = !if(!eq(P.HasModifiers,1), "cvtDPP", ""); + let SubtargetPredicate = HasDPP; + let AssemblerPredicate = !if(P.HasExtDPP, HasDPP, DisableInst); + let AsmVariantName = !if(P.HasExtDPP, AMDGPUAsmVariants.DPP, + AMDGPUAsmVariants.Disable); + let Constraints = !if(P.NumSrcArgs, P.TieRegDPP # " = $vdst", ""); + let DisableEncoding = !if(P.NumSrcArgs, P.TieRegDPP, ""); + let DecoderNamespace = "DPP"; +} + +class VOP_DPP8e<VOPProfile P> : Enc64 { + bits<8> src0; + bits<24> dpp8; + bits<9> fi; + + let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0); + let Inst{63-40} = dpp8{23-0}; +} + +class VOP_DPP8<string OpName, VOPProfile P> : + InstSI<P.OutsDPP8, P.InsDPP8, OpName#P.AsmDPP8, []>, + VOP_DPP8e<P> { + + let mayLoad = 0; + let mayStore = 0; + let hasSideEffects = 0; + let UseNamedOperandTable = 1; + + let VALU = 1; + let DPP = 1; + let Size = 8; + + let AsmMatchConverter = "cvtDPP8"; + let SubtargetPredicate = HasDPP8; + let AssemblerPredicate = !if(P.HasExt, HasDPP8, DisableInst); + let AsmVariantName = !if(P.HasExt, AMDGPUAsmVariants.DPP, + AMDGPUAsmVariants.Disable); + let Constraints = !if(P.NumSrcArgs, P.TieRegDPP # " = $vdst", ""); + let DisableEncoding = !if(P.NumSrcArgs, P.TieRegDPP, ""); +} + +def DPP8Mode { + int FI_0 = 0xE9; + int FI_1 = 0xEA; +} + class getNumNodeArgs<SDPatternOperator Op> { SDNode N = !cast<SDNode>(Op); SDTypeProfile TP = N.TypeProfile; |
