summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorcalc84maniac <calc84maniac@gmail.com>2012-01-02 15:07:36 -0500
committercalc84maniac <calc84maniac@gmail.com>2012-01-02 15:07:36 -0500
commit7d262ff1f423ba44d931d3cd79f837446c36ee0f (patch)
tree1906694bd071155cb7fcebae6b3e78446cb87efe /Source/Core
parenta2bd91b7266826199ba4b407ac22639d4cd9334d (diff)
rlwimix optimizations
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp78
1 files changed, 66 insertions, 12 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
index b246a2cc9e..cfac1728d6 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
@@ -1476,25 +1476,79 @@ void Jit64::rlwimix(UGeckoInstruction inst)
{
u32 mask = Helper_Mask(inst.MB,inst.ME);
gpr.SetImmediate32(a, ((u32)gpr.R(a).offset & ~mask) | (_rotl((u32)gpr.R(s).offset,inst.SH) & mask));
+ if (inst.Rc)
+ {
+ ComputeRC(gpr.R(a));
+ }
}
else
{
gpr.Lock(a, s);
- gpr.KillImmediate(a, true, true);
+ gpr.BindToRegister(a, true, true);
u32 mask = Helper_Mask(inst.MB, inst.ME);
- MOV(32, R(EAX), gpr.R(s));
- AND(32, gpr.R(a), Imm32(~mask));
- if (inst.SH)
- ROL(32, R(EAX), Imm8(inst.SH));
- AND(32, R(EAX), Imm32(mask));
- OR(32, gpr.R(a), R(EAX));
+ if (mask == 0 || (a == s && inst.SH == 0))
+ {
+ if (inst.RC)
+ {
+ ComputeRC(gpr.R(a));
+ }
+ }
+ else if (mask == 0xFFFFFFFF)
+ {
+ if (a != s)
+ {
+ MOV(32, gpr.R(a), gpr.R(s));
+ }
+ if (inst.SH)
+ {
+ ROL(32, gpr.R(a), Imm8(inst.SH));
+ }
+ if (inst.Rc)
+ {
+ ComputeRC(gpr.R(a));
+ }
+ }
+ else if (inst.SH)
+ {
+ if (mask == -(1 << inst.SH))
+ {
+ MOV(32, R(EAX), gpr.R(s));
+ SHL(32, R(EAX), Imm8(inst.SH));
+ AND(32, gpr.R(a), Imm32(~mask));
+ OR(32, gpr.R(a), R(EAX));
+ }
+ else if (mask == (1 << inst.SH) - 1)
+ {
+ MOV(32, R(EAX), gpr.R(s));
+ SHR(32, R(EAX), Imm8(32-inst.SH));
+ AND(32, gpr.R(a), Imm32(~mask));
+ OR(32, gpr.R(a), R(EAX));
+ }
+ else
+ {
+ MOV(32, R(EAX), gpr.R(s));
+ ROL(32, R(EAX), Imm8(inst.SH));
+ XOR(32, R(EAX), gpr.R(a));
+ AND(32, R(EAX), Imm32(mask));
+ XOR(32, gpr.R(a), R(EAX));
+ }
+ if (inst.Rc)
+ {
+ GenerateRC();
+ }
+ }
+ else
+ {
+ XOR(32, gpr.R(a), gpr.R(s));
+ AND(32, gpr.R(a), Imm32(~mask));
+ XOR(32, gpr.R(a), gpr.R(s));
+ if (inst.Rc)
+ {
+ GenerateRC();
+ }
+ }
gpr.UnlockAll();
}
-
- if (inst.Rc)
- {
- ComputeRC(gpr.R(a));
- }
}
void Jit64::rlwnmx(UGeckoInstruction inst)