1 // Copyright (c) 2012- PPSSPP Project. 2 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU General Public License as published by 5 // the Free Software Foundation, version 2.0 or later versions. 6 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 // GNU General Public License 2.0 for more details. 11 12 // A copy of the GPL 2.0 should have been included with the program. 13 // If not, see http://www.gnu.org/licenses/ 14 15 // Official git repository and contact information can be found at 16 // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. 17 18 #pragma once 19 20 #include <vector> 21 #include <string> 22 23 #include "Common/Common.h" 24 #include "Common/CommonTypes.h" 25 #include "Core/MIPS/MIPS.h" 26 27 // TODO: Find a better place for these. 28 std::vector<std::string> DisassembleArm2(const u8 *data, int size); 29 std::vector<std::string> DisassembleArm64(const u8 *data, int size); 30 std::vector<std::string> DisassembleX86(const u8 *data, int size); 31 32 struct JitBlock; 33 class JitBlockCache; 34 class JitBlockCacheDebugInterface; 35 class PointerWrap; 36 37 #ifdef USING_QT_UI 38 #undef emit 39 #endif 40 41 class MIPSState; 42 43 namespace MIPSComp { 44 void JitAt(); 45 46 class MIPSFrontendInterface { 47 public: ~MIPSFrontendInterface()48 virtual ~MIPSFrontendInterface() {} 49 50 virtual void EatPrefix() = 0; 51 52 virtual void Comp_Generic(MIPSOpcode op) = 0; 53 virtual void Comp_RunBlock(MIPSOpcode op) = 0; 54 virtual void Comp_ReplacementFunc(MIPSOpcode op) = 0; 55 virtual void Comp_ITypeMem(MIPSOpcode op) = 0; 56 virtual void Comp_Cache(MIPSOpcode op) = 0; 57 virtual void Comp_RelBranch(MIPSOpcode op) = 0; 58 virtual void Comp_RelBranchRI(MIPSOpcode op) = 0; 59 virtual void Comp_FPUBranch(MIPSOpcode op) = 0; 60 virtual void Comp_FPULS(MIPSOpcode op) = 0; 61 virtual void Comp_FPUComp(MIPSOpcode op) = 0; 62 virtual void Comp_Jump(MIPSOpcode op) = 0; 63 virtual void Comp_JumpReg(MIPSOpcode op) = 0; 64 virtual void Comp_Syscall(MIPSOpcode op) = 0; 65 virtual void Comp_Break(MIPSOpcode op) = 0; 66 virtual void Comp_IType(MIPSOpcode op) = 0; 67 virtual void Comp_RType2(MIPSOpcode op) = 0; 68 virtual void Comp_RType3(MIPSOpcode op) = 0; 69 virtual void Comp_ShiftType(MIPSOpcode op) = 0; 70 virtual void Comp_Allegrex(MIPSOpcode op) = 0; 71 virtual void Comp_Allegrex2(MIPSOpcode op) = 0; 72 virtual void Comp_VBranch(MIPSOpcode op) = 0; 73 virtual void Comp_MulDivType(MIPSOpcode op) = 0; 74 virtual void Comp_Special3(MIPSOpcode op) = 0; 75 virtual void Comp_FPU3op(MIPSOpcode op) = 0; 76 virtual void Comp_FPU2op(MIPSOpcode op) = 0; 77 virtual void Comp_mxc1(MIPSOpcode op) = 0; 78 virtual void Comp_SV(MIPSOpcode op) = 0; 79 virtual void Comp_SVQ(MIPSOpcode op) = 0; 80 virtual void Comp_VPFX(MIPSOpcode op) = 0; 81 virtual void Comp_VVectorInit(MIPSOpcode op) = 0; 82 virtual void Comp_VMatrixInit(MIPSOpcode op) = 0; 83 virtual void Comp_VDot(MIPSOpcode op) = 0; 84 virtual void Comp_VecDo3(MIPSOpcode op) = 0; 85 virtual void Comp_VV2Op(MIPSOpcode op) = 0; 86 virtual void Comp_Mftv(MIPSOpcode op) = 0; 87 virtual void Comp_Vmfvc(MIPSOpcode op) = 0; 88 virtual void Comp_Vmtvc(MIPSOpcode op) = 0; 89 virtual void Comp_Vmmov(MIPSOpcode op) = 0; 90 virtual void Comp_VScl(MIPSOpcode op) = 0; 91 virtual void Comp_Vmmul(MIPSOpcode op) = 0; 92 virtual void Comp_Vmscl(MIPSOpcode op) = 0; 93 virtual void Comp_Vtfm(MIPSOpcode op) = 0; 94 virtual void Comp_VHdp(MIPSOpcode op) = 0; 95 virtual void Comp_VCrs(MIPSOpcode op) = 0; 96 virtual void Comp_VDet(MIPSOpcode op) = 0; 97 virtual void Comp_Vi2x(MIPSOpcode op) = 0; 98 virtual void Comp_Vx2i(MIPSOpcode op) = 0; 99 virtual void Comp_Vf2i(MIPSOpcode op) = 0; 100 virtual void Comp_Vi2f(MIPSOpcode op) = 0; 101 virtual void Comp_Vh2f(MIPSOpcode op) = 0; 102 virtual void Comp_Vcst(MIPSOpcode op) = 0; 103 virtual void Comp_Vhoriz(MIPSOpcode op) = 0; 104 virtual void Comp_VRot(MIPSOpcode op) = 0; 105 virtual void Comp_VIdt(MIPSOpcode op) = 0; 106 virtual void Comp_Vcmp(MIPSOpcode op) = 0; 107 virtual void Comp_Vcmov(MIPSOpcode op) = 0; 108 virtual void Comp_Viim(MIPSOpcode op) = 0; 109 virtual void Comp_Vfim(MIPSOpcode op) = 0; 110 virtual void Comp_VCrossQuat(MIPSOpcode op) = 0; 111 virtual void Comp_Vsgn(MIPSOpcode op) = 0; 112 virtual void Comp_Vocp(MIPSOpcode op) = 0; 113 virtual void Comp_ColorConv(MIPSOpcode op) = 0; 114 virtual void Comp_Vbfy(MIPSOpcode op) = 0; 115 virtual void Comp_DoNothing(MIPSOpcode op) = 0; 116 117 virtual int Replace_fabsf() = 0; 118 }; 119 120 class JitInterface { 121 public: ~JitInterface()122 virtual ~JitInterface() {} 123 124 virtual bool CodeInRange(const u8 *ptr) const = 0; 125 virtual bool DescribeCodePtr(const u8 *ptr, std::string &name) = 0; IsAtDispatchFetch(const u8 * ptr)126 virtual bool IsAtDispatchFetch(const u8 *ptr) const { 127 return false; 128 } 129 virtual const u8 *GetDispatcher() const = 0; 130 virtual const u8 *GetCrashHandler() const = 0; 131 virtual JitBlockCache *GetBlockCache() = 0; 132 virtual JitBlockCacheDebugInterface *GetBlockCacheDebugInterface() = 0; 133 virtual void InvalidateCacheAt(u32 em_address, int length = 4) = 0; 134 virtual void DoState(PointerWrap &p) = 0; 135 virtual void RunLoopUntil(u64 globalticks) = 0; 136 virtual void Compile(u32 em_address) = 0; CompileFunction(u32 start_address,u32 length)137 virtual void CompileFunction(u32 start_address, u32 length) { } 138 virtual void ClearCache() = 0; 139 virtual void UpdateFCR31() = 0; 140 virtual MIPSOpcode GetOriginalOp(MIPSOpcode op) = 0; 141 142 // No jit operations may be run between these calls. 143 // Meant to be used to make memory safe for savestates, memcpy, etc. 144 virtual std::vector<u32> SaveAndClearEmuHackOps() = 0; 145 virtual void RestoreSavedEmuHackOps(std::vector<u32> saved) = 0; 146 147 // Block linking. This may need to work differently for whole-function JITs and stuff 148 // like that. 149 virtual void LinkBlock(u8 *exitPoint, const u8 *entryPoint) = 0; 150 virtual void UnlinkBlock(u8 *checkedEntry, u32 originalAddress) = 0; 151 }; 152 153 typedef void (MIPSFrontendInterface::*MIPSCompileFunc)(MIPSOpcode opcode); 154 typedef int (MIPSFrontendInterface::*MIPSReplaceFunc)(); 155 156 extern JitInterface *jit; 157 158 void DoDummyJitState(PointerWrap &p); 159 160 JitInterface *CreateNativeJit(MIPSState *mipsState); 161 } 162