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;
|
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.
|
||||||
*/
|
*/
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user