[JAEGER] Common function for computing obj slot refs; improved regalloc on GETGLOBAL.

This commit is contained in:
David Anderson 2010-05-30 14:37:18 -07:00
parent a822a2418e
commit aad4b0b970
4 changed files with 31 additions and 19 deletions

View File

@ -97,6 +97,20 @@ class BaseAssembler : public JSC::MacroAssembler
static const RegisterID FpReg = JSC::X86Registers::r11; static const RegisterID FpReg = JSC::X86Registers::r11;
#endif #endif
/*
* Finds and returns the address of a known object and slot.
*/
Address objSlotRef(JSObject *obj, RegisterID reg, uint32 slot) {
if (slot < JS_INITIAL_NSLOTS) {
void *vp = &obj->getSlotRef(slot);
move(ImmPtr(vp), reg);
return Address(reg, 0);
}
move(ImmPtr(&obj->dslots), reg);
loadPtr(reg, reg);
return Address(reg, (slot - JS_INITIAL_NSLOTS) * sizeof(Value));
}
/* /*
* Prepares for a stub call. * Prepares for a stub call.
*/ */

View File

@ -422,15 +422,8 @@ mjit::Compiler::jsop_setglobal(uint32 index)
bool popped = PC[JSOP_SETGLOBAL_LENGTH] == JSOP_POP; bool popped = PC[JSOP_SETGLOBAL_LENGTH] == JSOP_POP;
RegisterID reg = frame.allocReg(); RegisterID reg = frame.allocReg();
if (slot < JS_INITIAL_NSLOTS) { Address address = masm.objSlotRef(globalObj, reg, slot);
void *vp = &globalObj->getSlotRef(slot); frame.storeTo(fe, address, popped);
masm.move(ImmPtr(vp), reg);
frame.storeTo(fe, Address(reg, 0), popped);
} else {
masm.move(ImmPtr(&globalObj->dslots), reg);
masm.loadPtr(reg, reg);
frame.storeTo(fe, Address(reg, (slot - JS_INITIAL_NSLOTS) * sizeof(Value)), popped);
}
frame.freeReg(reg); frame.freeReg(reg);
} }
@ -441,16 +434,9 @@ mjit::Compiler::jsop_getglobal(uint32 index)
uint32 slot = script->getGlobalSlot(index); uint32 slot = script->getGlobalSlot(index);
RegisterID reg = frame.allocReg(); RegisterID reg = frame.allocReg();
if (slot < JS_INITIAL_NSLOTS) { Address address = masm.objSlotRef(globalObj, reg, slot);
void *vp = &globalObj->getSlotRef(slot);
masm.move(ImmPtr(vp), reg);
frame.push(Address(reg, 0));
} else {
masm.move(ImmPtr(&globalObj->dslots), reg);
masm.loadPtr(reg, reg);
frame.push(Address(reg, (slot - JS_INITIAL_NSLOTS) * sizeof(Value)));
}
frame.freeReg(reg); frame.freeReg(reg);
frame.push(address);
} }
void void

View File

@ -184,10 +184,19 @@ FrameState::push(Address address)
/* :XXX: X64 */ /* :XXX: X64 */
fe->resetUnsynced(); fe->resetUnsynced();
/* Prevent us from clobbering this reg. */
bool free = freeRegs.hasReg(address.base);
if (free)
freeRegs.takeReg(address.base);
RegisterID reg = alloc(fe, RematInfo::DATA, true); RegisterID reg = alloc(fe, RematInfo::DATA, true);
masm.loadData32(address, reg); masm.loadData32(address, reg);
fe->data.setRegister(reg); fe->data.setRegister(reg);
/* Now it's safe to grab this register again. */
if (free)
freeRegs.putReg(address.base);
reg = alloc(fe, RematInfo::TYPE, true); reg = alloc(fe, RematInfo::TYPE, true);
masm.loadTypeTag(address, reg); masm.loadTypeTag(address, reg);
fe->type.setRegister(reg); fe->type.setRegister(reg);

View File

@ -120,6 +120,9 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
return; return;
} }
/* Cannot clobber the address's register. */
JS_ASSERT(!freeRegs.hasReg(address.base));
if (fe->data.inRegister()) { if (fe->data.inRegister()) {
masm.storeData32(fe->data.reg(), addressOf(fe)); masm.storeData32(fe->data.reg(), addressOf(fe));
} else { } else {