summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authormagumagu <magumagu9@gmail.com>2014-06-23 22:17:45 -0700
committerPierre Bourdon <delroth@gmail.com>2014-07-30 21:41:17 -0700
commitc8dd557dde01cab79e22d8c338fc25a2018afd2f (patch)
treeb58bf13297c42742cc31dd6680f1d9612ae96c55 /Source/Core
parent5bb428c68543fea11233b3f3f7e74b6daa5013f7 (diff)
JITIL: compare instruction folding.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/Jit64IL/IR_X86.cpp2
-rw-r--r--Source/Core/Core/PowerPC/JitILCommon/IR.cpp53
2 files changed, 54 insertions, 1 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64IL/IR_X86.cpp b/Source/Core/Core/PowerPC/Jit64IL/IR_X86.cpp
index 94d61dc761..b1dba1c913 100644
--- a/Source/Core/Core/PowerPC/Jit64IL/IR_X86.cpp
+++ b/Source/Core/Core/PowerPC/Jit64IL/IR_X86.cpp
@@ -1721,7 +1721,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, u32 exitAddress) {
case ICmpNe: flag = CC_E; break;
case ICmpUgt: flag = CC_BE; break;
case ICmpUlt: flag = CC_AE; break;
- case ICmpUge: flag = CC_L; break;
+ case ICmpUge: flag = CC_B; break;
case ICmpUle: flag = CC_A; break;
case ICmpSgt: flag = CC_LE; break;
case ICmpSlt: flag = CC_GE; break;
diff --git a/Source/Core/Core/PowerPC/JitILCommon/IR.cpp b/Source/Core/Core/PowerPC/JitILCommon/IR.cpp
index 4125b21d0b..90450ea652 100644
--- a/Source/Core/Core/PowerPC/JitILCommon/IR.cpp
+++ b/Source/Core/Core/PowerPC/JitILCommon/IR.cpp
@@ -356,6 +356,25 @@ InstLoc IRBuilder::FoldUOp(unsigned Opcode, InstLoc Op1, unsigned extra) {
return getOp1(Op1);
}
}
+ if (Opcode == FastCRGTSet)
+ {
+ if (getOpcode(*Op1) == ICmpCRSigned)
+ return EmitICmpSgt(getOp1(Op1), getOp2(Op1));
+ if (getOpcode(*Op1) == ICmpCRUnsigned)
+ return EmitICmpUgt(getOp1(Op1), getOp2(Op1));
+ }
+ if (Opcode == FastCRLTSet)
+ {
+ if (getOpcode(*Op1) == ICmpCRSigned)
+ return EmitICmpSlt(getOp1(Op1), getOp2(Op1));
+ if (getOpcode(*Op1) == ICmpCRUnsigned)
+ return EmitICmpUlt(getOp1(Op1), getOp2(Op1));
+ }
+ if (Opcode == FastCREQSet)
+ {
+ if (getOpcode(*Op1) == ICmpCRSigned || getOpcode(*Op1) == ICmpCRUnsigned)
+ return EmitICmpEq(getOp1(Op1), getOp2(Op1));
+ }
return EmitUOp(Opcode, Op1, extra);
}
@@ -778,6 +797,35 @@ InstLoc IRBuilder::FoldOr(InstLoc Op1, InstLoc Op2) {
return EmitBiOp(Or, Op1, Op2);
}
+static unsigned ICmpInverseOp(unsigned op)
+{
+ switch (op)
+ {
+ case ICmpEq:
+ return ICmpNe;
+ case ICmpNe:
+ return ICmpEq;
+ case ICmpUlt:
+ return ICmpUge;
+ case ICmpUgt:
+ return ICmpUle;
+ case ICmpUle:
+ return ICmpUgt;
+ case ICmpUge:
+ return ICmpUlt;
+ case ICmpSlt:
+ return ICmpSge;
+ case ICmpSgt:
+ return ICmpSle;
+ case ICmpSle:
+ return ICmpSgt;
+ case ICmpSge:
+ return ICmpSlt;
+ }
+ PanicAlert("Bad opcode");
+ return Nop;
+}
+
InstLoc IRBuilder::FoldXor(InstLoc Op1, InstLoc Op2) {
simplifyCommutative(Xor, Op1, Op2);
@@ -794,6 +842,11 @@ InstLoc IRBuilder::FoldXor(InstLoc Op1, InstLoc Op2) {
GetImmValue(getOp2(Op1));
return FoldXor(getOp1(Op1), EmitIntConst(RHS));
}
+ if (isICmp(getOpcode(*Op1)) && GetImmValue(Op2) == 1)
+ {
+ return FoldBiOp(ICmpInverseOp(getOpcode(*Op1)), getOp1(Op1), getOp2(Op1));
+
+ }
}
if (Op1 == Op2) return EmitIntConst(0);