mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00: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 changed files with 8 additions and 5 deletions
				
			
		|  | @ -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
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue