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

Commit 8a43284

Browse files
committed
HACK: Atomics.exchange() is not yet implemented, so as a temp workaround, do it as u32 version with a CAS loop. TODO: revert this commit once https://bugzilla.mozilla.org/show_bug.cgi?id=1141986 lands.
1 parent 188be8a commit 8a43284

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

lib/Target/JSBackend/CallHandlers.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,8 @@ std::string getAddressAsString(const Value *Ptr, int shift) {
546546
}
547547
}
548548

549+
/* TODO: Uncomment once https://bugzilla.mozilla.org/show_bug.cgi?id=1141986 is implemented!
550+
549551
DEF_CALL_HANDLER(emscripten_atomic_exchange_u8, {
550552
return getAssign(CI) + "Atomics_exchange(HEAP8, " + getValueAsStr(CI->getOperand(0)) + ", " + getValueAsStr(CI->getOperand(1)) + ")";
551553
})
@@ -561,6 +563,7 @@ DEF_CALL_HANDLER(emscripten_atomic_exchange_f32, {
561563
DEF_CALL_HANDLER(emscripten_atomic_exchange_f64, {
562564
return getAssign(CI) + "Atomics_exchange(HEAPF64, " + getAddressAsString(CI->getOperand(0), 3) + ", " + getValueAsStr(CI->getOperand(1)) + ")";
563565
})
566+
*/
564567

565568
DEF_CALL_HANDLER(emscripten_atomic_cas_u8, {
566569
return getAssign(CI) + "Atomics_compareExchange(HEAP8, " + getValueAsStr(CI->getOperand(0)) + ", " + getValueAsStr(CI->getOperand(1)) + ", " + getValueAsStr(CI->getOperand(2)) + ")";
@@ -868,11 +871,13 @@ void setupCallHandlers() {
868871
SETUP_CALL_HANDLER(emscripten_asm_const_int);
869872
SETUP_CALL_HANDLER(emscripten_asm_const_double);
870873

874+
/* TODO: Uncomment once https://bugzilla.mozilla.org/show_bug.cgi?id=1141986 is implemented!
871875
SETUP_CALL_HANDLER(emscripten_atomic_exchange_u8);
872876
SETUP_CALL_HANDLER(emscripten_atomic_exchange_u16);
873877
SETUP_CALL_HANDLER(emscripten_atomic_exchange_u32);
874878
SETUP_CALL_HANDLER(emscripten_atomic_exchange_f32);
875879
SETUP_CALL_HANDLER(emscripten_atomic_exchange_f64);
880+
*/
876881

877882
SETUP_CALL_HANDLER(emscripten_atomic_cas_u8);
878883
SETUP_CALL_HANDLER(emscripten_atomic_cas_u16);

lib/Target/JSBackend/JSBackend.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2385,6 +2385,11 @@ void JSWriter::generateExpression(const User *I, raw_string_ostream& Code) {
23852385
// implemented, we could remove the emulation, but until then we must emulate manually.
23862386
bool fround = PreciseF32 && !strcmp(HeapName, "HEAPF32");
23872387
Code << Assign << (fround ? "Math_fround(" : "+") << "_emscripten_atomic_" << atomicFunc << "_" << heapNameToAtomicTypeName(HeapName) << "(" << getByteAddressAsStr(P) << ", " << VS << (fround ? "))" : ")"); break;
2388+
2389+
// TODO: Remove the following two lines once https://bugzilla.mozilla.org/show_bug.cgi?id=1141986 is implemented!
2390+
} else if (rmwi->getOperation() == AtomicRMWInst::Xchg && !strcmp(HeapName, "HEAP32")) {
2391+
Code << Assign << "_emscripten_atomic_exchange_u32(" << getByteAddressAsStr(P) << ", " << VS << ")|0"; break;
2392+
23882393
} else {
23892394
Code << Assign << "Atomics_" << atomicFunc << "(" << HeapName << ", " << Index << ", " << VS << ")"; break;
23902395
}

0 commit comments

Comments
 (0)