Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 93 additions & 35 deletions llvm/lib/Target/AIE/aie2p/AIE2PInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -554,7 +554,6 @@ void AIE2PInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
MCRegister SrcReg, bool KillSrc) const {
MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();

if (AIE2P::mMvSclSrcRegClass.contains(SrcReg) &&
AIE2P::mMvSclDstRegClass.contains(DstReg)) {
// Build MultiSlotPseudo in preference
Expand Down Expand Up @@ -618,22 +617,22 @@ void AIE2PInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
} else if (AIE2P::VEC1024RegClass.contains(SrcReg) &&
AIE2P::ACC1024RegClass.contains(DstReg)) {
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_acc_lo))
TRI.getSubReg(DstReg, AIE2P::sub_512_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_lo),
getKillRegState(KillSrc));
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_acc_hi))
TRI.getSubReg(DstReg, AIE2P::sub_512_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_hi),
getKillRegState(KillSrc));
} else if (AIE2P::ACC1024RegClass.contains(SrcReg) &&
AIE2P::VEC1024RegClass.contains(DstReg)) {
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_acc_lo),
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_lo),
getKillRegState(KillSrc));
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_acc_hi),
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_hi),
getKillRegState(KillSrc));
} else if ((AIE2P::ACC2048RegClass.contains(SrcReg)) &&
(AIE2P::ACC2048RegClass.contains(DstReg))) {
Expand Down Expand Up @@ -684,52 +683,52 @@ void AIE2PInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
} else if ((AIE2P::FIFO1024RegClass.contains(SrcReg)) &&
(AIE2P::FIFO1024RegClass.contains(DstReg))) {
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_lo_fifo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_lo_fifo),
TRI.getSubReg(DstReg, AIE2P::sub_512_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_lo),
getKillRegState(KillSrc));
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_hi_fifo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_hi_fifo),
TRI.getSubReg(DstReg, AIE2P::sub_512_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_hi),
getKillRegState(KillSrc));
} else if ((AIE2P::VEC1024RegClass.contains(SrcReg)) &&
(AIE2P::FIFO1024RegClass.contains(DstReg))) {
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_lo_fifo))
TRI.getSubReg(DstReg, AIE2P::sub_512_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_lo),
getKillRegState(KillSrc));
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_hi_fifo))
TRI.getSubReg(DstReg, AIE2P::sub_512_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_hi),
getKillRegState(KillSrc));
} else if ((AIE2P::FIFO1024RegClass.contains(SrcReg)) &&
(AIE2P::VEC1024RegClass.contains(DstReg))) {
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_lo_fifo),
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_lo),
getKillRegState(KillSrc));
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_hi_fifo),
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_hi),
getKillRegState(KillSrc));
} else if ((AIE2P::ACC1024RegClass.contains(SrcReg)) &&
(AIE2P::FIFO1024RegClass.contains(DstReg))) {
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_lo_fifo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_acc_lo),
TRI.getSubReg(DstReg, AIE2P::sub_512_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_lo),
getKillRegState(KillSrc));
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_hi_fifo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_acc_hi),
TRI.getSubReg(DstReg, AIE2P::sub_512_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_hi),
getKillRegState(KillSrc));
} else if ((AIE2P::FIFO1024RegClass.contains(SrcReg)) &&
(AIE2P::ACC1024RegClass.contains(DstReg))) {
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_acc_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_lo_fifo),
TRI.getSubReg(DstReg, AIE2P::sub_512_lo))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_lo),
getKillRegState(KillSrc));
BuildMI(MBB, MBBI, DL, get(AIE2P::VMOV_alu_mv_mv_x),
TRI.getSubReg(DstReg, AIE2P::sub_512_acc_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_hi_fifo),
TRI.getSubReg(DstReg, AIE2P::sub_512_hi))
.addReg(TRI.getSubReg(SrcReg, AIE2P::sub_512_hi),
getKillRegState(KillSrc));
} else if ((AIE2P::eLRegClass.contains(SrcReg)) &&
(AIE2P::EXPVEC64RegClass.contains(DstReg))) {
Expand All @@ -753,8 +752,16 @@ void AIE2PInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
getKillRegState(KillSrc));
} else if ((AIE2P::ePSRFLdFRegClass.contains(SrcReg)) &&
(AIE2P::ePSRFLdFRegClass.contains(DstReg))) {
copyThroughSubRegs(MBB, MBBI, DL, DstReg, SrcReg, KillSrc);
// copyThroughSubRegs(MBB, MBBI, DL, DstReg, SrcReg, KillSrc);
copyPhysReg(MBB, MBBI, DL, TRI.getSubReg(DstReg, AIE2P::sub_ptr),
TRI.getSubReg(SrcReg, AIE2P::sub_ptr), KillSrc);
copyPhysReg(MBB, MBBI, DL, TRI.getSubReg(DstReg, AIE2P::sub_fifo),
TRI.getSubReg(SrcReg, AIE2P::sub_fifo), KillSrc);
copyPhysReg(MBB, MBBI, DL, TRI.getSubReg(DstReg, AIE2P::sub_avail),
TRI.getSubReg(SrcReg, AIE2P::sub_avail), KillSrc);
} else {
MBBI->dump();
LLVM_DEBUG(MBBI->dump());
llvm_unreachable("unhandled case in copyPhysReg");
}
}
Expand Down Expand Up @@ -805,6 +812,8 @@ Register AIE2PInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
case AIE2P::LDA_DS_SPILL:
case AIE2P::VLDA_EX_SPILL:
case AIE2P::VLDA_E_SPILL:
case AIE2P::VLDA_512_COMPOSED_REG_SPILL:
case AIE2P::VLDA_1024_COMPOSED_REG_SPILL:
break;
}

Expand Down Expand Up @@ -838,6 +847,8 @@ Register AIE2PInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
case AIE2P::VST_Y_SPILL:
case AIE2P::VST_E_SPILL:
case AIE2P::VST_EX_SPILL:
case AIE2P::VST_512_COMPOSED_REG_SPILL:
case AIE2P::VST_1024_COMPOSED_REG_SPILL:
break;
}

Expand Down Expand Up @@ -876,6 +887,10 @@ void AIE2PInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
<< "\n");
if (regClassMatches(AIE2P::mSclStRegClass, RC, SrcReg)) {
Opcode = AIE2P::ST_R_SPILL;
} else if (&AIE2P::spill_vec1024_to_compositeRegClass == RC) {
Opcode = AIE2P::VST_1024_COMPOSED_REG_SPILL;
} else if (&AIE2P::spill_vec512_to_compositeRegClass == RC) {
Opcode = AIE2P::VST_512_COMPOSED_REG_SPILL;
} else if (regClassMatches(AIE2P::mQQssRegClass, RC, SrcReg)) {
Opcode = AIE2P::ST_dmv_sts_q_spill;
} else if (regClassMatches(AIE2P::mBMsRegClass, RC, SrcReg)) {
Expand Down Expand Up @@ -957,11 +972,17 @@ void AIE2PInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
RC = constrainRegClass(MBB.getParent()->getRegInfo(), RC, DstReg);
if (regClassMatches(AIE2P::mLdaSclRegClass, RC, DstReg)) {
Opcode = AIE2P::LDA_R_SPILL;
} else if (&AIE2P::spill_vec1024_to_compositeRegClass == RC) {
Opcode = AIE2P::VLDA_1024_COMPOSED_REG_SPILL;
} else if (&AIE2P::spill_vec512_to_compositeRegClass == RC) {
// I->dump();
Opcode = AIE2P::VLDA_512_COMPOSED_REG_SPILL;
} else if (regClassMatches(AIE2P::mQQssRegClass, RC, DstReg)) {
Opcode = AIE2P::LDA_dmv_lda_q_spill;
} else if (regClassMatches(AIE2P::VEC256RegClass, RC, DstReg)) {
Opcode = AIE2P::VLDA_dmw_lda_w_spill;
} else if (regClassMatches(AIE2P::mBMsRegClass, RC, DstReg)) {
// I->dump();
Opcode = AIE2P::VLDA_dmx_lda_bm_spill;
} else if (regClassMatches(AIE2P::mFifoHLRegRegClass, RC, DstReg)) {
Opcode = AIE2P::VLDA_dmx_lda_fifohl_spill;
Expand All @@ -970,6 +991,7 @@ void AIE2PInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
} else if (regClassMatches(AIE2P::ACC2048RegClass, RC, DstReg)) {
Opcode = AIE2P::VLDA_DM_SPILL;
} else if (regClassMatches(AIE2P::ACC1024RegClass, RC, DstReg)) {
// I->dump();
Opcode = AIE2P::VLDA_CM_SPILL;
} else if (regClassMatches(AIE2P::FIFO1024RegClass, RC, DstReg)) {
Opcode = AIE2P::VLDA_FIFO_SPILL;
Expand Down Expand Up @@ -999,6 +1021,7 @@ void AIE2PInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
.addReg(Reg, getKillRegState(true));
return;
} else {
I->dump();
llvm_unreachable(
"Can't load this register from stack slot: is it virtual?");
}
Expand All @@ -1025,19 +1048,19 @@ AIE2PInstrInfo::getSpillPseudoExpandInfo(const MachineInstr &MI) const {
return {{AIE2P::ST_dms_sts_spill, AIE2P::sub_l_even},
{AIE2P::ST_dms_sts_spill, AIE2P::sub_l_odd}};
case AIE2P::VST_CM_SPILL:
return {{AIE2P::VST_dmx_sts_bm_spill, AIE2P::sub_512_acc_lo},
{AIE2P::VST_dmx_sts_bm_spill, AIE2P::sub_512_acc_hi}};
return {{AIE2P::VST_dmx_sts_bm_spill, AIE2P::sub_512_lo},
{AIE2P::VST_dmx_sts_bm_spill, AIE2P::sub_512_hi}};
case AIE2P::VST_FIFO_SPILL:
return {{AIE2P::VST_dmx_sts_fifohl_spill, AIE2P::sub_lo_fifo},
{AIE2P::VST_dmx_sts_fifohl_spill, AIE2P::sub_hi_fifo}};
return {{AIE2P::VST_dmx_sts_fifohl_spill, AIE2P::sub_512_lo},
{AIE2P::VST_dmx_sts_fifohl_spill, AIE2P::sub_512_hi}};
case AIE2P::VST_PLFR_SPILL:
return {{AIE2P::VST_FIFO_SPILL, AIE2P::sub_fifo},
{AIE2P::ST_dms_sts_spill, AIE2P::sub_avail},
{AIE2P::ST_dms_sts_spill, AIE2P::sub_ptr}};

case AIE2P::VST_DM_SPILL:
return {{AIE2P::VST_CM_SPILL, AIE2P::sub_1024_acc_lo},
{AIE2P::VST_CM_SPILL, AIE2P::sub_1024_acc_hi}};
return {{AIE2P::VST_CM_SPILL, AIE2P::sub_1024_lo},
{AIE2P::VST_CM_SPILL, AIE2P::sub_1024_hi}};
case AIE2P::VST_Y_SPILL:
return {{AIE2P::VST_dmx_sts_x_spill, AIE2P::sub_512_lo},
{AIE2P::VST_dmx_sts_x_spill, AIE2P::sub_512_hi}};
Expand All @@ -1055,27 +1078,29 @@ AIE2PInstrInfo::getSpillPseudoExpandInfo(const MachineInstr &MI) const {
{AIE2P::ST_dms_sts_spill, AIE2P::sub_hi_dim_then_sub_dim_size},
{AIE2P::ST_dms_sts_spill, AIE2P::sub_hi_dim_then_sub_dim_stride},
{AIE2P::ST_dms_sts_spill, AIE2P::sub_hi_dim_then_sub_dim_count}};

case AIE2P::VST_1024_COMPOSED_REG_SPILL:
return {{AIE2P::VST_512_COMPOSED_REG_SPILL, AIE2P::sub_512_lo},
{AIE2P::VST_512_COMPOSED_REG_SPILL, AIE2P::sub_512_hi}};
case AIE2P::LDA_R_SPILL:
return {{AIE2P::LDA_dms_lda_spill, AIE2P::NoSubRegister, 4}};
case AIE2P::VLDA_L_SPILL:
return {{AIE2P::LDA_dms_lda_spill, AIE2P::sub_l_even},
{AIE2P::LDA_dms_lda_spill, AIE2P::sub_l_odd}};
case AIE2P::VLDA_CM_SPILL:
return {{AIE2P::VLDA_dmx_lda_bm_spill, AIE2P::sub_512_acc_lo},
{AIE2P::VLDA_dmx_lda_bm_spill, AIE2P::sub_512_acc_hi}};
return {{AIE2P::VLDA_dmx_lda_bm_spill, AIE2P::sub_512_lo},
{AIE2P::VLDA_dmx_lda_bm_spill, AIE2P::sub_512_hi}};
case AIE2P::VLDA_FIFO_SPILL:
return {{AIE2P::VLDA_dmx_lda_fifohl_spill, AIE2P::sub_lo_fifo},
{AIE2P::VLDA_dmx_lda_fifohl_spill, AIE2P::sub_hi_fifo}};
return {{AIE2P::VLDA_dmx_lda_fifohl_spill, AIE2P::sub_512_lo},
{AIE2P::VLDA_dmx_lda_fifohl_spill, AIE2P::sub_512_hi}};
case AIE2P::VLDA_PLFR_SPILL:
return {
{AIE2P::VLDA_FIFO_SPILL, AIE2P::sub_fifo},
{AIE2P::LDA_dms_lda_spill, AIE2P::sub_avail},
{AIE2P::LDA_dms_lda_spill, AIE2P::sub_ptr},
};
case AIE2P::VLDA_DM_SPILL:
return {{AIE2P::VLDA_CM_SPILL, AIE2P::sub_1024_acc_lo},
{AIE2P::VLDA_CM_SPILL, AIE2P::sub_1024_acc_hi}};
return {{AIE2P::VLDA_CM_SPILL, AIE2P::sub_1024_lo},
{AIE2P::VLDA_CM_SPILL, AIE2P::sub_1024_hi}};
case AIE2P::VLDA_Y_SPILL:
return {{AIE2P::VLDA_dmx_lda_x_spill, AIE2P::sub_512_lo},
{AIE2P::VLDA_dmx_lda_x_spill, AIE2P::sub_512_hi}};
Expand Down Expand Up @@ -1105,6 +1130,11 @@ AIE2PInstrInfo::getSpillPseudoExpandInfo(const MachineInstr &MI) const {
case AIE2P::VST_EX_SPILL:
return {{AIE2P::VST_dmx_sts_x_spill, AIE2P::sub_bfp16_x},
{AIE2P::VST_E_SPILL, AIE2P::sub_bfp16_e}};
case AIE2P::VLDA_1024_COMPOSED_REG_SPILL:
return {{AIE2P::VLDA_512_COMPOSED_REG_SPILL, AIE2P::sub_512_lo},
{AIE2P::VLDA_512_COMPOSED_REG_SPILL, AIE2P::sub_512_hi}};
case AIE2P::VLDA_512_COMPOSED_REG_SPILL:
return {};
}
llvm_unreachable("Un-implemented");
}
Expand Down Expand Up @@ -1195,6 +1225,34 @@ bool AIE2PInstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
MI.eraseFromParent();
return true;
}
case AIE2P::VLDA_512_COMPOSED_REG_SPILL: {
unsigned int Opcode;
if (AIE2P::VEC512RegClass.contains(MI.getOperand(0).getReg())) {
Opcode = AIE2P::VLDA_dmx_lda_x_spill;
} else if (AIE2P::FIFO512RegClass.contains(MI.getOperand(0).getReg())) {
Opcode = AIE2P::VLDA_dmx_lda_fifohl_spill;
} else if (AIE2P::ACC512RegClass.contains(MI.getOperand(0).getReg())) {
Opcode = AIE2P::VLDA_dmx_lda_bm_spill;
} else {
llvm_unreachable("Not a valid register for VST_512_COMPOSED_REG_SPILL");
}
MI.setDesc(get(Opcode));
return false;
}
case AIE2P::VST_512_COMPOSED_REG_SPILL: {
unsigned int Opcode;
if (AIE2P::VEC512RegClass.contains(MI.getOperand(0).getReg())) {
Opcode = AIE2P::VST_dmx_sts_x_spill;
} else if (AIE2P::FIFO512RegClass.contains(MI.getOperand(0).getReg())) {
Opcode = AIE2P::VST_dmx_sts_fifohl_spill;
} else if (AIE2P::ACC512RegClass.contains(MI.getOperand(0).getReg())) {
Opcode = AIE2P::VST_dmx_sts_bm_spill;
} else {
llvm_unreachable("Not a valid register for VST_512_COMPOSED_REG_SPILL");
}
MI.setDesc(get(Opcode));
return false;
}
}
return false;
}
Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/Target/AIE/aie2p/AIE2PInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,8 @@ def VST_FIFO_SPILL : Pseudo<(outs ), (ins FIFO1024:$src, c16n_step64:$imm), "vst
def VST_PLFR_SPILL : Pseudo<(outs ), (ins ePSRFLdF:$src, c16n_step64:$imm), "vst_plfr_spill", "${src}, [sp, $imm]">;
def VST_EX_SPILL : Pseudo<(outs ), (ins VEC576:$src, c16n_step64:$imm), "vst_ex_spill", "${src}, [sp, $imm]">;
def VST_E_SPILL : Pseudo<(outs ), (ins EXPVEC64:$src, c12n_step4:$imm), "vst_e_spill", "$src, [sp, $imm]">;
def VST_512_COMPOSED_REG_SPILL : Pseudo<(outs ), (ins spill_vec512_to_composite:$src, c16n_step64:$imm), "vst_512_composed_reg_spill", "${src}, [sp, $imm]">;
def VST_1024_COMPOSED_REG_SPILL : Pseudo<(outs ), (ins spill_vec1024_to_composite:$src, c16n_step64:$imm), "vst_512_composed_reg_spill", "${src}, [sp, $imm]">;
}

