Skip to content

Commit 7c4fa80

Browse files
committed
initial implementation
1 parent 7113aec commit 7c4fa80

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

llvm/include/llvm/IR/IntrinsicsPowerPC.td

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,6 +1661,22 @@ let TargetPrefix = "ppc" in {
16611661
DefaultAttrsIntrinsic<[llvm_v1024i1_ty], [llvm_v1024i1_ty,
16621662
llvm_v1024i1_ty], [IntrNoMem]>;
16631663

1664+
def int_ppc_mma_dmxxextfdmr512 :
1665+
DefaultAttrsIntrinsic<[llvm_v256i1_ty, llvm_v256i1_ty], [llvm_v1024i1_ty,
1666+
llvm_i32_ty], [IntrNoMem]>;
1667+
1668+
def int_ppc_mma_dmxxinstdmr512 :
1669+
DefaultAttrsIntrinsic<[llvm_v1024i1_ty], [llvm_v1024i1_ty, llvm_v256i1_ty,
1670+
llvm_v256i1_ty, llvm_i32_ty], [IntrNoMem]>;
1671+
1672+
def int_ppc_mma_dmxxextfdmr256 :
1673+
DefaultAttrsIntrinsic<[llvm_v256i1_ty], [llvm_v1024i1_ty, llvm_i32_ty],
1674+
[IntrNoMem]>;
1675+
1676+
def int_ppc_mma_dmxxinstdmr256 :
1677+
DefaultAttrsIntrinsic<[llvm_v1024i1_ty], [llvm_v1024i1_ty, llvm_v256i1_ty,
1678+
llvm_i32_ty], [IntrNoMem]>;
1679+
16641680
// MMA Reduced-Precision: Outer Product Intrinsic Definitions.
16651681
defm int_ppc_mma_xvi4ger8 :
16661682
PowerPC_MMA_ACC_PP_Intrinsic<[llvm_v16i8_ty, llvm_v16i8_ty]>;

llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ MCRegister PPC::getRegNumForOperand(const MCInstrDesc &Desc, MCRegister Reg,
135135
if (PPC::isVRRegister(Reg))
136136
return PPC::VSX32 + (Reg - PPC::V0);
137137
break;
138+
case PPC::DMRROWpRCRegClassID: {
139+
// Reference to dmr reg. There are four dmrrow pairs per dmr.
140+
return PPC::DMR0 + ((Reg - PPC::DMRROWp0) / 4);
141+
}
138142
// Other RegClass doesn't need mapping
139143
default:
140144
break;

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)