[JAEGER] Added common call functionality to BaseAssembler.

This commit is contained in:
David Anderson 2010-05-26 17:49:34 -07:00
parent 1faf352c4e
commit 035b69b6f3
3 changed files with 50 additions and 5 deletions

View File

@ -40,6 +40,9 @@
#if !defined jsjaeger_baseassembler_h__ && defined JS_METHODJIT #if !defined jsjaeger_baseassembler_h__ && defined JS_METHODJIT
#define jsjaeger_baseassembler_h__ #define jsjaeger_baseassembler_h__
#include "jscntxt.h"
#include "jstl.h"
#include "assembler/assembler/MacroAssemblerCodeRef.h"
#include "assembler/assembler/MacroAssembler.h" #include "assembler/assembler/MacroAssembler.h"
namespace js { namespace js {
@ -47,7 +50,42 @@ namespace mjit {
class BaseAssembler : public JSC::MacroAssembler class BaseAssembler : public JSC::MacroAssembler
{ {
struct CallPatch {
CallPatch(ptrdiff_t distance, void *fun)
: distance(distance), fun(fun)
{ }
ptrdiff_t distance;
JSC::FunctionPtr fun;
};
/* :TODO: OOM */
Label startLabel;
Vector<CallPatch, 64, SystemAllocPolicy> callPatches;
public: public:
BaseAssembler()
: callPatches(SystemAllocPolicy())
{
startLabel = label();
}
Call call(void *fun) {
#if defined(_MSC_VER) && defined(_M_X64)
masm.subPtr(JSC::MacroAssembler::Imm32(32),
JSC::MacroAssembler::stackPointerRegister);
#endif
Call cl = JSC::MacroAssembler::call();
#if defined(_MSC_VER) && defined(_M_X64)
masm.addPtr(JSC::MacroAssembler::Imm32(32),
JSC::MacroAssembler::stackPointerRegister);
#endif
callPatches.append(CallPatch(differenceBetween(startLabel, cl), fun));
return cl;
}
}; };
} /* namespace js */ } /* namespace js */

View File

@ -45,7 +45,7 @@ using namespace js;
using namespace mjit; using namespace mjit;
StubCompiler::StubCompiler(JSContext *cx, mjit::Compiler &cc, FrameState &frame, JSScript *script) StubCompiler::StubCompiler(JSContext *cx, mjit::Compiler &cc, FrameState &frame, JSScript *script)
: cx(cx), cc(cc), frame(frame), script(script), exits(ContextAllocPolicy(cx)) : cx(cx), cc(cc), frame(frame), script(script), exits(SystemAllocPolicy())
{ {
} }
@ -109,9 +109,11 @@ static const RegisterID ClobberInCall = JSC::ARMRegisters::r2;
JS_STATIC_ASSERT(ClobberInCall != Registers::ArgReg1); JS_STATIC_ASSERT(ClobberInCall != Registers::ArgReg1);
void JSC::MacroAssembler::Call
StubCompiler::scall(void *ptr) StubCompiler::scall(void *ptr)
{ {
void *pfun = getCallTarget(ptr);
/* PC -> regs->pc :( */ /* PC -> regs->pc :( */
masm.storePtr(ImmPtr(cc.getPC()), masm.storePtr(ImmPtr(cc.getPC()),
FrameAddress(offsetof(VMFrame, regs) + offsetof(JSFrameRegs, pc))); FrameAddress(offsetof(VMFrame, regs) + offsetof(JSFrameRegs, pc)));
@ -127,5 +129,7 @@ StubCompiler::scall(void *ptr)
/* VMFrame -> ArgReg0 */ /* VMFrame -> ArgReg0 */
masm.move(Assembler::stackPointerRegister, Registers::ArgReg0); masm.move(Assembler::stackPointerRegister, Registers::ArgReg0);
return masm.call(pfun);
} }

View File

@ -58,6 +58,7 @@ struct StubCallInfo {
class StubCompiler class StubCompiler
{ {
typedef JSC::MacroAssembler::Call Call;
typedef JSC::MacroAssembler::Jump Jump; typedef JSC::MacroAssembler::Jump Jump;
typedef JSC::MacroAssembler::Label Label; typedef JSC::MacroAssembler::Label Label;
@ -75,16 +76,18 @@ class StubCompiler
FrameState &frame; FrameState &frame;
JSScript *script; JSScript *script;
Assembler masm; Assembler masm;
Vector<ExitPatch, 64, ContextAllocPolicy> exits; Vector<ExitPatch, 64, SystemAllocPolicy> exits;
public: public:
StubCompiler(JSContext *cx, mjit::Compiler &cc, FrameState &frame, JSScript *script); StubCompiler(JSContext *cx, mjit::Compiler &cc, FrameState &frame, JSScript *script);
void linkExit(Jump j); void linkExit(Jump j);
void syncAndSpill(); void syncAndSpill();
void call(JSObjStub stub) { scall(JS_FUNC_TO_DATA_PTR(void *, stub)); } Call call(JSObjStub stub) {
return scall(JS_FUNC_TO_DATA_PTR(void *, stub));
}
private: private:
void scall(void *ptr); Call scall(void *ptr);
void *getCallTarget(void *fun); void *getCallTarget(void *fun);
}; };