It's important for the cmp-and-swap to balance

loads and stores but it's even more important for
it to store the right value.:(



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55319 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dale Johannesen
2008-08-25 18:53:26 +00:00
parent cb3c51a4ae
commit 65e3973dff

View File

@@ -4040,36 +4040,54 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
unsigned oldval = MI->getOperand(3).getReg(); unsigned oldval = MI->getOperand(3).getReg();
unsigned newval = MI->getOperand(4).getReg(); unsigned newval = MI->getOperand(4).getReg();
MachineBasicBlock *loopMBB = F->CreateMachineBasicBlock(LLVM_BB); MachineBasicBlock *loop1MBB = F->CreateMachineBasicBlock(LLVM_BB);
MachineBasicBlock *loop2MBB = F->CreateMachineBasicBlock(LLVM_BB);
MachineBasicBlock *midMBB = F->CreateMachineBasicBlock(LLVM_BB);
MachineBasicBlock *exitMBB = F->CreateMachineBasicBlock(LLVM_BB); MachineBasicBlock *exitMBB = F->CreateMachineBasicBlock(LLVM_BB);
F->insert(It, loopMBB); F->insert(It, loop1MBB);
F->insert(It, loop2MBB);
F->insert(It, midMBB);
F->insert(It, exitMBB); F->insert(It, exitMBB);
exitMBB->transferSuccessors(BB); exitMBB->transferSuccessors(BB);
// thisMBB: // thisMBB:
// ... // ...
// fallthrough --> loopMBB // fallthrough --> loopMBB
BB->addSuccessor(loopMBB); BB->addSuccessor(loop1MBB);
// loopMBB: // loop1MBB:
// l[wd]arx dest, ptr // l[wd]arx dest, ptr
// cmp[wd] CR1, dest, oldval // cmp[wd] dest, oldval
// bne- midMBB
// loop2MBB:
// st[wd]cx. newval, ptr // st[wd]cx. newval, ptr
// bne- CR1, exitMBB
// bne- loopMBB // bne- loopMBB
// fallthrough --> exitMBB // b exitBB
BB = loopMBB; // midMBB:
// st[wd]cx. dest, ptr
// exitBB:
BB = loop1MBB;
BuildMI(BB, TII->get(is64bit ? PPC::LDARX : PPC::LWARX), dest) BuildMI(BB, TII->get(is64bit ? PPC::LDARX : PPC::LWARX), dest)
.addReg(ptrA).addReg(ptrB); .addReg(ptrA).addReg(ptrB);
BuildMI(BB, TII->get(is64bit ? PPC::CMPD : PPC::CMPW), PPC::CR1) BuildMI(BB, TII->get(is64bit ? PPC::CMPD : PPC::CMPW), PPC::CR0)
.addReg(oldval).addReg(dest); .addReg(oldval).addReg(dest);
BuildMI(BB, TII->get(PPC::BCC))
.addImm(PPC::PRED_NE).addReg(PPC::CR0).addMBB(midMBB);
BB->addSuccessor(loop2MBB);
BB->addSuccessor(midMBB);
BB = loop2MBB;
BuildMI(BB, TII->get(is64bit ? PPC::STDCX : PPC::STWCX)) BuildMI(BB, TII->get(is64bit ? PPC::STDCX : PPC::STWCX))
.addReg(newval).addReg(ptrA).addReg(ptrB); .addReg(newval).addReg(ptrA).addReg(ptrB);
BuildMI(BB, TII->get(PPC::BCC)) BuildMI(BB, TII->get(PPC::BCC))
.addImm(PPC::PRED_NE).addReg(PPC::CR1).addMBB(exitMBB); .addImm(PPC::PRED_NE).addReg(PPC::CR0).addMBB(loop1MBB);
BuildMI(BB, TII->get(PPC::BCC)) BuildMI(BB, TII->get(PPC::B)).addMBB(exitMBB);
.addImm(PPC::PRED_NE).addReg(PPC::CR0).addMBB(loopMBB); BB->addSuccessor(loop1MBB);
BB->addSuccessor(loopMBB); BB->addSuccessor(exitMBB);
BB = midMBB;
BuildMI(BB, TII->get(is64bit ? PPC::STDCX : PPC::STWCX))
.addReg(dest).addReg(ptrA).addReg(ptrB);
BB->addSuccessor(exitMBB); BB->addSuccessor(exitMBB);
// exitMBB: // exitMBB: