Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #862 from comex/registersinuse
Reduce my idiocy in register saving code.
  • Loading branch information
comex committed Aug 24, 2014
2 parents a7752f4 + d19ec35 commit d128795
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 21 deletions.
4 changes: 2 additions & 2 deletions Source/Core/Common/x64ABI.h
Expand Up @@ -30,7 +30,7 @@
#define ABI_PARAM3 R8
#define ABI_PARAM4 R9

#define ABI_ALL_CALLEE_SAVED ((1 << RAX) | (1 << RCX) | (1 << RDX) | (1 << R8) | \
#define ABI_ALL_CALLER_SAVED ((1 << RAX) | (1 << RCX) | (1 << RDX) | (1 << R8) | \
(1 << R9) | (1 << R10) | (1 << R11) | \
(1 << XMM0) | (1 << XMM1) | (1 << XMM2) | (1 << XMM3) | \
(1 << XMM4) | (1 << XMM5))
Expand All @@ -44,7 +44,7 @@
#define ABI_PARAM5 R8
#define ABI_PARAM6 R9

#define ABI_ALL_CALLEE_SAVED ((1 << RAX) | (1 << RCX) | (1 << RDX) | (1 << RDI) | \
#define ABI_ALL_CALLER_SAVED ((1 << RAX) | (1 << RCX) | (1 << RDX) | (1 << RDI) | \
(1 << RSI) | (1 << R8) | (1 << R9) | (1 << R10) | (1 << R11) | \
0xffff0000 /* xmm0..15 */)

Expand Down
6 changes: 3 additions & 3 deletions Source/Core/Core/PowerPC/Jit64/Jit.cpp
Expand Up @@ -501,7 +501,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
{
js.fifoBytesThisBlock -= 32;
MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write
u32 registersInUse = RegistersInUse();
u32 registersInUse = CallerSavedRegistersInUse();
ABI_PushRegistersAndAdjustStack(registersInUse, false);
ABI_CallFunction((void *)&GPFifo::CheckGatherPipe);
ABI_PopRegistersAndAdjustStack(registersInUse, false);
Expand Down Expand Up @@ -672,7 +672,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
return normalEntry;
}

u32 Jit64::RegistersInUse()
u32 Jit64::CallerSavedRegistersInUse()
{
u32 result = 0;
for (int i = 0; i < NUMXREGS; i++)
Expand All @@ -682,5 +682,5 @@ u32 Jit64::RegistersInUse()
if (!fpr.IsFreeX(i))
result |= (1 << (16 + i));
}
return result;
return result & ABI_ALL_CALLER_SAVED;
}
2 changes: 1 addition & 1 deletion Source/Core/Core/PowerPC/Jit64/Jit.h
Expand Up @@ -60,7 +60,7 @@ class Jit64 : public Jitx86Base
void Jit(u32 em_address) override;
const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b);

u32 RegistersInUse();
u32 CallerSavedRegistersInUse();

JitBlockCache *GetBlockCache() override { return &blocks; }

Expand Down
16 changes: 8 additions & 8 deletions Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp
Expand Up @@ -110,13 +110,13 @@ void Jit64::lXXx(UGeckoInstruction inst)
// do our job at first
s32 offset = (s32)(s16)inst.SIMM_16;
gpr.BindToRegister(d, false, true);
SafeLoadToReg(gpr.RX(d), gpr.R(a), accessSize, offset, RegistersInUse(), signExtend);
SafeLoadToReg(gpr.RX(d), gpr.R(a), accessSize, offset, CallerSavedRegistersInUse(), signExtend);

// if it's still 0, we can wait until the next event
TEST(32, gpr.R(d), gpr.R(d));
FixupBranch noIdle = J_CC(CC_NZ);

u32 registersInUse = RegistersInUse();
u32 registersInUse = CallerSavedRegistersInUse();
ABI_PushRegistersAndAdjustStack(registersInUse, false);

ABI_CallFunctionC((void *)&PowerPC::OnIdle, PowerPC::ppcState.gpr[a] + (s32)(s16)inst.SIMM_16);
Expand Down Expand Up @@ -199,7 +199,7 @@ void Jit64::lXXx(UGeckoInstruction inst)

gpr.Lock(a, b, d);
gpr.BindToRegister(d, js.memcheck, true);
SafeLoadToReg(gpr.RX(d), opAddress, accessSize, 0, RegistersInUse(), signExtend);
SafeLoadToReg(gpr.RX(d), opAddress, accessSize, 0, CallerSavedRegistersInUse(), signExtend);

