Path: blob/master/Core/MIPS/LoongArch64/LoongArch64Jit.h
3188 views
// Copyright (c) 2025- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.1617#pragma once1819#include <string>20#include <vector>21#include "Common/LoongArch64Emitter.h"22#include "Core/MIPS/IR/IRJit.h"23#include "Core/MIPS/IR/IRNativeCommon.h"24#include "Core/MIPS/JitCommon/JitState.h"25#include "Core/MIPS/JitCommon/JitCommon.h"26#include "Core/MIPS/LoongArch64/LoongArch64RegCache.h"2728namespace MIPSComp {2930class LoongArch64JitBackend : public LoongArch64Gen::LoongArch64CodeBlock, public IRNativeBackend {31public:32LoongArch64JitBackend(JitOptions &jo, IRBlockCache &blocks);33~LoongArch64JitBackend();3435bool DescribeCodePtr(const u8 *ptr, std::string &name) const override;3637void GenerateFixedCode(MIPSState *mipsState) override;38bool CompileBlock(IRBlockCache *irBlockCache, int block_num) override;39void ClearAllBlocks() override;40void InvalidateBlock(IRBlockCache *irBlockCache, int block_num) override;4142protected:43const CodeBlockCommon &CodeBlock() const override {44return *this;45}46private:47void RestoreRoundingMode(bool force = false);48void ApplyRoundingMode(bool force = false);49void MovFromPC(LoongArch64Gen::LoongArch64Reg r);50void MovToPC(LoongArch64Gen::LoongArch64Reg r);51void WriteDebugPC(uint32_t pc);52void WriteDebugPC(LoongArch64Gen::LoongArch64Reg r);53void WriteDebugProfilerStatus(IRProfilerStatus status);5455void SaveStaticRegisters();56void LoadStaticRegisters();5758// Note: destroys SCRATCH1.59void FlushAll();6061void WriteConstExit(uint32_t pc);62void OverwriteExit(int srcOffset, int len, int block_num) override;6364void CompIR_Arith(IRInst inst) override;65void CompIR_Assign(IRInst inst) override;66void CompIR_Basic(IRInst inst) override;67void CompIR_Bits(IRInst inst) override;68void CompIR_Breakpoint(IRInst inst) override;69void CompIR_Compare(IRInst inst) override;70void CompIR_CondAssign(IRInst inst) override;71void CompIR_CondStore(IRInst inst) override;72void CompIR_Div(IRInst inst) override;73void CompIR_Exit(IRInst inst) override;74void CompIR_ExitIf(IRInst inst) override;75void CompIR_FArith(IRInst inst) override;76void CompIR_FAssign(IRInst inst) override;77void CompIR_FCompare(IRInst inst) override;78void CompIR_FCondAssign(IRInst inst) override;79void CompIR_FCvt(IRInst inst) override;80void CompIR_FLoad(IRInst inst) override;81void CompIR_FRound(IRInst inst) override;82void CompIR_FSat(IRInst inst) override;83void CompIR_FSpecial(IRInst inst) override;84void CompIR_FStore(IRInst inst) override;85void CompIR_Generic(IRInst inst) override;86void CompIR_HiLo(IRInst inst) override;87void CompIR_Interpret(IRInst inst) override;88void CompIR_Load(IRInst inst) override;89void CompIR_LoadShift(IRInst inst) override;90void CompIR_Logic(IRInst inst) override;91void CompIR_Mult(IRInst inst) override;92void CompIR_RoundingMode(IRInst inst) override;93void CompIR_Shift(IRInst inst) override;94void CompIR_Store(IRInst inst) override;95void CompIR_StoreShift(IRInst inst) override;96void CompIR_System(IRInst inst) override;97void CompIR_Transfer(IRInst inst) override;98void CompIR_VecArith(IRInst inst) override;99void CompIR_VecAssign(IRInst inst) override;100void CompIR_VecClamp(IRInst inst) override;101void CompIR_VecHoriz(IRInst inst) override;102void CompIR_VecLoad(IRInst inst) override;103void CompIR_VecPack(IRInst inst) override;104void CompIR_VecStore(IRInst inst) override;105void CompIR_ValidateAddress(IRInst inst) override;106107void SetScratch1ToSrc1Address(IRReg src1);108// Modifies SCRATCH regs.109int32_t AdjustForAddressOffset(LoongArch64Gen::LoongArch64Reg *reg, int32_t constant, int32_t range = 0);110void NormalizeSrc1(IRInst inst, LoongArch64Gen::LoongArch64Reg *reg, LoongArch64Gen::LoongArch64Reg tempReg, bool allowOverlap);111void NormalizeSrc12(IRInst inst, LoongArch64Gen::LoongArch64Reg *lhs, LoongArch64Gen::LoongArch64Reg *rhs, LoongArch64Gen::LoongArch64Reg lhsTempReg, LoongArch64Gen::LoongArch64Reg rhsTempReg, bool allowOverlap);112LoongArch64Gen::LoongArch64Reg NormalizeR(IRReg rs, IRReg rd, LoongArch64Gen::LoongArch64Reg tempReg);113114JitOptions &jo;115LoongArch64RegCache regs_;116117const u8 *outerLoop_ = nullptr;118const u8 *outerLoopPCInSCRATCH1_ = nullptr;119const u8 *dispatcherCheckCoreState_ = nullptr;120const u8 *dispatcherPCInSCRATCH1_ = nullptr;121const u8 *dispatcherNoCheck_ = nullptr;122const u8 *applyRoundingMode_ = nullptr;123124const u8 *saveStaticRegisters_ = nullptr;125const u8 *loadStaticRegisters_ = nullptr;126127int jitStartOffset_ = 0;128int compilingBlockNum_ = -1;129int logBlocks_ = 0;130};131132class LoongArch64Jit : public IRNativeJit{133public:134LoongArch64Jit(MIPSState *mipsState) : IRNativeJit(mipsState), la64Backend_(jo, blocks_) {135Init(la64Backend_);136}137private:138LoongArch64JitBackend la64Backend_;139};140141} // namespace MIPSComp142143