aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/CppBackend/CPPBackend.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-12-12 16:20:52 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-12-12 16:20:52 -0800
commitdc9f227a0fef61e246fff0de4d742940002243e0 (patch)
tree2606d51bfa0098903cd40246e2d44ca010fe84d8 /lib/Target/CppBackend/CPPBackend.cpp
parentc43a522939a5e3d49ce76c47261592d61b341173 (diff)
implement AtomicCmpXchg
Diffstat (limited to 'lib/Target/CppBackend/CPPBackend.cpp')
-rw-r--r--lib/Target/CppBackend/CPPBackend.cpp16
1 files changed, 5 insertions, 11 deletions
diff --git a/lib/Target/CppBackend/CPPBackend.cpp b/lib/Target/CppBackend/CPPBackend.cpp
index 3cc023b9c2..4ff08e4531 100644
--- a/lib/Target/CppBackend/CPPBackend.cpp
+++ b/lib/Target/CppBackend/CPPBackend.cpp
@@ -1962,17 +1962,11 @@ std::string CppWriter::generateInstruction(const Instruction *I) {
break;
}
case Instruction::AtomicCmpXchg: {
- const AtomicCmpXchgInst *cxi = cast<AtomicCmpXchgInst>(I);
- StringRef Ordering = ConvertAtomicOrdering(cxi->getOrdering());
- StringRef CrossThread = ConvertAtomicSynchScope(cxi->getSynchScope());
- Out << "AtomicCmpXchgInst* " << iName
- << " = new AtomicCmpXchgInst("
- << opNames[0] << ", " << opNames[1] << ", " << opNames[2] << ", "
- << Ordering << ", " << CrossThread << ", " << bbname
- << ");";
- nl(Out) << iName << "->setName(\"";
- printEscapedString(cxi->getName());
- Out << "\");";
+ std::string Assign = getAssign(iName, I->getType());
+ const Value *P = I->getOperand(0);
+ text = getLoad(Assign, P, I->getType(), 0) + ';' +
+ "if ((" + getCast(iName, I->getType()) + ") == " + getValueAsCastParenStr(I->getOperand(1)) + ") " +
+ getStore(P, I->getType(), getValueAsStr(I->getOperand(2)), 0) + ";";
break;
}
case Instruction::AtomicRMW: {