Play-/tools/VuTest/VuAssembler.h

199 lines
3.6 KiB
C
Raw Permalink Normal View History

#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
#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
};
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,
};
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();
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);
class Upper
{
public:
enum
{
2015-04-25 22:16:45 -04:00
I_BIT = 0x80000000,
E_BIT = 0x40000000,
};
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);
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);
};
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();
};
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;
};