From 091969f9b851de13f72c0884541ea47adc391caf Mon Sep 17 00:00:00 2001 From: Sean Stangl Date: Tue, 12 Oct 2010 20:08:40 -0400 Subject: [PATCH] Eliminate ImmutableSync on x64. b=601066, r=dvander. --- js/src/methodjit/FrameState.cpp | 35 +++++++++++++++++++++++++++++- js/src/methodjit/FrameState.h | 4 ++++ js/src/methodjit/ImmutableSync.cpp | 5 +++++ js/src/methodjit/ImmutableSync.h | 2 +- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/js/src/methodjit/FrameState.cpp b/js/src/methodjit/FrameState.cpp index 30d2f08d75e9..831455c61ea0 100644 --- a/js/src/methodjit/FrameState.cpp +++ b/js/src/methodjit/FrameState.cpp @@ -47,7 +47,10 @@ using namespace js::mjit; JS_STATIC_ASSERT(sizeof(FrameEntry) % 8 == 0); FrameState::FrameState(JSContext *cx, JSScript *script, Assembler &masm) - : cx(cx), script(script), masm(masm), entries(NULL), reifier(cx, *this), + : cx(cx), script(script), masm(masm), entries(NULL), +#if defined JS_NUNBOX32 + reifier(cx, *this), +#endif inTryBlock(false) { } @@ -78,8 +81,10 @@ FrameState::init(uint32 nargs) if (!cursor) return false; +#if defined JS_NUNBOX32 if (!reifier.init(nslots)) return false; +#endif entries = (FrameEntry *)cursor; cursor += sizeof(FrameEntry) * nslots; @@ -414,6 +419,7 @@ FrameState::assertValidRegisterState() const } #endif +#if defined JS_NUNBOX32 void FrameState::syncFancy(Assembler &masm, Registers avail, FrameEntry *resumeAt, FrameEntry *bottom) const @@ -427,6 +433,7 @@ FrameState::syncFancy(Assembler &masm, Registers avail, FrameEntry *resumeAt, reifier.sync(fe); } } +#endif void FrameState::sync(Assembler &masm, Uses uses) const @@ -489,12 +496,38 @@ FrameState::sync(Assembler &masm, Uses uses) const backing = fe->copyOf(); JS_ASSERT(!backing->isConstant() && !fe->isConstant()); +#if defined JS_PUNBOX64 + if ((!fe->type.synced() && backing->type.inMemory()) || + (!fe->data.synced() && backing->data.inMemory())) { + + RegisterID syncReg = Registers::ValueReg; + + /* Load the entire Value into syncReg. */ + if (backing->type.synced() && backing->data.synced()) { + masm.loadValue(addressOf(backing), syncReg); + } else if (backing->type.inMemory()) { + masm.loadTypeTag(addressOf(backing), syncReg); + masm.orPtr(backing->data.reg(), syncReg); + } else { + JS_ASSERT(backing->data.inMemory()); + masm.loadPayload(addressOf(backing), syncReg); + if (backing->isTypeKnown()) + masm.orPtr(ImmType(backing->getKnownType()), syncReg); + else + masm.orPtr(backing->type.reg(), syncReg); + } + + masm.storeValue(syncReg, addressOf(fe)); + continue; + } +#elif defined JS_NUNBOX32 /* Fall back to a slower sync algorithm if load required. */ if ((!fe->type.synced() && backing->type.inMemory()) || (!fe->data.synced() && backing->data.inMemory())) { syncFancy(masm, avail, fe, bottom); return; } +#endif } /* If a part still needs syncing, it is either a copy or constant. */ diff --git a/js/src/methodjit/FrameState.h b/js/src/methodjit/FrameState.h index a858fcf228e5..6f9692380dd7 100644 --- a/js/src/methodjit/FrameState.h +++ b/js/src/methodjit/FrameState.h @@ -807,8 +807,10 @@ class FrameState inline void swapInTracker(FrameEntry *lhs, FrameEntry *rhs); inline uint32 localIndex(uint32 n); void pushCopyOf(uint32 index); +#if defined JS_NUNBOX32 void syncFancy(Assembler &masm, Registers avail, FrameEntry *resumeAt, FrameEntry *bottom) const; +#endif inline bool tryFastDoubleLoad(FrameEntry *fe, FPRegisterID fpReg, Assembler &masm) const; void resetInternalState(); @@ -882,7 +884,9 @@ class FrameState */ RegisterState regstate[Assembler::TotalRegisters]; +#if defined JS_NUNBOX32 mutable ImmutableSync reifier; +#endif JSPackedBool *closedVars; bool eval; diff --git a/js/src/methodjit/ImmutableSync.cpp b/js/src/methodjit/ImmutableSync.cpp index 46260aef3029..04d26fdfb4f6 100644 --- a/js/src/methodjit/ImmutableSync.cpp +++ b/js/src/methodjit/ImmutableSync.cpp @@ -36,6 +36,9 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ + +#if defined JS_NUNBOX32 + #include "FrameEntry.h" #include "FrameState.h" #include "FrameState-inl.h" @@ -270,3 +273,5 @@ ImmutableSync::syncNormal(FrameEntry *fe) } } +#endif /* JS_NUNBOX32 */ + diff --git a/js/src/methodjit/ImmutableSync.h b/js/src/methodjit/ImmutableSync.h index 28234af2f6db..204dbab41891 100644 --- a/js/src/methodjit/ImmutableSync.h +++ b/js/src/methodjit/ImmutableSync.h @@ -37,7 +37,7 @@ * * ***** END LICENSE BLOCK ***** */ -#if !defined jsjaeger_imm_sync_h__ && defined JS_METHODJIT +#if !defined jsjaeger_imm_sync_h__ && defined JS_METHODJIT && defined JS_NUNBOX32 #define jsjaeger_imm_sync_h__ #include "methodjit/MachineRegs.h"