CPU: Basic recompiler implementation for x64 (lui, ori, addiu)

Disabled by default.
This commit is contained in:
Connor McLaughlin
2019-11-19 20:30:04 +10:00
parent 0e8ff85f04
commit 1d6c4a3af1
25 changed files with 4104 additions and 49 deletions

59
src/core/cpu_code_cache.h Normal file
View File

@ -0,0 +1,59 @@
#pragma once
#include "common/bitfield.h"
#include "cpu_types.h"
#include <array>
#include <memory>
#include <unordered_map>
#include <vector>
class JitCodeBuffer;
class Bus;
namespace CPU {
class Core;
namespace Recompiler {
class ASMFunctions;
}
class CodeCache
{
public:
CodeCache();
~CodeCache();
void Initialize(Core* core, Bus* bus);
void Reset();
void Execute();
/// Flushes all blocks which are in the range of the specified code page.
void FlushBlocksWithPageIndex(u32 page_index);
private:
using BlockMap = std::unordered_map<u32, CodeBlock*>;
const CodeBlock* GetNextBlock();
bool CompileBlock(CodeBlock* block);
void FlushBlock(CodeBlock* block);
void InterpretCachedBlock(const CodeBlock& block);
void InterpretUncachedBlock();
Core* m_core;
Bus* m_bus;
const CodeBlock* m_current_block = nullptr;
bool m_current_block_flushed = false;
std::unique_ptr<JitCodeBuffer> m_code_buffer;
std::unique_ptr<Recompiler::ASMFunctions> m_asm_functions;
BlockMap m_blocks;
std::array<std::vector<CodeBlock*>, CPU_CODE_CACHE_PAGE_COUNT> m_ram_block_map;
};
extern bool USE_CODE_CACHE;
extern bool USE_RECOMPILER;
} // namespace CPU