☠☠ backed out by 86f32ce6a344 ☠ ☠ | |
author | Benjamin Bouvier <benj@benj.me> |
Wed, 13 Jul 2016 16:44:43 +0200 | |
changeset 305859 | aa1eab6436badfd108056b392c06ee1c95e533dc |
parent 305858 | 21d8bb5af7b4619ee5c594fa57797aa94f2ac910 |
child 305860 | 2bf27d83f47943d10f2f22e332a4af5793cd3f5a |
push id | 79685 |
push user | bbouvier@mozilla.com |
push date | Wed, 20 Jul 2016 17:16:38 +0000 |
treeherder | mozilla-inbound@aa1eab6436ba [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | luke |
bugs | 1286517 |
milestone | 50.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/asmjs/WasmBaselineCompile.cpp +++ b/js/src/asmjs/WasmBaselineCompile.cpp @@ -2057,25 +2057,25 @@ class BaseCompiler masm.move32(Imm32(sigIndex), WasmTableCallSigReg); } #if defined(JS_CODEGEN_X64) // CodeGeneratorX64::visitAsmJSLoadFuncPtr() { ScratchI32 scratch(*this); CodeOffset label = masm.loadRipRelativeInt64(scratch); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); masm.loadPtr(Operand(scratch, ptrReg, ScalePointer, 0), ptrReg); } #elif defined(JS_CODEGEN_X86) // CodeGeneratorX86::visitAsmJSLoadFuncPtr() { ScratchI32 scratch(*this); CodeOffset label = masm.movlWithPatch(PatchedAbsoluteAddress(), scratch); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); masm.loadPtr(Operand(scratch, ptrReg, ScalePointer), ptrReg); } #else MOZ_CRASH("BaseCompiler platform hook: funcPtrCall"); #endif callDynamic(ptrReg, call); } @@ -2084,21 +2084,21 @@ class BaseCompiler void ffiCall(unsigned globalDataOffset, const FunctionCall& call) { Register ptrReg = WasmTableCallPtrReg; #if defined(JS_CODEGEN_X64) // CodeGeneratorX64::visitAsmJSLoadFFIFunc() CodeOffset label = masm.loadRipRelativeInt64(ptrReg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #elif defined(JS_CODEGEN_X86) // CodeGeneratorX86::visitAsmJSLoadFFIFunc() CodeOffset label = masm.movlWithPatch(PatchedAbsoluteAddress(), ptrReg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: ffiCall"); #endif callDynamic(ptrReg, call); } void builtinCall(SymbolicAddress builtin, const FunctionCall& call) { @@ -2660,107 +2660,107 @@ class BaseCompiler // Global variable access. // CodeGenerator{X86,X64}::visitAsmJSLoadGlobalVar() void loadGlobalVarI32(unsigned globalDataOffset, RegI32 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.loadRipRelativeInt32(r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #elif defined(JS_CODEGEN_X86) CodeOffset label = masm.movlWithPatch(PatchedAbsoluteAddress(), r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: loadGlobalVarI32"); #endif } void loadGlobalVarI64(unsigned globalDataOffset, RegI64 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.loadRipRelativeInt64(r.reg.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: loadGlobalVarI64"); #endif } void loadGlobalVarF32(unsigned globalDataOffset, RegF32 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.loadRipRelativeFloat32(r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #elif defined(JS_CODEGEN_X86) CodeOffset label = masm.vmovssWithPatch(PatchedAbsoluteAddress(), r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: loadGlobalVarF32"); #endif } void loadGlobalVarF64(unsigned globalDataOffset, RegF64 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.loadRipRelativeDouble(r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #elif defined(JS_CODEGEN_X86) CodeOffset label = masm.vmovsdWithPatch(PatchedAbsoluteAddress(), r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: loadGlobalVarF32"); #endif } // CodeGeneratorX64::visitAsmJSStoreGlobalVar() void storeGlobalVarI32(unsigned globalDataOffset, RegI32 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.storeRipRelativeInt32(r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #elif defined(JS_CODEGEN_X86) CodeOffset label = masm.movlWithPatch(r.reg, PatchedAbsoluteAddress()); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: storeGlobalVarI32"); #endif } void storeGlobalVarI64(unsigned globalDataOffset, RegI64 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.storeRipRelativeInt64(r.reg.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: storeGlobalVarI64"); #endif } void storeGlobalVarF32(unsigned globalDataOffset, RegF32 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.storeRipRelativeFloat32(r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #elif defined(JS_CODEGEN_X86) CodeOffset label = masm.vmovssWithPatch(r.reg, PatchedAbsoluteAddress()); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: storeGlobalVarF32"); #endif } void storeGlobalVarF64(unsigned globalDataOffset, RegF64 r) { #if defined(JS_CODEGEN_X64) CodeOffset label = masm.storeRipRelativeDouble(r.reg); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #elif defined(JS_CODEGEN_X86) CodeOffset label = masm.vmovsdWithPatch(r.reg, PatchedAbsoluteAddress()); - masm.append(AsmJSGlobalAccess(label, globalDataOffset)); + masm.append(GlobalAccess(label, globalDataOffset)); #else MOZ_CRASH("BaseCompiler platform hook: storeGlobalVarF64"); #endif } ////////////////////////////////////////////////////////////////////// // // Heap access.
--- a/js/src/asmjs/WasmGenerator.cpp +++ b/js/src/asmjs/WasmGenerator.cpp @@ -512,36 +512,34 @@ ModuleGenerator::finishLinkData(Bytes& c if (!linkData_.internalLinks.append(inLink)) return false; } #if defined(JS_CODEGEN_X86) // Global data accesses in x86 need to be patched with the absolute // address of the global. Globals are allocated sequentially after the // code section so we can just use an InternalLink. - for (size_t i = 0; i < masm_.numAsmJSGlobalAccesses(); i++) { - AsmJSGlobalAccess a = masm_.asmJSGlobalAccess(i); + for (GlobalAccess a : masm_.globalAccesses()) { LinkData::InternalLink inLink(LinkData::InternalLink::RawPointer); inLink.patchAtOffset = masm_.labelToPatchOffset(a.patchAt); inLink.targetOffset = code.length() + a.globalDataOffset; if (!linkData_.internalLinks.append(inLink)) return false; } #elif defined(JS_CODEGEN_X64) // Global data accesses on x64 use rip-relative addressing and thus we can // patch here, now that we know the final codeLength. - for (size_t i = 0; i < masm_.numAsmJSGlobalAccesses(); i++) { - AsmJSGlobalAccess a = masm_.asmJSGlobalAccess(i); + for (GlobalAccess a : masm_.globalAccesses()) { void* from = code.begin() + a.patchAt.offset(); void* to = code.end() + a.globalDataOffset; X86Encoding::SetRel32(from, to); } #else // Global access is performed using the GlobalReg and requires no patching. - MOZ_ASSERT(masm_.numAsmJSGlobalAccesses() == 0); + MOZ_ASSERT(masm_.globalAccesses().length() == 0); #endif return true; } bool ModuleGenerator::addFuncImport(const Sig& sig, uint32_t globalDataOffset) {
--- a/js/src/asmjs/WasmIonCompile.cpp +++ b/js/src/asmjs/WasmIonCompile.cpp @@ -691,26 +691,26 @@ class FunctionCompiler return binop; } MDefinition* loadGlobalVar(unsigned globalDataOffset, bool isConst, MIRType type) { if (inDeadCode()) return nullptr; - auto* load = MAsmJSLoadGlobalVar::New(alloc(), type, globalDataOffset, isConst); + auto* load = MWasmLoadGlobalVar::New(alloc(), type, globalDataOffset, isConst); curBlock_->add(load); return load; } void storeGlobalVar(uint32_t globalDataOffset, MDefinition* v) { if (inDeadCode()) return; - curBlock_->add(MAsmJSStoreGlobalVar::New(alloc(), globalDataOffset, v)); + curBlock_->add(MWasmStoreGlobalVar::New(alloc(), globalDataOffset, v)); } void addInterruptCheck() { if (mg_.usesSignal.forInterrupt) return; if (inDeadCode())
--- a/js/src/asmjs/WasmStubs.cpp +++ b/js/src/asmjs/WasmStubs.cpp @@ -559,19 +559,19 @@ wasm::GenerateJitExit(MacroAssembler& ma // 2. Callee Register callee = ABINonArgReturnReg0; // live until call Register scratch = ABINonArgReturnReg1; // repeatedly clobbered // 2.1. Get ExitDatum uint32_t globalDataOffset = fi.exitGlobalDataOffset(); #if defined(JS_CODEGEN_X64) - masm.append(AsmJSGlobalAccess(masm.leaRipRelative(callee), globalDataOffset)); + masm.append(GlobalAccess(masm.leaRipRelative(callee), globalDataOffset)); #elif defined(JS_CODEGEN_X86) - masm.append(AsmJSGlobalAccess(masm.movlWithPatch(Imm32(0), callee), globalDataOffset)); + masm.append(GlobalAccess(masm.movlWithPatch(Imm32(0), callee), globalDataOffset)); #elif defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_ARM64) || \ defined(JS_CODEGEN_MIPS32) || defined(JS_CODEGEN_MIPS64) masm.computeEffectiveAddress(Address(GlobalReg, globalDataOffset - AsmJSGlobalRegBias), callee); #endif // 2.2. Get callee masm.loadPtr(Address(callee, offsetof(FuncImportExit, fun)), callee);
--- a/js/src/jit/AliasAnalysisShared.cpp +++ b/js/src/jit/AliasAnalysisShared.cpp @@ -141,18 +141,18 @@ GetObject(const MDefinition* ins) case MDefinition::Op_AtomicExchangeTypedArrayElement: case MDefinition::Op_AtomicTypedArrayElementBinop: case MDefinition::Op_AsmJSLoadHeap: case MDefinition::Op_AsmJSStoreHeap: case MDefinition::Op_WasmLoad: case MDefinition::Op_WasmStore: case MDefinition::Op_AsmJSCompareExchangeHeap: case MDefinition::Op_AsmJSAtomicBinopHeap: - case MDefinition::Op_AsmJSLoadGlobalVar: - case MDefinition::Op_AsmJSStoreGlobalVar: + case MDefinition::Op_WasmLoadGlobalVar: + case MDefinition::Op_WasmStoreGlobalVar: case MDefinition::Op_ArrayJoin: return nullptr; default: #ifdef DEBUG // Crash when the default aliasSet is overriden, but when not added in the list above. if (!ins->getAliasSet().isStore() || ins->getAliasSet().flags() != AliasSet::Flag::Any) MOZ_CRASH("Overridden getAliasSet without updating AliasAnalysisShared GetObject"); #endif
--- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -4076,25 +4076,25 @@ void LIRGenerator::visitHasClass(MHasClass* ins) { MOZ_ASSERT(ins->object()->type() == MIRType::Object); MOZ_ASSERT(ins->type() == MIRType::Boolean); define(new(alloc()) LHasClass(useRegister(ins->object())), ins); } void -LIRGenerator::visitAsmJSLoadGlobalVar(MAsmJSLoadGlobalVar* ins) -{ - define(new(alloc()) LAsmJSLoadGlobalVar, ins); -} - -void -LIRGenerator::visitAsmJSStoreGlobalVar(MAsmJSStoreGlobalVar* ins) -{ - add(new(alloc()) LAsmJSStoreGlobalVar(useRegisterAtStart(ins->value())), ins); +LIRGenerator::visitWasmLoadGlobalVar(MWasmLoadGlobalVar* ins) +{ + define(new(alloc()) LWasmLoadGlobalVar, ins); +} + +void +LIRGenerator::visitWasmStoreGlobalVar(MWasmStoreGlobalVar* ins) +{ + add(new(alloc()) LWasmStoreGlobalVar(useRegisterAtStart(ins->value())), ins); } void LIRGenerator::visitAsmJSLoadFuncPtr(MAsmJSLoadFuncPtr* ins) { define(new(alloc()) LAsmJSLoadFuncPtr(useRegister(ins->index())), ins); }
--- a/js/src/jit/Lowering.h +++ b/js/src/jit/Lowering.h @@ -276,18 +276,18 @@ class LIRGenerator : public LIRGenerator void visitIn(MIn* ins); void visitInArray(MInArray* ins); void visitInstanceOf(MInstanceOf* ins); void visitCallInstanceOf(MCallInstanceOf* ins); void visitIsCallable(MIsCallable* ins); void visitIsConstructor(MIsConstructor* ins); void visitIsObject(MIsObject* ins); void visitHasClass(MHasClass* ins); - void visitAsmJSLoadGlobalVar(MAsmJSLoadGlobalVar* ins); - void visitAsmJSStoreGlobalVar(MAsmJSStoreGlobalVar* ins); + void visitWasmLoadGlobalVar(MWasmLoadGlobalVar* ins); + void visitWasmStoreGlobalVar(MWasmStoreGlobalVar* ins); void visitAsmJSLoadFuncPtr(MAsmJSLoadFuncPtr* ins); void visitAsmJSLoadFFIFunc(MAsmJSLoadFFIFunc* ins); void visitAsmJSParameter(MAsmJSParameter* ins); void visitAsmJSReturn(MAsmJSReturn* ins); void visitAsmJSVoidReturn(MAsmJSVoidReturn* ins); void visitAsmJSPassStackArg(MAsmJSPassStackArg* ins); void visitAsmJSCall(MAsmJSCall* ins); void visitSetDOMProperty(MSetDOMProperty* ins);
--- a/js/src/jit/MIR.cpp +++ b/js/src/jit/MIR.cpp @@ -4894,51 +4894,50 @@ MAsmJSLoadHeap::congruentTo(const MDefin return false; const MAsmJSLoadHeap* load = ins->toAsmJSLoadHeap(); return load->accessType() == accessType() && load->offset() == offset() && congruentIfOperandsEqual(load); } MDefinition::AliasType -MAsmJSLoadGlobalVar::mightAlias(const MDefinition* def) const -{ - if (def->isAsmJSStoreGlobalVar()) { - const MAsmJSStoreGlobalVar* store = def->toAsmJSStoreGlobalVar(); +MWasmLoadGlobalVar::mightAlias(const MDefinition* def) const +{ + if (def->isWasmStoreGlobalVar()) { + const MWasmStoreGlobalVar* store = def->toWasmStoreGlobalVar(); + // Global variables can't alias each other or be type-reinterpreted. return (store->globalDataOffset() == globalDataOffset_) ? AliasType::MayAlias : AliasType::NoAlias; } return AliasType::MayAlias; } HashNumber -MAsmJSLoadGlobalVar::valueHash() const +MWasmLoadGlobalVar::valueHash() const { HashNumber hash = MDefinition::valueHash(); hash = addU32ToHash(hash, globalDataOffset_); return hash; } bool -MAsmJSLoadGlobalVar::congruentTo(const MDefinition* ins) const -{ - if (ins->isAsmJSLoadGlobalVar()) { - const MAsmJSLoadGlobalVar* load = ins->toAsmJSLoadGlobalVar(); - return globalDataOffset_ == load->globalDataOffset_; - } +MWasmLoadGlobalVar::congruentTo(const MDefinition* ins) const +{ + if (ins->isWasmLoadGlobalVar()) + return globalDataOffset_ == ins->toWasmLoadGlobalVar()->globalDataOffset_; return false; } MDefinition* -MAsmJSLoadGlobalVar::foldsTo(TempAllocator& alloc) -{ - if (!dependency() || !dependency()->isAsmJSStoreGlobalVar()) +MWasmLoadGlobalVar::foldsTo(TempAllocator& alloc) +{ + if (!dependency() || !dependency()->isWasmStoreGlobalVar()) return this; - MAsmJSStoreGlobalVar* store = dependency()->toAsmJSStoreGlobalVar(); + MWasmStoreGlobalVar* store = dependency()->toWasmStoreGlobalVar(); if (!store->block()->dominates(block())) return this; if (store->globalDataOffset() != globalDataOffset()) return this; if (store->value()->type() != type()) return this;
--- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -13276,58 +13276,58 @@ class MAsmJSAtomicBinopHeap MDefinition* base() const { return getOperand(0); } MDefinition* value() const { return getOperand(1); } AliasSet getAliasSet() const override { return AliasSet::Store(AliasSet::AsmJSHeap); } }; -class MAsmJSLoadGlobalVar : public MNullaryInstruction -{ - MAsmJSLoadGlobalVar(MIRType type, unsigned globalDataOffset, bool isConstant) +class MWasmLoadGlobalVar : public MNullaryInstruction +{ + MWasmLoadGlobalVar(MIRType type, unsigned globalDataOffset, bool isConstant) : globalDataOffset_(globalDataOffset), isConstant_(isConstant) { MOZ_ASSERT(IsNumberType(type) || IsSimdType(type)); setResultType(type); setMovable(); } unsigned globalDataOffset_; bool isConstant_; public: - INSTRUCTION_HEADER(AsmJSLoadGlobalVar) + INSTRUCTION_HEADER(WasmLoadGlobalVar) TRIVIAL_NEW_WRAPPERS unsigned globalDataOffset() const { return globalDataOffset_; } HashNumber valueHash() const override; bool congruentTo(const MDefinition* ins) const override; MDefinition* foldsTo(TempAllocator& alloc) override; AliasSet getAliasSet() const override { return isConstant_ ? AliasSet::None() : AliasSet::Load(AliasSet::AsmJSGlobalVar); } AliasType mightAlias(const MDefinition* def) const override; }; -class MAsmJSStoreGlobalVar +class MWasmStoreGlobalVar : public MUnaryInstruction, public NoTypePolicy::Data { - MAsmJSStoreGlobalVar(unsigned globalDataOffset, MDefinition* v) + MWasmStoreGlobalVar(unsigned globalDataOffset, MDefinition* v) : MUnaryInstruction(v), globalDataOffset_(globalDataOffset) {} unsigned globalDataOffset_; public: - INSTRUCTION_HEADER(AsmJSStoreGlobalVar) + INSTRUCTION_HEADER(WasmStoreGlobalVar) TRIVIAL_NEW_WRAPPERS unsigned globalDataOffset() const { return globalDataOffset_; } MDefinition* value() const { return getOperand(0); } AliasSet getAliasSet() const override { return AliasSet::Store(AliasSet::AsmJSGlobalVar); }
--- a/js/src/jit/MOpcodes.h +++ b/js/src/jit/MOpcodes.h @@ -273,18 +273,18 @@ namespace jit { _(WasmLoad) \ _(WasmStore) \ _(WasmTruncateToInt32) \ _(AsmJSNeg) \ _(AsmJSUnsignedToDouble) \ _(AsmJSUnsignedToFloat32) \ _(AsmJSLoadHeap) \ _(AsmJSStoreHeap) \ - _(AsmJSLoadGlobalVar) \ - _(AsmJSStoreGlobalVar) \ + _(WasmLoadGlobalVar) \ + _(WasmStoreGlobalVar) \ _(AsmJSLoadFuncPtr) \ _(AsmJSLoadFFIFunc) \ _(AsmJSReturn) \ _(AsmJSParameter) \ _(AsmJSVoidReturn) \ _(AsmJSPassStackArg) \ _(AsmJSCall) \ _(AsmSelect) \
--- a/js/src/jit/arm/CodeGenerator-arm.cpp +++ b/js/src/jit/arm/CodeGenerator-arm.cpp @@ -2690,45 +2690,47 @@ CodeGeneratorARM::visitEffectiveAddress( Register base = ToRegister(ins->base()); Register index = ToRegister(ins->index()); Register output = ToRegister(ins->output()); masm.as_add(output, base, lsl(index, mir->scale())); masm.ma_add(Imm32(mir->displacement()), output); } void -CodeGeneratorARM::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins) +CodeGeneratorARM::visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins) { - const MAsmJSLoadGlobalVar* mir = ins->mir(); + const MWasmLoadGlobalVar* mir = ins->mir(); unsigned addr = mir->globalDataOffset() - AsmJSGlobalRegBias; if (mir->type() == MIRType::Int32) { masm.ma_dtr(IsLoad, GlobalReg, Imm32(addr), ToRegister(ins->output())); } else if (mir->type() == MIRType::Float32) { VFPRegister vd(ToFloatRegister(ins->output())); masm.ma_vldr(Address(GlobalReg, addr), vd.singleOverlay()); } else { + MOZ_ASSERT(mir->type() == MIRType::Double); masm.ma_vldr(Address(GlobalReg, addr), ToFloatRegister(ins->output())); } } void -CodeGeneratorARM::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins) +CodeGeneratorARM::visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins) { - const MAsmJSStoreGlobalVar* mir = ins->mir(); + const MWasmStoreGlobalVar* mir = ins->mir(); MIRType type = mir->value()->type(); MOZ_ASSERT(IsNumberType(type)); unsigned addr = mir->globalDataOffset() - AsmJSGlobalRegBias; if (type == MIRType::Int32) { masm.ma_dtr(IsStore, GlobalReg, Imm32(addr), ToRegister(ins->value())); } else if (type == MIRType::Float32) { VFPRegister vd(ToFloatRegister(ins->value())); masm.ma_vstr(vd.singleOverlay(), Address(GlobalReg, addr)); } else { + MOZ_ASSERT(mir->type() == MIRType::Double); masm.ma_vstr(ToFloatRegister(ins->value()), Address(GlobalReg, addr)); } } void CodeGeneratorARM::visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins) { const MAsmJSLoadFuncPtr* mir = ins->mir();
--- a/js/src/jit/arm/CodeGenerator-arm.h +++ b/js/src/jit/arm/CodeGenerator-arm.h @@ -201,27 +201,27 @@ class CodeGeneratorARM : public CodeGene void visitCompareExchangeTypedArrayElement(LCompareExchangeTypedArrayElement* lir); void visitAtomicExchangeTypedArrayElement(LAtomicExchangeTypedArrayElement* lir); void visitAsmSelect(LAsmSelect* ins); void visitAsmReinterpret(LAsmReinterpret* ins); void visitAsmJSCall(LAsmJSCall* ins); void visitWasmBoundsCheck(LWasmBoundsCheck* ins); void visitWasmLoad(LWasmLoad* ins); void visitWasmStore(LWasmStore* ins); + void visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins); + void visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins); void visitAsmJSLoadHeap(LAsmJSLoadHeap* ins); void visitAsmJSStoreHeap(LAsmJSStoreHeap* ins); void visitAsmJSCompareExchangeHeap(LAsmJSCompareExchangeHeap* ins); void visitAsmJSCompareExchangeCallout(LAsmJSCompareExchangeCallout* ins); void visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins); void visitAsmJSAtomicExchangeCallout(LAsmJSAtomicExchangeCallout* ins); void visitAsmJSAtomicBinopHeap(LAsmJSAtomicBinopHeap* ins); void visitAsmJSAtomicBinopHeapForEffect(LAsmJSAtomicBinopHeapForEffect* ins); void visitAsmJSAtomicBinopCallout(LAsmJSAtomicBinopCallout* ins); - void visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins); - void visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins); void visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins); void visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc* ins); void visitAsmJSPassStackArg(LAsmJSPassStackArg* ins); void visitWasmTruncateToInt32(LWasmTruncateToInt32* ins); void visitOutOfLineWasmTruncateCheck(OutOfLineWasmTruncateCheck* ool); void visitCopySignD(LCopySignD* ins); void visitCopySignF(LCopySignF* ins);
--- a/js/src/jit/arm64/CodeGenerator-arm64.cpp +++ b/js/src/jit/arm64/CodeGenerator-arm64.cpp @@ -687,25 +687,25 @@ CodeGeneratorARM64::visitUMod(LUMod* ins void CodeGeneratorARM64::visitEffectiveAddress(LEffectiveAddress* ins) { MOZ_CRASH("visitEffectiveAddress"); } void -CodeGeneratorARM64::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins) +CodeGeneratorARM64::visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins) { - MOZ_CRASH("visitAsmJSLoadGlobalVar"); + MOZ_CRASH("visitWasmLoadGlobalVar"); } void -CodeGeneratorARM64::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins) +CodeGeneratorARM64::visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins) { - MOZ_CRASH("visitAsmJSStoreGlobalVar"); + MOZ_CRASH("visitWasmStoreGlobalVar"); } void CodeGeneratorARM64::visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins) { MOZ_CRASH("visitAsmJSLoadFuncPtr"); }
--- a/js/src/jit/arm64/CodeGenerator-arm64.h +++ b/js/src/jit/arm64/CodeGenerator-arm64.h @@ -198,22 +198,23 @@ class CodeGeneratorARM64 : public CodeGe void visitStoreTypedArrayElementStatic(LStoreTypedArrayElementStatic* ins); void visitCompareExchangeTypedArrayElement(LCompareExchangeTypedArrayElement* lir); void visitAtomicExchangeTypedArrayElement(LAtomicExchangeTypedArrayElement* lir); void visitAsmJSCall(LAsmJSCall* ins); void visitAsmJSLoadHeap(LAsmJSLoadHeap* ins); void visitAsmJSStoreHeap(LAsmJSStoreHeap* ins); void visitAsmJSCompareExchangeHeap(LAsmJSCompareExchangeHeap* ins); void visitAsmJSAtomicBinopHeap(LAsmJSAtomicBinopHeap* ins); - void visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins); - void visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins); void visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins); void visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc* ins); void visitAsmJSPassStackArg(LAsmJSPassStackArg* ins); + void visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins); + void visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins); + void generateInvalidateEpilogue(); void setReturnDoubleRegs(LiveRegisterSet* regs); protected: void postAsmJSCall(LAsmJSCall* lir) { MOZ_CRASH("postAsmJSCall"); }
--- a/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp +++ b/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp @@ -2100,32 +2100,32 @@ CodeGeneratorMIPSShared::visitEffectiveA Register index = ToRegister(ins->index()); Register output = ToRegister(ins->output()); BaseIndex address(base, index, mir->scale(), mir->displacement()); masm.computeEffectiveAddress(address, output); } void -CodeGeneratorMIPSShared::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins) +CodeGeneratorMIPSShared::visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins) { - const MAsmJSLoadGlobalVar* mir = ins->mir(); + const MWasmLoadGlobalVar* mir = ins->mir(); unsigned addr = mir->globalDataOffset() - AsmJSGlobalRegBias; if (mir->type() == MIRType::Int32) masm.load32(Address(GlobalReg, addr), ToRegister(ins->output())); else if (mir->type() == MIRType::Float32) masm.loadFloat32(Address(GlobalReg, addr), ToFloatRegister(ins->output())); else masm.loadDouble(Address(GlobalReg, addr), ToFloatRegister(ins->output())); } void -CodeGeneratorMIPSShared::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins) +CodeGeneratorMIPSShared::visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins) { - const MAsmJSStoreGlobalVar* mir = ins->mir(); + const MWasmStoreGlobalVar* mir = ins->mir(); MOZ_ASSERT(IsNumberType(mir->value()->type())); unsigned addr = mir->globalDataOffset() - AsmJSGlobalRegBias; if (mir->value()->type() == MIRType::Int32) masm.store32(ToRegister(ins->value()), Address(GlobalReg, addr)); else if (mir->value()->type() == MIRType::Float32) masm.storeFloat32(ToFloatRegister(ins->value()), Address(GlobalReg, addr)); else
--- a/js/src/jit/mips-shared/CodeGenerator-mips-shared.h +++ b/js/src/jit/mips-shared/CodeGenerator-mips-shared.h @@ -160,16 +160,18 @@ class CodeGeneratorMIPSShared : public C virtual void visitCeil(LCeil* lir); virtual void visitCeilF(LCeilF* lir); virtual void visitRound(LRound* lir); virtual void visitRoundF(LRoundF* lir); virtual void visitTruncateDToInt32(LTruncateDToInt32* ins); virtual void visitTruncateFToInt32(LTruncateFToInt32* ins); void visitWasmTruncateToInt32(LWasmTruncateToInt32* lir); + void visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins); + void visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins); // Out of line visitors. virtual void visitOutOfLineBailout(OutOfLineBailout* ool) = 0; void visitOutOfLineWasmTruncateCheck(OutOfLineWasmTruncateCheck* ool); void visitCopySignD(LCopySignD* ins); void visitCopySignF(LCopySignF* ins); protected: @@ -194,18 +196,16 @@ class CodeGeneratorMIPSShared : public C void visitStoreTypedArrayElementStatic(LStoreTypedArrayElementStatic* ins); void visitAsmJSCall(LAsmJSCall* ins); void visitAsmJSLoadHeap(LAsmJSLoadHeap* ins); void visitAsmJSStoreHeap(LAsmJSStoreHeap* ins); void visitAsmJSCompareExchangeHeap(LAsmJSCompareExchangeHeap* ins); void visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins); void visitAsmJSAtomicBinopHeap(LAsmJSAtomicBinopHeap* ins); void visitAsmJSAtomicBinopHeapForEffect(LAsmJSAtomicBinopHeapForEffect* ins); - void visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins); - void visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins); void visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins); void visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc* ins); void visitAsmJSPassStackArg(LAsmJSPassStackArg* ins); void visitAsmSelect(LAsmSelect* ins); void visitAsmReinterpret(LAsmReinterpret* ins); void visitMemoryBarrier(LMemoryBarrier* ins);
--- a/js/src/jit/shared/Assembler-shared.h +++ b/js/src/jit/shared/Assembler-shared.h @@ -675,46 +675,59 @@ struct AsmJSFrame // The return address pushed by the call (in the case of ARM/MIPS the return // address is pushed by the first instruction of the prologue). void* returnAddress; }; static_assert(sizeof(AsmJSFrame) == 2 * sizeof(void*), "?!"); static const uint32_t AsmJSFrameBytesAfterReturnAddress = sizeof(void*); -struct AsmJSGlobalAccess -{ - CodeOffset patchAt; - unsigned globalDataOffset; - - AsmJSGlobalAccess(CodeOffset patchAt, unsigned globalDataOffset) - : patchAt(patchAt), globalDataOffset(globalDataOffset) - {} -}; - // Represents an instruction to be patched and the intended pointee. These // links are accumulated in the MacroAssembler, but patching is done outside // the MacroAssembler (in Module::staticallyLink). struct AsmJSAbsoluteAddress { AsmJSAbsoluteAddress(CodeOffset patchAt, wasm::SymbolicAddress target) : patchAt(patchAt), target(target) {} CodeOffset patchAt; wasm::SymbolicAddress target; }; +} // namespace jit + +namespace wasm { + +// Summarizes a global access for a mutable (in asm.js) or immutable value (in +// asm.js or the MVP) that needs to get patched later. + +struct GlobalAccess +{ + GlobalAccess(jit::CodeOffset patchAt, unsigned globalDataOffset) + : patchAt(patchAt), globalDataOffset(globalDataOffset) + {} + + jit::CodeOffset patchAt; + unsigned globalDataOffset; +}; + +typedef Vector<GlobalAccess, 0, SystemAllocPolicy> GlobalAccessVector; + +} // namespace wasm + +namespace jit { + // The base class of all Assemblers for all archs. class AssemblerShared { wasm::CallSiteAndTargetVector callsites_; wasm::JumpSiteArray jumpsites_; wasm::MemoryAccessVector memoryAccesses_; wasm::BoundsCheckVector boundsChecks_; - Vector<AsmJSGlobalAccess, 0, SystemAllocPolicy> asmJSGlobalAccesses_; + wasm::GlobalAccessVector globalAccesses_; Vector<AsmJSAbsoluteAddress, 0, SystemAllocPolicy> asmJSAbsoluteAddresses_; protected: Vector<CodeLabel, 0, SystemAllocPolicy> codeLabels_; bool enoughMemory_; bool embedsNurseryPointers_; @@ -757,19 +770,18 @@ class AssemblerShared void clearJumpSites() { for (auto& v : jumpsites_) v.clear(); } void append(wasm::MemoryAccess access) { enoughMemory_ &= memoryAccesses_.append(access); } wasm::MemoryAccessVector&& extractMemoryAccesses() { return Move(memoryAccesses_); } void append(wasm::BoundsCheck check) { enoughMemory_ &= boundsChecks_.append(check); } wasm::BoundsCheckVector&& extractBoundsChecks() { return Move(boundsChecks_); } - void append(AsmJSGlobalAccess access) { enoughMemory_ &= asmJSGlobalAccesses_.append(access); } - size_t numAsmJSGlobalAccesses() const { return asmJSGlobalAccesses_.length(); } - AsmJSGlobalAccess asmJSGlobalAccess(size_t i) const { return asmJSGlobalAccesses_[i]; } + void append(wasm::GlobalAccess access) { enoughMemory_ &= globalAccesses_.append(access); } + const wasm::GlobalAccessVector& globalAccesses() const { return globalAccesses_; } void append(AsmJSAbsoluteAddress link) { enoughMemory_ &= asmJSAbsoluteAddresses_.append(link); } size_t numAsmJSAbsoluteAddresses() const { return asmJSAbsoluteAddresses_.length(); } AsmJSAbsoluteAddress asmJSAbsoluteAddress(size_t i) const { return asmJSAbsoluteAddresses_[i]; } static bool canUseInSingleByteInstruction(Register reg) { return true; } void addCodeLabel(CodeLabel label) { @@ -803,20 +815,20 @@ class AssemblerShared for (; i < memoryAccesses_.length(); i++) memoryAccesses_[i].offsetBy(delta); i = boundsChecks_.length(); enoughMemory_ &= boundsChecks_.appendAll(other.boundsChecks_); for (; i < boundsChecks_.length(); i++) boundsChecks_[i].offsetBy(delta); - i = asmJSGlobalAccesses_.length(); - enoughMemory_ &= asmJSGlobalAccesses_.appendAll(other.asmJSGlobalAccesses_); - for (; i < asmJSGlobalAccesses_.length(); i++) - asmJSGlobalAccesses_[i].patchAt.offsetBy(delta); + i = globalAccesses_.length(); + enoughMemory_ &= globalAccesses_.appendAll(other.globalAccesses_); + for (; i < globalAccesses_.length(); i++) + globalAccesses_[i].patchAt.offsetBy(delta); i = asmJSAbsoluteAddresses_.length(); enoughMemory_ &= asmJSAbsoluteAddresses_.appendAll(other.asmJSAbsoluteAddresses_); for (; i < asmJSAbsoluteAddresses_.length(); i++) asmJSAbsoluteAddresses_[i].patchAt.offsetBy(delta); i = codeLabels_.length(); enoughMemory_ &= codeLabels_.appendAll(other.codeLabels_);
--- a/js/src/jit/shared/LIR-shared.h +++ b/js/src/jit/shared/LIR-shared.h @@ -8041,34 +8041,34 @@ class LAsmJSAtomicBinopHeapForEffect : p return getTemp(4); } MAsmJSAtomicBinopHeap* mir() const { return mir_->toAsmJSAtomicBinopHeap(); } }; -class LAsmJSLoadGlobalVar : public LInstructionHelper<1, 0, 0> -{ - public: - LIR_HEADER(AsmJSLoadGlobalVar); - MAsmJSLoadGlobalVar* mir() const { - return mir_->toAsmJSLoadGlobalVar(); - } -}; - -class LAsmJSStoreGlobalVar : public LInstructionHelper<0, 1, 0> -{ - public: - LIR_HEADER(AsmJSStoreGlobalVar); - explicit LAsmJSStoreGlobalVar(const LAllocation& value) { +class LWasmLoadGlobalVar : public LInstructionHelper<1, 0, 0> +{ + public: + LIR_HEADER(WasmLoadGlobalVar); + MWasmLoadGlobalVar* mir() const { + return mir_->toWasmLoadGlobalVar(); + } +}; + +class LWasmStoreGlobalVar : public LInstructionHelper<0, 1, 0> +{ + public: + LIR_HEADER(WasmStoreGlobalVar); + explicit LWasmStoreGlobalVar(const LAllocation& value) { setOperand(0, value); } - MAsmJSStoreGlobalVar* mir() const { - return mir_->toAsmJSStoreGlobalVar(); + MWasmStoreGlobalVar* mir() const { + return mir_->toWasmStoreGlobalVar(); } const LAllocation* value() { return getOperand(0); } }; class LAsmJSLoadFuncPtr : public LInstructionHelper<1, 1, 0> {
--- a/js/src/jit/shared/LOpcodes-shared.h +++ b/js/src/jit/shared/LOpcodes-shared.h @@ -384,21 +384,21 @@ _(IsObjectAndBranch) \ _(HasClass) \ _(AsmSelect) \ _(AsmSelectI64) \ _(WasmLoad) \ _(WasmLoadI64) \ _(WasmStore) \ _(WasmBoundsCheck) \ + _(WasmLoadGlobalVar) \ + _(WasmStoreGlobalVar) \ _(AsmJSLoadHeap) \ _(AsmJSStoreHeap) \ _(AsmJSLoadFuncPtr) \ - _(AsmJSLoadGlobalVar) \ - _(AsmJSStoreGlobalVar) \ _(AsmJSLoadFFIFunc) \ _(AsmJSParameter) \ _(AsmJSReturn) \ _(AsmJSVoidReturn) \ _(AsmJSPassStackArg) \ _(AsmJSCall) \ _(AsmJSCompareExchangeHeap) \ _(AsmJSAtomicExchangeHeap) \
--- a/js/src/jit/x64/Assembler-x64.h +++ b/js/src/jit/x64/Assembler-x64.h @@ -822,21 +822,21 @@ class Assembler : public AssemblerX86Sha return CodeOffset(masm.vmovaps_rrip(dest.encoding()).offset()); } CodeOffset leaRipRelative(Register dest) { return CodeOffset(masm.leaq_rip(dest.encoding()).offset()); } void loadWasmActivation(Register dest) { CodeOffset label = loadRipRelativeInt64(dest); - append(AsmJSGlobalAccess(label, wasm::ActivationGlobalDataOffset)); + append(wasm::GlobalAccess(label, wasm::ActivationGlobalDataOffset)); } void loadAsmJSHeapRegisterFromGlobalData() { CodeOffset label = loadRipRelativeInt64(HeapReg); - append(AsmJSGlobalAccess(label, wasm::HeapGlobalDataOffset)); + append(wasm::GlobalAccess(label, wasm::HeapGlobalDataOffset)); } void cmpq(Register rhs, Register lhs) { masm.cmpq_rr(rhs.encoding(), lhs.encoding()); } void cmpq(Register rhs, const Operand& lhs) { switch (lhs.kind()) { case Operand::REG:
--- a/js/src/jit/x64/CodeGenerator-x64.cpp +++ b/js/src/jit/x64/CodeGenerator-x64.cpp @@ -1168,19 +1168,19 @@ CodeGeneratorX64::visitAsmJSAtomicBinopH else atomicBinopToTypedIntArray(op, accessType, ToRegister(value), srcAddr); 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 -CodeGeneratorX64::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins) +CodeGeneratorX64::visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins) { - MAsmJSLoadGlobalVar* mir = ins->mir(); + MWasmLoadGlobalVar* mir = ins->mir(); MIRType type = mir->type(); MOZ_ASSERT(IsNumberType(type) || IsSimdType(type)); CodeOffset label; switch (type) { case MIRType::Int32: label = masm.loadRipRelativeInt32(ToRegister(ins->output())); @@ -1200,26 +1200,26 @@ CodeGeneratorX64::visitAsmJSLoadGlobalVa case MIRType::Bool16x8: case MIRType::Bool32x4: label = masm.loadRipRelativeInt32x4(ToFloatRegister(ins->output())); break; case MIRType::Float32x4: label = masm.loadRipRelativeFloat32x4(ToFloatRegister(ins->output())); break; default: - MOZ_CRASH("unexpected type in visitAsmJSLoadGlobalVar"); + MOZ_CRASH("unexpected type in visitWasmLoadGlobalVar"); } - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); } void -CodeGeneratorX64::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins) +CodeGeneratorX64::visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins) { - MAsmJSStoreGlobalVar* mir = ins->mir(); + MWasmStoreGlobalVar* mir = ins->mir(); MIRType type = mir->value()->type(); MOZ_ASSERT(IsNumberType(type) || IsSimdType(type)); CodeOffset label; switch (type) { case MIRType::Int32: label = masm.storeRipRelativeInt32(ToRegister(ins->value())); @@ -1235,48 +1235,48 @@ CodeGeneratorX64::visitAsmJSStoreGlobalV case MIRType::Int32x4: case MIRType::Bool32x4: label = masm.storeRipRelativeInt32x4(ToFloatRegister(ins->value())); break; case MIRType::Float32x4: label = masm.storeRipRelativeFloat32x4(ToFloatRegister(ins->value())); break; default: - MOZ_CRASH("unexpected type in visitAsmJSStoreGlobalVar"); + MOZ_CRASH("unexpected type in visitWasmStoreGlobalVar"); } - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); } void CodeGeneratorX64::visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins) { const MAsmJSLoadFuncPtr* mir = ins->mir(); Register index = ToRegister(ins->index()); Register out = ToRegister(ins->output()); if (mir->hasLimit()) { masm.branch32(Assembler::Condition::AboveOrEqual, index, Imm32(mir->limit()), wasm::JumpTarget::OutOfBounds); } CodeOffset label = masm.loadRipRelativeInt64(out); - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); masm.loadPtr(Operand(out, index, ScalePointer, 0), out); } void CodeGeneratorX64::visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc* ins) { MAsmJSLoadFFIFunc* mir = ins->mir(); CodeOffset label = masm.loadRipRelativeInt64(ToRegister(ins->output())); - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); } void CodeGeneratorX64::visitTruncateDToInt32(LTruncateDToInt32* ins) { FloatRegister input = ToFloatRegister(ins->input()); Register output = ToRegister(ins->output());
--- a/js/src/jit/x64/CodeGenerator-x64.h +++ b/js/src/jit/x64/CodeGenerator-x64.h @@ -70,26 +70,26 @@ class CodeGeneratorX64 : public CodeGene void visitExtendInt32ToInt64(LExtendInt32ToInt64* lir); void visitWasmTruncateToInt64(LWasmTruncateToInt64* lir); void visitInt64ToFloatingPoint(LInt64ToFloatingPoint* lir); void visitLoadTypedArrayElementStatic(LLoadTypedArrayElementStatic* ins); void visitStoreTypedArrayElementStatic(LStoreTypedArrayElementStatic* ins); void visitWasmLoad(LWasmLoad* ins); void visitWasmLoadI64(LWasmLoadI64* ins); void visitWasmStore(LWasmStore* ins); + void visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins); + void visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins); void visitAsmSelectI64(LAsmSelectI64* ins); void visitAsmJSCall(LAsmJSCall* ins); void visitAsmJSLoadHeap(LAsmJSLoadHeap* ins); void visitAsmJSStoreHeap(LAsmJSStoreHeap* ins); void visitAsmJSCompareExchangeHeap(LAsmJSCompareExchangeHeap* ins); void visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins); void visitAsmJSAtomicBinopHeap(LAsmJSAtomicBinopHeap* ins); void visitAsmJSAtomicBinopHeapForEffect(LAsmJSAtomicBinopHeapForEffect* ins); - void visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins); - void visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins); void visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins); void visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc* ins); void visitAsmJSUInt32ToDouble(LAsmJSUInt32ToDouble* lir); void visitAsmJSUInt32ToFloat32(LAsmJSUInt32ToFloat32* lir); void visitAsmReinterpretFromI64(LAsmReinterpretFromI64* lir); void visitAsmReinterpretToI64(LAsmReinterpretToI64* lir); void visitTestI64AndBranch(LTestI64AndBranch* lir);
--- a/js/src/jit/x86/Assembler-x86.h +++ b/js/src/jit/x86/Assembler-x86.h @@ -917,17 +917,17 @@ class Assembler : public AssemblerX86Sha CodeOffset vmovupsWithPatch(FloatRegister src, PatchedAbsoluteAddress dest) { MOZ_ASSERT(HasSSE2()); masm.vmovups_rm(src.encoding(), dest.addr); return CodeOffset(masm.currentOffset()); } void loadWasmActivation(Register dest) { CodeOffset label = movlWithPatch(PatchedAbsoluteAddress(), dest); - append(AsmJSGlobalAccess(label, wasm::ActivationGlobalDataOffset)); + append(wasm::GlobalAccess(label, wasm::ActivationGlobalDataOffset)); } void loadAsmJSHeapRegisterFromGlobalData() { // x86 doesn't have a pinned heap register. } static bool canUseInSingleByteInstruction(Register reg) { return X86Encoding::HasSubregL(reg.encoding()); }
--- a/js/src/jit/x86/CodeGenerator-x86.cpp +++ b/js/src/jit/x86/CodeGenerator-x86.cpp @@ -826,19 +826,19 @@ CodeGeneratorX86::visitAsmJSAtomicBinopH Address memAddr(addrTemp, mir->offset()); if (value->isConstant()) atomicBinopToTypedIntArray(op, accessType, Imm32(ToInt32(value)), memAddr); else atomicBinopToTypedIntArray(op, accessType, ToRegister(value), memAddr); } void -CodeGeneratorX86::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins) +CodeGeneratorX86::visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins) { - MAsmJSLoadGlobalVar* mir = ins->mir(); + MWasmLoadGlobalVar* mir = ins->mir(); MIRType type = mir->type(); MOZ_ASSERT(IsNumberType(type) || IsSimdType(type)); CodeOffset label; switch (type) { case MIRType::Int32: label = masm.movlWithPatch(PatchedAbsoluteAddress(), ToRegister(ins->output())); break; @@ -857,25 +857,25 @@ CodeGeneratorX86::visitAsmJSLoadGlobalVa case MIRType::Bool16x8: case MIRType::Bool32x4: label = masm.vmovdqaWithPatch(PatchedAbsoluteAddress(), ToFloatRegister(ins->output())); break; case MIRType::Float32x4: label = masm.vmovapsWithPatch(PatchedAbsoluteAddress(), ToFloatRegister(ins->output())); break; default: - MOZ_CRASH("unexpected type in visitAsmJSLoadGlobalVar"); + MOZ_CRASH("unexpected type in visitWasmLoadGlobalVar"); } - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); } void -CodeGeneratorX86::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins) +CodeGeneratorX86::visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins) { - MAsmJSStoreGlobalVar* mir = ins->mir(); + MWasmStoreGlobalVar* mir = ins->mir(); MIRType type = mir->value()->type(); MOZ_ASSERT(IsNumberType(type) || IsSimdType(type)); CodeOffset label; switch (type) { case MIRType::Int32: label = masm.movlWithPatch(ToRegister(ins->value()), PatchedAbsoluteAddress()); @@ -891,48 +891,48 @@ CodeGeneratorX86::visitAsmJSStoreGlobalV case MIRType::Int32x4: case MIRType::Bool32x4: label = masm.vmovdqaWithPatch(ToFloatRegister(ins->value()), PatchedAbsoluteAddress()); break; case MIRType::Float32x4: label = masm.vmovapsWithPatch(ToFloatRegister(ins->value()), PatchedAbsoluteAddress()); break; default: - MOZ_CRASH("unexpected type in visitAsmJSStoreGlobalVar"); + MOZ_CRASH("unexpected type in visitWasmStoreGlobalVar"); } - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); } void CodeGeneratorX86::visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins) { const MAsmJSLoadFuncPtr* mir = ins->mir(); Register index = ToRegister(ins->index()); Register out = ToRegister(ins->output()); if (mir->hasLimit()) { masm.branch32(Assembler::Condition::AboveOrEqual, index, Imm32(mir->limit()), wasm::JumpTarget::OutOfBounds); } CodeOffset label = masm.movlWithPatch(PatchedAbsoluteAddress(), out); - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); masm.loadPtr(Operand(out, index, ScalePointer), out); } void CodeGeneratorX86::visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc* ins) { MAsmJSLoadFFIFunc* mir = ins->mir(); Register out = ToRegister(ins->output()); CodeOffset label = masm.movlWithPatch(PatchedAbsoluteAddress(), out); - masm.append(AsmJSGlobalAccess(label, mir->globalDataOffset())); + masm.append(wasm::GlobalAccess(label, mir->globalDataOffset())); } namespace js { namespace jit { class OutOfLineTruncate : public OutOfLineCodeBase<CodeGeneratorX86> { LTruncateDToInt32* ins_;
--- a/js/src/jit/x86/CodeGenerator-x86.h +++ b/js/src/jit/x86/CodeGenerator-x86.h @@ -55,24 +55,24 @@ class CodeGeneratorX86 : public CodeGene void visitAsmJSUInt32ToFloat32(LAsmJSUInt32ToFloat32* lir); void visitTruncateDToInt32(LTruncateDToInt32* ins); void visitTruncateFToInt32(LTruncateFToInt32* ins); void visitLoadTypedArrayElementStatic(LLoadTypedArrayElementStatic* ins); void visitStoreTypedArrayElementStatic(LStoreTypedArrayElementStatic* ins); void visitAsmJSCall(LAsmJSCall* ins); void visitWasmLoad(LWasmLoad* ins); void visitWasmStore(LWasmStore* ins); + void visitWasmLoadGlobalVar(LWasmLoadGlobalVar* ins); + void visitWasmStoreGlobalVar(LWasmStoreGlobalVar* ins); void visitAsmJSLoadHeap(LAsmJSLoadHeap* ins); void visitAsmJSStoreHeap(LAsmJSStoreHeap* ins); void visitAsmJSCompareExchangeHeap(LAsmJSCompareExchangeHeap* ins); void visitAsmJSAtomicExchangeHeap(LAsmJSAtomicExchangeHeap* ins); void visitAsmJSAtomicBinopHeap(LAsmJSAtomicBinopHeap* ins); void visitAsmJSAtomicBinopHeapForEffect(LAsmJSAtomicBinopHeapForEffect* ins); - void visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar* ins); - void visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar* ins); void visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr* ins); void visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc* ins); void visitWasmTruncateToInt32(LWasmTruncateToInt32* ins); void visitOutOfLineTruncate(OutOfLineTruncate* ool); void visitOutOfLineTruncateFloat32(OutOfLineTruncateFloat32* ool); private: