mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[JAEGER] Added common call functionality to BaseAssembler.
This commit is contained in:
parent
1faf352c4e
commit
035b69b6f3
@ -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 */
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user