mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-22 06:41:08 +00:00
JitIL/Jit64: Removed std::vector for speed up.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6222 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
073899cb26
commit
97a9c375f9
@ -437,11 +437,13 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
|||||||
//Analyze the block, collect all instructions it is made of (including inlining,
|
//Analyze the block, collect all instructions it is made of (including inlining,
|
||||||
//if that is enabled), reorder instructions for optimal performance, and join joinable instructions.
|
//if that is enabled), reorder instructions for optimal performance, and join joinable instructions.
|
||||||
u32 nextPC = em_address;
|
u32 nextPC = em_address;
|
||||||
std::vector<u32> merged_addresses;
|
u32 merged_addresses[32];
|
||||||
|
const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]);
|
||||||
|
int size_of_merged_addresses;
|
||||||
if (!memory_exception)
|
if (!memory_exception)
|
||||||
{
|
{
|
||||||
// If there is a memory exception inside a block (broken_block==true), compile up to that instruction.
|
// If there is a memory exception inside a block (broken_block==true), compile up to that instruction.
|
||||||
nextPC = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses);
|
nextPC = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
PPCAnalyst::CodeOp *ops = code_buf->codebuffer;
|
PPCAnalyst::CodeOp *ops = code_buf->codebuffer;
|
||||||
@ -498,7 +500,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
|||||||
js.downcountAmount = 0;
|
js.downcountAmount = 0;
|
||||||
if (!Core::g_CoreStartupParameter.bEnableDebugging)
|
if (!Core::g_CoreStartupParameter.bEnableDebugging)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < merged_addresses.size(); ++i)
|
for (unsigned int i = 0; i < size_of_merged_addresses; ++i)
|
||||||
{
|
{
|
||||||
const u32 address = merged_addresses[i];
|
const u32 address = merged_addresses[i];
|
||||||
js.downcountAmount += PatchEngine::GetSpeedhackCycles(address);
|
js.downcountAmount += PatchEngine::GetSpeedhackCycles(address);
|
||||||
|
@ -429,11 +429,13 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
|||||||
//Analyze the block, collect all instructions it is made of (including inlining,
|
//Analyze the block, collect all instructions it is made of (including inlining,
|
||||||
//if that is enabled), reorder instructions for optimal performance, and join joinable instructions.
|
//if that is enabled), reorder instructions for optimal performance, and join joinable instructions.
|
||||||
b->exitAddress[0] = em_address;
|
b->exitAddress[0] = em_address;
|
||||||
std::vector<u32> merged_addresses;
|
u32 merged_addresses[32];
|
||||||
|
const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]);
|
||||||
|
int size_of_merged_addresses;
|
||||||
if (!memory_exception)
|
if (!memory_exception)
|
||||||
{
|
{
|
||||||
// If there is a memory exception inside a block (broken_block==true), compile up to that instruction.
|
// If there is a memory exception inside a block (broken_block==true), compile up to that instruction.
|
||||||
b->exitAddress[0] = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses);
|
b->exitAddress[0] = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses);
|
||||||
}
|
}
|
||||||
PPCAnalyst::CodeOp *ops = code_buf->codebuffer;
|
PPCAnalyst::CodeOp *ops = code_buf->codebuffer;
|
||||||
|
|
||||||
@ -472,7 +474,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc
|
|||||||
js.downcountAmount = 0;
|
js.downcountAmount = 0;
|
||||||
if (!Core::g_CoreStartupParameter.bEnableDebugging)
|
if (!Core::g_CoreStartupParameter.bEnableDebugging)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < merged_addresses.size(); ++i)
|
for (unsigned int i = 0; i < size_of_merged_addresses; ++i)
|
||||||
{
|
{
|
||||||
const u32 address = merged_addresses[i];
|
const u32 address = merged_addresses[i];
|
||||||
js.downcountAmount += PatchEngine::GetSpeedhackCycles(address);
|
js.downcountAmount += PatchEngine::GetSpeedhackCycles(address);
|
||||||
|
@ -285,9 +285,18 @@ bool CanSwapAdjacentOps(const CodeOp &a, const CodeOp &b)
|
|||||||
|
|
||||||
// Does not yet perform inlining - although there are plans for that.
|
// Does not yet perform inlining - although there are plans for that.
|
||||||
// Returns the exit address of the next PC
|
// Returns the exit address of the next PC
|
||||||
u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, BlockRegStats *fpa, bool &broken_block, CodeBuffer *buffer, int blockSize, std::vector<u32>& merged_addresses)
|
u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa,
|
||||||
|
BlockRegStats *fpa, bool &broken_block, CodeBuffer *buffer,
|
||||||
|
int blockSize, u32* merged_addresses,
|
||||||
|
int capacity_of_merged_addresses, int& size_of_merged_addresses)
|
||||||
{
|
{
|
||||||
merged_addresses.push_back(address);
|
if (capacity_of_merged_addresses < FUNCTION_FOLLOWING_THRESHOLD) {
|
||||||
|
PanicAlert("capacity of merged_addresses is too small!");
|
||||||
|
}
|
||||||
|
std::fill_n(merged_addresses, capacity_of_merged_addresses, 0);
|
||||||
|
merged_addresses[0] = address;
|
||||||
|
size_of_merged_addresses = 1;
|
||||||
|
|
||||||
memset(st, 0, sizeof(st));
|
memset(st, 0, sizeof(st));
|
||||||
|
|
||||||
// Disabled the following optimization in preference of FAST_ICACHE
|
// Disabled the following optimization in preference of FAST_ICACHE
|
||||||
@ -475,7 +484,7 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, Bloc
|
|||||||
// because bx may store a certain value to the link register.
|
// because bx may store a certain value to the link register.
|
||||||
// Instead, we skip a part of bx in Jit**::bx().
|
// Instead, we skip a part of bx in Jit**::bx().
|
||||||
address = destination;
|
address = destination;
|
||||||
merged_addresses.push_back(address);
|
merged_addresses[size_of_merged_addresses++] = address;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -108,7 +108,10 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, BlockRegStats *fpa, bool &broken_block, CodeBuffer *buffer, int blockSize, std::vector<u32>& merged_addresses);
|
u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa,
|
||||||
|
BlockRegStats *fpa, bool &broken_block, CodeBuffer *buffer,
|
||||||
|
int blockSize, u32* merged_addresses,
|
||||||
|
int capacity_of_merged_addresses, int& size_of_merged_addresses);
|
||||||
void LogFunctionCall(u32 addr);
|
void LogFunctionCall(u32 addr);
|
||||||
void FindFunctions(u32 startAddr, u32 endAddr, PPCSymbolDB *func_db);
|
void FindFunctions(u32 startAddr, u32 endAddr, PPCSymbolDB *func_db);
|
||||||
bool AnalyzeFunction(u32 startAddr, Symbol &func, int max_size = 0);
|
bool AnalyzeFunction(u32 startAddr, Symbol &func, int max_size = 0);
|
||||||
|
@ -177,8 +177,10 @@ void CJitWindow::Compare(u32 em_address)
|
|||||||
PPCAnalyst::BlockRegStats gpa;
|
PPCAnalyst::BlockRegStats gpa;
|
||||||
PPCAnalyst::BlockRegStats fpa;
|
PPCAnalyst::BlockRegStats fpa;
|
||||||
bool broken_block = false;
|
bool broken_block = false;
|
||||||
std::vector<u32> merged_addresses;
|
u32 merged_addresses[32];
|
||||||
if (PPCAnalyst::Flatten(ppc_addr, &size, &st, &gpa, &fpa, broken_block, &code_buffer, size, merged_addresses) != 0xffffffff)
|
const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]);
|
||||||
|
int size_of_merged_addresses;
|
||||||
|
if (PPCAnalyst::Flatten(ppc_addr, &size, &st, &gpa, &fpa, broken_block, &code_buffer, size, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses) != 0xffffffff)
|
||||||
{
|
{
|
||||||
sptr = (char*)xDis;
|
sptr = (char*)xDis;
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user