mirror of
https://github.com/classilla/tenfourfox.git
synced 2025-01-03 20:30:00 +00:00
#371: passing jit tests in debug --ion-shared-stubs=on
This commit is contained in:
parent
9e3bc128db
commit
f7b2332518
@ -275,7 +275,8 @@ ICUnaryArith_Int32::Compiler::generateStubCode(MacroAssembler &masm)
|
|||||||
BufferOffset bo_failure2;
|
BufferOffset bo_failure2;
|
||||||
|
|
||||||
// Guard on int.
|
// Guard on int.
|
||||||
masm.cmpwi(R0.typeReg(), JSVAL_TAG_INT32);
|
masm.x_li32(r0, JSVAL_TAG_INT32);
|
||||||
|
masm.cmpw(R0.typeReg(), r0);
|
||||||
PPC_BC(Assembler::NotEqual, failure);
|
PPC_BC(Assembler::NotEqual, failure);
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
|
@ -130,8 +130,27 @@ EmitBaselineTailCallVM(JitCode *target, MacroAssembler &masm, uint32_t argSize)
|
|||||||
inline void
|
inline void
|
||||||
EmitIonTailCallVM(JitCode* target, MacroAssembler& masm, uint32_t stackSize)
|
EmitIonTailCallVM(JitCode* target, MacroAssembler& masm, uint32_t stackSize)
|
||||||
{
|
{
|
||||||
// XXX. When we do implement this, remember that MIPS now uses ra, not on-stack return addresses.
|
// Based on x86. As above, we assume during this that Baseline R0 and R1
|
||||||
MOZ_CRASH("Not implemented yet.");
|
// have been pushed, and that Baseline R2 is unused. The argregs will not
|
||||||
|
// be set until we actually call the VMWrapper, so we can trample R2's set.
|
||||||
|
ispew("[[ EmitIonTailCallVM");
|
||||||
|
|
||||||
|
// For tail calls, find the already pushed JitFrame_IonJS signifying the
|
||||||
|
// end of the Ion frame. Retrieve the length of the frame and repush
|
||||||
|
// JitFrame_IonJS with the extra stacksize, rendering the original
|
||||||
|
// JitFrame_IonJS obsolete.
|
||||||
|
MOZ_ASSERT(stackSize < 16383);
|
||||||
|
masm.lwz(r3, r1, stackSize);
|
||||||
|
masm.x_srwi(r3, r3, FRAMESIZE_SHIFT);
|
||||||
|
masm.addi(r3, r3, (stackSize + JitStubFrameLayout::Size() - sizeof(intptr_t)));
|
||||||
|
|
||||||
|
// Push frame descriptor and perform the tail call. The call is to
|
||||||
|
// Ion code, so it does not need to be ABI compliant.
|
||||||
|
// XXX: could be mtctr/mFD/push2/bctr
|
||||||
|
masm.makeFrameDescriptor(r3, JitFrame_IonJS);
|
||||||
|
masm.push2(r3, ICTailCallReg);
|
||||||
|
masm.branch(target);
|
||||||
|
ispew(" EmitIonTailCallVM ]]");
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
@ -164,8 +183,26 @@ EmitBaselineCallVM(JitCode *target, MacroAssembler &masm)
|
|||||||
inline void
|
inline void
|
||||||
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
|
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
|
||||||
{
|
{
|
||||||
// XXX. See EmitIonTailCallVM above.
|
// Based on x86.
|
||||||
MOZ_CRASH("Not implemented yet.");
|
ispew("[[ EmitIonCallVM");
|
||||||
|
|
||||||
|
// Stubs often use the return address, which is actually accounted by the
|
||||||
|
// caller of the stub, though in the stubcode we fake that it's part of the
|
||||||
|
// stub in order to make it possible to pop it. As a result we have to
|
||||||
|
// fix it here by subtracting it or else it would be counted twice.
|
||||||
|
uint32_t framePushed = masm.framePushed() - sizeof(void*);
|
||||||
|
|
||||||
|
uint32_t descriptor = MakeFrameDescriptor(framePushed, JitFrame_IonStub);
|
||||||
|
masm.Push(Imm32(descriptor));
|
||||||
|
masm.call(target);
|
||||||
|
|
||||||
|
// Remove rest of the frame left on the stack. We remove the return address
|
||||||
|
// which is implicitly popped when returning.
|
||||||
|
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
|
||||||
|
|
||||||
|
// Pop arguments from framePushed.
|
||||||
|
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
|
||||||
|
ispew(" EmitIonCallVM ]]");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size of values pushed by EmitEnterStubFrame.
|
// Size of values pushed by EmitEnterStubFrame.
|
||||||
@ -214,7 +251,10 @@ EmitBaselineEnterStubFrame(MacroAssembler &masm, Register scratch)
|
|||||||
inline void
|
inline void
|
||||||
EmitIonEnterStubFrame(MacroAssembler& masm, Register scratch)
|
EmitIonEnterStubFrame(MacroAssembler& masm, Register scratch)
|
||||||
{
|
{
|
||||||
MOZ_CRASH("Not implemented yet.");
|
MOZ_ASSERT(scratch != ICTailCallReg);
|
||||||
|
|
||||||
|
masm.lwz(ICTailCallReg, stackPointerRegister, 0);
|
||||||
|
masm.Push2(ICTailCallReg, ICStubReg);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
@ -248,7 +288,7 @@ EmitBaselineLeaveStubFrame(MacroAssembler &masm, bool calledIntoIon = false)
|
|||||||
inline void
|
inline void
|
||||||
EmitIonLeaveStubFrame(MacroAssembler& masm)
|
EmitIonLeaveStubFrame(MacroAssembler& masm)
|
||||||
{
|
{
|
||||||
MOZ_CRASH("Not implemented yet.");
|
masm.Pop2(ICStubReg, ICTailCallReg);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
|
Loading…
Reference in New Issue
Block a user