[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
#define jsjaeger_baseassembler_h__
#include "jscntxt.h"
#include "jstl.h"
#include "assembler/assembler/MacroAssemblerCodeRef.h"
#include "assembler/assembler/MacroAssembler.h"
namespace js {
@ -47,7 +50,42 @@ namespace mjit {
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:
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 */

View File

@ -45,7 +45,7 @@ using namespace js;
using namespace mjit;
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);
void
JSC::MacroAssembler::Call
StubCompiler::scall(void *ptr)
{
void *pfun = getCallTarget(ptr);
/* PC -> regs->pc :( */
masm.storePtr(ImmPtr(cc.getPC()),
FrameAddress(offsetof(VMFrame, regs) + offsetof(JSFrameRegs, pc)));
@ -127,5 +129,7 @@ StubCompiler::scall(void *ptr)
/* VMFrame -> ArgReg0 */
masm.move(Assembler::stackPointerRegister, Registers::ArgReg0);
return masm.call(pfun);
}

View File

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