Play-/Source/ee/VuBasicBlock.h
Jean-Philip Desjardins 2d16426412
Some checks are pending
Build Android / build_android (apk) (push) Waiting to run
Build Android / build_android (libretro) (push) Waiting to run
Build iOS / build_ios (push) Waiting to run
Build JavaScript / build_js (push) Waiting to run
Build Linux / build_linux (push) Waiting to run
Build Linux ARM32 / build_linux_arm32 (push) Waiting to run
Build Linux ARM64 / build_linux_arm64 (push) Waiting to run
Build macOS / build_macos (push) Waiting to run
Build Windows / build_windows (x86_32, Visual Studio 16 2019, installer32.nsi, win32_msvc2019, Win32) (push) Waiting to run
Build Windows / build_windows (x86_64, Visual Studio 16 2019, installer64.nsi, win64_msvc2019_64, x64) (push) Waiting to run
Build Windows Psf / build_windows_psf (off, x86_64, Visual Studio 16 2019, installer64.nsi, x64) (push) Waiting to run
Build Windows Psf / build_windows_psf (on, x86_64, Visual Studio 16 2019, installer64.nsi, x64) (push) Waiting to run
Check Format / run_clangformat (push) Waiting to run
Enable accurate ADDi only on the VU block that needs it.
2024-12-18 13:53:07 -05:00

50 lines
1.3 KiB
C++

#pragma once
#include "../BasicBlock.h"
class CVuBasicBlock : public CBasicBlock
{
public:
CVuBasicBlock(CMIPS&, uint32, uint32, BLOCK_CATEGORY);
virtual ~CVuBasicBlock() = default;
void AddBlockCompileHints(uint32);
bool IsLinkable() const;
protected:
void CompileRange(CMipsJitter*) override;
private:
struct INTEGER_BRANCH_DELAY_INFO
{
unsigned int regIndex = 0;
uint32 saveRegAddress = MIPS_INVALID_PC;
uint32 useRegAddress = MIPS_INVALID_PC;
};
static bool IsConditionalBranch(uint32);
static bool IsNonConditionalBranch(uint32);
typedef uint32 FmacRegWriteTimes[32][4];
struct BlockFmacPipelineInfo
{
//State of the write times at the end of block
FmacRegWriteTimes regWriteTimes = {};
//Delays incurred during every instruction execution
std::vector<uint32> stallDelays;
//Pipe time at the end of block
uint32 pipeTime = 0;
};
INTEGER_BRANCH_DELAY_INFO ComputeIntegerBranchDelayInfo(const std::vector<uint32>&) const;
INTEGER_BRANCH_DELAY_INFO ComputeTrailingIntegerBranchDelayInfo(const std::vector<uint32>&) const;
bool CheckIsSpecialIntegerLoop(unsigned int) const;
void ComputeSkipFlagsHints(const std::vector<uint32>&, std::vector<uint32>&) const;
BlockFmacPipelineInfo ComputeFmacStallDelays(uint32, uint32) const;
static void EmitXgKick(CMipsJitter*);
bool m_isLinkable = true;
uint32 m_blockCompileHints = 0;
};