Skip to content

Commit

Permalink
Simplify EmitComparisonOpcode slightly
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed May 15, 2020
1 parent 81c31be commit 02653ab
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 59 deletions.
114 changes: 57 additions & 57 deletions src/common/scripting/jit/jit_math.cpp
Expand Up @@ -37,7 +37,7 @@ static int StringCompare(FString* first, FString* second)

void JitCompiler::EmitCMPS()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {

IRValue* arg0 = static_cast<bool>(A & CMP_BK) ? ConstS(B) : LoadS(B);
IRValue* arg1 = static_cast<bool>(A & CMP_CK) ? ConstS(C) : LoadS(C);
Expand Down Expand Up @@ -67,7 +67,7 @@ void JitCompiler::EmitCMPS()
else result = cc.CreateICmpSGT(result, zero);
}

cc.CreateCondBr(result, fail, success);
return result;
});
}

Expand Down Expand Up @@ -480,141 +480,141 @@ void JitCompiler::EmitNOT()

void JitCompiler::EmitEQ_R()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpEQ(LoadD(B), LoadD(C));
else result = cc.CreateICmpNE(LoadD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitEQ_K()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpEQ(LoadD(B), ConstD(C));
else result = cc.CreateICmpNE(LoadD(B), ConstD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLT_RR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpSLT(LoadD(B), LoadD(C));
else result = cc.CreateICmpSGE(LoadD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLT_RK()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpSLT(LoadD(B), ConstD(C));
else result = cc.CreateICmpSGE(LoadD(B), ConstD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLT_KR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpSLT(ConstD(B), LoadD(C));
else result = cc.CreateICmpSGE(ConstD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLE_RR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpSLE(LoadD(B), LoadD(C));
else result = cc.CreateICmpSGT(LoadD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLE_RK()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpSLE(LoadD(B), ConstD(C));
else result = cc.CreateICmpSGT(LoadD(B), ConstD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLE_KR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpSLE(ConstD(B), LoadD(C));
else result = cc.CreateICmpSGT(ConstD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLTU_RR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpULT(LoadD(B), LoadD(C));
else result = cc.CreateICmpUGE(LoadD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLTU_RK()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpULT(LoadD(B), ConstD(C));
else result = cc.CreateICmpUGE(LoadD(B), ConstD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLTU_KR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpULT(ConstD(B), LoadD(C));
else result = cc.CreateICmpUGE(ConstD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLEU_RR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpULE(LoadD(B), LoadD(C));
else result = cc.CreateICmpUGT(LoadD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLEU_RK()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpULE(LoadD(B), ConstD(C));
else result = cc.CreateICmpUGT(LoadD(B), ConstD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLEU_KR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpULE(ConstD(B), LoadD(C));
else result = cc.CreateICmpUGT(ConstD(B), LoadD(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

Expand Down Expand Up @@ -876,14 +876,14 @@ void JitCompiler::EmitFLOP()

void JitCompiler::EmitEQF_R()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitVectorComparison(1, check, fail, success);
EmitComparisonOpcode([&](bool check) {
return EmitVectorComparison(1, check);
});
}

void JitCompiler::EmitEQF_K()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
bool approx = static_cast<bool>(A & CMP_APPROX);
if (!approx)
{
Expand All @@ -893,7 +893,7 @@ void JitCompiler::EmitEQF_K()
else
result = cc.CreateFCmpUNE(LoadF(B), ConstF(C));

cc.CreateCondBr(result, fail, success);
return result;
}
else
{
Expand All @@ -908,14 +908,14 @@ void JitCompiler::EmitEQF_K()
cc.CreateFCmpULE(diff, ConstValueF(-VM_EPSILON)),
cc.CreateFCmpUGE(diff, ConstValueF(VM_EPSILON)));

cc.CreateCondBr(result, fail, success);
return result;
}
});
}

void JitCompiler::EmitLTF_RR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
if (static_cast<bool>(A & CMP_APPROX)) I_Error("CMP_APPROX not implemented for LTF_RR.\n");

IRValue* result;
Expand All @@ -924,13 +924,13 @@ void JitCompiler::EmitLTF_RR()
else
result = cc.CreateFCmpUGE(LoadF(B), LoadF(C));

cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLTF_RK()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
if (static_cast<bool>(A & CMP_APPROX)) I_Error("CMP_APPROX not implemented for LTF_RK.\n");

IRValue* result;
Expand All @@ -939,13 +939,13 @@ void JitCompiler::EmitLTF_RK()
else
result = cc.CreateFCmpUGE(LoadF(B), ConstF(C));

cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLTF_KR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
if (static_cast<bool>(A & CMP_APPROX)) I_Error("CMP_APPROX not implemented for LTF_KR.\n");

IRValue* result;
Expand All @@ -954,13 +954,13 @@ void JitCompiler::EmitLTF_KR()
else
result = cc.CreateFCmpUGE(ConstF(B), LoadF(C));

cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLEF_RR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
if (static_cast<bool>(A & CMP_APPROX)) I_Error("CMP_APPROX not implemented for LEF_RR.\n");

IRValue* result;
Expand All @@ -969,13 +969,13 @@ void JitCompiler::EmitLEF_RR()
else
result = cc.CreateFCmpUGT(LoadF(B), LoadF(C));

cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLEF_RK()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
if (static_cast<bool>(A & CMP_APPROX)) I_Error("CMP_APPROX not implemented for LEF_RK.\n");

IRValue* result;
Expand All @@ -984,13 +984,13 @@ void JitCompiler::EmitLEF_RK()
else
result = cc.CreateFCmpUGT(LoadF(B), ConstF(C));

cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitLEF_KR()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
if (static_cast<bool>(A & CMP_APPROX)) I_Error("CMP_APPROX not implemented for LEF_KR.\n");

IRValue* result;
Expand All @@ -999,7 +999,7 @@ void JitCompiler::EmitLEF_KR()
else
result = cc.CreateFCmpUGT(ConstF(B), LoadF(C));

cc.CreateCondBr(result, fail, success);
return result;
});
}

Expand Down Expand Up @@ -1072,8 +1072,8 @@ void JitCompiler::EmitLENV2()

void JitCompiler::EmitEQV2_R()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitVectorComparison(2, check, fail, success);
EmitComparisonOpcode([&](bool check) {
return EmitVectorComparison(2, check);
});
}

Expand Down Expand Up @@ -1174,8 +1174,8 @@ void JitCompiler::EmitLENV3()

void JitCompiler::EmitEQV3_R()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitVectorComparison(3, check, fail, success);
EmitComparisonOpcode([&](bool check) {
return EmitVectorComparison(3, check);
});
}

Expand Down Expand Up @@ -1236,25 +1236,25 @@ void JitCompiler::EmitSUBA()

void JitCompiler::EmitEQA_R()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpEQ(LoadA(B), LoadA(C));
else result = cc.CreateICmpNE(LoadA(B), LoadA(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitEQA_K()
{
EmitComparisonOpcode([&](bool check, IRBasicBlock* fail, IRBasicBlock* success) {
EmitComparisonOpcode([&](bool check) {
IRValue* result;
if (check) result = cc.CreateICmpEQ(LoadA(B), ConstA(C));
else result = cc.CreateICmpNE(LoadA(B), ConstA(C));
cc.CreateCondBr(result, fail, success);
return result;
});
}

void JitCompiler::EmitVectorComparison(int N, bool check, IRBasicBlock* fail, IRBasicBlock* success)
IRValue* JitCompiler::EmitVectorComparison(int N, bool check)
{
IRValue* result = nullptr;
bool approx = static_cast<bool>(A & CMP_APPROX);
Expand Down Expand Up @@ -1286,5 +1286,5 @@ void JitCompiler::EmitVectorComparison(int N, bool check, IRBasicBlock* fail, IR
else
result = cc.CreateAnd(result, elementresult);
}
cc.CreateCondBr(result, fail, success);
return result;
}
5 changes: 3 additions & 2 deletions src/common/scripting/jit/jitintern.h
Expand Up @@ -164,12 +164,13 @@ class JitCompiler
int i = (int)(ptrdiff_t)(pc - sfunc->Code);
IRBasicBlock* successbb = irfunc->createBasicBlock({});
IRBasicBlock* failbb = GetLabel(i + 2 + JMPOFS(pc + 1));
jmpFunc(static_cast<bool>(A & CMP_CHECK), failbb, successbb);
IRValue* result = jmpFunc(static_cast<bool>(A & CMP_CHECK));
cc.CreateCondBr(result, failbb, successbb);
cc.SetInsertPoint(successbb);
pc++; // This instruction uses two instruction slots - skip the next one
}

void EmitVectorComparison(int N, bool check, IRBasicBlock* fail, IRBasicBlock* success);
IRValue* EmitVectorComparison(int N, bool check);

IRValue* LoadD(int index) { return cc.CreateLoad(regD[index]); }
IRValue* LoadF(int index) { return cc.CreateLoad(regF[index]); }
Expand Down

0 comments on commit 02653ab

Please sign in to comment.