summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2016-04-13 05:24:34 +0200
committerbunnei <bunneidev@gmail.com>2016-04-14 05:04:52 +0200
commit60aa72e1177c436351c91be291ef869816df79e0 (patch)
tree5bdec04703a68c30fe523ebbe75feb54a6b7c5cd
parentshader_jit_x64: Use CALL/RET instead of JMP for subroutines. (diff)
downloadyuzu-60aa72e1177c436351c91be291ef869816df79e0.tar
yuzu-60aa72e1177c436351c91be291ef869816df79e0.tar.gz
yuzu-60aa72e1177c436351c91be291ef869816df79e0.tar.bz2
yuzu-60aa72e1177c436351c91be291ef869816df79e0.tar.lz
yuzu-60aa72e1177c436351c91be291ef869816df79e0.tar.xz
yuzu-60aa72e1177c436351c91be291ef869816df79e0.tar.zst
yuzu-60aa72e1177c436351c91be291ef869816df79e0.zip
-rw-r--r--src/video_core/shader/shader_jit_x64.cpp9
-rw-r--r--src/video_core/shader/shader_jit_x64.h4
2 files changed, 8 insertions, 5 deletions
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp
index 503fad158..e32a4e720 100644
--- a/src/video_core/shader/shader_jit_x64.cpp
+++ b/src/video_core/shader/shader_jit_x64.cpp
@@ -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() {
diff --git a/src/video_core/shader/shader_jit_x64.h b/src/video_core/shader/shader_jit_x64.h
index 920a269e2..aa5060584 100644
--- a/src/video_core/shader/shader_jit_x64.h
+++ b/src/video_core/shader/shader_jit_x64.h
@@ -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