diff options
Diffstat (limited to 'contrib/llvm/lib/Target/AMDGPU/VOPInstructions.td')
-rw-r--r-- | contrib/llvm/lib/Target/AMDGPU/VOPInstructions.td | 117 |
1 files changed, 103 insertions, 14 deletions
diff --git a/contrib/llvm/lib/Target/AMDGPU/VOPInstructions.td b/contrib/llvm/lib/Target/AMDGPU/VOPInstructions.td index f0f7f259f71d..7de7d90d27b3 100644 --- a/contrib/llvm/lib/Target/AMDGPU/VOPInstructions.td +++ b/contrib/llvm/lib/Target/AMDGPU/VOPInstructions.td @@ -420,10 +420,10 @@ class VOP_SDWA_Pseudo <string opName, VOPProfile P, list<dag> pattern=[]> : let SDWA = 1; let Uses = [EXEC]; - let SubtargetPredicate = !if(P.HasExt, HasSDWA, DisableInst); - let AssemblerPredicate = !if(P.HasExt, HasSDWA, DisableInst); - let AsmVariantName = !if(P.HasExt, AMDGPUAsmVariants.SDWA, - AMDGPUAsmVariants.Disable); + let SubtargetPredicate = !if(P.HasExtSDWA, HasSDWA, DisableInst); + let AssemblerPredicate = !if(P.HasExtSDWA, HasSDWA, DisableInst); + let AsmVariantName = !if(P.HasExtSDWA, AMDGPUAsmVariants.SDWA, + AMDGPUAsmVariants.Disable); let DecoderNamespace = "SDWA"; VOPProfile Pfl = P; @@ -471,10 +471,10 @@ class VOP_SDWA9_Real <VOP_SDWA_Pseudo ps> : let Constraints = ps.Constraints; let DisableEncoding = ps.DisableEncoding; - let SubtargetPredicate = !if(ps.Pfl.HasSDWA9, HasSDWA9, DisableInst); - let AssemblerPredicate = !if(ps.Pfl.HasSDWA9, HasSDWA9, DisableInst); - let AsmVariantName = !if(ps.Pfl.HasSDWA9, AMDGPUAsmVariants.SDWA9, - AMDGPUAsmVariants.Disable); + let SubtargetPredicate = !if(ps.Pfl.HasExtSDWA9, HasSDWA9, DisableInst); + let AssemblerPredicate = !if(ps.Pfl.HasExtSDWA9, HasSDWA9, DisableInst); + let AsmVariantName = !if(ps.Pfl.HasExtSDWA9, AMDGPUAsmVariants.SDWA9, + AMDGPUAsmVariants.Disable); let DecoderNamespace = "SDWA9"; // Copy relevant pseudo op flags @@ -505,9 +505,14 @@ class VOP_DPPe<VOPProfile P> : Enc64 { let Inst{63-60} = row_mask; } -class VOP_DPP <string OpName, VOPProfile P> : - InstSI <P.OutsDPP, P.InsDPP, OpName#P.AsmDPP, []>, - VOP_DPPe<P> { +class VOP_DPP_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[]> : + InstSI <P.OutsDPP, P.InsDPP, OpName#P.AsmDPP, pattern>, + VOP <OpName>, + SIMCInstr <OpName#"_dpp", SIEncodingFamily.NONE>, + MnemonicAlias <OpName#"_dpp", OpName> { + + let isPseudo = 1; + let isCodeGenOnly = 1; let mayLoad = 0; let mayStore = 0; @@ -517,15 +522,99 @@ class VOP_DPP <string OpName, VOPProfile P> : let VALU = 1; let DPP = 1; let Size = 8; + let Uses = [EXEC]; + let isConvergent = 1; + + string Mnemonic = OpName; + string AsmOperands = P.AsmDPP; let AsmMatchConverter = !if(!eq(P.HasModifiers,1), "cvtDPP", ""); let SubtargetPredicate = HasDPP; - let AssemblerPredicate = !if(P.HasExt, HasDPP, DisableInst); - let AsmVariantName = !if(P.HasExt, AMDGPUAsmVariants.DPP, - AMDGPUAsmVariants.Disable); + 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 DecoderNamespace = "DPP"; + + VOPProfile Pfl = P; +} + +class VOP_DPP_Real <VOP_DPP_Pseudo ps, int EncodingFamily> : + InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>, + SIMCInstr <ps.PseudoInstr, EncodingFamily> { + + let isPseudo = 0; + let isCodeGenOnly = 0; + + let Defs = ps.Defs; + let Uses = ps.Uses; + let SchedRW = ps.SchedRW; + let hasSideEffects = ps.hasSideEffects; + + let Constraints = ps.Constraints; + let DisableEncoding = ps.DisableEncoding; + + // Copy relevant pseudo op flags + let isConvergent = ps.isConvergent; + let SubtargetPredicate = ps.SubtargetPredicate; + let AssemblerPredicate = ps.AssemblerPredicate; + let AsmMatchConverter = ps.AsmMatchConverter; + let AsmVariantName = ps.AsmVariantName; + let UseNamedOperandTable = ps.UseNamedOperandTable; + let DecoderNamespace = ps.DecoderNamespace; + let Constraints = ps.Constraints; + let DisableEncoding = ps.DisableEncoding; + let TSFlags = ps.TSFlags; +} + +class getNumNodeArgs<SDPatternOperator Op> { + SDNode N = !cast<SDNode>(Op); + SDTypeProfile TP = N.TypeProfile; + int ret = TP.NumOperands; +} + + +class getDivergentFrag<SDPatternOperator Op> { + + int NumSrcArgs = getNumNodeArgs<Op>.ret; + PatFrag ret = PatFrag < + !if(!eq(NumSrcArgs, 1), + (ops node:$src0), + !if(!eq(NumSrcArgs, 2), + (ops node:$src0, node:$src1), + (ops node:$src0, node:$src1, node:$src2))), + !if(!eq(NumSrcArgs, 1), + (Op $src0), + !if(!eq(NumSrcArgs, 2), + (Op $src0, $src1), + (Op $src0, $src1, $src2))), + [{ return N->isDivergent(); }] + >; +} + +class VOPPatGen<SDPatternOperator Op, VOPProfile P> { + + PatFrag Operator = getDivergentFrag < Op >.ret; + + dag Ins = !foreach(tmp, P.Ins32, !subst(ins, Operator, + !subst(P.Src0RC32, P.Src0VT, + !subst(P.Src1RC32, P.Src1VT, tmp)))); + + + dag Outs = !foreach(tmp, P.Outs32, !subst(outs, set, + !subst(P.DstRC, P.DstVT, tmp))); + + list<dag> ret = [!con(Outs, (set Ins))]; +} + +class VOPPatOrNull<SDPatternOperator Op, VOPProfile P> { + list<dag> ret = !if(!ne(P.NeedPatGen,PatGenMode.NoPattern), VOPPatGen<Op, P>.ret, []); +} + +class DivergentFragOrOp<SDPatternOperator Op, VOPProfile P> { + SDPatternOperator ret = !if(!eq(P.NeedPatGen,PatGenMode.Pattern), + !if(!isa<SDNode>(Op), getDivergentFrag<Op>.ret, Op), Op); } include "VOPCInstructions.td" |