Eliminate ImmutableSync on x64. b=601066, r=dvander.

This commit is contained in:
Sean Stangl 2010-10-12 20:08:40 -04:00
Родитель 2e0ab0d967
Коммит 091969f9b8
4 изменённых файлов: 44 добавлений и 2 удалений

Просмотреть файл

@ -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. */

Просмотреть файл

@ -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;

Просмотреть файл

@ -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 */

Просмотреть файл

@ -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"