summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorcalc84maniac <calc84maniac@gmail.com>2012-01-05 19:07:31 -0500
committercalc84maniac <calc84maniac@gmail.com>2012-01-05 19:07:31 -0500
commita7a6a1859e2a96ea356c9b4e6e8f5a52be604fa5 (patch)
treedfb50d4bc14387ef0dde6605776b9d0b35434f18 /Source/Core
parent60cddf0823a05a1f4b8690e23b267bc20f5d80fc (diff)
subfex optimization when RD==RA
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
index b3c38efd3a..4b68b32036 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
@@ -913,28 +913,31 @@ void Jit64::subfex(UGeckoInstruction inst)
JitClearCAOV(inst.OE);
SHR(32, R(EAX), Imm8(30));
- // Convert carry to borrow
- CMC();
-
+ bool invertedCarry = false;
if (d == b)
{
+ // Convert carry to borrow
+ CMC();
SBB(32, gpr.R(d), gpr.R(a));
+ invertedCarry = true;
}
else if (d == a)
{
- MOV(32, R(EAX), gpr.R(a));
- MOV(32, gpr.R(d), gpr.R(b));
- SBB(32, gpr.R(d), R(EAX));
+ NOT(32, gpr.R(d));
+ ADC(32, gpr.R(d), gpr.R(b));
}
else
{
+ // Convert carry to borrow
+ CMC();
MOV(32, gpr.R(d), gpr.R(b));
SBB(32, gpr.R(d), gpr.R(a));
+ invertedCarry = true;
}
if (inst.Rc) {
GenerateRC();
}
- FinalizeCarryOverflow(inst.OE, true);
+ FinalizeCarryOverflow(inst.OE, invertedCarry);
gpr.UnlockAll();
}