if (update && js.memcheck && !zeroOffset)
{
Expand Down Expand Up @@ -320,7 +320,7 @@ void Jit64::stX(UGeckoInstruction inst)
// Helps external systems know which instruction triggered the write
MOV(32, M(&PC), Imm32(jit->js.compilerPC));

u32 registersInUse = RegistersInUse();
u32 registersInUse = CallerSavedRegistersInUse();
ABI_PushRegistersAndAdjustStack(registersInUse, false);
switch (accessSize)
{
Expand All @@ -345,7 +345,7 @@ void Jit64::stX(UGeckoInstruction inst)
gpr.Lock(s, a);
MOV(32, R(EDX), gpr.R(a));
MOV(32, R(ECX), gpr.R(s));
SafeWriteRegToReg(ECX, EDX, accessSize, offset, RegistersInUse());
SafeWriteRegToReg(ECX, EDX, accessSize, offset, CallerSavedRegistersInUse());

if (update && offset)
{
Expand Down Expand Up @@ -410,7 +410,7 @@ void Jit64::stXx(UGeckoInstruction inst)
}

MOV(32, R(ECX), gpr.R(s));
SafeWriteRegToReg(ECX, EDX, accessSize, 0, RegistersInUse());
SafeWriteRegToReg(ECX, EDX, accessSize, 0, CallerSavedRegistersInUse());

gpr.UnlockAll();
gpr.UnlockAllX();
Expand All @@ -429,7 +429,7 @@ void Jit64::lmw(UGeckoInstruction inst)
ADD(32, R(ECX), gpr.R(inst.RA));
for (int i = inst.RD; i < 32; i++)
{
SafeLoadToReg(EAX, R(ECX), 32, (i - inst.RD) * 4, RegistersInUse(), false);
SafeLoadToReg(EAX, R(ECX), 32, (i - inst.RD) * 4, CallerSavedRegistersInUse(), false);
gpr.BindToRegister(i, false, true);
MOV(32, gpr.R(i), R(EAX));
}
Expand All @@ -450,7 +450,7 @@ void Jit64::stmw(UGeckoInstruction inst)
else
XOR(32, R(EAX), R(EAX));
MOV(32, R(ECX), gpr.R(i));
SafeWriteRegToReg(ECX, EAX, 32, (i - inst.RD) * 4 + (u32)(s32)inst.SIMM_16, RegistersInUse());
SafeWriteRegToReg(ECX, EAX, 32, (i - inst.RD) * 4 + (u32)(s32)inst.SIMM_16, CallerSavedRegistersInUse());
}
gpr.UnlockAllX();
}
Expand Down
12 changes: 6 additions & 6 deletions Source/Core/Core/PowerPC/Jit64/Jit_LoadStoreFloating.cpp
Expand Up @@ -25,7 +25,7 @@ void Jit64::lfs(UGeckoInstruction inst)

s32 offset = (s32)(s16)inst.SIMM_16;

SafeLoadToReg(EAX, gpr.R(a), 32, offset, RegistersInUse(), false);
SafeLoadToReg(EAX, gpr.R(a), 32, offset, CallerSavedRegistersInUse(), false);

fpr.Lock(d);
fpr.BindToRegister(d, js.memcheck);
Expand All @@ -49,7 +49,7 @@ void Jit64::lfd(UGeckoInstruction inst)

s32 offset = (s32)(s16)inst.SIMM_16;

SafeLoadToReg(RAX, gpr.R(a), 64, offset, RegistersInUse(), false);
SafeLoadToReg(RAX, gpr.R(a), 64, offset, CallerSavedRegistersInUse(), false);

fpr.Lock(d);
fpr.BindToRegister(d, true);
Expand Down Expand Up @@ -81,7 +81,7 @@ void Jit64::stfd(UGeckoInstruction inst)
MOV(64, R(RAX), fpr.R(s));

s32 offset = (s32)(s16)inst.SIMM_16;
SafeWriteRegToReg(RAX, ABI_PARAM1, 64, offset, RegistersInUse());
SafeWriteRegToReg(RAX, ABI_PARAM1, 64, offset, CallerSavedRegistersInUse());

gpr.UnlockAllX();
}
Expand All @@ -100,7 +100,7 @@ void Jit64::stfs(UGeckoInstruction inst)
ConvertDoubleToSingle(XMM0, fpr.RX(s));
gpr.FlushLockX(ABI_PARAM1);
MOV(32, R(ABI_PARAM1), gpr.R(a));
SafeWriteF32ToReg(XMM0, ABI_PARAM1, offset, RegistersInUse());
SafeWriteF32ToReg(XMM0, ABI_PARAM1, offset, CallerSavedRegistersInUse());
fpr.UnlockAll();
gpr.UnlockAllX();
}
Expand All @@ -119,7 +119,7 @@ void Jit64::stfsx(UGeckoInstruction inst)
fpr.Lock(s);
fpr.BindToRegister(s, true, false);
ConvertDoubleToSingle(XMM0, fpr.RX(s));
SafeWriteF32ToReg(XMM0, ABI_PARAM1, 0, RegistersInUse());
SafeWriteF32ToReg(XMM0, ABI_PARAM1, 0, CallerSavedRegistersInUse());
fpr.UnlockAll();
gpr.UnlockAllX();
}
Expand All @@ -133,7 +133,7 @@ void Jit64::lfsx(UGeckoInstruction inst)
if (inst.RA)
ADD(32, R(EAX), gpr.R(inst.RA));

SafeLoadToReg(EAX, R(EAX), 32, 0, RegistersInUse(), false);
SafeLoadToReg(EAX, R(EAX), 32, 0, CallerSavedRegistersInUse(), false);

fpr.Lock(inst.RS);
fpr.BindToRegister(inst.RS, js.memcheck);
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/Core/PowerPC/JitCommon/JitAsmCommon.cpp
Expand Up @@ -8,7 +8,7 @@
#include "Core/PowerPC/JitCommon/JitAsmCommon.h"
#include "Core/PowerPC/JitCommon/JitBase.h"

#define QUANTIZED_REGS_TO_SAVE (ABI_ALL_CALLEE_SAVED & ~((1 << RAX) | (1 << RCX) | (1 << RDX) | \
#define QUANTIZED_REGS_TO_SAVE (ABI_ALL_CALLER_SAVED & ~((1 << RAX) | (1 << RCX) | (1 << RDX) | \
(1 << XMM0) | (1 << XMM1)))

using namespace Gen;
Expand Down

0 comments on commit d128795

Please sign in to comment.