shader_jit_x64: Use a sorted vector instead of a set for keeping track of return addresses.
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei