@@ -1361,8 +1361,11 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
13611361 if (Subtarget.isISAFuture()) {
13621362 addRegisterClass(MVT::v512i1, &PPC::WACCRCRegClass);
13631363 addRegisterClass(MVT::v1024i1, &PPC::DMRRCRegClass);
1364+ addRegisterClass(MVT::v2048i1, &PPC::DMRpRCRegClass);
13641365 setOperationAction(ISD::LOAD, MVT::v1024i1, Custom);
13651366 setOperationAction(ISD::STORE, MVT::v1024i1, Custom);
1367+ setOperationAction(ISD::LOAD, MVT::v2048i1, Custom);
1368+ setOperationAction(ISD::STORE, MVT::v2048i1, Custom);
13661369 } else {
13671370 addRegisterClass(MVT::v512i1, &PPC::UACCRCRegClass);
13681371 }
@@ -11890,15 +11893,19 @@ SDValue PPCTargetLowering::LowerDMFVectorLoad(SDValue Op,
1189011893 SDValue LoadChain = LN->getChain();
1189111894 SDValue BasePtr = LN->getBasePtr();
1189211895 EVT VT = Op.getValueType();
11896+ bool IsV1024i1 = VT == MVT::v1024i1;
11897+ bool IsV2048i1 = VT == MVT::v2048i1;
1189311898
11894- // Type v1024i1 is used for Dense Math dmr registers.
11895- assert(VT == MVT::v1024i1 && "Unsupported type.");
11899+ // The types v1024i1 and v2048i1 are used for Dense Math dmr registers and
11900+ // Dense Math dmr pair registers, respectively.
11901+ assert((IsV1024i1 || IsV2048i1) && "Unsupported type.");
1189611902 assert((Subtarget.hasMMA() && Subtarget.isISAFuture()) &&
1189711903 "Dense Math support required.");
1189811904 assert(Subtarget.pairedVectorMemops() && "Vector pair support required.");
1189911905
11900- SmallVector<SDValue, 4> Loads;
11901- SmallVector<SDValue, 4> LoadChains;
11906+ SmallVector<SDValue, 8> Loads;
11907+ SmallVector<SDValue, 8> LoadChains;
11908+
1190211909 SDValue IntrinID = DAG.getConstant(Intrinsic::ppc_vsx_lxvp, dl, MVT::i32);
1190311910 SDValue LoadOps[] = {LoadChain, IntrinID, BasePtr};
1190411911 MachineMemOperand *MMO = LN->getMemOperand();
@@ -11934,10 +11941,40 @@ SDValue PPCTargetLowering::LowerDMFVectorLoad(SDValue Op,
1193411941 SDValue HiSub = DAG.getTargetConstant(PPC::sub_wacc_hi, dl, MVT::i32);
1193511942 SDValue RC = DAG.getTargetConstant(PPC::DMRRCRegClassID, dl, MVT::i32);
1193611943 const SDValue Ops[] = {RC, Lo, LoSub, Hi, HiSub};
11944+
1193711945 SDValue Value =
1193811946 SDValue(DAG.getMachineNode(PPC::REG_SEQUENCE, dl, MVT::v1024i1, Ops), 0);
1193911947
11940- SDValue RetOps[] = {Value, TF};
11948+ SDValue DmrPValue;
11949+ if (IsV2048i1) {
11950+ // This corresponds to v2048i1 which represents a dmr pair.
11951+ SDValue Dmr1Lo(DAG.getMachineNode(PPC::DMXXINSTDMR512, dl, MVT::v512i1, Loads[4],
11952+ Loads[5]), 0);
11953+ SDValue Dmr1Hi(DAG.getMachineNode(PPC::DMXXINSTDMR512_HI, dl, MVT::v512i1,
11954+ Loads[6], Loads[7]), 0);
11955+ const SDValue Dmr1Ops[] = {RC, Dmr1Lo, LoSub, Dmr1Hi, HiSub};
11956+ SDValue Dmr1Value =
11957+ SDValue(DAG.getMachineNode(PPC::REG_SEQUENCE, dl,
11958+ MVT::v1024i1, Dmr1Ops), 0);
11959+
11960+ SDValue Dmr0Sub = DAG.getTargetConstant(PPC::sub_dmr0, dl, MVT::i32);
11961+ SDValue Dmr1Sub = DAG.getTargetConstant(PPC::sub_dmr1, dl, MVT::i32);
11962+
11963+ SDValue DmrPRC = DAG.getTargetConstant(PPC::DMRpRCRegClassID, dl, MVT::i32);
11964+ const SDValue DmrPOps[] = {DmrPRC, Value, Dmr0Sub, Dmr1Value, Dmr1Sub};
11965+
11966+ DmrPValue =
11967+ SDValue(DAG.getMachineNode(PPC::REG_SEQUENCE, dl, MVT::v2048i1,
11968+ DmrPOps), 0);
11969+ }
11970+
11971+ SDValue RetOps[2];
11972+ if (IsV1024i1)
11973+ RetOps[0] = Value;
11974+ else
11975+ RetOps[0] = DmrPValue;
11976+ RetOps[1] = TF;
11977+
1194111978 return DAG.getMergeValues(RetOps, dl);
1194211979}
1194311980
@@ -11949,7 +11986,7 @@ SDValue PPCTargetLowering::LowerVectorLoad(SDValue Op,
1194911986 SDValue BasePtr = LN->getBasePtr();
1195011987 EVT VT = Op.getValueType();
1195111988
11952- if (VT == MVT::v1024i1)
11989+ if (VT == MVT::v1024i1 || VT == MVT::v2048i1 )
1195311990 return LowerDMFVectorLoad(Op, DAG);
1195411991
1195511992 if (VT != MVT::v256i1 && VT != MVT::v512i1)
@@ -11996,34 +12033,85 @@ SDValue PPCTargetLowering::LowerDMFVectorStore(SDValue Op,
1199612033 StoreSDNode *SN = cast<StoreSDNode>(Op.getNode());
1199712034 SDValue StoreChain = SN->getChain();
1199812035 SDValue BasePtr = SN->getBasePtr();
11999- SmallVector<SDValue, 4 > Values;
12000- SmallVector<SDValue, 4 > Stores;
12036+ SmallVector<SDValue, 8 > Values;
12037+ SmallVector<SDValue, 8 > Stores;
1200112038 EVT VT = SN->getValue().getValueType();
12039+ bool IsV1024i1 = VT == MVT::v1024i1;
12040+ bool IsV2048i1 = VT == MVT::v2048i1;
1200212041
12003- // Type v1024i1 is used for Dense Math dmr registers.
12004- assert(VT == MVT::v1024i1 && "Unsupported type.");
12042+ // The types v1024i1 and v2048i1 are used for Dense Math dmr registers and
12043+ // Dense Math dmr pair registers, respectively.
12044+ assert((IsV1024i1 || IsV2048i1)&& "Unsupported type.");
1200512045 assert((Subtarget.hasMMA() && Subtarget.isISAFuture()) &&
1200612046 "Dense Math support required.");
1200712047 assert(Subtarget.pairedVectorMemops() && "Vector pair support required.");
1200812048
12009- SDValue Lo(
12010- DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12011- Op.getOperand(1),
12012- DAG.getTargetConstant(PPC::sub_wacc_lo, dl, MVT::i32)),
12013- 0);
12014- SDValue Hi(
12015- DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12016- Op.getOperand(1),
12017- DAG.getTargetConstant(PPC::sub_wacc_hi, dl, MVT::i32)),
12018- 0);
1201912049 EVT ReturnTypes[] = {MVT::v256i1, MVT::v256i1};
12020- MachineSDNode *ExtNode =
12021- DAG.getMachineNode(PPC::DMXXEXTFDMR512, dl, ReturnTypes, Lo);
12022- Values.push_back(SDValue(ExtNode, 0));
12023- Values.push_back(SDValue(ExtNode, 1));
12024- ExtNode = DAG.getMachineNode(PPC::DMXXEXTFDMR512_HI, dl, ReturnTypes, Hi);
12025- Values.push_back(SDValue(ExtNode, 0));
12026- Values.push_back(SDValue(ExtNode, 1));
12050+ if (IsV1024i1) {
12051+ SDValue Lo(
12052+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12053+ Op.getOperand(1),
12054+ DAG.getTargetConstant(PPC::sub_wacc_lo, dl, MVT::i32)),
12055+ 0);
12056+ SDValue Hi(
12057+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12058+ Op.getOperand(1),
12059+ DAG.getTargetConstant(PPC::sub_wacc_hi, dl, MVT::i32)),
12060+ 0);
12061+ MachineSDNode *ExtNode =
12062+ DAG.getMachineNode(PPC::DMXXEXTFDMR512, dl, ReturnTypes, Lo);
12063+ Values.push_back(SDValue(ExtNode, 0));
12064+ Values.push_back(SDValue(ExtNode, 1));
12065+ ExtNode = DAG.getMachineNode(PPC::DMXXEXTFDMR512_HI, dl, ReturnTypes, Hi);
12066+ Values.push_back(SDValue(ExtNode, 0));
12067+ Values.push_back(SDValue(ExtNode, 1));
12068+ }
12069+ else {
12070+ // This corresponds to v2048i1 which represents a dmr pair.
12071+ SDValue Dmr0(
12072+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v1024i1,
12073+ Op.getOperand(1),
12074+ DAG.getTargetConstant(PPC::sub_dmr0, dl, MVT::i32)), 0);
12075+
12076+ SDValue Dmr1(
12077+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v1024i1,
12078+ Op.getOperand(1),
12079+ DAG.getTargetConstant(PPC::sub_dmr1, dl, MVT::i32)), 0);
12080+
12081+ SDValue Dmr0Lo(
12082+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12083+ Dmr0,
12084+ DAG.getTargetConstant(PPC::sub_wacc_lo, dl, MVT::i32)), 0);
12085+
12086+ SDValue Dmr0Hi(
12087+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12088+ Dmr0,
12089+ DAG.getTargetConstant(PPC::sub_wacc_hi, dl, MVT::i32)), 0);
12090+
12091+ SDValue Dmr1Lo(
12092+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12093+ Dmr1,
12094+ DAG.getTargetConstant(PPC::sub_wacc_lo, dl, MVT::i32)), 0);
12095+
12096+ SDValue Dmr1Hi(
12097+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
12098+ Dmr1,
12099+ DAG.getTargetConstant(PPC::sub_wacc_hi, dl, MVT::i32)), 0);
12100+
12101+ MachineSDNode *ExtNode =
12102+ DAG.getMachineNode(PPC::DMXXEXTFDMR512, dl, ReturnTypes, Dmr0Lo);
12103+ Values.push_back(SDValue(ExtNode, 0));
12104+ Values.push_back(SDValue(ExtNode, 1));
12105+ ExtNode = DAG.getMachineNode(PPC::DMXXEXTFDMR512_HI, dl, ReturnTypes, Dmr0Hi);
12106+ Values.push_back(SDValue(ExtNode, 0));
12107+ Values.push_back(SDValue(ExtNode, 1));
12108+ ExtNode = DAG.getMachineNode(PPC::DMXXEXTFDMR512, dl, ReturnTypes, Dmr1Lo);
12109+ Values.push_back(SDValue(ExtNode, 0));
12110+ Values.push_back(SDValue(ExtNode, 1));
12111+ ExtNode = DAG.getMachineNode(PPC::DMXXEXTFDMR512_HI, dl, ReturnTypes, Dmr1Hi);
12112+ Values.push_back(SDValue(ExtNode, 0));
12113+ Values.push_back(SDValue(ExtNode, 1));
12114+ }
1202712115
1202812116 if (Subtarget.isLittleEndian())
1202912117 std::reverse(Values.begin(), Values.end());
@@ -12062,7 +12150,7 @@ SDValue PPCTargetLowering::LowerVectorStore(SDValue Op,
1206212150 SDValue Value2 = SN->getValue();
1206312151 EVT StoreVT = Value.getValueType();
1206412152
12065- if (StoreVT == MVT::v1024i1)
12153+ if (StoreVT == MVT::v1024i1 || StoreVT == MVT::v2048i1 )
1206612154 return LowerDMFVectorStore(Op, DAG);
1206712155
1206812156 if (StoreVT != MVT::v256i1 && StoreVT != MVT::v512i1)
0 commit comments