From aad4b0b970c6f2b105873dfd206598b7e262a592 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 30 May 2010 14:37:18 -0700 Subject: [PATCH] [JAEGER] Common function for computing obj slot refs; improved regalloc on GETGLOBAL. --- js/src/methodjit/BaseAssembler.h | 14 ++++++++++++++ js/src/methodjit/Compiler.cpp | 22 ++++------------------ js/src/methodjit/FrameState-inl.h | 11 ++++++++++- js/src/methodjit/FrameState.cpp | 3 +++ 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/js/src/methodjit/BaseAssembler.h b/js/src/methodjit/BaseAssembler.h index 1330ba3cfd3..f3a9ccab21b 100644 --- a/js/src/methodjit/BaseAssembler.h +++ b/js/src/methodjit/BaseAssembler.h @@ -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. */ diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 3bf261c559e..f4be4c47c6b 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -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 diff --git a/js/src/methodjit/FrameState-inl.h b/js/src/methodjit/FrameState-inl.h index bb616abf9d0..0db804b546f 100644 --- a/js/src/methodjit/FrameState-inl.h +++ b/js/src/methodjit/FrameState-inl.h @@ -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); diff --git a/js/src/methodjit/FrameState.cpp b/js/src/methodjit/FrameState.cpp index 4ab3ce2bcfd..2a4fd69c138 100644 --- a/js/src/methodjit/FrameState.cpp +++ b/js/src/methodjit/FrameState.cpp @@ -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 {