mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[JAEGER] Merge.
This commit is contained in:
commit
bc2301898a
@ -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 */
|
||||
|
||||
|
@ -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)));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user