summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMerryMage <MerryMage@users.noreply.github.com>2018-10-15 21:01:14 +0100
committerMerryMage <MerryMage@users.noreply.github.com>2018-10-28 17:57:44 +0000
commit817fddf7347e25fff627133d679d34e35db7fe2a (patch)
tree02383bca880987aab4505e7de3bc07bd5afec062 /Source/Core
parent32572dd6394cac415e6b5b3d1516b55f5f0d00e7 (diff)
Jit_Integer: srawx
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp43
1 files changed, 23 insertions, 20 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
index 172aed99ed..10dc9e4637 100644
--- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
@@ -1827,29 +1827,32 @@ void Jit64::srawx(UGeckoInstruction inst)
int b = inst.RB;
int s = inst.RS;
- gpr.FlushLockX(ECX);
- gpr.Lock(a, s, b);
- gpr.BindToRegister(a, (a == s || a == b), true);
- MOV(32, R(ECX), gpr.R(b));
- if (a != s)
- MOV(32, gpr.R(a), gpr.R(s));
- SHL(64, gpr.R(a), Imm8(32));
- SAR(64, gpr.R(a), R(ECX));
- if (js.op->wantsCA)
- {
- MOV(32, R(RSCRATCH), gpr.R(a));
- SHR(64, gpr.R(a), Imm8(32));
- TEST(32, gpr.R(a), R(RSCRATCH));
- }
- else
{
- SHR(64, gpr.R(a), Imm8(32));
+ RCX64Reg ecx = gpr.Scratch(ECX); // no register choice
+ RCX64Reg Ra = gpr.Bind(a, RCMode::Write);
+ RCOpArg Rb = gpr.Use(b, RCMode::Read);
+ RCOpArg Rs = gpr.Use(s, RCMode::Read);
+ RegCache::Realize(ecx, Ra, Rb, Rs);
+
+ MOV(32, ecx, Rb);
+ if (a != s)
+ MOV(32, Ra, Rs);
+ SHL(64, Ra, Imm8(32));
+ SAR(64, Ra, ecx);
+ if (js.op->wantsCA)
+ {
+ MOV(32, R(RSCRATCH), Ra);
+ SHR(64, Ra, Imm8(32));
+ TEST(32, Ra, R(RSCRATCH));
+ }
+ else
+ {
+ SHR(64, Ra, Imm8(32));
+ }
+ FinalizeCarry(CC_NZ);
}
- FinalizeCarry(CC_NZ);
if (inst.Rc)
- ComputeRC(gpr.R(a));
- gpr.UnlockAll();
- gpr.UnlockAllX();
+ ComputeRC(a);
}
void Jit64::srawix(UGeckoInstruction inst)