mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[JAEGER] Common function for computing obj slot refs; improved regalloc on GETGLOBAL.
This commit is contained in:
parent
a822a2418e
commit
aad4b0b970
@ -97,6 +97,20 @@ class BaseAssembler : public JSC::MacroAssembler
|
||||
static const RegisterID FpReg = JSC::X86Registers::r11;
|
||||
#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.
|
||||
*/
|
||||
|
@ -422,15 +422,8 @@ mjit::Compiler::jsop_setglobal(uint32 index)
|
||||
bool popped = PC[JSOP_SETGLOBAL_LENGTH] == JSOP_POP;
|
||||
|
||||
RegisterID reg = frame.allocReg();
|
||||
if (slot < JS_INITIAL_NSLOTS) {
|
||||
void *vp = &globalObj->getSlotRef(slot);
|
||||
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);
|
||||
}
|
||||
Address address = masm.objSlotRef(globalObj, reg, slot);
|
||||
frame.storeTo(fe, address, popped);
|
||||
frame.freeReg(reg);
|
||||
}
|
||||
|
||||
@ -441,16 +434,9 @@ mjit::Compiler::jsop_getglobal(uint32 index)
|
||||
uint32 slot = script->getGlobalSlot(index);
|
||||
|
||||
RegisterID reg = frame.allocReg();
|
||||
if (slot < JS_INITIAL_NSLOTS) {
|
||||
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)));
|
||||
}
|
||||
Address address = masm.objSlotRef(globalObj, reg, slot);
|
||||
frame.freeReg(reg);
|
||||
frame.push(address);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -184,10 +184,19 @@ FrameState::push(Address address)
|
||||
/* :XXX: X64 */
|
||||
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);
|
||||
masm.loadData32(address, 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);
|
||||
masm.loadTypeTag(address, reg);
|
||||
fe->type.setRegister(reg);
|
||||
|
@ -120,6 +120,9 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Cannot clobber the address's register. */
|
||||
JS_ASSERT(!freeRegs.hasReg(address.base));
|
||||
|
||||
if (fe->data.inRegister()) {
|
||||
masm.storeData32(fe->data.reg(), addressOf(fe));
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user