summaryrefslogtreecommitdiff
path: root/include/arm_types.h
blob: 1b93d1a867d57c8b418a7ff1818e409b0c2a032d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265

#ifndef ARM_TYPES_H
#define ARM_TYPES_H

#include "vb_types.h"

// Condition codes
enum {
    ARM_COND_EQ, // Equal
    ARM_COND_NE, // Not Equal
    ARM_COND_CS, // Carry Set
    ARM_COND_CC, // Carry Clear
    ARM_COND_MI, // MInus
    ARM_COND_PL, // PLus
    ARM_COND_VS, // oVerflow Set
    ARM_COND_VC, // oVerflow Clear
    ARM_COND_HI, // HIgher
    ARM_COND_LS, // Lower or Same
    ARM_COND_GE, // Greater or Equal
    ARM_COND_LT, // Less Than
    ARM_COND_GT, // Greater Than
    ARM_COND_LE, // Less or Equal
    ARM_COND_AL, // Always
    ARM_COND_NV  // NeVer
} ARM_COND_CODE;

// Data processing opcodes
enum {
    ARM_OP_AND, // AND
    ARM_OP_EOR, // XOR
    ARM_OP_SUB, // Subtract
    ARM_OP_RSB, // Reverse subtract
    ARM_OP_ADD, // Add
    ARM_OP_ADC, // Add with carry
    ARM_OP_SBC, // Subtract with carry
    ARM_OP_RSC, // Reverse subtract with carry
    ARM_OP_TST, // Test
    ARM_OP_TEQ, // Test equals
    ARM_OP_CMP, // Compare
    ARM_OP_CMN, // Compare negative
    ARM_OP_ORR, // OR
    ARM_OP_MOV, // Move
    ARM_OP_BIC, // Bit clear
    ARM_OP_MVN  // Move negative
} ARM_OPCODE;

// Shift types
enum {
    ARM_SHIFT_LSL, // Logical shift left
    ARM_SHIFT_LSR, // Logical shift right
    ARM_SHIFT_ASR, // Arithmetic shift right
    ARM_SHIFT_ROR  // Rotate right
} ARM_SHIFT;

typedef enum {
    ARM_DATA_PROC_IMM,
    ARM_DATA_PROC_IMM_SHIFT,
    ARM_DATA_PROC_REG_SHIFT,
    ARM_MUL,
    ARM_MULL,
    ARM_MOV_FROM_CPSR,
    ARM_MOV_IMM_CPSR,
    ARM_MOV_REG_CPSR,
    ARM_BR,
    ARM_LDST_IMM_OFF,
    ARM_LDST_REG_OFF,
    ARM_LDST_HB1,
    ARM_LDST_HB2,
    ARM_SWAP,
    ARM_LDST_MULT,
    ARM_BRANCH_LINK,
    ARM_FLOATING_POINT,
} arm_inst_type;

typedef struct {
    BYTE op;
    BYTE s;
    BYTE Rn;
    BYTE Rd;
    BYTE rot;
    BYTE imm;
} arm_inst_dpi;

typedef struct {
    BYTE opcode;
    BYTE s;
    BYTE Rn;
    BYTE Rd;
    BYTE shift_imm;
    BYTE shift;
    BYTE Rm;
} arm_inst_dpis;

typedef struct {
    BYTE opcode;
    BYTE s;
    BYTE Rn;
    BYTE Rd;
    BYTE Rs;
    BYTE shift;
    BYTE Rm;
} arm_inst_dprs;

typedef struct {
    BYTE a;
    BYTE s;
    BYTE Rd;
    BYTE Rn;
    BYTE Rs;
    BYTE Rm;
} arm_inst_mul;

typedef struct {
    BYTE u;
    BYTE a;
    BYTE s;
    BYTE RdHi;
    BYTE RdLo;
    BYTE Rn;
    BYTE Rm;
} arm_inst_mull;

typedef struct {
    BYTE r;
    BYTE sbo;
    BYTE Rd;
    HWORD sbz;
} arm_inst_mfcpsr;

typedef struct {
    BYTE r;
    BYTE mask;
    BYTE sbo;
    BYTE rot;
    BYTE imm;
} arm_inst_micpsr;

typedef struct {
    BYTE r;
    BYTE mask;
    BYTE sbo;
    BYTE sbz;
    BYTE Rm;
} arm_inst_mrcpsr;

typedef struct {
    BYTE l;
    BYTE Rm;
} arm_inst_br;

typedef struct {
    BYTE p;
    BYTE u;
    BYTE b;
    BYTE w;
    BYTE l;
    BYTE Rn;
    BYTE Rd;
    HWORD imm;
} arm_inst_ldst_io;

typedef struct {
    BYTE p;
    BYTE u;
    BYTE b;
    BYTE w;
    BYTE l;
    BYTE Rn;
    BYTE Rd;
    BYTE shift_imm;
    BYTE shift;
    BYTE Rm;
} arm_inst_ldst_ro;

typedef struct {
    BYTE p;
    BYTE u;
    BYTE w;
    BYTE l;
    BYTE Rn;
    BYTE Rd;
    BYTE high_off;
    BYTE s;
    BYTE h;
    BYTE Rm;
} arm_inst_ldst_hb1;

typedef struct {
    BYTE p;
    BYTE u;
    BYTE w;
    BYTE l;
    BYTE Rn;
    BYTE Rd;
    BYTE sbz;
    BYTE s;
    BYTE h;
    BYTE Rm;
} arm_inst_ldst_hb2;

typedef struct {
    BYTE b;
    BYTE Rn;
    BYTE Rd;
    BYTE sbz;
    BYTE Rm;
} arm_inst_swp;

typedef struct {
    BYTE p;
    BYTE u;
    BYTE s;
    BYTE w;
    BYTE l;
    BYTE Rn;
    HWORD regs;
} arm_inst_ldstm;

typedef struct {
    BYTE l;
    int imm;
} arm_inst_b_bl;

typedef struct {
    BYTE opc1;
    BYTE opc2;
    BYTE b12;
    BYTE b8;
    BYTE opc3;
    BYTE b4;
    BYTE opc4;
} arm_inst_fp;

typedef struct {
    arm_inst_type type;
    BYTE cond;
    WORD PC;
    bool needs_pool;
    bool needs_branch;
#ifdef LITERAL_POOL
    WORD* pool_start;
    HWORD pool_pos;
#endif
    union {
        arm_inst_dpi dpi;
        arm_inst_dpis dpis;
        arm_inst_dprs dprs;
        arm_inst_mul mul;
        arm_inst_mull mull;
        arm_inst_mfcpsr mfcpsr;
        arm_inst_micpsr micpsr;
        arm_inst_mrcpsr mrcpsr;
        arm_inst_br br;
        arm_inst_ldst_io ldst_io;
        arm_inst_ldst_ro ldst_ro;
        arm_inst_ldst_hb1 ldst_hb1;
        arm_inst_ldst_hb2 ldst_hb2;
        arm_inst_swp swp;
        arm_inst_ldstm ldstm;
        arm_inst_b_bl b_bl;
        arm_inst_fp fp;
    };
} arm_inst;

#endif //ARM_TYPES_H