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
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <algorithm>
|
||||
#include <smmintrin.h>
|
||||
|
||||
#include "common/x64/abi.h"
|
||||
|
@ -760,8 +761,7 @@ void JitCompiler::Compile_Return() {
|
|||
}
|
||||
|
||||
void JitCompiler::Compile_NextInstr() {
|
||||
auto search = return_offsets.find(program_counter);
|
||||
if (search != return_offsets.end()) {
|
||||
if (std::binary_search(return_offsets.begin(), return_offsets.end(), program_counter)) {
|
||||
Compile_Return();
|
||||
}
|
||||
|
||||
|
@ -793,10 +793,13 @@ void JitCompiler::FindReturnOffsets() {
|
|||
case OpCode::Id::CALL:
|
||||
case OpCode::Id::CALLC:
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort for efficient binary search later
|
||||
std::sort(return_offsets.begin(), return_offsets.end());
|
||||
}
|
||||
|
||||
void JitCompiler::Compile() {
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <set>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <nihstro/shader_bytecode.h>
|
||||
|
||||
|
@ -106,7 +106,7 @@ private:
|
|||
std::array<const u8*, 1024> code_ptr;
|
||||
|
||||
/// 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
|
||||
bool looping = false; ///< True if compiling a loop, used to check for nested loops
|
||||
|
|
Reference in New Issue