@@ -67,7 +67,7 @@ class VOP3P_Mix_Profile<VOPProfile P, VOP3Features Features = VOP3_REGULAR,
6767class VOP3P_Mix_Profile_t16<VOPProfile P, VOP3Features Features = VOP3_REGULAR>
6868 : VOP3P_Mix_Profile<P, Features, 0> {
6969 let IsTrue16 = 1;
70- let IsRealTrue16 = 1;
70+ let IsRealTrue16 = 1;
7171 let DstRC64 = getVALUDstForVT<P.DstVT, 1 /*IsTrue16*/, 1 /*IsVOP3Encoding*/>.ret;
7272}
7373
@@ -950,7 +950,7 @@ class MFMA_F8F6F4_WithSizeTable_Helper<VOP3_Pseudo ps, string F8F8Op> :
950950}
951951
952952// Currently assumes scaled instructions never have abid
953- class MAIFrag<SDPatternOperator Op, code pred, bit HasAbid = true, bit Scaled = false> : PatFrag <
953+ class MAIFrag<SDPatternOperator Op, bit HasAbid = true, bit Scaled = false> : PatFrag <
954954 !if(Scaled, (ops node:$src0, node:$src1, node:$src2, node:$cbsz, node:$blgp,
955955 node:$src0_modifiers, node:$scale_src0,
956956 node:$src1_modifiers, node:$scale_src1),
@@ -959,37 +959,30 @@ class MAIFrag<SDPatternOperator Op, code pred, bit HasAbid = true, bit Scaled =
959959 (ops node:$blgp))),
960960 !if(Scaled, (Op $src0, $src1, $src2, $cbsz, $blgp, $src0_modifiers, $scale_src0, $src1_modifiers, $scale_src1),
961961 !if(HasAbid, (Op $src0, $src1, $src2, $cbsz, $abid, $blgp),
962- (Op $src0, $src1, $src2, $cbsz, $blgp))),
963- pred
964- >;
965-
966- defvar MayNeedAGPRs = [{
967- return MF->getInfo<SIMachineFunctionInfo>()->mayNeedAGPRs();
968- }];
969-
970- defvar MayNeedAGPRs_gisel = [{
971- return MF.getInfo<SIMachineFunctionInfo>()->mayNeedAGPRs();
972- }];
962+ (Op $src0, $src1, $src2, $cbsz, $blgp)))>;
973963
974- defvar MayNotNeedAGPRs = [{
975- return !MF->getInfo<SIMachineFunctionInfo>()->mayNeedAGPRs();
976- }];
964+ class CanUseAGPR_MAI<ValueType vt> {
965+ code PredicateCode = [{
966+ return !Subtarget->hasGFX90AInsts() ||
967+ (!SIMachineFunctionInfo::MFMAVGPRForm &&
968+ MF->getInfo<SIMachineFunctionInfo>()->getMinNumAGPRs() >=
969+ }] # !srl(vt.Size, 5) # ");";
977970
978- defvar MayNotNeedAGPRs_gisel = [{
979- return !MF.getInfo<SIMachineFunctionInfo>()->mayNeedAGPRs();
980- }];
971+ code GISelPredicateCode = [{
972+ return !Subtarget->hasGFX90AInsts() ||
973+ (!SIMachineFunctionInfo::MFMAVGPRForm &&
974+ MF.getInfo<SIMachineFunctionInfo>()->getMinNumAGPRs() >=
975+ }] # !srl(vt.Size, 5) # ");";
976+ }
981977
982- class AgprMAIFrag<SDPatternOperator Op, bit HasAbid = true,
978+ class AgprMAIFrag<SDPatternOperator Op, ValueType vt, bit HasAbid = true,
983979 bit Scaled = false> :
984- MAIFrag<Op, MayNeedAGPRs, HasAbid, Scaled> {
985- let GISelPredicateCode = MayNeedAGPRs_gisel;
986- }
980+ MAIFrag<Op, HasAbid, Scaled>,
981+ CanUseAGPR_MAI<vt>;
987982
988983class VgprMAIFrag<SDPatternOperator Op, bit HasAbid = true,
989- bit Scaled = false> :
990- MAIFrag<Op, MayNotNeedAGPRs, HasAbid, Scaled> {
991- let GISelPredicateCode = MayNotNeedAGPRs_gisel;
992- }
984+ bit Scaled = false> :
985+ MAIFrag<Op, HasAbid, Scaled>;
993986
994987let isAsCheapAsAMove = 1, isReMaterializable = 1 in {
995988 defm V_ACCVGPR_READ_B32 : VOP3Inst<"v_accvgpr_read_b32", VOPProfileAccRead>;
@@ -1037,16 +1030,19 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node = null_frag,
10371030 bit HasAbid = true,
10381031 bit Scaled = false> {
10391032 defvar NoDstOverlap = !cast<VOPProfileMAI>("VOPProfileMAI_" # P).NoDstOverlap;
1033+ defvar ProfileAGPR = !cast<VOPProfileMAI>("VOPProfileMAI_" # P);
1034+ defvar ProfileVGPR = !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD");
1035+
10401036
10411037 let isConvergent = 1, mayRaiseFPException = 0, ReadsModeReg = 1 in {
10421038 // FP32 denorm mode is respected, rounding mode is not. Exceptions are not supported.
10431039 let Constraints = !if(NoDstOverlap, "@earlyclobber $vdst", "") in {
1044- def _e64 : MAIInst<OpName, !cast<VOPProfileMAI>("VOPProfileMAI_" # P) ,
1045- !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, AgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
1040+ def _e64 : MAIInst<OpName, ProfileAGPR ,
1041+ !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, AgprMAIFrag<node, ProfileAGPR.DstVT, HasAbid, Scaled>), Scaled>,
10461042 MFMATable<0, "AGPR", NAME # "_e64">;
10471043
10481044 let OtherPredicates = [isGFX90APlus], Mnemonic = OpName in
1049- def _vgprcd_e64 : MAIInst<OpName # "_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD") ,
1045+ def _vgprcd_e64 : MAIInst<OpName # "_vgprcd", ProfileVGPR ,
10501046 !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
10511047 MFMATable<0, "VGPR", NAME # "_vgprcd_e64", NAME # "_e64">;
10521048 }
@@ -1055,12 +1051,12 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node = null_frag,
10551051 let Constraints = !if(NoDstOverlap, "$vdst = $src2", ""),
10561052 isConvertibleToThreeAddress = NoDstOverlap,
10571053 Mnemonic = OpName in {
1058- def "_mac_e64" : MAIInst<OpName # "_mac", !cast<VOPProfileMAI>("VOPProfileMAI_" # P) ,
1059- !if(!eq(node, null_frag), null_frag, AgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
1054+ def "_mac_e64" : MAIInst<OpName # "_mac", ProfileAGPR ,
1055+ !if(!eq(node, null_frag), null_frag, AgprMAIFrag<node, ProfileAGPR.DstVT, HasAbid, Scaled>), Scaled>,
10601056 MFMATable<1, "AGPR", NAME # "_e64", NAME # "_mac_e64">;
10611057
10621058 let OtherPredicates = [isGFX90APlus] in
1063- def _mac_vgprcd_e64 : MAIInst<OpName # "_mac_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD") ,
1059+ def _mac_vgprcd_e64 : MAIInst<OpName # "_mac_vgprcd", ProfileVGPR ,
10641060 !if(!eq(node, null_frag), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
10651061 MFMATable<1, "VGPR", NAME # "_vgprcd_e64", NAME # "_mac_e64">;
10661062 }
@@ -1074,11 +1070,11 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
10741070 defvar UnscaledOpName = UnscaledOpName_#VariantSuffix;
10751071
10761072 defvar HasAbid = false;
1077-
1078- defvar NoDstOverlap = !cast<VOPProfileMAI>(!cast<MAIInst>(UnscaledOpName#"_e64").Pfl) .NoDstOverlap;
1073+ defvar Profile = !cast<VOPProfileMAI>(!cast<MAIInst>(UnscaledOpName#"_e64").Pfl);
1074+ defvar NoDstOverlap = Profile .NoDstOverlap;
10791075
10801076 def _e64 : ScaledMAIInst<OpName,
1081- !cast<MAIInst>(UnscaledOpName#"_e64"), !if(NoDstOverlap, null_frag, AgprMAIFrag<node, HasAbid, true>)>,
1077+ !cast<MAIInst>(UnscaledOpName#"_e64"), !if(NoDstOverlap, null_frag, AgprMAIFrag<node, Profile.DstVT, HasAbid, true>)>,
10821078 MFMATable<0, "AGPR", NAME # "_e64">;
10831079
10841080 def _vgprcd_e64 : ScaledMAIInst<OpName # "_vgprcd",
@@ -1090,7 +1086,7 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
10901086 isConvertibleToThreeAddress = NoDstOverlap,
10911087 Mnemonic = UnscaledOpName_ in {
10921088 def _mac_e64 : ScaledMAIInst<OpName # "_mac",
1093- !cast<MAIInst>(UnscaledOpName # "_mac_e64"), AgprMAIFrag<node, HasAbid, true>>,
1089+ !cast<MAIInst>(UnscaledOpName # "_mac_e64"), AgprMAIFrag<node, Profile.DstVT, HasAbid, true>>,
10941090 MFMATable<1, "AGPR", NAME # "_e64">;
10951091
10961092 def _mac_vgprcd_e64 : ScaledMAIInst<OpName # " _mac_vgprcd",
0 commit comments