Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit cd521f2

Browse files
committed
Use PNaCl intrinsics based approach for handling atomic cmpxchg.
1 parent d617e91 commit cd521f2

File tree

3 files changed

+13
-33
lines changed

3 files changed

+13
-33
lines changed

lib/Target/JSBackend/CallHandlers.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -314,16 +314,21 @@ DEF_CALL_HANDLER(llvm_nacl_atomic_store_i32, {
314314
return "HEAP32[" + getValueAsStr(CI->getOperand(0)) + ">>2]=" + getValueAsStr(CI->getOperand(1));
315315
})
316316

317-
#define CMPXCHG_HANDLER(name) \
317+
#define CMPXCHG_HANDLER(name, HeapName) \
318318
DEF_CALL_HANDLER(name, { \
319319
const Value *P = CI->getOperand(0); \
320-
return getLoad(CI, P, CI->getType(), 0) + ';' + \
321-
"if ((" + getCast(getJSName(CI), CI->getType()) + ") == " + getValueAsCastParenStr(CI->getOperand(1)) + ") " + \
322-
getStore(CI, P, CI->getType(), getValueAsStr(CI->getOperand(2)), 0); \
323-
})
324-
CMPXCHG_HANDLER(llvm_nacl_atomic_cmpxchg_i8);
325-
CMPXCHG_HANDLER(llvm_nacl_atomic_cmpxchg_i16);
326-
CMPXCHG_HANDLER(llvm_nacl_atomic_cmpxchg_i32);
320+
if (EnablePthreads) { \
321+
return getAssign(CI) + "Atomics_compareExchange(" HeapName ", " + getAddressAsString(CI->getOperand(0), 2) + ", " + getValueAsStr(CI->getOperand(1)) + ", " + getValueAsStr(CI->getOperand(2)) + ")"; \
322+
} else { \
323+
return getLoad(CI, P, CI->getType(), 0) + ';' + \
324+
"if ((" + getCast(getJSName(CI), CI->getType()) + ") == " + getValueAsCastParenStr(CI->getOperand(1)) + ") " + \
325+
getStore(CI, P, CI->getType(), getValueAsStr(CI->getOperand(2)), 0); \
326+
} \
327+
})
328+
329+
CMPXCHG_HANDLER(llvm_nacl_atomic_cmpxchg_i8, "HEAP8");
330+
CMPXCHG_HANDLER(llvm_nacl_atomic_cmpxchg_i16, "HEAP16");
331+
CMPXCHG_HANDLER(llvm_nacl_atomic_cmpxchg_i32, "HEAP32");
327332

328333
#define UNROLL_LOOP_MAX 8
329334
#define WRITE_LOOP_MAX 128

lib/Target/JSBackend/JSBackend.cpp

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2367,30 +2367,6 @@ void JSWriter::generateExpression(const User *I, raw_string_ostream& Code) {
23672367
getValueAsStr(I->getOperand(2));
23682368
break;
23692369
}
2370-
case Instruction::ExtractValue: {
2371-
const ExtractValueInst *evi = cast<ExtractValueInst>(I);
2372-
std::string Assign = getAssign(evi);
2373-
Code << Assign << getValueAsStr(I->getOperand(0)) << "_" << evi->idx_begin()[0];
2374-
break;
2375-
}
2376-
case Instruction::AtomicCmpXchg: {
2377-
const AtomicCmpXchgInst *cxi = cast<AtomicCmpXchgInst>(I);
2378-
const Value *P = I->getOperand(0);
2379-
const char *HeapName;
2380-
std::string Index = getHeapNameAndIndex(P, &HeapName);
2381-
std::string Assign = getJSName(I);
2382-
UsedVars[Assign + "_0"] = I->getOperand(1)->getType();
2383-
UsedVars[Assign + "_1"] = Type::getInt1Ty(P->getContext());
2384-
if (EnablePthreads) {
2385-
Code << Assign << "_0 = Atomics_compareExchange(" << HeapName << ", " << Index << ", " << getValueAsStr(I->getOperand(1)) << ", " << getValueAsStr(I->getOperand(2)) << ");\n";
2386-
Code << Assign << "_1 = (" << Assign << "_0|0) == (" << getValueAsStr(I->getOperand(1)) << "|0)";
2387-
} else {
2388-
Code << Assign << "_0 = " << HeapName << "[" << Index << "];\n";
2389-
Code << Assign << "_1 = (" << Assign << "_0|0) == (" << getValueAsStr(I->getOperand(1)) << "|0); ";
2390-
Code << "if (" << Assign << "_1) " << getStore(cxi, P, I->getType(), getValueAsStr(I->getOperand(2)), 0);
2391-
}
2392-
break;
2393-
}
23942370
case Instruction::AtomicRMW: {
23952371
const AtomicRMWInst *rmwi = cast<AtomicRMWInst>(I);
23962372
const Value *P = rmwi->getOperand(0);

lib/Transforms/NaCl/RewriteAtomics.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,6 @@ void AtomicVisitor::visitAtomicRMWInst(AtomicRMWInst &I) {
379379
/// %success = icmp eq %old, %val
380380
/// Note: weak is currently dropped if present, the cmpxchg is always strong.
381381
void AtomicVisitor::visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) {
382-
return; // XXX EMSCRIPTEN
383382
PointerHelper<AtomicCmpXchgInst> PH(*this, I);
384383
const NaCl::AtomicIntrinsics::AtomicIntrinsic *Intrinsic =
385384
findAtomicIntrinsic(I, Intrinsic::nacl_atomic_cmpxchg, PH.PET);

0 commit comments

Comments
 (0)