2015-02-15 22:13:32 -05:00
|
|
|
#pragma once
|
|
|
|
|
2021-07-15 20:22:47 -04:00
|
|
|
#include <cstddef>
|
2020-05-25 12:51:01 -04:00
|
|
|
#include <map>
|
2021-07-15 20:22:47 -04:00
|
|
|
|
2015-02-15 22:13:32 -05:00
|
|
|
#include "Types.h"
|
|
|
|
|
|
|
|
class CVuAssembler
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum VF_REGISTER
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
VF0,
|
|
|
|
VF1,
|
|
|
|
VF2,
|
|
|
|
VF3,
|
|
|
|
VF4,
|
|
|
|
VF5,
|
|
|
|
VF6,
|
|
|
|
VF7,
|
|
|
|
VF8,
|
|
|
|
VF9,
|
|
|
|
VF10,
|
|
|
|
VF11,
|
|
|
|
VF12,
|
|
|
|
VF13,
|
|
|
|
VF14,
|
|
|
|
VF15,
|
|
|
|
VF16,
|
|
|
|
VF17,
|
|
|
|
VF18,
|
|
|
|
VF19,
|
|
|
|
VF20,
|
|
|
|
VF21,
|
|
|
|
VF22,
|
|
|
|
VF23,
|
|
|
|
VF24,
|
|
|
|
VF25,
|
|
|
|
VF26,
|
|
|
|
VF27,
|
|
|
|
VF28,
|
|
|
|
VF29,
|
|
|
|
VF30,
|
|
|
|
VF31
|
2015-02-15 22:13:32 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
enum VI_REGISTER
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
VI0,
|
|
|
|
VI1,
|
|
|
|
VI2,
|
|
|
|
VI3,
|
|
|
|
VI4,
|
|
|
|
VI5,
|
|
|
|
VI6,
|
|
|
|
VI7,
|
|
|
|
VI8,
|
|
|
|
VI9,
|
|
|
|
VI10,
|
|
|
|
VI11,
|
|
|
|
VI12,
|
|
|
|
VI13,
|
|
|
|
VI14,
|
|
|
|
VI15,
|
2015-02-15 22:13:32 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
enum DEST
|
|
|
|
{
|
|
|
|
DEST_NONE,
|
|
|
|
DEST_W,
|
|
|
|
DEST_Z,
|
|
|
|
DEST_ZW,
|
|
|
|
DEST_Y,
|
|
|
|
DEST_YW,
|
|
|
|
DEST_YZ,
|
|
|
|
DEST_YZW,
|
|
|
|
DEST_X,
|
|
|
|
DEST_XW,
|
|
|
|
DEST_XZ,
|
|
|
|
DEST_XZW,
|
|
|
|
DEST_XY,
|
|
|
|
DEST_XYW,
|
|
|
|
DEST_XYZ,
|
|
|
|
DEST_XYZW,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum BROADCAST
|
|
|
|
{
|
|
|
|
BC_X,
|
|
|
|
BC_Y,
|
|
|
|
BC_Z,
|
|
|
|
BC_W,
|
|
|
|
};
|
|
|
|
|
2020-02-24 12:54:17 -05:00
|
|
|
enum FVF
|
|
|
|
{
|
|
|
|
FVF_X,
|
|
|
|
FVF_Y,
|
|
|
|
FVF_Z,
|
|
|
|
FVF_W
|
|
|
|
};
|
|
|
|
|
2020-05-25 16:25:52 -04:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
INSTRUCTION_SIZE = 8,
|
|
|
|
};
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
CVuAssembler(uint32*);
|
|
|
|
virtual ~CVuAssembler();
|
2015-02-15 22:13:32 -05:00
|
|
|
|
2020-05-25 12:51:01 -04:00
|
|
|
typedef uint32 LABEL;
|
|
|
|
|
|
|
|
struct BRANCHOP
|
|
|
|
{
|
|
|
|
uint32 op = 0;
|
|
|
|
LABEL label = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
unsigned int GetProgramSize() const;
|
|
|
|
LABEL CreateLabel();
|
|
|
|
void MarkLabel(LABEL);
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
void Write(uint32, uint32);
|
2020-05-25 12:51:01 -04:00
|
|
|
void Write(uint32, BRANCHOP);
|
2015-02-15 22:13:32 -05:00
|
|
|
|
|
|
|
class Upper
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum
|
|
|
|
{
|
2015-04-25 22:16:45 -04:00
|
|
|
I_BIT = 0x80000000,
|
2015-02-15 22:13:32 -05:00
|
|
|
E_BIT = 0x40000000,
|
|
|
|
};
|
|
|
|
|
2020-06-01 17:42:26 -04:00
|
|
|
static uint32 ADDbc(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER, BROADCAST);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 ADDi(DEST, VF_REGISTER, VF_REGISTER);
|
2020-02-26 20:09:18 -05:00
|
|
|
static uint32 CLIP(VF_REGISTER, VF_REGISTER);
|
|
|
|
static uint32 FTOI4(DEST, VF_REGISTER, VF_REGISTER);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 ITOF0(DEST, VF_REGISTER, VF_REGISTER);
|
2020-02-26 20:09:18 -05:00
|
|
|
static uint32 ITOF12(DEST, VF_REGISTER, VF_REGISTER);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 MADDbc(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER, BROADCAST);
|
|
|
|
static uint32 MADDAbc(DEST, VF_REGISTER, VF_REGISTER, BROADCAST);
|
|
|
|
static uint32 MULi(DEST, VF_REGISTER, VF_REGISTER);
|
2020-02-24 12:54:17 -05:00
|
|
|
static uint32 MULq(DEST, VF_REGISTER, VF_REGISTER);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 MULAbc(DEST, VF_REGISTER, VF_REGISTER, BROADCAST);
|
2020-04-14 15:44:05 -04:00
|
|
|
static uint32 MAX(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER);
|
2025-03-10 14:27:40 -04:00
|
|
|
static uint32 MAXbc(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER, BROADCAST);
|
2020-04-11 15:11:43 -04:00
|
|
|
static uint32 MINI(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 NOP();
|
|
|
|
static uint32 OPMULA(VF_REGISTER, VF_REGISTER);
|
|
|
|
static uint32 OPMSUB(VF_REGISTER, VF_REGISTER, VF_REGISTER);
|
2020-06-01 17:42:26 -04:00
|
|
|
static uint32 SUB(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 SUBbc(DEST, VF_REGISTER, VF_REGISTER, VF_REGISTER, BROADCAST);
|
2015-02-15 22:13:32 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
class Lower
|
|
|
|
{
|
|
|
|
public:
|
2020-05-25 12:51:01 -04:00
|
|
|
static BRANCHOP B(LABEL);
|
2020-02-24 12:54:17 -05:00
|
|
|
static uint32 DIV(VF_REGISTER, FVF, VF_REGISTER, FVF);
|
2023-05-10 21:08:56 -04:00
|
|
|
static uint32 ERLENG(VF_REGISTER);
|
2020-02-26 20:09:18 -05:00
|
|
|
static uint32 FCAND(uint32);
|
2021-01-29 16:33:11 -05:00
|
|
|
static uint32 FCGET(VI_REGISTER);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 FMAND(VI_REGISTER, VI_REGISTER);
|
|
|
|
static uint32 FSAND(VI_REGISTER, uint16);
|
2020-02-26 20:09:18 -05:00
|
|
|
static uint32 IADDIU(VI_REGISTER, VI_REGISTER, uint16);
|
2020-05-25 12:51:01 -04:00
|
|
|
static BRANCHOP IBEQ(VI_REGISTER, VI_REGISTER, LABEL);
|
2022-08-19 10:22:00 -04:00
|
|
|
static BRANCHOP IBNE(VI_REGISTER, VI_REGISTER, LABEL);
|
2022-08-31 17:50:20 -04:00
|
|
|
static uint32 ILW(DEST, VI_REGISTER, uint16, VI_REGISTER);
|
2022-08-18 16:59:08 -04:00
|
|
|
static uint32 ISUBIU(VI_REGISTER, VI_REGISTER, uint16);
|
2020-02-26 20:09:18 -05:00
|
|
|
static uint32 LQ(DEST, VF_REGISTER, uint16, VI_REGISTER);
|
2022-08-19 10:22:00 -04:00
|
|
|
static uint32 LQI(DEST, VF_REGISTER, VI_REGISTER);
|
2021-01-29 16:33:11 -05:00
|
|
|
static uint32 MFIR(DEST, VF_REGISTER, VI_REGISTER);
|
|
|
|
static uint32 MTIR(VI_REGISTER, VF_REGISTER, FVF);
|
2018-04-30 21:01:23 +01:00
|
|
|
static uint32 NOP();
|
2020-02-26 20:09:18 -05:00
|
|
|
static uint32 SQ(DEST, VF_REGISTER, uint16, VI_REGISTER);
|
2023-05-10 21:08:56 -04:00
|
|
|
static uint32 WAITP();
|
2020-02-24 12:54:17 -05:00
|
|
|
static uint32 WAITQ();
|
2015-02-15 22:13:32 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
2020-05-25 12:51:01 -04:00
|
|
|
void ResolveLabelReferences();
|
|
|
|
void CreateLabelReference(LABEL);
|
|
|
|
|
|
|
|
struct LABELREF
|
|
|
|
{
|
|
|
|
size_t address;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef std::map<LABEL, size_t> LabelMapType;
|
|
|
|
typedef std::multimap<LABEL, LABELREF> LabelReferenceMapType;
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
uint32* m_ptr = nullptr;
|
2020-05-25 12:51:01 -04:00
|
|
|
uint32* m_startPtr = nullptr;
|
|
|
|
LabelMapType m_labels;
|
|
|
|
LabelReferenceMapType m_labelReferences;
|
|
|
|
uint32 m_nextLabelId = 1;
|
2015-02-15 22:13:32 -05:00
|
|
|
};
|