Lines Matching +full:- +full:p
1 //===-- VOPInstructions.td - Vector Instruction Definitions ---------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
58 class VOP_Pseudo <string opName, string suffix, VOPProfile P, dag outs, dag ins,
69 bit IsTrue16 = P.IsTrue16;
70 bit IsInvalidSingleUseConsumer = P.IsInvalidSingleUseConsumer;
71 bit IsInvalidSingleUseProducer = P.IsInvalidSingleUseProducer;
72 VOPProfile Pfl = P;
85 let AddedComplexity = -1000;
97 // need a post-isel hook to insert copies in order to avoid
102 class VOP3_Pseudo <string opName, VOPProfile P, list<dag> pattern = [],
104 VOP_Pseudo <opName, "_e64", P, P.Outs64,
106 P.InsVOP3OpSel,
107 !if(!and(isVOP3P, P.IsPacked), P.InsVOP3P, P.Ins64)),
111 let IsPacked = P.IsPacked;
112 let IsMAI = P.IsMAI;
113 let IsWMMA = P.IsWMMA;
114 let IsSWMMAC = P.IsSWMMAC;
117 P.AsmVOP3OpSel,
118 !if(!and(isVOP3P, P.IsPacked), P.AsmVOP3P, P.Asm64));
126 // need a post-isel hook to insert copies in order to avoid
134 let AddedComplexity = -1000;
138 let FPClamp = P.HasFPClamp;
139 let IntClamp = P.HasIntClamp;
140 let ClampLo = P.HasClampLo;
141 let ClampHi = P.HasClampHi;
143 let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP);
152 !if(!or(P.HasModifiers, P.HasOMod, P.HasClamp),
157 class VOP3P_Pseudo <string opName, VOPProfile P, list<dag> pattern = []> :
158 VOP3_Pseudo<opName, P, pattern, 1> {
160 let IsDOT = P.IsDOT;
209 // XXX - Is there any reason to distinguish this from regular VOP3
224 class VOP3a<VOPProfile P> : Enc64 {
234 let Inst{8} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0);
235 let Inst{9} = !if(P.HasSrc1Mods, src1_modifiers{1}, 0);
236 let Inst{10} = !if(P.HasSrc2Mods, src2_modifiers{1}, 0);
238 let Inst{31-26} = 0x34; //encoding
239 let Inst{40-32} = !if(P.HasSrc0, src0, 0);
240 let Inst{49-41} = !if(P.HasSrc1, src1, 0);
241 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
242 let Inst{60-59} = !if(P.HasOMod, omod, 0);
243 let Inst{61} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0);
244 let Inst{62} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0);
245 let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0);
248 class VOP3a_gfx6_gfx7<bits<9> op, VOPProfile p> : VOP3a<p> {
249 let Inst{11} = !if(p.HasClamp, clamp{0}, 0);
250 let Inst{25-17} = op;
253 class VOP3a_gfx10<bits<10> op, VOPProfile p> : VOP3a<p> {
254 let Inst{15} = !if(p.HasClamp, clamp{0}, 0);
255 let Inst{25-16} = op;
256 let Inst{31-26} = 0x35;
259 class VOP3a_gfx11_gfx12<bits<10> op, VOPProfile p> : VOP3a_gfx10<op, p>;
261 class VOP3a_vi <bits<10> op, VOPProfile P> : VOP3a<P> {
262 let Inst{25-16} = op;
263 let Inst{15} = !if(P.HasClamp, clamp{0}, 0);
266 class VOP3e_gfx6_gfx7<bits<9> op, VOPProfile p> : VOP3a_gfx6_gfx7<op, p> {
268 let Inst{7-0} = !if(p.EmitDst, vdst{7-0}, 0);
271 class VOP3e_gfx10<bits<10> op, VOPProfile p> : VOP3a_gfx10<op, p> {
273 let Inst{7-0} = !if(p.EmitDst, vdst{7-0}, 0);
276 class VOP3e_gfx11_gfx12<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p>;
278 class VOP3e_vi <bits<10> op, VOPProfile P> : VOP3a_vi <op, P> {
280 let Inst{7-0} = !if(P.EmitDst, vdst{7-0}, 0);
283 class VOP3OpSel_gfx9 <bits<10> op, VOPProfile P> : VOP3e_vi <op, P> {
284 let Inst{11} = !if(P.HasSrc0, src0_modifiers{2}, 0);
285 let Inst{12} = !if(P.HasSrc1, src1_modifiers{2}, 0);
286 let Inst{13} = !if(P.HasSrc2, src2_modifiers{2}, 0);
287 let Inst{14} = !if(P.HasDst, src0_modifiers{3}, 0);
290 class VOP3OpSel_gfx10<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p> {
291 let Inst{11} = !if(p.HasSrc0, src0_modifiers{2}, 0);
292 let Inst{12} = !if(p.HasSrc1, src1_modifiers{2}, 0);
293 let Inst{13} = !if(p.HasSrc2, src2_modifiers{2}, 0);
294 let Inst{14} = !if(p.HasDst, src0_modifiers{3}, 0);
297 class VOP3OpSel_gfx11_gfx12<bits<10> op, VOPProfile p> : VOP3OpSel_gfx10<op, p>;
299 class VOP3FP8OpSel_src_bytesel_gfx11_gfx12<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p> {
301 let Inst{11-12} = byte_sel; // NB: bit order is intentionally reversed!
302 let Inst{14-13} = 0; // op_sel2/3
305 class VOP3FP8OpSel_dst_bytesel_gfx11_gfx12<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p> {
310 let Inst{14-13} = byte_sel; // op_sel2/3
313 class VOP3DotOpSel_gfx11_gfx12<bits<10> op, VOPProfile p> : VOP3OpSel_gfx11_gfx12<op, p>{
319 class VOP3Interp_vi <bits<10> op, VOPProfile P> : VOP3e_vi <op, P> {
327 let Inst{9} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0);
328 let Inst{62} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0);
330 let Inst{37-32} = attr;
331 let Inst{39-38} = attrchan;
332 let Inst{40} = !if(P.HasHigh, high, 0);
334 let Inst{49-41} = src0;
337 class VOP3Interp_gfx10<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p> {
343 let Inst{9} = !if(p.HasSrc0Mods, src0_modifiers{1}, 0);
344 let Inst{37-32} = attr;
345 let Inst{39-38} = attrchan;
346 let Inst{40} = !if(p.HasHigh, high, 0);
347 let Inst{49-41} = src0;
349 let Inst{62} = !if(p.HasSrc0Mods, src0_modifiers{0}, 0);
352 class VOP3Interp_gfx11<bits<10> op, VOPProfile p> : VOP3Interp_gfx10<op, p>;
354 class VOP3be <VOPProfile P> : Enc64 {
365 let Inst{7-0} = vdst;
366 let Inst{14-8} = sdst;
367 let Inst{31-26} = 0x34; //encoding
368 let Inst{40-32} = !if(P.HasSrc0, src0, 0);
369 let Inst{49-41} = !if(P.HasSrc1, src1, 0);
370 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
371 let Inst{60-59} = !if(P.HasOMod, omod, 0);
372 let Inst{61} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0);
373 let Inst{62} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0);
374 let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0);
377 class VOP3Pe <bits<7> op, VOPProfile P> : Enc64 {
389 let Inst{7-0} = vdst;
390 let Inst{8} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0); // neg_hi src0
391 let Inst{9} = !if(P.HasSrc1Mods, src1_modifiers{1}, 0); // neg_hi src1
392 let Inst{10} = !if(P.HasSrc2Mods, src2_modifiers{1}, 0); // neg_hi src2
394 let Inst{11} = !if(!and(P.HasSrc0, P.HasOpSel), src0_modifiers{2}, 0); // op_sel(0)
395 let Inst{12} = !if(!and(P.HasSrc1, P.HasOpSel), src1_modifiers{2}, 0); // op_sel(1)
396 let Inst{13} = !if(!and(P.HasSrc2, P.HasOpSel), src2_modifiers{2}, 0); // op_sel(2)
398 …let Inst{14} = !if(!and(P.HasSrc2, P.HasOpSel), src2_modifiers{3}, !if(P.IsDOT, 1, ?)); // op_sel_…
400 let Inst{15} = !if(P.HasClamp, clamp{0}, 0);
402 let Inst{22-16} = op;
403 let Inst{31-23} = 0x1a7; //encoding
404 let Inst{40-32} = !if(P.HasSrc0, src0, 0);
405 let Inst{49-41} = !if(P.HasSrc1, src1, 0);
406 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
407 …let Inst{59} = !if(!and(P.HasSrc0, P.HasOpSel), src0_modifiers{3}, !if(P.IsDOT, 1, ?)); // op_s…
408 …let Inst{60} = !if(!and(P.HasSrc1, P.HasOpSel), src1_modifiers{3}, !if(P.IsDOT, 1, ?)); // op_s…
409 let Inst{61} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0); // neg (lo)
410 let Inst{62} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0); // neg (lo)
411 let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0); // neg (lo)
414 class VOP3Pe_MAI <bits<7> op, VOPProfile P, bit acc_cd = 0> : Enc64 {
423 let Inst{7-0} = vdst;
425 let Inst{10-8} = !if(P.HasSrc1, cbsz, 0);
426 let Inst{14-11} = !if(P.HasSrc1, abid, 0);
430 let Inst{22-16} = op;
431 let Inst{31-23} = 0x1a7; //encoding
432 let Inst{40-32} = !if(P.HasSrc0, src0{8-0}, 0);
433 let Inst{49-41} = !if(P.HasSrc1, src1{8-0}, 0);
434 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
436 let Inst{59} = !if(P.HasSrc0, src0{9}, 0); // acc(0)
437 let Inst{60} = !if(P.HasSrc1, src1{9}, 0); // acc(1)
439 let Inst{63-61} = !if(P.HasSrc1, blgp, 0);
453 let Inst{7-0} = vdst{7-0};
455 let Inst{10-8} = cbsz;
456 let Inst{14-11} = abid;
460 let Inst{22-16} = op;
461 let Inst{31-23} = 0x1a7; // encoding
462 let Inst{40-32} = src0{8-0};
463 let Inst{49-41} = src1{8-0};
464 let Inst{58-50} = idx;
469 let Inst{63-61} = blgp;
472 class VOP3Pe_gfx10 <bits<7> op, VOPProfile P> : VOP3Pe<op, P> {
473 let Inst{31-23} = 0x198; //encoding
476 class VOP3Pe_gfx11_gfx12<bits<7> op, VOPProfile P> : VOP3Pe_gfx10<op, P>;
478 class VOP3be_gfx6_gfx7<bits<9> op, VOPProfile p> : VOP3be<p> {
479 let Inst{25-17} = op;
482 class VOP3be_gfx10<bits<10> op, VOPProfile p> : VOP3be<p> {
484 let Inst{15} = !if(p.HasClamp, clamp{0}, 0);
485 let Inst{25-16} = op;
486 let Inst{31-26} = 0x35;
489 class VOP3be_gfx11_gfx12<bits<10> op, VOPProfile p> : VOP3be_gfx10<op, p>;
491 class VOP3be_vi <bits<10> op, VOPProfile P> : VOP3be<P> {
493 let Inst{25-16} = op;
494 let Inst{15} = !if(P.HasClamp, clamp{0}, 0);
513 class VOP_SDWAe<VOPProfile P> : Enc64 {
523 let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0);
524 let Inst{42-40} = !if(P.EmitDstSel, dst_sel{2-0}, ?);
525 let Inst{44-43} = !if(P.EmitDstSel, dst_unused{1-0}, ?);
526 let Inst{45} = !if(P.HasSDWAClamp, clamp{0}, 0);
527 let Inst{50-48} = !if(P.HasSrc0, src0_sel{2-0}, 0);
528 let Inst{51} = !if(P.HasSrc0IntMods, src0_modifiers{0}, 0);
529 let Inst{53-52} = !if(P.HasSrc0FloatMods, src0_modifiers{1-0}, 0);
530 let Inst{58-56} = !if(P.HasSrc1, src1_sel{2-0}, 0);
531 let Inst{59} = !if(P.HasSrc1IntMods, src1_modifiers{0}, 0);
532 let Inst{61-60} = !if(P.HasSrc1FloatMods, src1_modifiers{1-0}, 0);
549 class VOP_SDWA9e<VOPProfile P> : Enc64 {
550 bits<9> src0; // {src0_sgpr{0}, src0{7-0}}
557 let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0);
558 let Inst{50-48} = !if(P.HasSrc0, src0_sel{2-0}, 0);
559 let Inst{51} = !if(P.HasSrc0IntMods, src0_modifiers{0}, 0);
560 let Inst{53-52} = !if(P.HasSrc0FloatMods, src0_modifiers{1-0}, 0);
561 let Inst{55} = !if(P.HasSrc0, src0{8}, 0);
562 let Inst{58-56} = !if(P.HasSrc1, src1_sel{2-0}, 0);
563 let Inst{59} = !if(P.HasSrc1IntMods, src1_modifiers{0}, 0);
564 let Inst{61-60} = !if(P.HasSrc1FloatMods, src1_modifiers{1-0}, 0);
565 let Inst{63} = 0; // src1_sgpr - should be specified in subclass
568 // gfx9 SDWA-A
569 class VOP_SDWA9Ae<VOPProfile P> : VOP_SDWA9e<P> {
575 let Inst{42-40} = !if(P.EmitDstSel, dst_sel{2-0}, ?);
576 let Inst{44-43} = !if(P.EmitDstSel, dst_unused{1-0}, ?);
577 let Inst{45} = !if(P.HasSDWAClamp, clamp{0}, 0);
578 let Inst{47-46} = !if(P.HasSDWAOMod, omod{1-0}, 0);
581 // gfx9 SDWA-B
582 class VOP_SDWA9Be<VOPProfile P> : VOP_SDWA9e<P> {
583 bits<8> sdst; // {vcc_sdst{0}, sdst{6-0}}
585 let Inst{46-40} = !if(P.EmitDst, sdst{6-0}, ?);
586 let Inst{47} = !if(P.EmitDst, sdst{7}, 0);
589 class VOP_SDWA_Pseudo <string opName, VOPProfile P, list<dag> pattern=[]> :
590 InstSI <P.OutsSDWA, P.InsSDWA, "", pattern>,
599 string AsmOperands = P.AsmSDWA;
600 string AsmOperands9 = P.AsmSDWA9;
610 let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP);
617 let AsmVariantName = !if(P.HasExtSDWA, AMDGPUAsmVariants.SDWA,
621 VOPProfile Pfl = P;
707 class VOP_DPPe<VOPProfile P, bit IsDPP16=0> : Enc64 {
717 let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0);
718 let Inst{48-40} = dpp_ctrl;
721 let Inst{52} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0); // src0_neg
722 let Inst{53} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0); // src0_abs
723 let Inst{54} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0); // src1_neg
724 let Inst{55} = !if(P.HasSrc1Mods, src1_modifiers{1}, 0); // src1_abs
725 let Inst{59-56} = bank_mask;
726 let Inst{63-60} = row_mask;
741 class VOP3_DPPe_Common_Base<bits<10> op, VOPProfile P> : Enc96 {
749 let Inst{8} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0);
750 let Inst{9} = !if(P.HasSrc1Mods, src1_modifiers{1}, 0);
751 let Inst{10} = !if(P.HasSrc2Mods, src2_modifiers{1}, 0);
753 let Inst{11} = !if(P.HasOpSel, !if(P.HasSrc0Mods, src0_modifiers{2}, 0),
754 !if(P.IsFP8SrcByteSel, byte_sel{1}, ?));
755 let Inst{12} = !if(P.HasOpSel, !if(P.HasSrc1Mods, src1_modifiers{2}, 0),
756 !if(P.IsFP8SrcByteSel, byte_sel{0}, ?));
757 let Inst{13} = !if(P.HasOpSel, !if(P.HasSrc2Mods, src2_modifiers{2}, 0),
758 !if(P.IsFP8DstByteSel, byte_sel{0}, ?));
759 let Inst{14} = !if(P.HasOpSel, !if(P.HasSrc0Mods, src0_modifiers{3}, 0),
760 !if(P.IsFP8DstByteSel, byte_sel{1}, ?));
761 let Inst{15} = !if(P.HasClamp, clamp, 0);
762 let Inst{25-16} = op;
763 let Inst{31-26} = 0x35;
765 let Inst{60-59} = !if(P.HasOMod, omod, 0);
766 let Inst{61} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0);
767 let Inst{62} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0);
768 let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0);
771 class VOP3_DPPe_Common<bits<10> op, VOPProfile P> : VOP3_DPPe_Common_Base<op, P> {
776 let Inst{7-0} = !if(P.EmitDst, vdst{7-0}, 0);
777 let Inst{49-41} = !if(P.HasSrc1, src1, 0);
778 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
781 class VOP3P_DPPe_Common_Base<bits<7> op, VOPProfile P> : Enc96 {
787 let Inst{8} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0); // neg_hi src0
788 let Inst{9} = !if(P.HasSrc1Mods, src1_modifiers{1}, 0); // neg_hi src1
789 let Inst{10} = !if(P.HasSrc2Mods, src2_modifiers{1}, 0); // neg_hi src2
790 let Inst{11} = !if(!and(P.HasSrc0, P.HasOpSel), src0_modifiers{2}, 0); // op_sel(0)
791 let Inst{12} = !if(!and(P.HasSrc1, P.HasOpSel), src1_modifiers{2}, 0); // op_sel(1)
792 let Inst{13} = !if(!and(P.HasSrc2, P.HasOpSel), src2_modifiers{2}, 0); // op_sel(2)
793 …let Inst{14} = !if(!and(P.HasSrc2, P.HasOpSel), src2_modifiers{3}, !if(P.IsDOT, 1, ?)); // op_sel_…
794 let Inst{15} = !if(P.HasClamp, clamp{0}, 0);
795 let Inst{22-16} = op;
796 let Inst{31-23} = 0x198; // encoding
797 …let Inst{59} = !if(!and(P.HasSrc0, P.HasOpSel), src0_modifiers{3}, !if(P.IsDOT, 1, ?)); // op_s…
798 …let Inst{60} = !if(!and(P.HasSrc1, P.HasOpSel), src1_modifiers{3}, !if(P.IsDOT, 1, ?)); // op_s…
799 let Inst{61} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0); // neg (lo)
800 let Inst{62} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0); // neg (lo)
801 let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0); // neg (lo)
804 class VOP3P_DPPe_Common<bits<7> op, VOPProfile P> : VOP3P_DPPe_Common_Base<op, P> {
809 let Inst{7-0} = vdst;
810 let Inst{49-41} = !if(P.HasSrc1, src1, 0);
811 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
814 class VOP_DPP_Pseudo <string OpName, VOPProfile P, list<dag> pattern=[],
815 dag Ins = P.InsDPP, string asmOps = P.AsmDPP> :
816 VOP_Pseudo<OpName, "_dpp", P, P.OutsDPP, Ins, asmOps, pattern> {
825 let IsPacked = P.IsPacked;
827 let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP);
835 let AsmMatchConverter = !if(P.HasModifiers, "cvtDPP", "");
836 let AssemblerPredicate = !if(P.HasExt64BitDPP, HasDPALU_DPP, HasDPP);
837 let AsmVariantName = !if(P.HasExtDPP, AMDGPUAsmVariants.DPP,
839 let Constraints = !if(P.NumSrcArgs, P.TieRegDPP # " = $vdst", "");
840 let DisableEncoding = !if(P.NumSrcArgs, P.TieRegDPP, "");
847 class VOP3_DPP_Pseudo <string OpName, VOPProfile P> :
848 VOP_DPP_Pseudo <OpName, P, [], P.InsVOP3DPP, P.AsmVOP3DPP> {
850 let OutOperandList = P.OutsVOP3DPP;
854 let AsmVariantName = !if(P.HasExtVOP3DPP, AMDGPUAsmVariants.VOP3_DPP,
894 class VOP_DPP_Base <string OpName, VOPProfile P,
897 InstSI <P.OutsDPP, InsDPP, OpName#AsmDPP, []> {
908 let AsmMatchConverter = !if(P.HasModifiers, "cvtDPP", "");
909 let AssemblerPredicate = !if(P.HasExt64BitDPP, HasDPALU_DPP, HasDPP);
910 let AsmVariantName = !if(P.HasExtDPP, AMDGPUAsmVariants.DPP,
912 let Constraints = !if(P.NumSrcArgs, P.TieRegDPP # " = $vdst", "");
913 let DisableEncoding = !if(P.NumSrcArgs, P.TieRegDPP, "");
917 class VOP_DPP <string OpName, VOPProfile P, bit IsDPP16,
918 dag InsDPP = !if(IsDPP16, P.InsDPP16, P.InsDPP),
919 string AsmDPP = !if(IsDPP16, P.AsmDPP16, P.AsmDPP)> :
920 VOP_DPP_Base<OpName, P, InsDPP, AsmDPP>, VOP_DPPe<P, IsDPP16>;
922 class VOP3_DPP_Base <string OpName, VOPProfile P, bit IsDPP16,
923 dag InsDPP = !if(IsDPP16, P.InsVOP3DPP16, P.InsVOP3DPP),
924 string AsmDPP = !if(IsDPP16, P.AsmVOP3DPP16, P.AsmVOP3DPP)> :
925 VOP_DPP_Base<OpName, P, InsDPP, AsmDPP> {
926 let OutOperandList = P.OutsVOP3DPP;
929 let AsmVariantName = !if(P.HasExtVOP3DPP, AMDGPUAsmVariants.VOP3_DPP,
934 class VOP3_DPP <bits<10> op, string OpName, VOPProfile P, bit IsDPP16,
935 dag InsDPP = !if(IsDPP16, P.InsVOP3DPP16, P.InsVOP3DPP),
936 string AsmDPP = !if(IsDPP16, P.AsmVOP3DPP16, P.AsmVOP3DPP)> :
937 VOP3_DPP_Base<OpName, P, IsDPP16, InsDPP, AsmDPP>, VOP3_DPPe_Common<op, P>,
940 let Inst{40-32} = 0xfa;
941 let Inst{71-64} = !if(P.HasSrc0, src0{7-0}, 0);
942 let Inst{80-72} = dpp_ctrl;
946 // Inst{87-84} ignored by hw
947 let Inst{91-88} = bank_mask;
948 let Inst{95-92} = row_mask;
951 class VOP3P_DPP <bits<7> op, string OpName, VOPProfile P, bit IsDPP16,
952 dag InsDPP = !if(IsDPP16, P.InsVOP3DPP16, P.InsVOP3DPP),
953 string AsmDPP = !if(IsDPP16, P.AsmVOP3DPP16, P.AsmVOP3DPP)> :
954 VOP3_DPP_Base<OpName, P, IsDPP16, InsDPP, AsmDPP>, VOP3P_DPPe_Common<op, P>,
959 let Inst{40-32} = 0xfa;
960 let Inst{71-64} = !if(P.HasSrc0, src0{7-0}, 0);
961 let Inst{80-72} = dpp_ctrl;
965 // Inst{87-84} ignored by hw
966 let Inst{91-88} = bank_mask;
967 let Inst{95-92} = row_mask;
970 class VOP_DPP8e<VOPProfile P> : Enc64 {
975 let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0);
976 let Inst{63-40} = dpp8{23-0};
985 class VOP_DPP8_Base<string OpName, VOPProfile P, dag InsDPP8 = P.InsDPP8, string AsmDPP8 = P.AsmDPP…
986 InstSI<P.OutsDPP8, InsDPP8, OpName#AsmDPP8, []> {
1000 let Constraints = !if(P.NumSrcArgs, P.TieRegDPP # " = $vdst", "");
1001 let DisableEncoding = !if(P.NumSrcArgs, P.TieRegDPP, "");
1004 class VOP_DPP8<string OpName, VOPProfile P> :
1005 VOP_DPP8_Base<OpName, P>, VOP_DPP8e<P>;
1007 class VOP3_DPP8_Base<string OpName, VOPProfile P> :
1008 VOP_DPP8_Base<OpName, P, P.InsVOP3DPP8, P.AsmVOP3DPP8> {
1009 let OutOperandList = P.OutsVOP3DPP8;
1011 let AsmVariantName = !if(P.HasExtVOP3DPP, AMDGPUAsmVariants.VOP3_DPP,
1018 class VOP3_DPP8<bits<10> op, string OpName, VOPProfile P> :
1019 VOP3_DPP8_Base<OpName, P>, VOP3_DPPe_Common<op, P>,
1022 let Inst{40-32} = fi;
1023 let Inst{71-64} = !if(P.HasSrc0, src0{7-0}, 0);
1024 let Inst{95-72} = dpp8{23-0};
1027 class VOP3P_DPP8<bits<7> op, string OpName, VOPProfile P> :
1028 VOP3_DPP8_Base<OpName, P>, VOP3P_DPPe_Common<op, P>,
1032 let Inst{40-32} = fi;
1033 let Inst{71-64} = !if(P.HasSrc0, src0{7-0}, 0);
1034 let Inst{95-72} = dpp8{23-0};
1064 [{ return N->isDivergent(); }]
1068 class VOPPatGen<SDPatternOperator Op, VOPProfile P> {
1071 dag Ins = !foreach(tmp, P.Ins32, !subst(ins, Operator,
1072 !subst(P.Src0RC32, P.Src0VT,
1073 !subst(P.Src1RC32, P.Src1VT, tmp))));
1075 dag Outs = !foreach(tmp, P.Outs32, !subst(outs, set,
1076 !subst(P.DstRC, P.DstVT, tmp)));
1084 [{ return N->isDivergent(); }]> {
1093 class VOPPatOrNull<SDPatternOperator Op, VOPProfile P> {
1094 list<dag> ret = !if(!ne(P.NeedPatGen,PatGenMode.NoPattern), VOPPatGen<Op, P>.ret, []);
1097 class DivergentFragOrOp<SDPatternOperator Op, VOPProfile P> {
1098 SDPatternOperator ret = !if(!eq(P.NeedPatGen,PatGenMode.Pattern),
1114 //===----------------------------------------------------------------------===//
1116 //===----------------------------------------------------------------------===//
1118 class getVOP3ModPat<VOPProfile P, SDPatternOperator node> {
1119 dag src0 = !if(P.HasOMod,
1120 (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp, i32:$omod),
1121 (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp));
1123 list<dag> ret3 = [(set P.DstVT:$vdst,
1124 (DivergentFragOrOp<node, P>.ret (P.Src0VT src0),
1125 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)),
1126 (P.Src2VT (VOP3Mods P.Src2VT:$src2, i32:$src2_modifiers))))];
1128 list<dag> ret2 = [(set P.DstVT:$vdst,
1129 (DivergentFragOrOp<node, P>.ret (P.Src0VT src0),
1130 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))];
1132 list<dag> ret1 = [(set P.DstVT:$vdst,
1133 (DivergentFragOrOp<node, P>.ret (P.Src0VT src0)))];
1135 list<dag> ret = !if(!eq(P.NumSrcArgs, 3), ret3,
1136 !if(!eq(P.NumSrcArgs, 2), ret2,
1140 class getVOP3PModPat<VOPProfile P, SDPatternOperator node, bit HasExplicitClamp,
1143 dag src0_dag = (P.Src0VT (SrcPat P.Src0VT:$src0, i32:$src0_modifiers));
1144 dag src1_dag = (P.Src1VT (SrcPat P.Src1VT:$src1, i32:$src1_modifiers));
1145 dag src2_dag = (P.Src2VT (SrcPat P.Src2VT:$src2, i32:$src2_modifiers));
1148 list<dag> ret3 = [(set P.DstVT:$vdst,
1150 (DivergentFragOrOp<node, P>.ret src0_dag, src1_dag, src2_dag, clamp_dag),
1151 (DivergentFragOrOp<node, P>.ret src0_dag, src1_dag, src2_dag)))];
1153 list<dag> ret2 = [(set P.DstVT:$vdst,
1155 (DivergentFragOrOp<node, P>.ret src0_dag, src1_dag, clamp_dag),
1156 (DivergentFragOrOp<node, P>.ret src0_dag, src1_dag)))];
1158 list<dag> ret1 = [(set P.DstVT:$vdst,
1160 (DivergentFragOrOp<node, P>.ret src0_dag, clamp_dag),
1161 (DivergentFragOrOp<node, P>.ret src0_dag)))];
1163 list<dag> ret = !if(!eq(P.NumSrcArgs, 3), ret3,
1164 !if(!eq(P.NumSrcArgs, 2), ret2,
1168 class getVOP3OpSelPat<VOPProfile P, SDPatternOperator node> {
1169 list<dag> ret3 = [(set P.DstVT:$vdst,
1170 (DivergentFragOrOp<node, P>.ret (P.Src0VT (VOP3OpSel P.Src0VT:$src0, i32:$src0_modifiers)),
1171 (P.Src1VT (VOP3OpSel P.Src1VT:$src1, i32:$src1_modifiers)),
1172 (P.Src2VT (VOP3OpSel P.Src2VT:$src2, i32:$src2_modifiers))))];
1174 list<dag> ret2 = [(set P.DstVT:$vdst,
1175 (DivergentFragOrOp<node, P>.ret (P.Src0VT (VOP3OpSel P.Src0VT:$src0, i32:$src0_modifiers)),
1176 (P.Src1VT (VOP3OpSel P.Src1VT:$src1, i32:$src1_modifiers))))];
1178 list<dag> ret1 = [(set P.DstVT:$vdst,
1179 (DivergentFragOrOp<node, P>.ret (P.Src0VT (VOP3OpSel P.Src0VT:$src0, i32:$src0_modifiers))))];
1181 list<dag> ret = !if(!eq(P.NumSrcArgs, 3), ret3,
1182 !if(!eq(P.NumSrcArgs, 2), ret2,
1186 class getVOP3OpSelModPat<VOPProfile P, SDPatternOperator node> {
1187 list<dag> ret3 = [(set P.DstVT:$vdst,
1188 …(DivergentFragOrOp<node, P>.ret (P.Src0VT !if(P.HasClamp, (VOP3OpSelMods P.Src0VT:$src0, i32:$src0…
1189 (VOP3OpSelMods P.Src0VT:$src0, i32:$src0_modifiers))),
1190 (P.Src1VT (VOP3OpSelMods P.Src1VT:$src1, i32:$src1_modifiers)),
1191 (P.Src2VT (VOP3OpSelMods P.Src2VT:$src2, i32:$src2_modifiers))))];
1193 list<dag> ret2 = [(set P.DstVT:$vdst,
1194 …(DivergentFragOrOp<node, P>.ret !if(P.HasClamp, (P.Src0VT (VOP3OpSelMods P.Src0VT:$src0, i32:$src0…
1195 (P.Src0VT (VOP3OpSelMods P.Src0VT:$src0, i32:$src0_modifiers))),
1196 (P.Src1VT (VOP3OpSelMods P.Src1VT:$src1, i32:$src1_modifiers))))];
1198 list<dag> ret1 = [(set P.DstVT:$vdst,
1199 … (DivergentFragOrOp<node, P>.ret (P.Src0VT (VOP3OpSelMods P.Src0VT:$src0, i32:$src0_modifiers))))];
1201 list<dag> ret = !if(!eq(P.NumSrcArgs, 3), ret3,
1202 !if(!eq(P.NumSrcArgs, 2), ret2,
1206 class getVOP3FromVOP2Pat<VOPProfile P, SDPatternOperator node> {
1207 list<dag> ret = [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1))];
1210 class getVOP3Pat<VOPProfile P, SDPatternOperator node> {
1212 !if(P.HasOMod,
1213 !if(P.HasClamp,
1214 (VOP3Mods0 P.Src0VT:$src0, i1:$clamp, i32:$omod),
1215 (VOP3Mods0 P.Src0VT:$src0, i32:$omod)), // impossible?
1216 !if(P.HasClamp,
1217 (VOP3Mods0 P.Src0VT:$src0, i1:$clamp),
1218 (VOP3Mods0 P.Src0VT:$src0))
1220 …list<dag> ret3 = [(set P.DstVT:$vdst, (DivergentFragOrOp<node, P>.ret (P.Src0VT src0), P.Src1VT:$s…
1222 …list<dag> ret2 = [(set P.DstVT:$vdst, (DivergentFragOrOp<node, P>.ret (P.Src0VT src0), P.Src1VT:$s…
1224 list<dag> ret1 = [(set P.DstVT:$vdst, (DivergentFragOrOp<node, P>.ret (P.Src0VT src0)))];
1225 list<dag> ret = !if(!eq(P.NumSrcArgs, 3), ret3,
1226 !if(!eq(P.NumSrcArgs, 2), ret2,
1230 class getVOP3ClampPat<VOPProfile P, SDPatternOperator node> {
1231 …list<dag> ret3 = [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1, P.Src2VT:$src2, i1:$cl…
1232 list<dag> ret2 = [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1, i1:$clamp))];
1233 list<dag> ret1 = [(set P.DstVT:$vdst, (node P.Src0VT:$src0, i1:$clamp))];
1234 list<dag> ret = !if(!eq(P.NumSrcArgs, 3), ret3,
1235 !if(!eq(P.NumSrcArgs, 2), ret2,
1239 class getVOP3MAIPat<VOPProfile P, SDPatternOperator node> {
1240 list<dag> ret = !if(!eq(P.Src0VT, P.Src1VT),
1242 [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1, P.Src2VT:$src2,
1245 … [(set P.DstVT:$vdst, (node P.Src0VT:$src0, P.Src1VT:$src1, P.Src2VT:$src2, i32:$idx,
1262 class VOP3_Profile_Base<VOPProfile P, VOP3Features Features = VOP3_REGULAR> : VOPProfile<P.ArgVT> {
1264 let HasClamp = !if(Features.HasClamp, 1, P.HasClamp);
1265 let HasOpSel = !if(Features.HasOpSel, 1, P.HasOpSel);
1266 let IsMAI = !if(Features.IsMAI, 1, P.IsMAI);
1267 let IsPacked = !if(Features.IsPacked, 1, P.IsPacked);
1271 !or(Features.IsPacked, Features.HasOpSel, P.HasModifiers));
1274 class VOP3_Profile<VOPProfile P, VOP3Features Features = VOP3_REGULAR> : VOP3_Profile_Base<P, Featu…
1280 multiclass VOP3Inst_Pseudo_Wrapper<string opName, VOPProfile P, list<dag> pattern = [], bit VOP3Onl…
1281 def _e64 : VOP3_Pseudo<opName, P, pattern, VOP3Only>;
1284 class VOP3InstBase<string OpName, VOPProfile P, SDPatternOperator node = null_frag, bit IsVOP2 = 0>…
1285 VOP3_Pseudo<OpName, P,
1286 !if(P.HasOpSel,
1287 !if(P.HasModifiers,
1288 getVOP3OpSelModPat<P, node>.ret,
1289 getVOP3OpSelPat<P, node>.ret),
1290 !if(P.HasModifiers,
1291 getVOP3ModPat<P, node>.ret,
1293 getVOP3FromVOP2Pat<P, node>.ret,
1294 !if(P.HasIntClamp,
1295 getVOP3ClampPat<P, node>.ret,
1296 !if (P.IsMAI,
1297 getVOP3MAIPat<P, node>.ret,
1298 getVOP3Pat<P, node>.ret))))),
1299 0, P.HasOpSel> {
1301 let IntClamp = P.HasIntClamp;
1303 !if(P.HasOpSel,
1305 !if(!or(P.HasModifiers, P.HasOMod, P.HasIntClamp),
1310 multiclass VOP3Inst<string OpName, VOPProfile P, SDPatternOperator node = null_frag> {
1311 def _e64 : VOP3InstBase<OpName, P, node>;
1313 if P.HasExtVOP3DPP then
1314 def _e64_dpp : VOP3_DPP_Pseudo <OpName, P>;
1323 multiclass VOP3PseudoScalarInst<string OpName, VOPProfile P,
1325 def _e64 : VOP3_Pseudo<OpName, P, [(set P.DstVT:$vdst,
1327 (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp,
1331 //===----------------------------------------------------------------------===//
1333 //===----------------------------------------------------------------------===//
1378 let Inst{14 - 8} = sdst;
1384 let Inst{14 - 8} = sdst;
1387 //===----------------------------------------------------------------------===//
1389 //===----------------------------------------------------------------------===//
1581 //===----------------------------------------------------------------------===//
1583 //===----------------------------------------------------------------------===//
1601 //===----------------------------------------------------------------------===//
1603 //===----------------------------------------------------------------------===//
1642 //===----------------------------------------------------------------------===//