shader_jit_x64: Use a sorted vector instead of a set for keeping track of return addresses.

master
bunnei 2016-04-12 23:24:34 +07:00
parent 60749f2cda
commit 60aa72e117
2 changed files with 8 additions and 5 deletions

@ -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