|
|
|
@ -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() {
|
|
|
|
|