- 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
|
|
@ -15,8 +15,7 @@ void JitCompiler::EmitMOVEF()
|
|||
|
||||
void JitCompiler::EmitMOVES()
|
||||
{
|
||||
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, regS[B]);
|
||||
}
|
||||
|
|
@ -41,31 +40,6 @@ void JitCompiler::EmitMOVEV3()
|
|||
|
||||
void JitCompiler::EmitCAST()
|
||||
{
|
||||
static void (*i2s)(FString *a, int b) = [](FString *a, int b) { a->Format("%d", b); };
|
||||
static void (*u2s)(FString *a, int b) = [](FString *a, int b) { a->Format("%u", b); };
|
||||
static void (*f2s)(FString *a, double b) = [](FString *a, double b) { a->Format("%.5f", b); };
|
||||
static void (*v22s)(FString *a, double b, double b1) = [](FString *a, double b, double b1) { a->Format("(%.5f, %.5f)", b, b1); };
|
||||
static void (*v32s)(FString *a, double b, double b1, double b2) = [](FString *a, double b, double b1, double b2) { a->Format("(%.5f, %.5f, %.5f)", b, b1, b2); };
|
||||
static void (*p2s)(FString *a, void *b) = [](FString *a, void *b) { if (b == nullptr) *a = "null"; else a->Format("%p", b); };
|
||||
static int (*s2i)(FString *b) = [](FString *b) -> int { return (VM_SWORD)b->ToLong(); };
|
||||
static double (*s2f)(FString *b) = [](FString *b) -> double { return b->ToDouble(); };
|
||||
static int (*s2n)(FString *b) = [](FString *b) -> int { return b->Len() == 0 ? FName(NAME_None) : FName(*b); };
|
||||
static void (*n2s)(FString *a, int b) = [](FString *a, int b) { FName name = FName(ENamedName(b)); *a = name.IsValidName() ? name.GetChars() : ""; };
|
||||
static int (*s2co)(FString *b) = [](FString *b) -> int { return V_GetColor(nullptr, *b); };
|
||||
static void (*co2s)(FString *a, int b) = [](FString *a, int b) { PalEntry c(b); a->Format("%02x %02x %02x", c.r, c.g, c.b); };
|
||||
static int (*s2so)(FString *b) = [](FString *b) -> int { return FSoundID(*b); };
|
||||
static void (*so2s)(FString *a, int b) = [](FString *a, int b) { *a = S_sfx[b].name; };
|
||||
static void (*sid2s)(FString *a, unsigned int b) = [](FString *a, unsigned int b) { *a = (b >= sprites.Size()) ? "TNT1" : sprites[b].name; };
|
||||
static void (*tid2s)(FString *a, int b) = [](FString *a, int b) { auto tex = TexMan[*(FTextureID*)&b]; *a = (tex == nullptr) ? "(null)" : tex->Name.GetChars(); };
|
||||
|
||||
typedef asmjit::FuncSignature2<void, FString*, int> FuncI2S, FuncU2S, FuncN2S, FuncCo2S, FuncSo2S, FuncSid2S, FuncTid2S;
|
||||
typedef asmjit::FuncSignature2<void, FString*, double> FuncF2S;
|
||||
typedef asmjit::FuncSignature3<void, FString*, double, double> FuncV22S;
|
||||
typedef asmjit::FuncSignature4<void, FString*, double, double, double> FuncV32S;
|
||||
typedef asmjit::FuncSignature2<void, FString*, void*> FuncP2S;
|
||||
typedef asmjit::FuncSignature1<int, FString*> FuncS2I, FuncS2N, FuncS2Co, FuncS2So;
|
||||
typedef asmjit::FuncSignature1<double, FString*> FuncS2F;
|
||||
|
||||
asmjit::X86Gp tmp;
|
||||
asmjit::CCFuncCall *call = nullptr;
|
||||
|
||||
|
|
@ -89,85 +63,85 @@ void JitCompiler::EmitCAST()
|
|||
cc.mov(regD[A], tmp.r32());
|
||||
break;
|
||||
case CAST_I2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(i2s)), FuncI2S());
|
||||
call = CreateCall<void, FString*, int>([](FString *a, int b) { a->Format("%d", b); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regD[B]);
|
||||
break;
|
||||
case CAST_U2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(u2s)), FuncU2S());
|
||||
call = CreateCall<void, FString*, int>([](FString *a, int b) { a->Format("%u", b); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regD[B]);
|
||||
break;
|
||||
case CAST_F2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(f2s)), FuncF2S());
|
||||
call = CreateCall<void, FString*, double>([](FString *a, double b) { a->Format("%.5f", b); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regF[B]);
|
||||
break;
|
||||
case CAST_V22S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(v22s)), FuncV22S());
|
||||
call = CreateCall<void, FString*, double, double>([](FString *a, double b, double b1) { a->Format("(%.5f, %.5f)", b, b1); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regF[B]);
|
||||
call->setArg(2, regF[B + 1]);
|
||||
break;
|
||||
case CAST_V32S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(v32s)), FuncV32S());
|
||||
call = CreateCall<void, FString*, double, double, double>([](FString *a, double b, double b1, double b2) { a->Format("(%.5f, %.5f, %.5f)", b, b1, b2); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regF[B]);
|
||||
call->setArg(2, regF[B + 1]);
|
||||
call->setArg(3, regF[B + 2]);
|
||||
break;
|
||||
case CAST_P2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(p2s)), FuncP2S());
|
||||
call = CreateCall<void, FString*, void*>([](FString *a, void *b) { if (b == nullptr) *a = "null"; else a->Format("%p", b); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regA[B]);
|
||||
break;
|
||||
case CAST_S2I:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(s2i)), FuncS2I());
|
||||
call = CreateCall<int, FString*>([](FString *b) -> int { return (VM_SWORD)b->ToLong(); });
|
||||
call->setRet(0, regD[A]);
|
||||
call->setArg(0, regS[B]);
|
||||
break;
|
||||
case CAST_S2F:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(s2f)), FuncS2F());
|
||||
call = CreateCall<double, FString*>([](FString *b) -> double { return b->ToDouble(); });
|
||||
call->setRet(0, regF[A]);
|
||||
call->setArg(0, regS[B]);
|
||||
break;
|
||||
case CAST_S2N:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(s2n)), FuncS2N());
|
||||
call = CreateCall<int, FString*>([](FString *b) -> int { return b->Len() == 0 ? FName(NAME_None) : FName(*b); });
|
||||
call->setRet(0, regD[A]);
|
||||
call->setArg(0, regS[B]);
|
||||
break;
|
||||
case CAST_N2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(n2s)), FuncN2S());
|
||||
call = CreateCall<void, FString*, int>([](FString *a, int b) { FName name = FName(ENamedName(b)); *a = name.IsValidName() ? name.GetChars() : ""; });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regD[B]);
|
||||
break;
|
||||
case CAST_S2Co:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(s2co)), FuncS2Co());
|
||||
call = CreateCall<int, FString*>([](FString *b) -> int { return V_GetColor(nullptr, *b); });
|
||||
call->setRet(0, regD[A]);
|
||||
call->setArg(0, regS[B]);
|
||||
break;
|
||||
case CAST_Co2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(co2s)), FuncCo2S());
|
||||
call = CreateCall<void, FString*, int>([](FString *a, int b) { PalEntry c(b); a->Format("%02x %02x %02x", c.r, c.g, c.b); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regD[B]);
|
||||
break;
|
||||
case CAST_S2So:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(s2so)), FuncS2So());
|
||||
call = CreateCall<int, FString*>([](FString *b) -> int { return FSoundID(*b); });
|
||||
call->setRet(0, regD[A]);
|
||||
call->setArg(0, regS[B]);
|
||||
break;
|
||||
case CAST_So2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(so2s)), FuncSo2S());
|
||||
call = CreateCall<void, FString*, int>([](FString *a, int b) { *a = S_sfx[b].name; });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regD[B]);
|
||||
break;
|
||||
case CAST_SID2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(sid2s)), FuncSid2S());
|
||||
call = CreateCall<void, FString*, unsigned int>([](FString *a, unsigned int b) { *a = (b >= sprites.Size()) ? "TNT1" : sprites[b].name; });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regD[B]);
|
||||
break;
|
||||
case CAST_TID2S:
|
||||
call = cc.call(ToMemAddress(reinterpret_cast<const void*>(tid2s)), FuncTid2S());
|
||||
call = CreateCall<void, FString*, int>([](FString *a, int b) { auto tex = TexMan[*(FTextureID*)&b]; *a = (tex == nullptr) ? "(null)" : tex->Name.GetChars(); });
|
||||
call->setArg(0, regS[A]);
|
||||
call->setArg(1, regD[B]);
|
||||
break;
|
||||
|
|
@ -200,11 +174,7 @@ void JitCompiler::EmitCASTB()
|
|||
}
|
||||
else
|
||||
{
|
||||
using namespace asmjit;
|
||||
typedef int(*FuncPtr)(FString*);
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](FString *s) -> int {
|
||||
return s->Len() > 0;
|
||||
}))), FuncSignature1<int, void*>());
|
||||
auto call = CreateCall<int, FString*>([](FString *s) -> int { return s->Len() > 0; });
|
||||
call->setRet(0, regD[A]);
|
||||
call->setArg(0, regS[B]);
|
||||
}
|
||||
|
|
@ -212,11 +182,9 @@ void JitCompiler::EmitCASTB()
|
|||
|
||||
void JitCompiler::EmitDYNCAST_R()
|
||||
{
|
||||
using namespace asmjit;
|
||||
typedef DObject*(*FuncPtr)(DObject*, PClass*);
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](DObject *obj, PClass *cls) -> DObject* {
|
||||
auto call = CreateCall<DObject*, DObject*, PClass*>([](DObject *obj, PClass *cls) -> DObject* {
|
||||
return (obj && obj->IsKindOf(cls)) ? obj : nullptr;
|
||||
}))), FuncSignature2<void*, void*, void*>());
|
||||
});
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, regA[B]);
|
||||
call->setArg(1, regA[C]);
|
||||
|
|
@ -224,13 +192,11 @@ void JitCompiler::EmitDYNCAST_R()
|
|||
|
||||
void JitCompiler::EmitDYNCAST_K()
|
||||
{
|
||||
using namespace asmjit;
|
||||
auto c = cc.newIntPtr();
|
||||
cc.mov(c, ToMemAddress(konsta[C].o));
|
||||
typedef DObject*(*FuncPtr)(DObject*, PClass*);
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](DObject *obj, PClass *cls) -> DObject* {
|
||||
auto call = CreateCall<DObject*, DObject*, PClass*>([](DObject *obj, PClass *cls) -> DObject* {
|
||||
return (obj && obj->IsKindOf(cls)) ? obj : nullptr;
|
||||
}))), FuncSignature2<void*, void*, void*>());
|
||||
});
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, regA[B]);
|
||||
call->setArg(1, c);
|
||||
|
|
@ -238,11 +204,9 @@ void JitCompiler::EmitDYNCAST_K()
|
|||
|
||||
void JitCompiler::EmitDYNCASTC_R()
|
||||
{
|
||||
using namespace asmjit;
|
||||
typedef PClass*(*FuncPtr)(PClass*, PClass*);
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](PClass *cls1, PClass *cls2) -> PClass* {
|
||||
auto call = CreateCall<PClass*, PClass*, PClass*>([](PClass *cls1, PClass *cls2) -> PClass* {
|
||||
return (cls1 && cls1->IsDescendantOf(cls2)) ? cls1 : nullptr;
|
||||
}))), FuncSignature2<void*, void*, void*>());
|
||||
});
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, regA[B]);
|
||||
call->setArg(1, regA[C]);
|
||||
|
|
@ -254,9 +218,9 @@ void JitCompiler::EmitDYNCASTC_K()
|
|||
auto c = cc.newIntPtr();
|
||||
cc.mov(c, ToMemAddress(konsta[C].o));
|
||||
typedef PClass*(*FuncPtr)(PClass*, PClass*);
|
||||
auto call = cc.call(ToMemAddress(reinterpret_cast<const void*>(static_cast<FuncPtr>([](PClass *cls1, PClass *cls2) -> PClass* {
|
||||
auto call = CreateCall<PClass*, PClass*, PClass*>([](PClass *cls1, PClass *cls2) -> PClass* {
|
||||
return (cls1 && cls1->IsDescendantOf(cls2)) ? cls1 : nullptr;
|
||||
}))), FuncSignature2<void*, void*, void*>());
|
||||
});
|
||||
call->setRet(0, regA[A]);
|
||||
call->setArg(0, regA[B]);
|
||||
call->setArg(1, c);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue