From 65540da3f7bb8105101cd2ad178c70a7cecd767b Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 20 May 2025 16:05:09 +0200 Subject: [PATCH] Optimize signed long compare --- autotest/testint32cmp.c | 161 +++++++++++++++++- oscar64/NativeCodeGenerator.cpp | 278 ++++++++++++++++++++------------ 2 files changed, 332 insertions(+), 107 deletions(-) diff --git a/autotest/testint32cmp.c b/autotest/testint32cmp.c index 637f122..3a51a34 100644 --- a/autotest/testint32cmp.c +++ b/autotest/testint32cmp.c @@ -63,6 +63,33 @@ bool nge(long a, long b) + +inline bool ieq(long a, long b) +{ + return a == b; +} + +inline bool ilt(long a, long b) +{ + return a < b; +} + +inline bool igt(long a, long b) +{ + return a > b; +} + +inline bool ile(long a, long b) +{ + return a <= b; +} + +inline bool ige(long a, long b) +{ + return a >= b; +} + + bool beqz(long a) { return a == 0; @@ -188,7 +215,71 @@ bool nge1(long a) -void cmp(long a, long b) +bool beqm(long a) +{ + return a == -1; +} + +bool bltm(long a) +{ + return a < -1; +} + +bool bgtm(long a) +{ + return a > -1; +} + +bool blem(long a) +{ + return a <= -1; +} + +bool bgem(long a) +{ + return a >= -1; +} + + + +bool neqm(long a) +{ + return a == -1; +} + +#pragma native(neqm) + +bool nltm(long a) +{ + return a < -1; +} + +#pragma native(nltm) + +bool ngtm(long a) +{ + return a > -1; +} + +#pragma native(ngtm) + +bool nlem(long a) +{ + return a <= -1; +} + +#pragma native(nlem) + +bool ngem(long a) +{ + return a >= -1; +} + +#pragma native(ngem) + + + +void cmpc(long a, long b) { bool beqf = beq(a, b), bltf = blt(a, b), bgtf = bgt(a, b), blef = ble(a, b), bgef = bge(a, b); bool neqf = neq(a, b), nltf = nlt(a, b), ngtf = ngt(a, b), nlef = nle(a, b), ngef = nge(a, b); @@ -203,6 +294,27 @@ void cmp(long a, long b) assert(bgef == ngef); } +void cmpi(long a, long b) +{ + bool ieqf = ieq(a, b), iltf = ilt(a, b), igtf = igt(a, b), ilef = ile(a, b), igef = ige(a, b); + bool neqf = neq(a, b), nltf = nlt(a, b), ngtf = ngt(a, b), nlef = nle(a, b), ngef = nge(a, b); + + printf("INLINE %ld, %ld : EQ %d LT %d GT %d\r", a, b, ieqf, iltf, igtf); + printf("NATIVE %ld, %ld : EQ %d LT %d GT %d\r", a, b, neqf, nltf, ngtf); + + assert(ieqf == neqf); + assert(iltf == nltf); + assert(igtf == ngtf); + assert(ilef == nlef); + assert(igef == ngef); +} + +void cmp(long a, long b) +{ + cmpc(a, b); + cmpi(a, b); +} + void cmpz(long a) { bool beqf = beqz(a), bltf = bltz(a), bgtf = bgtz(a), blef = blez(a), bgef = bgez(a); @@ -233,6 +345,21 @@ void cmp1(long a) assert(bgef == ngef); } +void cmpm(long a) +{ + bool beqf = beqm(a), bltf = bltm(a), bgtf = bgtm(a), blef = blem(a), bgef = bgem(a); + bool neqf = neqm(a), nltf = nltm(a), ngtf = ngtm(a), nlef = nlem(a), ngef = ngem(a); + + printf("BYTE %ld, 1 : EQ %d LT %d GT %d LE %d GE %d\r", a, beqf, bltf, bgtf, blef, bgef); + printf("NATIVE %ld, 1 : EQ %d LT %d GT %d LE %d GE %d\r", a, neqf, nltf, ngtf, nlef, ngef); + + assert(beqf == neqf); + assert(bltf == nltf); + assert(bgtf == ngtf); + assert(blef == nlef); + assert(bgef == ngef); +} + int main(void) { cmp( 0, 1); @@ -327,6 +454,10 @@ int main(void) cmp1(256); cmp1(10000); cmp1(20000); + cmp1(1000000l); + cmp1(2000000l); + cmp1(100000000l); + cmp1(200000000l); cmp1(-1); cmp1(-2); cmp1(-3); @@ -334,6 +465,34 @@ int main(void) cmp1(-256); cmp1(-10000); cmp1(-20000); + cmp1(-1000000l); + cmp1(-2000000l); + cmp1(-100000000l); + cmp1(-200000000l); + + cmpm(0); + cmpm(1); + cmpm(2); + cmpm(3); + cmpm(255); + cmpm(256); + cmpm(10000); + cmpm(20000); + cmpm(1000000l); + cmpm(2000000l); + cmpm(100000000l); + cmpm(200000000l); + cmpm(-1); + cmpm(-2); + cmpm(-3); + cmpm(-255); + cmpm(-256); + cmpm(-10000); + cmpm(-20000); + cmpm(-1000000l); + cmpm(-2000000l); + cmpm(-100000000l); + cmpm(-200000000l); return 0; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 64fc26a..8091e82 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -13348,134 +13348,200 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In } else if (ins->mSrc[0].mType == IT_INT32) { - int li = 1, ri = 0; - if (op == IA_CMPLEU || op == IA_CMPGU || op == IA_CMPLES || op == IA_CMPGS) + if ((op >= IA_CMPGES && op <= IA_CMPLS) && + (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst >= 0 && ins->mSrc[0].mIntConst < 256 || + ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst >= 0 && ins->mSrc[1].mIntConst < 256)) { - li = 0; ri = 1; - op = MirrorRelational(op); - } + NativeCodeBasicBlock* eblock3 = nproc->AllocateBlock(); + NativeCodeBasicBlock* eblock2 = nproc->AllocateBlock(); + NativeCodeBasicBlock* eblock1 = nproc->AllocateBlock(); + NativeCodeBasicBlock* eblock0 = nproc->AllocateBlock(); - NativeCodeBasicBlock* eblock3 = nproc->AllocateBlock(); - NativeCodeBasicBlock* eblock2 = nproc->AllocateBlock(); - NativeCodeBasicBlock* eblock1 = nproc->AllocateBlock(); - NativeCodeBasicBlock* nblock = nproc->AllocateBlock(); - NativeCodeBasicBlock* rblock = nproc->AllocateBlock(); - - - if (op >= IA_CMPGES && op <= IA_CMPLS) - { - if (ins->mSrc[ri].mTemp >= 0) + int li = 1, ri = 0; + if (ins->mSrc[1].mTemp < 0) { - NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); + li = 0; + ri = 1; + op = MirrorRelational(op); + } + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); + if (op == IA_CMPGS || op == IA_CMPGES) + { + if (op == IA_CMPGES && ins->mSrc[ri].mIntConst == 0) + this->Close(ins, falseJump, trueJump, ASMIT_BMI); + else + { + this->Close(ins, falseJump, eblock3, ASMIT_BMI); + eblock3->Close(ins, trueJump, eblock2, ASMIT_BNE); + eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 2)); + eblock2->Close(ins, trueJump, eblock1, ASMIT_BNE); + eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); + if (op == IA_CMPGS && ins->mSrc[ri].mIntConst == 255) + eblock1->Close(ins, trueJump, falseJump, ASMIT_BNE); + else + { + eblock1->Close(ins, trueJump, eblock0, ASMIT_BNE); + eblock0->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); + eblock0->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, ins->mSrc[ri].mIntConst + (op == IA_CMPGS))); + eblock0->Close(ins, trueJump, falseJump, ASMIT_BCS); + } + } + } + else + { + if (op == IA_CMPLS && ins->mSrc[ri].mIntConst == 0) + this->Close(ins, trueJump, falseJump, ASMIT_BMI); + else + { + this->Close(ins, trueJump, eblock3, ASMIT_BMI); + eblock3->Close(ins, falseJump, eblock2, ASMIT_BNE); + eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 2)); + eblock2->Close(ins, falseJump, eblock1, ASMIT_BNE); + eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); + eblock1->Close(ins, falseJump, eblock0, ASMIT_BNE); + if (op == IA_CMPLES && ins->mSrc[ri].mIntConst == 255) + eblock1->Close(ins, falseJump, trueJump, ASMIT_BNE); + else + { + eblock0->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); + eblock0->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, ins->mSrc[ri].mIntConst + (op == IA_CMPLES))); + eblock0->Close(ins, falseJump, trueJump, ASMIT_BCS); + } + } + } + } + else + { + int li = 1, ri = 0; + if (op == IA_CMPLEU || op == IA_CMPGU || op == IA_CMPLES || op == IA_CMPGS) + { + li = 0; ri = 1; + op = MirrorRelational(op); + } + + NativeCodeBasicBlock* eblock3 = nproc->AllocateBlock(); + NativeCodeBasicBlock* eblock2 = nproc->AllocateBlock(); + NativeCodeBasicBlock* eblock1 = nproc->AllocateBlock(); + NativeCodeBasicBlock* nblock = nproc->AllocateBlock(); + NativeCodeBasicBlock* rblock = nproc->AllocateBlock(); + + + if (op >= IA_CMPGES && op <= IA_CMPLS) + { + if (ins->mSrc[ri].mTemp >= 0) + { + NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); + + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 24) & 0xff)); + else + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); + + this->Close(ins, eblock3, eblock, ASMIT_BEQ); + eblock->mIns.Push(NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); + eblock->Close(ins, nblock, rblock, ASMIT_BPL); + } + else + { + if (ins->mSrc[ri].mTemp >= 0) + { + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK)); + } + + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, ((ins->mSrc[li].mIntConst >> 24) & 0xff) ^ 0x80)); + else + { + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); + } + + if (ins->mSrc[ri].mTemp < 0) + mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, ((ins->mSrc[ri].mIntConst >> 24) & 0xff) ^ 0x80)); + else + mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_WORK)); + this->Close(ins, nblock, eblock3, ASMIT_BNE); + } + } + else + { if (ins->mSrc[li].mTemp < 0) mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 24) & 0xff)); else mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); - mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); - - this->Close(ins, eblock3, eblock, ASMIT_BEQ); - eblock->mIns.Push(NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); - eblock->Close(ins, nblock, rblock, ASMIT_BPL); - } - else - { - if (ins->mSrc[ri].mTemp >= 0) - { - mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); - mIns.Push(NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); - mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK)); - } - - if (ins->mSrc[li].mTemp < 0) - mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, ((ins->mSrc[li].mIntConst >> 24) & 0xff) ^ 0x80)); - else - { - mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); - mIns.Push(NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); - } - if (ins->mSrc[ri].mTemp < 0) - mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, ((ins->mSrc[ri].mIntConst >> 24) & 0xff) ^ 0x80)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 24) & 0xff)); else - mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_WORK)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); this->Close(ins, nblock, eblock3, ASMIT_BNE); } - } - else - { + + if (ins->mSrc[li].mTemp < 0) - mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 24) & 0xff)); + eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 16) & 0xff)); else - mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); + eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 2)); if (ins->mSrc[ri].mTemp < 0) - mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 24) & 0xff)); + eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 16) & 0xff)); else - mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); - this->Close(ins, nblock, eblock3, ASMIT_BNE); - } + eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 2)); + eblock3->Close(ins, nblock, eblock2, ASMIT_BNE); - if (ins->mSrc[li].mTemp < 0) - eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 16) & 0xff)); - else - eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 2)); - if (ins->mSrc[ri].mTemp < 0) - eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 16) & 0xff)); - else - eblock3->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 2)); + if (ins->mSrc[li].mTemp < 0) + eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 8) & 0xff)); + else + eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); + if (ins->mSrc[ri].mTemp < 0) + eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 8) & 0xff)); + else + eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 1)); - eblock3->Close(ins, nblock, eblock2, ASMIT_BNE); + eblock2->Close(ins, nblock, eblock1, ASMIT_BNE); - if (ins->mSrc[li].mTemp < 0) - eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 8) & 0xff)); - else - eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); - if (ins->mSrc[ri].mTemp < 0) - eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 8) & 0xff)); - else - eblock2->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 1)); + if (ins->mSrc[li].mTemp < 0) + eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[li].mIntConst & 0xff)); + else + eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); + if (ins->mSrc[ri].mTemp < 0) + eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, ins->mSrc[ri].mIntConst & 0xff)); + else + eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp])); - eblock2->Close(ins, nblock, eblock1, ASMIT_BNE); - - if (ins->mSrc[li].mTemp < 0) - eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[li].mIntConst & 0xff)); - else - eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); - if (ins->mSrc[ri].mTemp < 0) - eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_IMMEDIATE, ins->mSrc[ri].mIntConst & 0xff)); - else - eblock1->mIns.Push(NativeCodeInstruction(ins, ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp])); - - switch (op) - { - case IA_CMPEQ: - nblock->Close(ins, falseJump, nullptr, ASMIT_JMP); - rblock->Close(ins, falseJump, nullptr, ASMIT_JMP); - eblock1->Close(ins, trueJump, falseJump, ASMIT_BEQ); - break; - case IA_CMPNE: - nblock->Close(ins, trueJump, nullptr, ASMIT_JMP); - rblock->Close(ins, trueJump, nullptr, ASMIT_JMP); - eblock1->Close(ins, falseJump, trueJump, ASMIT_BEQ); - break; - case IA_CMPLU: - case IA_CMPLS: - case IA_CMPGU: - case IA_CMPGS: - eblock1->Close(ins, nblock, nullptr, ASMIT_JMP); - nblock->Close(ins, trueJump, falseJump, ASMIT_BCC); - rblock->Close(ins, trueJump, falseJump, ASMIT_BCS); - break; - case IA_CMPLEU: - case IA_CMPLES: - case IA_CMPGEU: - case IA_CMPGES: - eblock1->Close(ins, nblock, nullptr, ASMIT_JMP); - nblock->Close(ins, trueJump, falseJump, ASMIT_BCS); - rblock->Close(ins, trueJump, falseJump, ASMIT_BCC); - break; + switch (op) + { + case IA_CMPEQ: + nblock->Close(ins, falseJump, nullptr, ASMIT_JMP); + rblock->Close(ins, falseJump, nullptr, ASMIT_JMP); + eblock1->Close(ins, trueJump, falseJump, ASMIT_BEQ); + break; + case IA_CMPNE: + nblock->Close(ins, trueJump, nullptr, ASMIT_JMP); + rblock->Close(ins, trueJump, nullptr, ASMIT_JMP); + eblock1->Close(ins, falseJump, trueJump, ASMIT_BEQ); + break; + case IA_CMPLU: + case IA_CMPLS: + case IA_CMPGU: + case IA_CMPGS: + eblock1->Close(ins, nblock, nullptr, ASMIT_JMP); + nblock->Close(ins, trueJump, falseJump, ASMIT_BCC); + rblock->Close(ins, trueJump, falseJump, ASMIT_BCS); + break; + case IA_CMPLEU: + case IA_CMPLES: + case IA_CMPGEU: + case IA_CMPGES: + eblock1->Close(ins, nblock, nullptr, ASMIT_JMP); + nblock->Close(ins, trueJump, falseJump, ASMIT_BCS); + rblock->Close(ins, trueJump, falseJump, ASMIT_BCC); + break; + } } } else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst == 0 || ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst == 0)