void CodeGeneratorX64::visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins) { MAsmJSAtomicExchangeHeap* mir = ins->mir(); MOZ_ASSERT(mir->access().offset() == 0); Register ptr = ToRegister(ins->ptr()); Register value = ToRegister(ins->value()); MOZ_ASSERT(ins->addrTemp()->isBogusTemp()); Scalar::Type accessType = mir->access().type(); MOZ_ASSERT(accessType <= Scalar::Uint32); BaseIndex srcAddr(HeapReg, ptr, TimesOne); masm.atomicExchangeToTypedIntArray(accessType == Scalar::Uint32 ? Scalar::Int32 : accessType, srcAddr, value, InvalidReg, ToAnyRegister(ins->output())); }
void CodeGeneratorX86::visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins) { MAsmJSAtomicExchangeHeap* mir = ins->mir(); MOZ_ASSERT(mir->access().offset() == 0); Scalar::Type accessType = mir->access().type(); Register ptrReg = ToRegister(ins->ptr()); Register value = ToRegister(ins->value()); Register addrTemp = ToRegister(ins->addrTemp()); Register memoryBase = ToRegister(ins->memoryBase()); asmJSAtomicComputeAddress(addrTemp, ptrReg, memoryBase); Address memAddr(addrTemp, 0); masm.atomicExchangeToTypedIntArray(accessType == Scalar::Uint32 ? Scalar::Int32 : accessType, memAddr, value, InvalidReg, ToAnyRegister(ins->output())); }
void CodeGeneratorX64::visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins) { MAsmJSAtomicExchangeHeap* mir = ins->mir(); Scalar::Type accessType = mir->accessType(); const LAllocation* ptr = ins->ptr(); MOZ_ASSERT(ins->addrTemp()->isBogusTemp()); MOZ_ASSERT(ptr->isRegister()); MOZ_ASSERT(accessType <= Scalar::Uint32); BaseIndex srcAddr(HeapReg, ToRegister(ptr), TimesOne, mir->offset()); Register value = ToRegister(ins->value()); // Note that we can't use // needsAsmJSBoundsCheckBranch/emitAsmJSBoundsCheckBranch/cleanupAfterAsmJSBoundsCheckBranch // since signal-handler bounds checking is not yet implemented for atomic accesses. uint32_t maybeCmpOffset = AsmJSHeapAccess::NoLengthCheck; if (mir->needsBoundsCheck()) { maybeCmpOffset = masm.cmp32WithPatch(ToRegister(ptr), Imm32(-mir->endOffset())).offset(); masm.j(Assembler::Above, gen->outOfBoundsLabel()); } uint32_t before = masm.size(); masm.atomicExchangeToTypedIntArray(accessType == Scalar::Uint32 ? Scalar::Int32 : accessType, srcAddr, value, InvalidReg, ToAnyRegister(ins->output())); MOZ_ASSERT(mir->offset() == 0, "The AsmJS signal handler doesn't yet support emulating " "atomic accesses in the case of a fault from an unwrapped offset"); masm.append(AsmJSHeapAccess(before, AsmJSHeapAccess::Throw, maybeCmpOffset)); }
void CodeGeneratorX64::visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins) { MOZ_ASSERT(ins->addrTemp()->isBogusTemp()); MOZ_ASSERT(ins->mir()->accessType() <= Scalar::Uint32); MAsmJSAtomicExchangeHeap* mir = ins->mir(); Scalar::Type accessType = mir->accessType(); Register ptr = ToRegister(ins->ptr()); BaseIndex srcAddr(HeapReg, ptr, TimesOne, mir->offset()); Register value = ToRegister(ins->value()); MaybeAddAtomicsBoundsCheck(masm, mir, ptr); masm.atomicExchangeToTypedIntArray(accessType == Scalar::Uint32 ? Scalar::Int32 : accessType, srcAddr, value, InvalidReg, ToAnyRegister(ins->output())); MOZ_ASSERT(mir->offset() == 0, "The AsmJS signal handler doesn't yet support emulating " "atomic accesses in the case of a fault from an unwrapped offset"); }
void CodeGeneratorX86::visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins) { MAsmJSAtomicExchangeHeap* mir = ins->mir(); Scalar::Type accessType = mir->accessType(); Register ptrReg = ToRegister(ins->ptr()); Register value = ToRegister(ins->value()); Register addrTemp = ToRegister(ins->addrTemp()); asmJSAtomicComputeAddress(addrTemp, ptrReg, mir->needsBoundsCheck(), mir->offset(), mir->endOffset()); Address memAddr(addrTemp, mir->offset()); masm.atomicExchangeToTypedIntArray(accessType == Scalar::Uint32 ? Scalar::Int32 : accessType, memAddr, value, InvalidReg, ToAnyRegister(ins->output())); }