From 43dc70eace95522833b5482aeaa9f1f35c583ae3 Mon Sep 17 00:00:00 2001 From: nodchip Date: Sun, 22 Aug 2010 08:27:43 +0000 Subject: [PATCH] JitIL: Omitted some extra MOVs when a next program counter is in a register. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6116 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp | 8 +++----- Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp | 12 ++++++------ Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h | 4 ++-- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp index 7faccf3d02..941b0c4e6a 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp @@ -653,9 +653,7 @@ static void regWriteExit(RegInfo& RI, InstLoc dest) { if (isImm(*dest)) { RI.Jit->WriteExit(RI.Build->GetImmValue(dest), RI.exitNumber++); } else { - if (!regLocForInst(RI, dest).IsSimpleReg(EAX)) - RI.Jit->MOV(32, R(EAX), regLocForInst(RI, dest)); - RI.Jit->WriteExitDestInEAX(RI.exitNumber++); + RI.Jit->WriteExitDestInOpArg(regLocForInst(RI, dest), RI.exitNumber++); } } @@ -1608,7 +1606,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak } case InterpreterBranch: { Jit->MOV(32, R(EAX), M(&NPC)); - Jit->WriteExitDestInEAX(0); + Jit->WriteExitDestInOpArg(R(EAX), 0); break; } case RFIExit: { @@ -1625,7 +1623,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak Jit->MOV(32, M(&MSR), R(EAX)); // NPC = SRR0; Jit->MOV(32, R(EAX), M(&SRR0)); - Jit->WriteRfiExitDestInEAX(); + Jit->WriteRfiExitDestInOpArg(R(EAX)); break; } case FPExceptionCheckStart: { diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp index 2175a05492..249a31975c 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp @@ -227,7 +227,7 @@ void JitIL::WriteCallInterpreter(UGeckoInstruction inst) if (js.isLastInstruction) { MOV(32, R(EAX), M(&NPC)); - WriteRfiExitDestInEAX(); + WriteRfiExitDestInOpArg(R(EAX)); } } @@ -248,7 +248,7 @@ void JitIL::HLEFunction(UGeckoInstruction _inst) { ABI_CallFunctionCC((void*)&HLE::Execute, js.compilerPC, _inst.hex); MOV(32, R(EAX), M(&NPC)); - WriteExitDestInEAX(0); + WriteExitDestInOpArg(R(EAX), 0); } void JitIL::DoNothing(UGeckoInstruction _inst) @@ -316,17 +316,17 @@ void JitIL::WriteExit(u32 destination, int exit_num) } } -void JitIL::WriteExitDestInEAX(int exit_num) +void JitIL::WriteExitDestInOpArg(const Gen::OpArg& arg, int exit_num) { - MOV(32, M(&PC), R(EAX)); + MOV(32, M(&PC), arg); Cleanup(); SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.dispatcher, true); } -void JitIL::WriteRfiExitDestInEAX() +void JitIL::WriteRfiExitDestInOpArg(const Gen::OpArg& arg) { - MOV(32, M(&PC), R(EAX)); + MOV(32, M(&PC), arg); Cleanup(); SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.testExceptions, true); diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h index 9e5a37d380..ea49791e41 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h @@ -110,9 +110,9 @@ public: // Utilities for use by opcodes void WriteExit(u32 destination, int exit_num); - void WriteExitDestInEAX(int exit_num); + void WriteExitDestInOpArg(const Gen::OpArg& arg, int exit_num); void WriteExceptionExit(); - void WriteRfiExitDestInEAX(); + void WriteRfiExitDestInOpArg(const Gen::OpArg& arg); void WriteCallInterpreter(UGeckoInstruction _inst); void Cleanup();