~ppsspp/ppsspp/ppsspp_1.3.0

« back to all changes in this revision

Viewing changes to ext/armips/Archs/MIPS/CMipsInstruction.h

  • Committer: Sérgio Benjamim
  • Date: 2017-01-02 00:12:05 UTC
  • Revision ID: sergio_br2@yahoo.com.br-20170102001205-cxbta9za203nmjwm
1.3.0 source (from ppsspp_1.3.0-r160.p5.l1762.a165.t83~56~ubuntu16.04.1.tar.xz).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#pragma once
 
2
#include "Commands/CAssemblerCommand.h"
 
3
#include "Mips.h"
 
4
#include "MipsOpcodes.h"
 
5
#include "Core/Expression.h"
 
6
 
 
7
enum class MipsRegisterType { Normal, Float, Ps2Cop2, VfpuVector, VfpuMatrix };
 
8
 
 
9
enum class MipsImmediateType { None, Immediate5, Immediate8, Immediate16, Immediate20, Immediate26,
 
10
        Immediate20_0, ImmediateHalfFloat, Immediate7, Ext, Ins, Cop2BranchType };
 
11
 
 
12
struct MipsRegisterValue
 
13
{
 
14
        MipsRegisterType type;
 
15
        std::wstring name;
 
16
        int num;
 
17
};
 
18
 
 
19
struct MipsRegisterData {
 
20
        MipsRegisterValue grs;                  // general source reg
 
21
        MipsRegisterValue grt;                  // general target reg
 
22
        MipsRegisterValue grd;                  // general dest reg
 
23
        
 
24
        MipsRegisterValue frs;                  // float source reg
 
25
        MipsRegisterValue frt;                  // float target reg
 
26
        MipsRegisterValue frd;                  // float dest reg
 
27
        
 
28
        MipsRegisterValue ps2vrs;               // ps2 vector source reg
 
29
        MipsRegisterValue ps2vrt;               // ps2 vector target reg
 
30
        MipsRegisterValue ps2vrd;               // ps2 vector dest reg
 
31
 
 
32
        MipsRegisterValue vrs;                  // vfpu source reg
 
33
        MipsRegisterValue vrt;                  // vfpu target reg
 
34
        MipsRegisterValue vrd;                  // vfpu dest reg
 
35
 
 
36
        void reset()
 
37
        {
 
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;
 
42
        }
 
43
};
 
44
 
 
45
struct MipsImmediateData
 
46
{
 
47
        struct
 
48
        {
 
49
                MipsImmediateType type;
 
50
                Expression expression;
 
51
                int value;
 
52
                int originalValue;
 
53
        } primary;
 
54
 
 
55
        struct
 
56
        {
 
57
                MipsImmediateType type;
 
58
                Expression expression;
 
59
                int value;
 
60
                int originalValue;
 
61
        } secondary;
 
62
 
 
63
        void reset()
 
64
        {
 
65
                primary.type = MipsImmediateType::None;
 
66
                if (primary.expression.isLoaded())
 
67
                        primary.expression = Expression();
 
68
                
 
69
                secondary.type = MipsImmediateType::None;
 
70
                if (secondary.expression.isLoaded())
 
71
                        secondary.expression = Expression();
 
72
        }
 
73
};
 
74
 
 
75
struct MipsOpcodeData
 
76
{
 
77
        tMipsOpcode opcode;
 
78
        int vfpuSize;
 
79
        int vectorCondition;
 
80
 
 
81
        void reset()
 
82
        {
 
83
                vfpuSize = vectorCondition = -1;
 
84
        }
 
85
};
 
86
 
 
87
class CMipsInstruction: public CAssemblerCommand
 
88
{
 
89
public:
 
90
        CMipsInstruction(MipsOpcodeData& opcode, MipsImmediateData& immediate, MipsRegisterData& registers);
 
91
        ~CMipsInstruction();
 
92
        virtual bool Validate();
 
93
        virtual void Encode() const;
 
94
        virtual void writeTempData(TempData& tempData) const;
 
95
private:
 
96
        void encodeNormal() const;
 
97
        void encodeVfpu() const;
 
98
        int floatToHalfFloat(int i);
 
99
 
 
100
        bool IgnoreLoadDelay;
 
101
        u64 RamPos;
 
102
        bool addNop;
 
103
 
 
104
        // opcode variables
 
105
        MipsOpcodeData opcodeData;
 
106
        MipsImmediateData immediateData;
 
107
        MipsRegisterData registerData;
 
108
};