2015-05-06 00:54:15 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../BasicBlock.h"
|
|
|
|
|
|
|
|
class CVuBasicBlock : public CBasicBlock
|
|
|
|
{
|
|
|
|
public:
|
2022-08-15 10:45:12 -04:00
|
|
|
CVuBasicBlock(CMIPS&, uint32, uint32, BLOCK_CATEGORY);
|
2018-04-30 21:01:23 +01:00
|
|
|
virtual ~CVuBasicBlock() = default;
|
2015-05-06 00:54:15 -04:00
|
|
|
|
2024-12-18 13:53:07 -05:00
|
|
|
void AddBlockCompileHints(uint32);
|
2020-05-29 13:27:39 -04:00
|
|
|
bool IsLinkable() const;
|
|
|
|
|
2015-05-06 00:54:15 -04:00
|
|
|
protected:
|
2018-04-30 21:01:23 +01:00
|
|
|
void CompileRange(CMipsJitter*) override;
|
2015-05-06 00:54:15 -04:00
|
|
|
|
|
|
|
private:
|
2016-08-06 22:14:44 -04:00
|
|
|
struct INTEGER_BRANCH_DELAY_INFO
|
|
|
|
{
|
|
|
|
unsigned int regIndex = 0;
|
2018-04-30 21:01:23 +01:00
|
|
|
uint32 saveRegAddress = MIPS_INVALID_PC;
|
|
|
|
uint32 useRegAddress = MIPS_INVALID_PC;
|
2016-08-06 22:14:44 -04:00
|
|
|
};
|
2015-05-06 00:54:15 -04:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
static bool IsConditionalBranch(uint32);
|
2020-05-29 13:27:39 -04:00
|
|
|
static bool IsNonConditionalBranch(uint32);
|
2016-08-06 22:14:44 -04:00
|
|
|
|
2021-02-05 17:03:10 -05:00
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2022-08-19 12:14:52 -04:00
|
|
|
INTEGER_BRANCH_DELAY_INFO ComputeIntegerBranchDelayInfo(const std::vector<uint32>&) const;
|
2024-01-22 23:28:49 +00:00
|
|
|
INTEGER_BRANCH_DELAY_INFO ComputeTrailingIntegerBranchDelayInfo(const std::vector<uint32>&) const;
|
2018-06-11 12:59:00 -04:00
|
|
|
bool CheckIsSpecialIntegerLoop(unsigned int) const;
|
2020-02-27 13:13:57 -05:00
|
|
|
void ComputeSkipFlagsHints(const std::vector<uint32>&, std::vector<uint32>&) const;
|
2023-10-16 18:03:42 -04:00
|
|
|
BlockFmacPipelineInfo ComputeFmacStallDelays(uint32, uint32) const;
|
2018-04-30 21:01:23 +01:00
|
|
|
static void EmitXgKick(CMipsJitter*);
|
2020-05-29 13:27:39 -04:00
|
|
|
|
|
|
|
bool m_isLinkable = true;
|
2024-12-18 13:53:07 -05:00
|
|
|
uint32 m_blockCompileHints = 0;
|
2015-05-06 00:54:15 -04:00
|
|
|
};
|