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