[clang] [llvm] [LoongArch] Support sc.q instruction for 128bit cmpxchg operation (PR #116771)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 21 22:46:27 PST 2025
================
@@ -604,6 +610,109 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg(
return true;
}
+bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg128(
+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
+ MachineBasicBlock::iterator &NextMBBI) {
+ MachineInstr &MI = *MBBI;
+ DebugLoc DL = MI.getDebugLoc();
+ MachineFunction *MF = MBB.getParent();
+ auto LoopHeadMBB = MF->CreateMachineBasicBlock(MBB.getBasicBlock());
+ auto LoopTailMBB = MF->CreateMachineBasicBlock(MBB.getBasicBlock());
+ auto TailMBB = MF->CreateMachineBasicBlock(MBB.getBasicBlock());
+ auto DoneMBB = MF->CreateMachineBasicBlock(MBB.getBasicBlock());
+
+ // Insert new MBBs
+ MF->insert(++MBB.getIterator(), LoopHeadMBB);
+ MF->insert(++LoopHeadMBB->getIterator(), LoopTailMBB);
+ MF->insert(++LoopTailMBB->getIterator(), TailMBB);
+ MF->insert(++TailMBB->getIterator(), DoneMBB);
+
+ // Set up successors and transfer remaining instructions to DoneMBB.
+ LoopHeadMBB->addSuccessor(LoopTailMBB);
+ LoopHeadMBB->addSuccessor(TailMBB);
+ LoopTailMBB->addSuccessor(DoneMBB);
+ LoopTailMBB->addSuccessor(LoopHeadMBB);
+ TailMBB->addSuccessor(DoneMBB);
+ DoneMBB->splice(DoneMBB->end(), &MBB, MI, MBB.end());
+ DoneMBB->transferSuccessors(&MBB);
+ MBB.addSuccessor(LoopHeadMBB);
+
+ Register DestLoReg = MI.getOperand(0).getReg();
+ Register DestHiReg = MI.getOperand(1).getReg();
+ Register ScratchReg = MI.getOperand(2).getReg();
+ Register AddrReg = MI.getOperand(3).getReg();
+ Register CmpValLoReg = MI.getOperand(4).getReg();
+ Register CmpValHiReg = MI.getOperand(5).getReg();
+ Register NewValLoReg = MI.getOperand(6).getReg();
+ Register NewValHiReg = MI.getOperand(7).getReg();
+
+ // .loophead:
+ // ll.d res_lo, (addr)
----------------
heiher wrote:
Insert a `dbar acquire` here.
https://github.com/llvm/llvm-project/pull/116771
More information about the llvm-commits
mailing list