[JAEGER] Merge.

This commit is contained in:
David Anderson 2010-06-14 13:36:05 -07:00
commit bc2301898a
8 changed files with 149 additions and 47 deletions

View File

@ -95,23 +95,26 @@ class BaseAssembler : public JSC::MacroAssembler
startLabel = label();
}
void load32FromImm(void *ptr, RegisterID reg) {
load32(ptr, reg);
}
/* Total number of floating-point registers. */
static const uint32 TotalFPRegisters = FPRegisters::TotalFPRegisters;
/*
* FpReg is used to home the current JSStackFrame*.
* JSFrameReg is used to home the current JSStackFrame*.
*/
#if defined(JS_CPU_X86) || defined(JS_CPU_X64)
static const RegisterID FpReg = JSC::X86Registers::ebx;
static const RegisterID JSFrameReg = JSC::X86Registers::ebx;
#elif defined(JS_CPU_ARM)
static const RegisterID FpReg = JSC::X86Registers::r11;
static const RegisterID JSFrameReg = JSC::X86Registers::r11;
#endif
size_t distanceOf(Label l) {
return differenceBetween(startLabel, l);
}
void load32FromImm(void *ptr, RegisterID reg) {
load32(ptr, reg);
}
/*
* Finds and returns the address of a known object and slot.
*/
@ -194,7 +197,7 @@ class BaseAssembler : public JSC::MacroAssembler
void fixScriptStack(uint32 frameDepth) {
/* sp = fp + slots() + stackDepth */
addPtr(Imm32(sizeof(JSStackFrame) + frameDepth * sizeof(jsval)),
FpReg,
JSFrameReg,
ClobberInCall);
/* regs->sp = sp */
@ -239,6 +242,9 @@ class BaseAssembler : public JSC::MacroAssembler
}
};
/* Save some typing. */
const JSC::MacroAssembler::RegisterID JSFrameReg = BaseAssembler::JSFrameReg;
} /* namespace js */
} /* namespace mjit */

View File

