2
#include "Commands/CAssemblerCommand.h"
4
#include "MipsOpcodes.h"
5
#include "Core/Expression.h"
7
enum class MipsRegisterType { Normal, Float, Ps2Cop2, VfpuVector, VfpuMatrix };
9
enum class MipsImmediateType { None, Immediate5, Immediate8, Immediate16, Immediate20, Immediate26,
10
Immediate20_0, ImmediateHalfFloat, Immediate7, Ext, Ins, Cop2BranchType };
12
struct MipsRegisterValue
14
MipsRegisterType type;
19
struct MipsRegisterData {
20
MipsRegisterValue grs; // general source reg
21
MipsRegisterValue grt; // general target reg
22
MipsRegisterValue grd; // general dest reg
24
MipsRegisterValue frs; // float source reg
25
MipsRegisterValue frt; // float target reg
26
MipsRegisterValue frd; // float dest reg
28
MipsRegisterValue ps2vrs; // ps2 vector source reg
29
MipsRegisterValue ps2vrt; // ps2 vector target reg
30
MipsRegisterValue ps2vrd; // ps2 vector dest reg
32
MipsRegisterValue vrs; // vfpu source reg
33
MipsRegisterValue vrt; // vfpu target reg
34
MipsRegisterValue vrd; // vfpu dest reg
38
grs.num = grt.num = grd.num = -1;
39
frs.num = frt.num = frd.num = -1;
40
vrs.num = vrt.num = vrd.num = -1;
41
ps2vrs.num = ps2vrt.num = ps2vrd.num = -1;
45
struct MipsImmediateData
49
MipsImmediateType type;
50
Expression expression;
57
MipsImmediateType type;
58
Expression expression;
65
primary.type = MipsImmediateType::None;
66
if (primary.expression.isLoaded())
67
primary.expression = Expression();
69
secondary.type = MipsImmediateType::None;
70
if (secondary.expression.isLoaded())
71
secondary.expression = Expression();
83
vfpuSize = vectorCondition = -1;
87
class CMipsInstruction: public CAssemblerCommand
90
CMipsInstruction(MipsOpcodeData& opcode, MipsImmediateData& immediate, MipsRegisterData& registers);
92
virtual bool Validate();
93
virtual void Encode() const;
94
virtual void writeTempData(TempData& tempData) const;
96
void encodeNormal() const;
97
void encodeVfpu() const;
98
int floatToHalfFloat(int i);
100
bool IgnoreLoadDelay;
105
MipsOpcodeData opcodeData;
106
MipsImmediateData immediateData;
107
MipsRegisterData registerData;