void CodeGeneratorX64::visitAsmJSAtomicBinopHeap(LAsmJSAtomicBinopHeap* ins) { MAsmJSAtomicBinopHeap* mir = ins->mir(); MOZ_ASSERT(mir->access().offset() == 0); MOZ_ASSERT(mir->hasUses()); Register ptr = ToRegister(ins->ptr()); const LAllocation* value = ins->value(); Register temp = ins->temp()->isBogusTemp() ? InvalidReg : ToRegister(ins->temp()); AnyRegister output = ToAnyRegister(ins->output()); MOZ_ASSERT(ins->addrTemp()->isBogusTemp()); Scalar::Type accessType = mir->access().type(); if (accessType == Scalar::Uint32) accessType = Scalar::Int32; AtomicOp op = mir->operation(); BaseIndex srcAddr(HeapReg, ptr, TimesOne); if (value->isConstant()) { atomicBinopToTypedIntArray(op, accessType, Imm32(ToInt32(value)), srcAddr, temp, InvalidReg, output); } else { atomicBinopToTypedIntArray(op, accessType, ToRegister(value), srcAddr, temp, InvalidReg, output); } }
void CodeGeneratorX86::visitAsmJSAtomicBinopHeap(LAsmJSAtomicBinopHeap* ins) { MAsmJSAtomicBinopHeap* mir = ins->mir(); MOZ_ASSERT(mir->access().offset() == 0); Scalar::Type accessType = mir->access().type(); Register ptrReg = ToRegister(ins->ptr()); Register temp = ins->temp()->isBogusTemp() ? InvalidReg : ToRegister(ins->temp()); Register addrTemp = ToRegister(ins->addrTemp()); const LAllocation* value = ins->value(); AtomicOp op = mir->operation(); Register memoryBase = ToRegister(ins->memoryBase()); asmJSAtomicComputeAddress(addrTemp, ptrReg, memoryBase); Address memAddr(addrTemp, 0); if (value->isConstant()) { atomicBinopToTypedIntArray(op, accessType == Scalar::Uint32 ? Scalar::Int32 : accessType, Imm32(ToInt32(value)), memAddr, temp, InvalidReg, ToAnyRegister(ins->output())); } else { atomicBinopToTypedIntArray(op, accessType == Scalar::Uint32 ? Scalar::Int32 : accessType, ToRegister(value), memAddr, temp, InvalidReg, ToAnyRegister(ins->output())); } }
void CodeGeneratorX64::visitAsmJSAtomicBinopHeapForEffect(LAsmJSAtomicBinopHeapForEffect* ins) { MAsmJSAtomicBinopHeap* mir = ins->mir(); MOZ_ASSERT(mir->access().offset() == 0); MOZ_ASSERT(!mir->hasUses()); Register ptr = ToRegister(ins->ptr()); const LAllocation* value = ins->value(); MOZ_ASSERT(ins->addrTemp()->isBogusTemp()); Scalar::Type accessType = mir->access().type(); AtomicOp op = mir->operation(); BaseIndex srcAddr(HeapReg, ptr, TimesOne); if (value->isConstant()) atomicBinopToTypedIntArray(op, accessType, Imm32(ToInt32(value)), srcAddr); else atomicBinopToTypedIntArray(op, accessType, ToRegister(value), srcAddr); }
void CodeGeneratorX86::visitAsmJSAtomicBinopHeapForEffect(LAsmJSAtomicBinopHeapForEffect* ins) { MAsmJSAtomicBinopHeap* mir = ins->mir(); MOZ_ASSERT(mir->access().offset() == 0); MOZ_ASSERT(!mir->hasUses()); Scalar::Type accessType = mir->access().type(); Register ptrReg = ToRegister(ins->ptr()); Register addrTemp = ToRegister(ins->addrTemp()); const LAllocation* value = ins->value(); AtomicOp op = mir->operation(); Register memoryBase = ToRegister(ins->memoryBase()); asmJSAtomicComputeAddress(addrTemp, ptrReg, memoryBase); Address memAddr(addrTemp, 0); if (value->isConstant()) atomicBinopToTypedIntArray(op, accessType, Imm32(ToInt32(value)), memAddr); else atomicBinopToTypedIntArray(op, accessType, ToRegister(value), memAddr); }