let mayLoad = true, mayStore = false in {
Expand All @@ -335,6 +337,8 @@ def LDA_D_SPILL : Pseudo<(outs eD:$dst), (ins c12n_step4:$imm), "lda_d_spill", "
def LDA_DS_SPILL : Pseudo<(outs eDS:$dst), (ins c12n_step4:$imm), "lda_ds_spill", "${dst}, [sp, $imm]">;
def VLDA_EX_SPILL : Pseudo<(outs VEC576:$dst), (ins c16n_step64:$imm), "vlda_ex_spill", "${dst}, [sp, $imm]">;
def VLDA_E_SPILL : Pseudo<(outs EXPVEC64:$dst), (ins c12n_step4:$imm), "vlda_e_spill", "${dst}, [sp, $imm]">;
def VLDA_512_COMPOSED_REG_SPILL : Pseudo<(outs spill_vec512_to_composite:$dst), (ins c16n_step64:$imm), "vlda_512_composed_reg_spill", "${dst}, [sp, $imm]">;
def VLDA_1024_COMPOSED_REG_SPILL : Pseudo<(outs spill_vec1024_to_composite:$dst), (ins c16n_step64:$imm), "vlda_512_composed_reg_spill", "${dst}, [sp, $imm]">;
}
}

Expand Down
Loading
Loading