CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/MIPS/IR/IRFrontend.h
Views: 1401
#pragma once12#include "Common/CommonTypes.h"3#include "Core/MIPS/JitCommon/JitCommon.h"4#include "Core/MIPS/JitCommon/JitState.h"5#include "Core/MIPS/MIPSVFPUUtils.h"6#include "Core/MIPS/IR/IRInst.h"78namespace MIPSComp {910class IRFrontend : public MIPSFrontendInterface {11public:12IRFrontend(bool startDefaultPrefix);13void Comp_Generic(MIPSOpcode op) override;1415void Comp_RunBlock(MIPSOpcode op) override;16void Comp_ReplacementFunc(MIPSOpcode op) override;1718// Ops19void Comp_ITypeMem(MIPSOpcode op) override;20void Comp_StoreSync(MIPSOpcode op) override;21void Comp_Cache(MIPSOpcode op) override;2223void Comp_RelBranch(MIPSOpcode op) override;24void Comp_RelBranchRI(MIPSOpcode op) override;25void Comp_FPUBranch(MIPSOpcode op) override;26void Comp_FPULS(MIPSOpcode op) override;27void Comp_FPUComp(MIPSOpcode op) override;28void Comp_Jump(MIPSOpcode op) override;29void Comp_JumpReg(MIPSOpcode op) override;30void Comp_Syscall(MIPSOpcode op) override;31void Comp_Break(MIPSOpcode op) override;3233void Comp_IType(MIPSOpcode op) override;34void Comp_RType2(MIPSOpcode op) override;35void Comp_RType3(MIPSOpcode op) override;36void Comp_ShiftType(MIPSOpcode op) override;37void Comp_Allegrex(MIPSOpcode op) override;38void Comp_Allegrex2(MIPSOpcode op) override;39void Comp_VBranch(MIPSOpcode op) override;40void Comp_MulDivType(MIPSOpcode op) override;41void Comp_Special3(MIPSOpcode op) override;4243void Comp_FPU3op(MIPSOpcode op) override;44void Comp_FPU2op(MIPSOpcode op) override;45void Comp_mxc1(MIPSOpcode op) override;4647void Comp_DoNothing(MIPSOpcode op) override;4849void Comp_SV(MIPSOpcode op) override;50void Comp_SVQ(MIPSOpcode op) override;51void Comp_VPFX(MIPSOpcode op) override;52void Comp_VVectorInit(MIPSOpcode op) override;53void Comp_VMatrixInit(MIPSOpcode op) override;54void Comp_VDot(MIPSOpcode op) override;55void Comp_VecDo3(MIPSOpcode op) override;56void Comp_VV2Op(MIPSOpcode op) override;57void Comp_Mftv(MIPSOpcode op) override;58void Comp_Vmfvc(MIPSOpcode op) override;59void Comp_Vmtvc(MIPSOpcode op) override;60void Comp_Vmmov(MIPSOpcode op) override;61void Comp_VScl(MIPSOpcode op) override;62void Comp_Vmmul(MIPSOpcode op) override;63void Comp_Vmscl(MIPSOpcode op) override;64void Comp_Vtfm(MIPSOpcode op) override;65void Comp_VHdp(MIPSOpcode op) override;66void Comp_VCrs(MIPSOpcode op) override;67void Comp_VDet(MIPSOpcode op) override;68void Comp_Vi2x(MIPSOpcode op) override;69void Comp_Vx2i(MIPSOpcode op) override;70void Comp_Vf2i(MIPSOpcode op) override;71void Comp_Vi2f(MIPSOpcode op) override;72void Comp_Vh2f(MIPSOpcode op) override;73void Comp_Vcst(MIPSOpcode op) override;74void Comp_Vhoriz(MIPSOpcode op) override;75void Comp_VRot(MIPSOpcode op) override;76void Comp_VIdt(MIPSOpcode op) override;77void Comp_Vcmp(MIPSOpcode op) override;78void Comp_Vcmov(MIPSOpcode op) override;79void Comp_Viim(MIPSOpcode op) override;80void Comp_Vfim(MIPSOpcode op) override;81void Comp_VCrossQuat(MIPSOpcode op) override;82void Comp_Vsgn(MIPSOpcode op) override;83void Comp_Vocp(MIPSOpcode op) override;84void Comp_ColorConv(MIPSOpcode op) override;85void Comp_Vbfy(MIPSOpcode op) override;8687int Replace_fabsf() override;88void DoState(PointerWrap &p);89bool CheckRounding(u32 blockAddress); // returns true if we need a do-over9091void DoJit(u32 em_address, std::vector<IRInst> &instructions, u32 &mipsBytes, bool preload);9293void EatPrefix() override {94js.EatPrefix();95}9697void SetOptions(const IROptions &o) {98opts = o;99}100101private:102void RestoreRoundingMode(bool force = false);103void ApplyRoundingMode(bool force = false);104void UpdateRoundingMode();105106void FlushAll();107void FlushPrefixV();108109u32 GetCompilerPC();110void CompileDelaySlot();111void EatInstruction(MIPSOpcode op);112MIPSOpcode GetOffsetInstruction(int offset);113114void CheckBreakpoint(u32 addr);115void CheckMemoryBreakpoint(int rs, int offset);116117// Utility compilation functions118void BranchFPFlag(MIPSOpcode op, IRComparison cc, bool likely);119void BranchVFPUFlag(MIPSOpcode op, IRComparison cc, bool likely);120void BranchRSZeroComp(MIPSOpcode op, IRComparison cc, bool andLink, bool likely);121void BranchRSRTComp(MIPSOpcode op, IRComparison cc, bool likely);122123// Utilities to reduce duplicated code124void CompShiftImm(MIPSOpcode op, IROp shiftType, int sa);125void CompShiftVar(MIPSOpcode op, IROp shiftType);126127void ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz, int tempReg);128void ApplyPrefixD(u8 *vregs, VectorSize sz, int vectorReg);129void ApplyPrefixDMask(u8 *vregs, VectorSize sz, int vectorReg);130void GetVectorRegsPrefixS(u8 *regs, VectorSize sz, int vectorReg);131void GetVectorRegsPrefixT(u8 *regs, VectorSize sz, int vectorReg);132void GetVectorRegsPrefixD(u8 *regs, VectorSize sz, int vectorReg);133void GetVectorRegs(u8 regs[4], VectorSize N, int vectorReg);134void GetMatrixRegs(u8 regs[16], MatrixSize N, int matrixReg);135136// State137JitState js;138IRWriter ir;139IROptions opts{};140141int dontLogBlocks = 0;142int logBlocks = 0;143};144145} // namespace146147148