@ -333,7 +333,7 @@ mjit::Compiler::generateMethod()
BEGIN_CASE(JSOP_SETRVAL)
{
FrameEntry *fe = frame.peek(-1);
frame.storeTo(fe, Address(Assembler::FpReg, offsetof(JSStackFrame, rval)), true);
frame.storeTo(fe, Address(JSFrameReg, offsetof(JSStackFrame, rval)), true);
frame.pop();
}
END_CASE(JSOP_POPV)
@ -342,7 +342,7 @@ mjit::Compiler::generateMethod()
{
/* Safe point! */
FrameEntry *fe = frame.peek(-1);
frame.storeTo(fe, Address(Assembler::FpReg, offsetof(JSStackFrame, rval)), true);
frame.storeTo(fe, Address(JSFrameReg, offsetof(JSStackFrame, rval)), true);
frame.pop();
/* :TODO: We only have to forget things that are closed over... */
frame.forgetEverything();
@ -873,7 +873,7 @@ mjit::Compiler::generateMethod()
bool popped = PC[JSOP_SETARG_LENGTH] == JSOP_POP;
RegisterID reg = frame.allocReg();
masm.loadPtr(Address(Assembler::FpReg, offsetof(JSStackFrame, argv)), reg);
masm.loadPtr(Address(JSFrameReg, offsetof(JSStackFrame, argv)), reg);
Address address = Address(reg, slot * sizeof(Value));
frame.storeTo(top, address, popped);
frame.freeReg(reg);
@ -1061,7 +1061,7 @@ mjit::Compiler::generateMethod()
{
// :FIXME: x64
RegisterID reg = frame.allocReg();
masm.loadPtr(Address(Assembler::FpReg, offsetof(JSStackFrame, argv)), reg);
masm.loadPtr(Address(JSFrameReg, offsetof(JSStackFrame, argv)), reg);
masm.loadData32(Address(reg, int32(sizeof(Value)) * -2), reg);
masm.loadPtr(Address(reg, offsetof(JSObject, dslots)), reg);
frame.freeReg(reg);
@ -1454,7 +1454,7 @@ mjit::Compiler::dispatchCall(VoidPtrStubUInt32 stub)
void
mjit::Compiler::restoreFrameRegs()
{
masm.loadPtr(FrameAddress(offsetof(VMFrame, fp)), Assembler::FpReg);
masm.loadPtr(FrameAddress(offsetof(VMFrame, fp)), JSFrameReg);
}
bool
@ -1555,7 +1555,7 @@ void
mjit::Compiler::jsop_getarg(uint32 index)
{
RegisterID reg = frame.allocReg();
masm.loadPtr(Address(Assembler::FpReg, offsetof(JSStackFrame, argv)), reg);
masm.loadPtr(Address(JSFrameReg, offsetof(JSStackFrame, argv)), reg);
frame.freeReg(reg);
frame.push(Address(reg, index * sizeof(Value)));
}

View File

@ -76,7 +76,13 @@ FrameState::popn(uint32 n)
inline JSC::MacroAssembler::RegisterID
FrameState::allocReg()
{
return alloc();
RegisterID reg;
if (!freeRegs.empty())
reg = freeRegs.takeAnyReg();
else
reg = evictSomething();
regstate[reg].fe = NULL;
return reg;
}
inline JSC::MacroAssembler::RegisterID
@ -92,19 +98,7 @@ FrameState::allocReg(uint32 mask)
}
inline JSC::MacroAssembler::RegisterID
FrameState::alloc()
{
RegisterID reg;
if (!freeRegs.empty())
reg = freeRegs.takeAnyReg();
else
reg = evictSomething();
regstate[reg].fe = NULL;
return reg;
}
inline JSC::MacroAssembler::RegisterID
FrameState::alloc(FrameEntry *fe, RematInfo::RematType type, bool weak)
FrameState::allocReg(FrameEntry *fe, RematInfo::RematType type, bool weak)
{
RegisterID reg;
if (!freeRegs.empty())
@ -218,7 +212,7 @@ FrameState::push(Address address)
if (free)
freeRegs.takeReg(address.base);
RegisterID reg = alloc(fe, RematInfo::DATA, true);
RegisterID reg = allocReg(fe, RematInfo::DATA, true);
masm.loadData32(address, reg);
fe->data.setRegister(reg);
@ -226,7 +220,7 @@ FrameState::push(Address address)
if (free)
freeRegs.putReg(address.base);
reg = alloc(fe, RematInfo::TYPE, true);
reg = allocReg(fe, RematInfo::TYPE, true);
masm.loadTypeTag(address, reg);
fe->type.setRegister(reg);
}
@ -292,7 +286,7 @@ FrameState::tempRegForType(FrameEntry *fe)
/* :XXX: X64 */
RegisterID reg = alloc(fe, RematInfo::TYPE, true);
RegisterID reg = allocReg(fe, RematInfo::TYPE, true);
masm.loadTypeTag(addressOf(fe), reg);
fe->type.setRegister(reg);
return reg;
@ -309,7 +303,7 @@ FrameState::tempRegForData(FrameEntry *fe)
if (fe->data.inRegister())
return fe->data.reg();
RegisterID reg = alloc(fe, RematInfo::DATA, true);
RegisterID reg = allocReg(fe, RematInfo::DATA, true);
masm.loadData32(addressOf(fe), reg);
fe->data.setRegister(reg);
return reg;
@ -415,7 +409,7 @@ FrameState::addressOf(const FrameEntry *fe) const
uint32 index = (fe - entries);
JS_ASSERT(index >= nargs);
index -= nargs;
return Address(Assembler::FpReg, sizeof(JSStackFrame) + sizeof(Value) * index);
return Address(JSFrameReg, sizeof(JSStackFrame) + sizeof(Value) * index);
}
inline JSC::MacroAssembler::Jump

View File

