@@ -11146,6 +11146,102 @@ SDValue PPCTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
1114611146 return DAG.getMergeValues(RetOps, dl);
1114711147 }
1114811148
11149+ case Intrinsic::ppc_mma_dmxxextfdmr512: {
11150+ auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
11151+ assert(Idx && (Idx->getSExtValue() == 0 || Idx->getSExtValue() == 1) &&
11152+ "Specify P of 0 or 1 for lower or upper 512 bytes");
11153+ unsigned HiLo = Idx->getSExtValue();
11154+ unsigned Opcode;
11155+ unsigned Subx;
11156+ if (HiLo == 0) {
11157+ Opcode = PPC::DMXXEXTFDMR512;
11158+ Subx = PPC::sub_wacc_lo;
11159+ } else {
11160+ Opcode = PPC::DMXXEXTFDMR512_HI;
11161+ Subx = PPC::sub_wacc_hi;
11162+ }
11163+ SDValue Subreg(
11164+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v512i1,
11165+ Op.getOperand(1),
11166+ DAG.getTargetConstant(Subx, dl, MVT::i32)),
11167+ 0);
11168+ EVT ReturnTypes[] = {MVT::v256i1, MVT::v256i1};
11169+ return SDValue(DAG.getMachineNode(Opcode, dl, ReturnTypes, Subreg), 0);
11170+ }
11171+
11172+ case Intrinsic::ppc_mma_dmxxextfdmr256: {
11173+ auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
11174+ assert(Idx && (Idx->getSExtValue() >= 0 || Idx->getSExtValue() <= 3) &&
11175+ "Specify a dmr row pair 0-3");
11176+ unsigned IdxVal = Idx->getSExtValue();
11177+ unsigned Pairx;
11178+ switch (IdxVal) {
11179+ case 0: Pairx = PPC::sub_dmrrowp0; break;
11180+ case 1: Pairx = PPC::sub_dmrrowp1; break;
11181+ case 2: Pairx = PPC::sub_wacc_hi_then_sub_dmrrowp0; break;
11182+ case 3: Pairx = PPC::sub_wacc_hi_then_sub_dmrrowp1; break;
11183+ }
11184+ SDValue Pair(
11185+ DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, dl, MVT::v256i1,
11186+ Op.getOperand(1),
11187+ DAG.getTargetConstant(Pairx, dl, MVT::i32)),
11188+ 0);
11189+ SDValue C = DAG.getTargetConstant(IdxVal, dl, MVT::i32);
11190+ return SDValue(
11191+ DAG.getMachineNode(PPC::DMXXEXTFDMR256, dl, MVT::v256i1, {Pair, C}), 0);
11192+ }
11193+
11194+ case Intrinsic::ppc_mma_dmxxinstdmr512: {
11195+ auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(4));
11196+ assert(Idx && (Idx->getSExtValue() == 0 || Idx->getSExtValue() == 1) &&
11197+ "Specify P of 0 or 1 for lower or upper 512 bytes");
11198+ unsigned HiLo = Idx->getSExtValue();
11199+ unsigned Opcode;
11200+ unsigned Subx;
11201+ if (HiLo == 0) {
11202+ Opcode = PPC::DMXXINSTDMR512;
11203+ Subx = PPC::sub_wacc_lo;
11204+ } else {
11205+ Opcode = PPC::DMXXINSTDMR512_HI;
11206+ Subx = PPC::sub_wacc_hi;
11207+ }
11208+ SDValue Ops[] = { Op.getOperand(2), Op.getOperand(3) };
11209+ SDValue WideVec =
11210+ SDValue(DAG.getMachineNode(Opcode, dl, MVT::v512i1, Ops), 0);
11211+ SDValue SubReg = DAG.getTargetConstant(Subx, dl, MVT::i32);
11212+ return
11213+ SDValue(DAG.getMachineNode(PPC::INSERT_SUBREG, dl,
11214+ MVT::v1024i1, Op.getOperand(1), WideVec,
11215+ SubReg),
11216+ 0);
11217+ }
11218+
11219+ case Intrinsic::ppc_mma_dmxxinstdmr256: {
11220+ auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(3));
11221+ assert(Idx && (Idx->getSExtValue() >= 0 || Idx->getSExtValue() <= 3) &&
11222+ "Specify a dmr row pair 0-3");
11223+ unsigned IdxVal = Idx->getSExtValue();
11224+ unsigned Pairx;
11225+ unsigned Subx;
11226+ switch (IdxVal) {
11227+ case 0: Subx = PPC::sub_dmrrowp0; break;
11228+ case 1: Subx = PPC::sub_dmrrowp1; break;
11229+ case 2: Subx = PPC::sub_wacc_hi_then_sub_dmrrowp0; break;
11230+ case 3: Subx = PPC::sub_wacc_hi_then_sub_dmrrowp1; break;
11231+ }
11232+ SDValue SubReg = DAG.getTargetConstant(Subx, dl, MVT::i32);
11233+ SDValue C = DAG.getTargetConstant(IdxVal, dl, MVT::i32);
11234+ SDValue Ops[] = { Op.getOperand(2), C };
11235+ SDValue WideVec =
11236+ SDValue(DAG.getMachineNode(PPC::DMXXINSTDMR256, dl, MVT::v512i1, Ops),
11237+ 0);
11238+ return
11239+ SDValue(DAG.getMachineNode(PPC::INSERT_SUBREG, dl,
11240+ MVT::v1024i1, Op.getOperand(1), WideVec,
11241+ SubReg),
11242+ 0);
11243+ }
11244+
1114911245 case Intrinsic::ppc_mma_xxmfacc:
1115011246 case Intrinsic::ppc_mma_xxmtacc: {
1115111247 // Allow pre-isa-future subtargets to lower as normal.
0 commit comments