mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-22 18:53:28 +01:00
Implemented fallback to PPU Interpreter
This commit is contained in:
parent
aa614e83f2
commit
6135b450c2
@ -1,6 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Emu/Cell/PPUOpcodes.h"
|
#include "Emu/Cell/PPUOpcodes.h"
|
||||||
|
#include "Emu/SysCalls/SysCalls.h"
|
||||||
|
#include "rpcs3/Ini.h"
|
||||||
|
#include "Emu/System.h"
|
||||||
|
#include "Emu/SysCalls/Static.h"
|
||||||
|
#include "Emu/SysCalls/Modules.h"
|
||||||
|
#include "Emu/Memory/Memory.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
@ -50,6 +56,7 @@ u64 rotr64(const u64 x, const u8 n) { return (x >> n) | (x << (64 - n)); }
|
|||||||
|
|
||||||
class PPUInterpreter : public PPUOpcodes
|
class PPUInterpreter : public PPUOpcodes
|
||||||
{
|
{
|
||||||
|
friend class PPULLVMRecompiler;
|
||||||
private:
|
private:
|
||||||
PPUThread& CPU;
|
PPUThread& CPU;
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "Emu/Cell/PPUDecoder.h"
|
#include "Emu/Cell/PPUDecoder.h"
|
||||||
#include "Emu/Cell/PPUThread.h"
|
#include "Emu/Cell/PPUThread.h"
|
||||||
|
#include "Emu/Cell/PPUInterpreter.h"
|
||||||
#include "llvm/IR/LLVMContext.h"
|
#include "llvm/IR/LLVMContext.h"
|
||||||
#include "llvm/IR/IRBuilder.h"
|
#include "llvm/IR/IRBuilder.h"
|
||||||
#include "llvm/IR/Module.h"
|
#include "llvm/IR/Module.h"
|
||||||
@ -448,6 +449,9 @@ private:
|
|||||||
/// Module to which all generated code is output to
|
/// Module to which all generated code is output to
|
||||||
llvm::Module * m_module;
|
llvm::Module * m_module;
|
||||||
|
|
||||||
|
/// Global variable in m_module that corresponds to m_ppu.GPR
|
||||||
|
llvm::GlobalVariable * m_pc;
|
||||||
|
|
||||||
/// Global variable in m_module that corresponds to m_ppu.GPR
|
/// Global variable in m_module that corresponds to m_ppu.GPR
|
||||||
llvm::GlobalVariable * m_gpr;
|
llvm::GlobalVariable * m_gpr;
|
||||||
|
|
||||||
@ -469,6 +473,9 @@ private:
|
|||||||
/// Disassembler
|
/// Disassembler
|
||||||
LLVMDisasmContextRef m_disassembler;
|
LLVMDisasmContextRef m_disassembler;
|
||||||
|
|
||||||
|
/// PPU Interpreter
|
||||||
|
PPUInterpreter m_interpreter;
|
||||||
|
|
||||||
/// Get a bit
|
/// Get a bit
|
||||||
llvm::Value * GetBit(llvm::Value * val, u32 n);
|
llvm::Value * GetBit(llvm::Value * val, u32 n);
|
||||||
|
|
||||||
@ -550,6 +557,34 @@ private:
|
|||||||
/// Set VR to the specified value
|
/// Set VR to the specified value
|
||||||
void SetVr(u32 vr, llvm::Value * val_x128);
|
void SetVr(u32 vr, llvm::Value * val_x128);
|
||||||
|
|
||||||
|
/// Call a member function with no arguments
|
||||||
|
template<class F, class C>
|
||||||
|
void ThisCall0(const char * name, F function, C * this_p);
|
||||||
|
|
||||||
|
/// Call a member function with one argument
|
||||||
|
template<class F, class C, class T1>
|
||||||
|
void ThisCall1(const char * name, F function, C * this_p, T1 arg1);
|
||||||
|
|
||||||
|
/// Call a member function with two arguments
|
||||||
|
template<class F, class C, class T1, class T2>
|
||||||
|
void ThisCall2(const char * name, F function, C * this_p, T1 arg1, T2 arg2);
|
||||||
|
|
||||||
|
/// Call a member function with three arguments
|
||||||
|
template<class F, class C, class T1, class T2, class T3>
|
||||||
|
void ThisCall3(const char * name, F function, C * this_p, T1 arg1, T2 arg2, T3 arg3);
|
||||||
|
|
||||||
|
/// Call a member function with four arguments
|
||||||
|
template<class F, class C, class T1, class T2, class T3, class T4>
|
||||||
|
void ThisCall4(const char * name, F function, C * this_p, T1 arg1, T2 arg2, T3 arg3, T4 arg4);
|
||||||
|
|
||||||
|
/// Call a member function with five arguments
|
||||||
|
template<class F, class C, class T1, class T2, class T3, class T4, class T5>
|
||||||
|
void ThisCall5(const char * name, F function, C * this_p, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
|
||||||
|
|
||||||
|
/// Call a member function with six arguments
|
||||||
|
template<class F, class C, class T1, class T2, class T3, class T4, class T5, class T6>
|
||||||
|
void ThisCall6(const char * name, F function, C * this_p, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
|
||||||
|
|
||||||
/// Excute a test
|
/// Excute a test
|
||||||
void RunTest(const char * name, std::function<void()> test_case, std::function<void()> input, std::function<bool(std::string & msg)> check_result);
|
void RunTest(const char * name, std::function<void()> test_case, std::function<void()> input, std::function<bool(std::string & msg)> check_result);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user