[clang] [llvm] [X86][AMX] Support AMX-TRANSPOSE (PR #113532)
Phoebe Wang via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 29 07:05:32 PDT 2024
================
@@ -568,6 +568,131 @@ bool X86ExpandPseudo::expandMI(MachineBasicBlock &MBB,
MI.setDesc(TII->get(Opc));
return true;
}
+ // TILEPAIRLOAD is just for TILEPair spill, we don't have corresponding
+ // AMX instruction to support it. So, split it to 2 load instructions:
+ // "TILEPAIRLOAD TMM0:TMM1, Base, Scale, Index, Offset, Segment" -->
+ // "TILELOAD TMM0, Base, Scale, Index, Offset, Segment" +
+ // "TILELOAD TMM1, Base, Scale, Index, Offset + TMM_SIZE, Segment"
+ case X86::PTILEPAIRLOAD: {
+ int64_t Disp = MBBI->getOperand(1 + X86::AddrDisp).getImm();
+ Register TReg = MBBI->getOperand(0).getReg();
+ bool DstIsDead = MBBI->getOperand(0).isDead();
+ Register TReg0 = TRI->getSubReg(TReg, X86::sub_t0);
+ Register TReg1 = TRI->getSubReg(TReg, X86::sub_t1);
+ unsigned TmmSize = TRI->getRegSizeInBits(X86::TILERegClass) / 8;
+
+ MachineInstrBuilder MIBLo =
+ BuildMI(MBB, MBBI, DL, TII->get(X86::TILELOADD))
+ .addReg(TReg0, RegState::Define | getDeadRegState(DstIsDead));
+ MachineInstrBuilder MIBHi =
+ BuildMI(MBB, MBBI, DL, TII->get(X86::TILELOADD))
+ .addReg(TReg1, RegState::Define | getDeadRegState(DstIsDead));
+
+ for (int i = 0; i < X86::AddrNumOperands; ++i) {
+ MIBLo.add(MBBI->getOperand(1 + i));
+ if (i == X86::AddrDisp)
+ MIBHi.addImm(Disp + TmmSize);
+ else
+ MIBHi.add(MBBI->getOperand(1 + i));
+ }
+
+ // Make sure the first stride reg used in first tileload is alive.
+ MachineOperand &Stride =
+ MIBLo.getInstr()->getOperand(1 + X86::AddrIndexReg);
+ Stride.setIsKill(false);
+
+ // Split the memory operand, adjusting the offset and size for the halves.
+ MachineMemOperand *OldMMO = MBBI->memoperands().front();
+ MachineFunction *MF = MBB.getParent();
+ MachineMemOperand *MMOLo = MF->getMachineMemOperand(OldMMO, 0, TmmSize);
+ MachineMemOperand *MMOHi =
+ MF->getMachineMemOperand(OldMMO, TmmSize, TmmSize);
+
+ MIBLo.setMemRefs(MMOLo);
+ MIBHi.setMemRefs(MMOHi);
+
+ // Delete the pseudo.
+ MBB.erase(MBBI);
+ return true;
+ }
+ // Smilar with TILEPAIRLOAD, TILEPAIRSTORE is just for TILEPair spill, no
----------------
phoebewang wrote:
Done, thanks!
https://github.com/llvm/llvm-project/pull/113532
More information about the cfe-commits
mailing list