mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-29 07:22:07 +00:00
Merge pull request #569 from Gutawer/asmjit
Added strings and a few string opcodes
This commit is contained in:
commit
567a069df5
1 changed files with 100 additions and 20 deletions
|
@ -144,11 +144,11 @@ private:
|
||||||
EMIT_OP(LI);
|
EMIT_OP(LI);
|
||||||
EMIT_OP(LK);
|
EMIT_OP(LK);
|
||||||
EMIT_OP(LKF);
|
EMIT_OP(LKF);
|
||||||
// EMIT_OP(LKS);
|
EMIT_OP(LKS);
|
||||||
EMIT_OP(LKP);
|
EMIT_OP(LKP);
|
||||||
EMIT_OP(LK_R);
|
EMIT_OP(LK_R);
|
||||||
EMIT_OP(LKF_R);
|
EMIT_OP(LKF_R);
|
||||||
// EMIT_OP(LKS_R);
|
//EMIT_OP(LKS_R);
|
||||||
EMIT_OP(LKP_R);
|
EMIT_OP(LKP_R);
|
||||||
// EMIT_OP(LFP);
|
// EMIT_OP(LFP);
|
||||||
EMIT_OP(META);
|
EMIT_OP(META);
|
||||||
|
@ -167,8 +167,8 @@ private:
|
||||||
EMIT_OP(LSP_R);
|
EMIT_OP(LSP_R);
|
||||||
EMIT_OP(LDP);
|
EMIT_OP(LDP);
|
||||||
EMIT_OP(LDP_R);
|
EMIT_OP(LDP_R);
|
||||||
// EMIT_OP(LS);
|
EMIT_OP(LS);
|
||||||
// EMIT_OP(LS_R);
|
EMIT_OP(LS_R);
|
||||||
EMIT_OP(LO);
|
EMIT_OP(LO);
|
||||||
EMIT_OP(LO_R);
|
EMIT_OP(LO_R);
|
||||||
EMIT_OP(LP);
|
EMIT_OP(LP);
|
||||||
|
@ -177,7 +177,7 @@ private:
|
||||||
EMIT_OP(LV2_R);
|
EMIT_OP(LV2_R);
|
||||||
EMIT_OP(LV3);
|
EMIT_OP(LV3);
|
||||||
EMIT_OP(LV3_R);
|
EMIT_OP(LV3_R);
|
||||||
//EMIT_OP(LCS);
|
EMIT_OP(LCS);
|
||||||
//EMIT_OP(LCS_R);
|
//EMIT_OP(LCS_R);
|
||||||
EMIT_OP(LBIT);
|
EMIT_OP(LBIT);
|
||||||
EMIT_OP(SB);
|
EMIT_OP(SB);
|
||||||
|
@ -190,7 +190,7 @@ private:
|
||||||
EMIT_OP(SSP_R);
|
EMIT_OP(SSP_R);
|
||||||
EMIT_OP(SDP);
|
EMIT_OP(SDP);
|
||||||
EMIT_OP(SDP_R);
|
EMIT_OP(SDP_R);
|
||||||
//EMIT_OP(SS);
|
EMIT_OP(SS);
|
||||||
//EMIT_OP(SS_R);
|
//EMIT_OP(SS_R);
|
||||||
EMIT_OP(SO);
|
EMIT_OP(SO);
|
||||||
EMIT_OP(SO_R);
|
EMIT_OP(SO_R);
|
||||||
|
@ -378,7 +378,15 @@ private:
|
||||||
cc.movsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
cc.movsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
//void EmitLKS() { } // load string constant
|
void EmitLKS() {
|
||||||
|
auto loadLambda = [] (FString* to, FString* from) -> void {
|
||||||
|
*to = *from;
|
||||||
|
};
|
||||||
|
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(loadLambda))),
|
||||||
|
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||||
|
call->setArg(0, regS[A]);
|
||||||
|
call->setArg(1, asmjit::imm(ToMemAddress(konsts + BC)));
|
||||||
|
}
|
||||||
|
|
||||||
void EmitLKP()
|
void EmitLKP()
|
||||||
{
|
{
|
||||||
|
@ -397,7 +405,7 @@ private:
|
||||||
cc.movsd(regF[A], asmjit::x86::qword_ptr(tmp, regD[B], 3, C * sizeof(double)));
|
cc.movsd(regF[A], asmjit::x86::qword_ptr(tmp, regD[B], 3, C * sizeof(double)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//void EmitLKS_R() { } // load string constant indexed
|
//void EmitLKS_R() { }
|
||||||
|
|
||||||
void EmitLKP_R()
|
void EmitLKP_R()
|
||||||
{
|
{
|
||||||
|
@ -528,8 +536,35 @@ private:
|
||||||
cc.movsd(regF[A], asmjit::x86::qword_ptr(regA[B], regD[C]));
|
cc.movsd(regF[A], asmjit::x86::qword_ptr(regA[B], regD[C]));
|
||||||
}
|
}
|
||||||
|
|
||||||
//void EmitLS() { } // load string
|
void EmitLS() {
|
||||||
//void EmitLS_R() { }
|
EmitNullPointerThrow(B, X_READ_NIL);
|
||||||
|
auto ptr = cc.newIntPtr();
|
||||||
|
cc.mov(ptr, regA[B]);
|
||||||
|
cc.add(ptr, konstd[C]);
|
||||||
|
auto loadLambda = [](FString* to, FString* from) -> void {
|
||||||
|
*to = *from;
|
||||||
|
};
|
||||||
|
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(loadLambda))),
|
||||||
|
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||||
|
call->setArg(0, regS[A]);
|
||||||
|
call->setArg(1, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitLS_R() {
|
||||||
|
EmitNullPointerThrow(B, X_READ_NIL);
|
||||||
|
auto ptr = cc.newIntPtr();
|
||||||
|
cc.mov(ptr, regA[B]);
|
||||||
|
auto tmp = cc.newIntPtr();
|
||||||
|
cc.mov(tmp, regD[C]);
|
||||||
|
cc.add(ptr, tmp);
|
||||||
|
auto loadLambda = [](FString* to, FString* from) -> void {
|
||||||
|
*to = *from;
|
||||||
|
};
|
||||||
|
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(loadLambda))),
|
||||||
|
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||||
|
call->setArg(0, regS[A]);
|
||||||
|
call->setArg(1, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
void EmitLO()
|
void EmitLO()
|
||||||
{
|
{
|
||||||
|
@ -619,7 +654,20 @@ private:
|
||||||
cc.movsd(regF[A + 2], asmjit::x86::qword_ptr(tmp, 16));
|
cc.movsd(regF[A + 2], asmjit::x86::qword_ptr(tmp, 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
//void EmitLCS() { } // load string from char ptr.
|
void EmitLCS() {
|
||||||
|
EmitNullPointerThrow(B, X_READ_NIL);
|
||||||
|
auto ptr = cc.newIntPtr();
|
||||||
|
cc.mov(ptr, regA[B]);
|
||||||
|
cc.add(ptr, 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));
|
||||||
|
call->setArg(0, regS[A]);
|
||||||
|
call->setArg(1, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
//void EmitLCS_R() { }
|
//void EmitLCS_R() { }
|
||||||
|
|
||||||
void EmitLBIT()
|
void EmitLBIT()
|
||||||
|
@ -693,8 +741,37 @@ private:
|
||||||
cc.movsd(asmjit::x86::qword_ptr(regA[A], regD[C]), regF[B]);
|
cc.movsd(asmjit::x86::qword_ptr(regA[A], regD[C]), regF[B]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//void EmitSS() {} // store string
|
void EmitSS()
|
||||||
//void EmitSS_R() {}
|
{
|
||||||
|
EmitNullPointerThrow(B, X_WRITE_NIL);
|
||||||
|
auto ptr = cc.newIntPtr();
|
||||||
|
cc.mov(ptr, regA[A]);
|
||||||
|
cc.add(ptr, konstd[C]);
|
||||||
|
auto loadLambda = [](FString* to, FString* from) -> void {
|
||||||
|
*to = *from;
|
||||||
|
};
|
||||||
|
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(loadLambda))),
|
||||||
|
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||||
|
call->setArg(0, ptr);
|
||||||
|
call->setArg(1, regS[B]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitSS_R()
|
||||||
|
{
|
||||||
|
EmitNullPointerThrow(B, X_WRITE_NIL);
|
||||||
|
auto ptr = cc.newIntPtr();
|
||||||
|
cc.mov(ptr, regA[A]);
|
||||||
|
auto tmp = cc.newIntPtr();
|
||||||
|
cc.mov(tmp, regD[C]);
|
||||||
|
cc.add(ptr, tmp);
|
||||||
|
auto loadLambda = [](FString* to, FString* from) -> void {
|
||||||
|
*to = *from;
|
||||||
|
};
|
||||||
|
auto call = cc.call(ToMemAddress(reinterpret_cast<void*>(static_cast<void(*)(FString*, FString*)>(loadLambda))),
|
||||||
|
asmjit::FuncSignature2<void, FString*, FString*>(asmjit::CallConv::kIdHostCDecl));
|
||||||
|
call->setArg(0, ptr);
|
||||||
|
call->setArg(1, regS[B]);
|
||||||
|
}
|
||||||
|
|
||||||
void EmitSO()
|
void EmitSO()
|
||||||
{
|
{
|
||||||
|
@ -3178,16 +3255,16 @@ private:
|
||||||
regD.Resize(sfunc->NumRegD);
|
regD.Resize(sfunc->NumRegD);
|
||||||
regF.Resize(sfunc->NumRegF);
|
regF.Resize(sfunc->NumRegF);
|
||||||
regA.Resize(sfunc->NumRegA);
|
regA.Resize(sfunc->NumRegA);
|
||||||
//regS.Resize(sfunc->NumRegS);
|
regS.Resize(sfunc->NumRegS);
|
||||||
|
|
||||||
frameD = cc.newIntPtr();
|
frameD = cc.newIntPtr();
|
||||||
frameF = cc.newIntPtr();
|
frameF = cc.newIntPtr();
|
||||||
//frameS = cc.newIntPtr();
|
frameS = cc.newIntPtr();
|
||||||
frameA = cc.newIntPtr();
|
frameA = cc.newIntPtr();
|
||||||
params = cc.newIntPtr();
|
params = cc.newIntPtr();
|
||||||
cc.mov(frameD, x86::ptr(vmregs, offsetof(VMRegisters, d)));
|
cc.mov(frameD, x86::ptr(vmregs, offsetof(VMRegisters, d)));
|
||||||
cc.mov(frameF, x86::ptr(vmregs, offsetof(VMRegisters, f)));
|
cc.mov(frameF, x86::ptr(vmregs, offsetof(VMRegisters, f)));
|
||||||
//cc.mov(frameS, x86::ptr(vmregs, offsetof(VMRegisters, s)));
|
cc.mov(frameS, x86::ptr(vmregs, offsetof(VMRegisters, s)));
|
||||||
cc.mov(frameA, x86::ptr(vmregs, offsetof(VMRegisters, a)));
|
cc.mov(frameA, x86::ptr(vmregs, offsetof(VMRegisters, a)));
|
||||||
cc.mov(params, x86::ptr(vmregs, offsetof(VMRegisters, param)));
|
cc.mov(params, x86::ptr(vmregs, offsetof(VMRegisters, param)));
|
||||||
|
|
||||||
|
@ -3211,15 +3288,17 @@ private:
|
||||||
cc.movsd(regF[i], x86::qword_ptr(frameF, i * sizeof(double)));
|
cc.movsd(regF[i], x86::qword_ptr(frameF, i * sizeof(double)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*if (sfunc->NumRegS > 0)
|
if (sfunc->NumRegS > 0)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < sfunc->NumRegS; i++)
|
for (int i = 0; i < sfunc->NumRegS; i++)
|
||||||
{
|
{
|
||||||
FString regname;
|
FString regname;
|
||||||
regname.Format("regS%d", i);
|
regname.Format("regS%d", i);
|
||||||
regS[i] = cc.newGpd(regname.GetChars());
|
regS[i] = cc.newIntPtr(regname.GetChars());
|
||||||
|
cc.mov(regS[i], frameS);
|
||||||
|
if (i * sizeof(FString) != 0) cc.add(regS[i], i * sizeof(FString));
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
if (sfunc->NumRegA > 0)
|
if (sfunc->NumRegA > 0)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < sfunc->NumRegA; i++)
|
for (int i = 0; i < sfunc->NumRegA; i++)
|
||||||
|
@ -3394,6 +3473,7 @@ private:
|
||||||
|
|
||||||
asmjit::X86Gp frameD;
|
asmjit::X86Gp frameD;
|
||||||
asmjit::X86Gp frameF;
|
asmjit::X86Gp frameF;
|
||||||
|
asmjit::X86Gp frameS;
|
||||||
asmjit::X86Gp frameA;
|
asmjit::X86Gp frameA;
|
||||||
asmjit::X86Gp params;
|
asmjit::X86Gp params;
|
||||||
int NumParam = 0; // Actually part of vmframe (f->NumParam), but nobody seems to read that?
|
int NumParam = 0; // Actually part of vmframe (f->NumParam), but nobody seems to read that?
|
||||||
|
@ -3408,7 +3488,7 @@ private:
|
||||||
TArray<asmjit::X86Gp> regD;
|
TArray<asmjit::X86Gp> regD;
|
||||||
TArray<asmjit::X86Xmm> regF;
|
TArray<asmjit::X86Xmm> regF;
|
||||||
TArray<asmjit::X86Gp> regA;
|
TArray<asmjit::X86Gp> regA;
|
||||||
//TArray<asmjit::X86Gp> regS;
|
TArray<asmjit::X86Gp> regS;
|
||||||
|
|
||||||
TArray<asmjit::Label> labels;
|
TArray<asmjit::Label> labels;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue