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 "Common/MipsEmitter.h" 21 using namespace MIPSGen; 22 23 #include "Core/MIPS/JitCommon/JitCommon.h" 24 #include "Core/MIPS/JitCommon/JitState.h" 25 #include "Core/MIPS/JitCommon/JitBlockCache.h" 26 #include "../MIPSVFPUUtils.h" 27 28 #ifndef offsetof 29 #include "stddef.h" 30 #endif 31 32 namespace MIPSComp 33 { 34 35 class MipsJit : public MIPSGen::MIPSCodeBlock, public JitInterface, public MIPSFrontendInterface 36 { 37 public: 38 MipsJit(MIPSState *mipsState); 39 40 void DoState(PointerWrap &p) override; 41 42 // Compiled ops should ignore delay slots 43 // the compiler will take care of them by itself 44 // OR NOT 45 void Comp_Generic(MIPSOpcode op) override; 46 47 void RunLoopUntil(u64 globalticks) override; 48 49 void Compile(u32 em_address) override; // Compiles a block at current MIPS PC 50 const u8 *DoJit(u32 em_address, JitBlock *b); 51 GetCrashHandler()52 const u8 *GetCrashHandler() const override { return nullptr; } CodeInRange(const u8 * ptr)53 bool CodeInRange(const u8 *ptr) const override { return IsInSpace(ptr); } 54 bool DescribeCodePtr(const u8 *ptr, std::string &name); 55 56 void CompileDelaySlot(int flags); 57 void EatInstruction(MIPSOpcode op); 58 void AddContinuedBlock(u32 dest); 59 60 void Comp_RunBlock(MIPSOpcode op) override; 61 void Comp_ReplacementFunc(MIPSOpcode op) override; 62 63 // Ops Comp_ITypeMem(MIPSOpcode op)64 void Comp_ITypeMem(MIPSOpcode op) override {} Comp_Cache(MIPSOpcode op)65 void Comp_Cache(MIPSOpcode op) override {} 66 Comp_RelBranch(MIPSOpcode op)67 void Comp_RelBranch(MIPSOpcode op) override {} Comp_RelBranchRI(MIPSOpcode op)68 void Comp_RelBranchRI(MIPSOpcode op) override {} Comp_FPUBranch(MIPSOpcode op)69 void Comp_FPUBranch(MIPSOpcode op) override {} Comp_FPULS(MIPSOpcode op)70 void Comp_FPULS(MIPSOpcode op) override {} Comp_FPUComp(MIPSOpcode op)71 void Comp_FPUComp(MIPSOpcode op) override {} Comp_Jump(MIPSOpcode op)72 void Comp_Jump(MIPSOpcode op) override {} Comp_JumpReg(MIPSOpcode op)73 void Comp_JumpReg(MIPSOpcode op) override {} Comp_Syscall(MIPSOpcode op)74 void Comp_Syscall(MIPSOpcode op) override {} Comp_Break(MIPSOpcode op)75 void Comp_Break(MIPSOpcode op) override {} 76 Comp_IType(MIPSOpcode op)77 void Comp_IType(MIPSOpcode op) override {} Comp_RType2(MIPSOpcode op)78 void Comp_RType2(MIPSOpcode op) override {} Comp_RType3(MIPSOpcode op)79 void Comp_RType3(MIPSOpcode op) override {} Comp_ShiftType(MIPSOpcode op)80 void Comp_ShiftType(MIPSOpcode op) override {} Comp_Allegrex(MIPSOpcode op)81 void Comp_Allegrex(MIPSOpcode op) override {} Comp_Allegrex2(MIPSOpcode op)82 void Comp_Allegrex2(MIPSOpcode op) override {} Comp_VBranch(MIPSOpcode op)83 void Comp_VBranch(MIPSOpcode op) override {} Comp_MulDivType(MIPSOpcode op)84 void Comp_MulDivType(MIPSOpcode op) override {} Comp_Special3(MIPSOpcode op)85 void Comp_Special3(MIPSOpcode op) override {} 86 Comp_FPU3op(MIPSOpcode op)87 void Comp_FPU3op(MIPSOpcode op) override {} Comp_FPU2op(MIPSOpcode op)88 void Comp_FPU2op(MIPSOpcode op) override {} Comp_mxc1(MIPSOpcode op)89 void Comp_mxc1(MIPSOpcode op) override {} 90 Comp_DoNothing(MIPSOpcode op)91 void Comp_DoNothing(MIPSOpcode op) override {} 92 Comp_SV(MIPSOpcode op)93 void Comp_SV(MIPSOpcode op) override {} Comp_SVQ(MIPSOpcode op)94 void Comp_SVQ(MIPSOpcode op) override {} Comp_VPFX(MIPSOpcode op)95 void Comp_VPFX(MIPSOpcode op) override {} Comp_VVectorInit(MIPSOpcode op)96 void Comp_VVectorInit(MIPSOpcode op) override {} Comp_VMatrixInit(MIPSOpcode op)97 void Comp_VMatrixInit(MIPSOpcode op) override {} Comp_VDot(MIPSOpcode op)98 void Comp_VDot(MIPSOpcode op) override {} Comp_VecDo3(MIPSOpcode op)99 void Comp_VecDo3(MIPSOpcode op) override {} Comp_VV2Op(MIPSOpcode op)100 void Comp_VV2Op(MIPSOpcode op) override {} Comp_Mftv(MIPSOpcode op)101 void Comp_Mftv(MIPSOpcode op) override {} Comp_Vmfvc(MIPSOpcode op)102 void Comp_Vmfvc(MIPSOpcode op) override {} Comp_Vmtvc(MIPSOpcode op)103 void Comp_Vmtvc(MIPSOpcode op) override {} Comp_Vmmov(MIPSOpcode op)104 void Comp_Vmmov(MIPSOpcode op) override {} Comp_VScl(MIPSOpcode op)105 void Comp_VScl(MIPSOpcode op) override {} Comp_Vmmul(MIPSOpcode op)106 void Comp_Vmmul(MIPSOpcode op) override {} Comp_Vmscl(MIPSOpcode op)107 void Comp_Vmscl(MIPSOpcode op) override {} Comp_Vtfm(MIPSOpcode op)108 void Comp_Vtfm(MIPSOpcode op) override {} Comp_VHdp(MIPSOpcode op)109 void Comp_VHdp(MIPSOpcode op) override {} Comp_VCrs(MIPSOpcode op)110 void Comp_VCrs(MIPSOpcode op) override {} Comp_VDet(MIPSOpcode op)111 void Comp_VDet(MIPSOpcode op) override {} Comp_Vi2x(MIPSOpcode op)112 void Comp_Vi2x(MIPSOpcode op) override {} Comp_Vx2i(MIPSOpcode op)113 void Comp_Vx2i(MIPSOpcode op) override {} Comp_Vf2i(MIPSOpcode op)114 void Comp_Vf2i(MIPSOpcode op) override {} Comp_Vi2f(MIPSOpcode op)115 void Comp_Vi2f(MIPSOpcode op) override {} Comp_Vh2f(MIPSOpcode op)116 void Comp_Vh2f(MIPSOpcode op) override {} Comp_Vcst(MIPSOpcode op)117 void Comp_Vcst(MIPSOpcode op) override {} Comp_Vhoriz(MIPSOpcode op)118 void Comp_Vhoriz(MIPSOpcode op) override {} Comp_VRot(MIPSOpcode op)119 void Comp_VRot(MIPSOpcode op) override {} Comp_VIdt(MIPSOpcode op)120 void Comp_VIdt(MIPSOpcode op) override {} Comp_Vcmp(MIPSOpcode op)121 void Comp_Vcmp(MIPSOpcode op) override {} Comp_Vcmov(MIPSOpcode op)122 void Comp_Vcmov(MIPSOpcode op) override {} Comp_Viim(MIPSOpcode op)123 void Comp_Viim(MIPSOpcode op) override {} Comp_Vfim(MIPSOpcode op)124 void Comp_Vfim(MIPSOpcode op) override {} Comp_VCrossQuat(MIPSOpcode op)125 void Comp_VCrossQuat(MIPSOpcode op) override {} Comp_Vsgn(MIPSOpcode op)126 void Comp_Vsgn(MIPSOpcode op) override {} Comp_Vocp(MIPSOpcode op)127 void Comp_Vocp(MIPSOpcode op) override {} Comp_ColorConv(MIPSOpcode op)128 void Comp_ColorConv(MIPSOpcode op) override {} Replace_fabsf()129 int Replace_fabsf() override { return 0; } 130 Comp_Vbfy(MIPSOpcode op)131 void Comp_Vbfy(MIPSOpcode op) {} 132 GetBlockCache()133 JitBlockCache *GetBlockCache() override { return &blocks; } GetBlockCacheDebugInterface()134 JitBlockCacheDebugInterface *GetBlockCacheDebugInterface() override { return &blocks; } 135 136 MIPSOpcode GetOriginalOp(MIPSOpcode op) override; 137 SaveAndClearEmuHackOps()138 std::vector<u32> SaveAndClearEmuHackOps() override { return blocks.SaveAndClearEmuHackOps(); } RestoreSavedEmuHackOps(std::vector<u32> saved)139 void RestoreSavedEmuHackOps(std::vector<u32> saved) override { blocks.RestoreSavedEmuHackOps(saved); } 140 141 void ClearCache() override; 142 void InvalidateCacheAt(u32 em_address, int length = 4) override; 143 void UpdateFCR31() override; 144 GetDispatcher()145 const u8 *GetDispatcher() const override { 146 return dispatcher; 147 } 148 149 void LinkBlock(u8 *exitPoint, const u8 *checkedEntry) override; 150 void UnlinkBlock(u8 *checkedEntry, u32 originalAddress) override; 151 EatPrefix()152 void EatPrefix() override { js.EatPrefix(); } 153 154 private: 155 void GenerateFixedCode(); 156 void FlushAll(); 157 void FlushPrefixV(); 158 159 void WriteDownCount(int offset = 0); 160 void WriteDownCountR(MIPSReg reg); 161 void RestoreRoundingMode(bool force = false); 162 void ApplyRoundingMode(bool force = false); 163 void UpdateRoundingMode(); 164 void MovFromPC(MIPSReg r); 165 void MovToPC(MIPSReg r); 166 167 bool ReplaceJalTo(u32 dest); 168 169 void SaveDowncount(); 170 void RestoreDowncount(); 171 172 void WriteExit(u32 destination, int exit_num); 173 void WriteExitDestInR(MIPSReg Reg); 174 void WriteSyscallExit(); 175 176 JitBlockCache blocks; 177 JitOptions jo; 178 JitState js; 179 180 MIPSState *mips_; 181 182 int dontLogBlocks; 183 int logBlocks; 184 185 public: 186 // Code pointers 187 const u8 *enterCode; 188 189 const u8 *outerLoop; 190 const u8 *outerLoopPCInR0; 191 const u8 *dispatcherCheckCoreState; 192 const u8 *dispatcherPCInR0; 193 const u8 *dispatcher; 194 const u8 *dispatcherNoCheck; 195 }; 196 197 } // namespace MIPSComp 198 199