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
|
||||
#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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user