@ -194,7 +194,7 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
masm.storeData32(fe->data.reg(), address);
} else {
JS_ASSERT(fe->data.inMemory());
RegisterID reg = popped ? alloc() : alloc(fe, RematInfo::DATA, true);
RegisterID reg = popped ? allocReg() : allocReg(fe, RematInfo::DATA, true);
masm.loadData32(addressOf(fe), reg);
masm.storeData32(reg, address);
if (popped)
@ -209,7 +209,7 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
masm.storeTypeTag(fe->type.reg(), address);
} else {
JS_ASSERT(fe->type.inMemory());
RegisterID reg = popped ? alloc() : alloc(fe, RematInfo::TYPE, true);
RegisterID reg = popped ? allocReg() : allocReg(fe, RematInfo::TYPE, true);
masm.loadTypeTag(addressOf(fe), reg);
masm.storeTypeTag(reg, address);
if (popped)
@ -644,14 +644,14 @@ FrameState::copyData(FrameEntry *fe)
fe->data.setMemory();
regstate[reg].fe = NULL;
} else {
RegisterID newReg = alloc();
RegisterID newReg = allocReg();
masm.move(reg, newReg);
reg = newReg;
}
return reg;
}
RegisterID reg = alloc();
RegisterID reg = allocReg();
if (!freeRegs.empty())
masm.move(tempRegForData(fe), reg);
@ -726,7 +726,7 @@ FrameState::ownRegForData(FrameEntry *fe)
backing->data.setMemory();
moveOwnership(reg, NULL);
} else {
reg = alloc();
reg = allocReg();
masm.move(backing->data.reg(), reg);
}
return reg;
@ -735,7 +735,7 @@ FrameState::ownRegForData(FrameEntry *fe)
if (fe->isCopied()) {
uncopy(fe);
if (fe->isCopied()) {
reg = alloc();
reg = allocReg();
masm.loadData32(addressOf(fe), reg);
return reg;
}
@ -750,7 +750,7 @@ FrameState::ownRegForData(FrameEntry *fe)
fe->data.invalidate();
} else {
JS_ASSERT(fe->data.inMemory());
reg = alloc();
reg = allocReg();
masm.loadData32(addressOf(fe), reg);
}
return reg;

View File

@ -401,8 +401,7 @@ class FrameState
Address addressOf(const FrameEntry *fe) const;
private:
inline RegisterID alloc();
inline RegisterID alloc(FrameEntry *fe, RematInfo::RematType type, bool weak);
inline RegisterID allocReg(FrameEntry *fe, RematInfo::RematType type, bool weak);
inline void forgetReg(RegisterID reg);
RegisterID evictSomething(uint32 mask);
void evictReg(RegisterID reg);

View File

@ -162,11 +162,11 @@ struct Registers {
freeMask = AvailRegs;
}
bool empty() {
bool empty() const {
return !freeMask;
}
bool empty(uint32 mask) {
bool empty(uint32 mask) const {
return !(freeMask & mask);
}
@ -214,6 +214,109 @@ struct Registers {
uint32 freeMask;
};
struct FPRegisters {
typedef JSC::MacroAssembler::FPRegisterID FPRegisterID;
#if defined(JS_CPU_X86) || defined(JS_CPU_X64)
static const uint32 TotalFPRegisters = 8;
static const uint32 TempFPRegs =
(1 << JSC::X86Registers::xmm0)
| (1 << JSC::X86Registers::xmm1)
| (1 << JSC::X86Registers::xmm2)
| (1 << JSC::X86Registers::xmm3)
| (1 << JSC::X86Registers::xmm4)
| (1 << JSC::X86Registers::xmm5)
| (1 << JSC::X86Registers::xmm6)
| (1 << JSC::X86Registers::xmm7);
#elif defined(JS_CPU_ARM)
static const uint32 TotalFPRegisters = 4;
static const uint32 TempFPRegs =
(1 << JSC::ARMRegisters::d0)
| (1 << JSC::ARMRegisters::d1)
| (1 << JSC::ARMRegisters::d2)
| (1 << JSC::ARMRegisters::d3);
#else
# error "Unsupported platform"
#endif
static const uint32 AvailFPRegs = TempFPRegs;
FPRegisters()
: freeFPMask(AvailFPRegs)
{ }
FPRegisters(uint32 freeFPMask)
: freeFPMask(freeFPMask)
{ }
FPRegisters(const FPRegisters &other)
: freeFPMask(other.freeFPMask)
{ }
FPRegisters & operator =(const FPRegisters &other)
{
freeFPMask = other.freeFPMask;
return *this;
}
void reset() {
freeFPMask = AvailFPRegs;
}
bool empty() const {
return !freeFPMask;
}
bool empty(uint32 mask) const {
return !(freeFPMask & mask);
}
FPRegisterID takeAnyReg() {
JS_ASSERT(!empty());
FPRegisterID reg = (FPRegisterID)(31 - js_bitscan_clz32(freeFPMask));
takeReg(reg);
return reg;
}
bool hasRegInMask(uint32 mask) const {
FPRegisters temp(freeFPMask & mask);
return !temp.empty();
}
FPRegisterID takeRegInMask(uint32 mask) {
FPRegisters temp(freeFPMask & mask);
FPRegisterID reg = temp.takeAnyReg();
takeReg(reg);
return reg;
}
bool hasReg(FPRegisterID fpreg) const {
return !!(freeFPMask & (1 << fpreg));
}
void putRegUnchecked(FPRegisterID fpreg) {
freeFPMask |= (1 << fpreg);
}
void putReg(FPRegisterID fpreg) {
JS_ASSERT(!hasReg(fpreg));
putRegUnchecked(fpreg);
}
void takeReg(FPRegisterID fpreg) {
JS_ASSERT(hasReg(fpreg));
freeFPMask &= ~(1 << fpreg);
}
bool operator ==(const FPRegisters &other) {
return freeFPMask == other.freeFPMask;
}
uint32 freeFPMask;
};
} /* namespace mjit */
} /* namespace js */

View File

@ -316,7 +316,7 @@ SYMBOL_STRING(JaegerTrampoline) ":" "\n"
" push {r11}" "\n" /* inlineCallCount */
" push {r0}" "\n" /* cx */
" push {r1}" "\n" /* fp */
" mov r11, r1" "\n" /* FpReg */
" mov r11, r1" "\n" /* JSFrameReg */
/* Leave space for the VMFrame arguments. The largest slot appears to be 8 bytes for 32-bit
* architectures, though hard-coding this doesn't seem sensible. TODO: Use sizeof here and for

View File

@ -53,7 +53,7 @@ void
mjit::Compiler::jsop_bindname(uint32 index)
{
RegisterID reg = frame.allocReg();
Address scopeChain(Assembler::FpReg, offsetof(JSStackFrame, scopeChain));
Address scopeChain(JSFrameReg, offsetof(JSStackFrame, scopeChain));
masm.loadData32(scopeChain, reg);
Address address(reg, offsetof(JSObject, fslots) + JSSLOT_PARENT * sizeof(jsval));
@ -745,7 +745,7 @@ mjit::Compiler::jsop_localinc(JSOp op, uint32 slot, bool popped)
/* Note, stub call will push original value again no matter what. */
stubcc.leave();
stubcc.masm.addPtr(Imm32(sizeof(Value) * slot + sizeof(JSStackFrame)),
Assembler::FpReg,
JSFrameReg,
Registers::ArgReg1);
stubcc.vpInc(op, depth);
@ -784,7 +784,7 @@ mjit::Compiler::jsop_arginc(JSOp op, uint32 slot, bool popped)
ovf = masm.branchSub32(Assembler::Overflow, Imm32(1), reg);
stubcc.linkExit(ovf);
Address argv(Assembler::FpReg, offsetof(JSStackFrame, argv));
Address argv(JSFrameReg, offsetof(JSStackFrame, argv));
stubcc.leave();
stubcc.masm.loadPtr(argv, Registers::ArgReg1);