@@ -67,7 +67,7 @@ class VOP3P_Mix_Profile<VOPProfile P, VOP3Features Features = VOP3_REGULAR,
67
67
class VOP3P_Mix_Profile_t16<VOPProfile P, VOP3Features Features = VOP3_REGULAR>
68
68
: VOP3P_Mix_Profile<P, Features, 0> {
69
69
let IsTrue16 = 1;
70
- let IsRealTrue16 = 1;
70
+ let IsRealTrue16 = 1;
71
71
let DstRC64 = getVALUDstForVT<P.DstVT, 1 /*IsTrue16*/, 1 /*IsVOP3Encoding*/>.ret;
72
72
}
73
73
@@ -950,7 +950,7 @@ class MFMA_F8F6F4_WithSizeTable_Helper<VOP3_Pseudo ps, string F8F8Op> :
950
950
}
951
951
952
952
// 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 <
954
954
!if(Scaled, (ops node:$src0, node:$src1, node:$src2, node:$cbsz, node:$blgp,
955
955
node:$src0_modifiers, node:$scale_src0,
956
956
node:$src1_modifiers, node:$scale_src1),
@@ -959,37 +959,30 @@ class MAIFrag<SDPatternOperator Op, code pred, bit HasAbid = true, bit Scaled =
959
959
(ops node:$blgp))),
960
960
!if(Scaled, (Op $src0, $src1, $src2, $cbsz, $blgp, $src0_modifiers, $scale_src0, $src1_modifiers, $scale_src1),
961
961
!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)))>;
973
963
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) # ");";
977
970
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
+ }
981
977
982
- class AgprMAIFrag<SDPatternOperator Op, bit HasAbid = true,
978
+ class AgprMAIFrag<SDPatternOperator Op, ValueType vt, bit HasAbid = true,
983
979
bit Scaled = false> :
984
- MAIFrag<Op, MayNeedAGPRs, HasAbid, Scaled> {
985
- let GISelPredicateCode = MayNeedAGPRs_gisel;
986
- }
980
+ MAIFrag<Op, HasAbid, Scaled>,
981
+ CanUseAGPR_MAI<vt>;
987
982
988
983
class 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>;
993
986
994
987
let isAsCheapAsAMove = 1, isReMaterializable = 1 in {
995
988
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,
1037
1030
bit HasAbid = true,
1038
1031
bit Scaled = false> {
1039
1032
defvar NoDstOverlap = !cast<VOPProfileMAI>("VOPProfileMAI_" # P).NoDstOverlap;
1033
+ defvar ProfileAGPR = !cast<VOPProfileMAI>("VOPProfileMAI_" # P);
1034
+ defvar ProfileVGPR = !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD");
1035
+
1040
1036
1041
1037
let isConvergent = 1, mayRaiseFPException = 0, ReadsModeReg = 1 in {
1042
1038
// FP32 denorm mode is respected, rounding mode is not. Exceptions are not supported.
1043
1039
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>,
1046
1042
MFMATable<0, "AGPR", NAME # "_e64">;
1047
1043
1048
1044
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 ,
1050
1046
!if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
1051
1047
MFMATable<0, "VGPR", NAME # "_vgprcd_e64", NAME # "_e64">;
1052
1048
}
@@ -1055,12 +1051,12 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node = null_frag,
1055
1051
let Constraints = !if(NoDstOverlap, "$vdst = $src2", ""),
1056
1052
isConvertibleToThreeAddress = NoDstOverlap,
1057
1053
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>,
1060
1056
MFMATable<1, "AGPR", NAME # "_e64", NAME # "_mac_e64">;
1061
1057
1062
1058
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 ,
1064
1060
!if(!eq(node, null_frag), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
1065
1061
MFMATable<1, "VGPR", NAME # "_vgprcd_e64", NAME # "_mac_e64">;
1066
1062
}
@@ -1074,11 +1070,11 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
1074
1070
defvar UnscaledOpName = UnscaledOpName_#VariantSuffix;
1075
1071
1076
1072
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;
1079
1075
1080
1076
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>)>,
1082
1078
MFMATable<0, "AGPR", NAME # "_e64">;
1083
1079
1084
1080
def _vgprcd_e64 : ScaledMAIInst<OpName # "_vgprcd",
@@ -1090,7 +1086,7 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
1090
1086
isConvertibleToThreeAddress = NoDstOverlap,
1091
1087
Mnemonic = UnscaledOpName_ in {
1092
1088
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>>,
1094
1090
MFMATable<1, "AGPR", NAME # "_e64">;
1095
1091
1096
1092
def _mac_vgprcd_e64 : ScaledMAIInst<OpName # " _mac_vgprcd",
0 commit comments