Obvious enhancements to load generation; should be a slight speedup.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1253 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
magumagu9 2008-11-22 20:54:41 +00:00
parent a6d5a7ea9e
commit 9fe8f8b6dd
1 changed files with 12 additions and 11 deletions

View File

@ -47,17 +47,18 @@ void UnsafeLoadRegToReg(X64Reg reg_addr, X64Reg reg_value, int accessSize, s32 o
#endif #endif
if (accessSize == 32) if (accessSize == 32)
{ {
BSWAP(32, EAX); BSWAP(32, reg_value);
} }
else if (accessSize == 16) else if (accessSize == 16)
{ {
BSWAP(32, EAX); BSWAP(32, reg_value);
SHR(32, R(EAX), Imm8(16)); if (signExtend)
} SAR(32, R(reg_value), Imm8(16));
if (signExtend && accessSize < 32) { else
// For 16-bit, this must be done AFTER the BSWAP. SHR(32, R(reg_value), Imm8(16));
} else if (signExtend) {
// TODO: bake 8-bit into the original load. // TODO: bake 8-bit into the original load.
MOVSX(32, accessSize, EAX, R(EAX)); MOVSX(32, accessSize, reg_value, R(reg_value));
} }
} }
@ -66,10 +67,7 @@ void SafeLoadRegToEAX(X64Reg reg, int accessSize, s32 offset, bool signExtend)
if (offset) if (offset)
ADD(32, R(reg), Imm32((u32)offset)); ADD(32, R(reg), Imm32((u32)offset));
TEST(32, R(reg), Imm32(0x0C000000)); TEST(32, R(reg), Imm32(0x0C000000));
FixupBranch argh = J_CC(CC_NZ); FixupBranch argh = J_CC(CC_Z);
UnsafeLoadRegToReg(reg, EAX, accessSize, 0, signExtend);
FixupBranch arg2 = J();
SetJumpTarget(argh);
switch (accessSize) switch (accessSize)
{ {
case 32: ABI_CallFunctionR(ProtectFunction((void *)&Memory::Read_U32, 1), reg); break; case 32: ABI_CallFunctionR(ProtectFunction((void *)&Memory::Read_U32, 1), reg); break;
@ -80,6 +78,9 @@ void SafeLoadRegToEAX(X64Reg reg, int accessSize, s32 offset, bool signExtend)
// Need to sign extend values coming from the Read_U* functions. // Need to sign extend values coming from the Read_U* functions.
MOVSX(32, accessSize, EAX, R(EAX)); MOVSX(32, accessSize, EAX, R(EAX));
} }
FixupBranch arg2 = J();
SetJumpTarget(argh);
UnsafeLoadRegToReg(reg, EAX, accessSize, 0, signExtend);
SetJumpTarget(arg2); SetJumpTarget(arg2);
} }