mirror of
https://github.com/citra-mirror/citra.git
synced 2024-08-20 02:13:23 +02:00
shader_jit_x64: Use a sorted vector instead of a set for keeping track of return addresses.
This commit is contained in:
parent
60749f2cda
commit
60aa72e117
@ -2,6 +2,7 @@
|
|||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <smmintrin.h>
|
#include <smmintrin.h>
|
||||||
|
|
||||||
#include "common/x64/abi.h"
|
#include "common/x64/abi.h"
|
||||||
@ -760,8 +761,7 @@ void JitCompiler::Compile_Return() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JitCompiler::Compile_NextInstr() {
|
void JitCompiler::Compile_NextInstr() {
|
||||||
auto search = return_offsets.find(program_counter);
|
if (std::binary_search(return_offsets.begin(), return_offsets.end(), program_counter)) {
|
||||||
if (search != return_offsets.end()) {
|
|
||||||
Compile_Return();
|
Compile_Return();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -793,10 +793,13 @@ void JitCompiler::FindReturnOffsets() {
|
|||||||
case OpCode::Id::CALL:
|
case OpCode::Id::CALL:
|
||||||
case OpCode::Id::CALLC:
|
case OpCode::Id::CALLC:
|
||||||
case OpCode::Id::CALLU:
|
case OpCode::Id::CALLU:
|
||||||
return_offsets.insert(instr.flow_control.dest_offset + instr.flow_control.num_instructions);
|
return_offsets.push_back(instr.flow_control.dest_offset + instr.flow_control.num_instructions);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sort for efficient binary search later
|
||||||
|
std::sort(return_offsets.begin(), return_offsets.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitCompiler::Compile() {
|
void JitCompiler::Compile() {
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <set>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <nihstro/shader_bytecode.h>
|
#include <nihstro/shader_bytecode.h>
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ private:
|
|||||||
std::array<const u8*, 1024> code_ptr;
|
std::array<const u8*, 1024> code_ptr;
|
||||||
|
|
||||||
/// Offsets in code where a return needs to be inserted
|
/// Offsets in code where a return needs to be inserted
|
||||||
std::set<unsigned> return_offsets;
|
std::vector<unsigned> return_offsets;
|
||||||
|
|
||||||
unsigned program_counter = 0; ///< Offset of the next instruction to decode
|
unsigned program_counter = 0; ///< Offset of the next instruction to decode
|
||||||
bool looping = false; ///< True if compiling a loop, used to check for nested loops
|
bool looping = false; ///< True if compiling a loop, used to check for nested loops
|
||||||
|
Loading…
Reference in New Issue
Block a user