- create CreateCall helper to get rid of a lot of the cc.call boilerplate
This commit is contained in:
parent
f61df60240
commit
61735ddd8b
7 changed files with 97 additions and 175 deletions
|
|
@ -23,8 +23,7 @@ void JitCompiler::EmitLKF()
|
|||
|
||||
void JitCompiler::EmitLKS()
|
||||
{
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(CallAssignString))),
|
||||
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||
auto call = CreateCall<void, FString*, FString*>(&JitCompiler::CallAssignString);
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, asmjit::imm(ToMemAddress(konsts + BC)));
|
||||
}
|
||||
|
|
@ -60,8 +59,7 @@ void JitCompiler::EmitLKS_R()
|
|||
static_assert(sizeof(FString) == 4, "sizeof(FString) needs to be 4");
|
||||
cc.lea(ptr, asmjit::x86::ptr(base, regD[B], 2));
|
||||
#endif
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(CallAssignString))),
|
||||
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||
auto call = CreateCall<void, FString*, FString*>(&JitCompiler::CallAssignString);
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, ptr);
|
||||
}
|
||||
|
|
@ -86,36 +84,26 @@ void JitCompiler::EmitLFP()
|
|||
|
||||
void JitCompiler::EmitMETA()
|
||||
{
|
||||
typedef void*(*FuncPtr)(void*);
|
||||
|
||||
auto label = cc.newLabel();
|
||||
cc.test(regA[B], regA[B]);
|
||||
cc.jne(label);
|
||||
EmitThrowException(X_READ_NIL);
|
||||
cc.bind(label);
|
||||
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](void *o) -> void*
|
||||
{
|
||||
return static_cast<DObject*>(o)->GetClass()->Meta;
|
||||
}))), asmjit::FuncSignature1<void*, void*>());
|
||||
auto call = CreateCall<uint8_t*, DObject*>([](DObject *o) { return o->GetClass()->Meta; });
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, regA[B]);
|
||||
}
|
||||
|
||||
void JitCompiler::EmitCLSS()
|
||||
{
|
||||
typedef void*(*FuncPtr)(void*);
|
||||
|
||||
auto label = cc.newLabel();
|
||||
cc.test(regA[B], regA[B]);
|
||||
cc.jne(label);
|
||||
EmitThrowException(X_READ_NIL);
|
||||
cc.bind(label);
|
||||
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](void *o) -> void*
|
||||
{
|
||||
return static_cast<DObject*>(o)->GetClass();
|
||||
}))), asmjit::FuncSignature1<void*, void*>());
|
||||
auto call = CreateCall<PClass*, DObject*>([](DObject *o) { return o->GetClass(); });
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, regA[B]);
|
||||
}
|
||||
|
|
@ -212,8 +200,7 @@ void JitCompiler::EmitLS()
|
|||
EmitNullPointerThrow(B, X_READ_NIL);
|
||||
auto ptr = cc.newIntPtr();
|
||||
cc.lea(ptr, asmjit::x86::ptr(regA[B], konstd[C]));
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(CallAssignString))),
|
||||
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||
auto call = CreateCall<void, FString*, FString*>(&JitCompiler::CallAssignString);
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, ptr);
|
||||
}
|
||||
|
|
@ -223,8 +210,7 @@ void JitCompiler::EmitLS_R()
|
|||
EmitNullPointerThrow(B, X_READ_NIL);
|
||||
auto ptr = cc.newIntPtr();
|
||||
cc.lea(ptr, asmjit::x86::ptr(regA[B], regD[C]));
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(CallAssignString))),
|
||||
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||
auto call = CreateCall<void, FString*, FString*>(&JitCompiler::CallAssignString);
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, ptr);
|
||||
}
|
||||
|
|
@ -236,12 +222,7 @@ void JitCompiler::EmitLO()
|
|||
auto ptr = cc.newIntPtr();
|
||||
cc.mov(ptr, asmjit::x86::ptr(regA[B], konstd[C]));
|
||||
|
||||
typedef void*(*FuncPtr)(void*);
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](void *ptr) -> void*
|
||||
{
|
||||
DObject *p = static_cast<DObject *>(ptr);
|
||||
return GC::ReadBarrier(p);
|
||||
}))), asmjit::FuncSignature1<void*, void*>());
|
||||
auto call = CreateCall<DObject*,DObject*>([](DObject *p) { return GC::ReadBarrier(p); });
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, ptr);
|
||||
}
|
||||
|
|
@ -253,12 +234,7 @@ void JitCompiler::EmitLO_R()
|
|||
auto ptr = cc.newIntPtr();
|
||||
cc.mov(ptr, asmjit::x86::ptr(regA[B], regD[C]));
|
||||
|
||||
typedef void*(*FuncPtr)(void*);
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](void *ptr) -> void*
|
||||
{
|
||||
DObject *p = static_cast<DObject *>(ptr);
|
||||
return GC::ReadBarrier(p);
|
||||
}))), asmjit::FuncSignature1<void*, void*>());
|
||||
auto call = CreateCall<DObject*, DObject*>([](DObject *p) { return GC::ReadBarrier(p); });
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, ptr);
|
||||
}
|
||||
|
|
@ -322,11 +298,7 @@ void JitCompiler::EmitLCS()
|
|||
EmitNullPointerThrow(B, X_READ_NIL);
|
||||
auto ptr = cc.newIntPtr();
|
||||
cc.lea(ptr, asmjit::x86::ptr(regA[B], konstd[C]));
|
||||
auto loadLambda = [](FString* to, char** from) -> void {
|
||||
*to = *from;
|
||||
};
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, char**)>(loadLambda))),
|
||||
asmjit::FuncSignature2<void, FString*, char**>(asmjit::CallConv::kIdHostCDecl));
|
||||
auto call = CreateCall<void, FString*, char**>([](FString* to, char** from) { *to = *from; });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, ptr);
|
||||
}
|
||||
|
|
@ -336,11 +308,7 @@ void JitCompiler::EmitLCS_R()
|
|||
EmitNullPointerThrow(B, X_READ_NIL);
|
||||
auto ptr = cc.newIntPtr();
|
||||
cc.lea(ptr, asmjit::x86::ptr(regA[B], regD[C]));
|
||||
auto loadLambda = [](FString* to, char** from) -> void {
|
||||
*to = *from;
|
||||
};
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, char**)>(loadLambda))),
|
||||
asmjit::FuncSignature2<void, FString*, char**>(asmjit::CallConv::kIdHostCDecl));
|
||||
auto call = CreateCall<void, FString*, char**>([](FString* to, char** from) { *to = *from; });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, ptr);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue