Core commit. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / ops.h
CommitLineData
451ab91e 1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Mupen64plus - ops.h *
3 * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4 * Copyright (C) 2002 Hacktarux *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
21
22typedef struct _cpu_instruction_table
23{
24 /* All jump/branch instructions (except JR and JALR) have three versions:
25 * - JUMPNAME() which for jumps inside the current block.
26 * - JUMPNAME_OUT() which jumps outside the current block.
27 * - JUMPNAME_IDLE() which does busy wait optimization.
28 *
29 * Busy wait optimization is used when a jump jumps to itself,
30 * and the instruction on the delay slot is a NOP.
31 * The program is waiting for the next interrupt, so we can just
32 * increase Count until the point where the next interrupt happens. */
33
34 // Load and store instructions
35 void (*LB)(void);
36 void (*LBU)(void);
37 void (*LH)(void);
38 void (*LHU)(void);
39 void (*LW)(void);
40 void (*LWL)(void);
41 void (*LWR)(void);
42 void (*SB)(void);
43 void (*SH)(void);
44 void (*SW)(void);
45 void (*SWL)(void);
46 void (*SWR)(void);
47
48 void (*LD)(void);
49 void (*LDL)(void);
50 void (*LDR)(void);
51 void (*LL)(void);
52 void (*LWU)(void);
53 void (*SC)(void);
54 void (*SD)(void);
55 void (*SDL)(void);
56 void (*SDR)(void);
57 void (*SYNC)(void);
58
59 // Arithmetic instructions (ALU immediate)
60 void (*ADDI)(void);
61 void (*ADDIU)(void);
62 void (*SLTI)(void);
63 void (*SLTIU)(void);
64 void (*ANDI)(void);
65 void (*ORI)(void);
66 void (*XORI)(void);
67 void (*LUI)(void);
68
69 void (*DADDI)(void);
70 void (*DADDIU)(void);
71
72 // Arithmetic instructions (3-operand)
73 void (*ADD)(void);
74 void (*ADDU)(void);
75 void (*SUB)(void);
76 void (*SUBU)(void);
77 void (*SLT)(void);
78 void (*SLTU)(void);
79 void (*AND)(void);
80 void (*OR)(void);
81 void (*XOR)(void);
82 void (*NOR)(void);
83
84 void (*DADD)(void);
85 void (*DADDU)(void);
86 void (*DSUB)(void);
87 void (*DSUBU)(void);
88
89 // Multiply and divide instructions
90 void (*MULT)(void);
91 void (*MULTU)(void);
92 void (*DIV)(void);
93 void (*DIVU)(void);
94 void (*MFHI)(void);
95 void (*MTHI)(void);
96 void (*MFLO)(void);
97 void (*MTLO)(void);
98
99 void (*DMULT)(void);
100 void (*DMULTU)(void);
101 void (*DDIV)(void);
102 void (*DDIVU)(void);
103
104 // Jump and branch instructions
105 void (*J)(void);
106 void (*J_OUT)(void);
107 void (*J_IDLE)(void);
108 void (*JAL)(void);
109 void (*JAL_OUT)(void);
110 void (*JAL_IDLE)(void);
111 void (*JR)(void);
112 void (*JALR)(void);
113 void (*BEQ)(void);
114 void (*BEQ_OUT)(void);
115 void (*BEQ_IDLE)(void);
116 void (*BNE)(void);
117 void (*BNE_OUT)(void);
118 void (*BNE_IDLE)(void);
119 void (*BLEZ)(void);
120 void (*BLEZ_OUT)(void);
121 void (*BLEZ_IDLE)(void);
122 void (*BGTZ)(void);
123 void (*BGTZ_OUT)(void);
124 void (*BGTZ_IDLE)(void);
125 void (*BLTZ)(void);
126 void (*BLTZ_OUT)(void);
127 void (*BLTZ_IDLE)(void);
128 void (*BGEZ)(void);
129 void (*BGEZ_OUT)(void);
130 void (*BGEZ_IDLE)(void);
131 void (*BLTZAL)(void);
132 void (*BLTZAL_OUT)(void);
133 void (*BLTZAL_IDLE)(void);
134 void (*BGEZAL)(void);
135 void (*BGEZAL_OUT)(void);
136 void (*BGEZAL_IDLE)(void);
137
138 void (*BEQL)(void);
139 void (*BEQL_OUT)(void);
140 void (*BEQL_IDLE)(void);
141 void (*BNEL)(void);
142 void (*BNEL_OUT)(void);
143 void (*BNEL_IDLE)(void);
144 void (*BLEZL)(void);
145 void (*BLEZL_OUT)(void);
146 void (*BLEZL_IDLE)(void);
147 void (*BGTZL)(void);
148 void (*BGTZL_OUT)(void);
149 void (*BGTZL_IDLE)(void);
150 void (*BLTZL)(void);
151 void (*BLTZL_OUT)(void);
152 void (*BLTZL_IDLE)(void);
153 void (*BGEZL)(void);
154 void (*BGEZL_OUT)(void);
155 void (*BGEZL_IDLE)(void);
156 void (*BLTZALL)(void);
157 void (*BLTZALL_OUT)(void);
158 void (*BLTZALL_IDLE)(void);
159 void (*BGEZALL)(void);
160 void (*BGEZALL_OUT)(void);
161 void (*BGEZALL_IDLE)(void);
162 void (*BC1TL)(void);
163 void (*BC1TL_OUT)(void);
164 void (*BC1TL_IDLE)(void);
165 void (*BC1FL)(void);
166 void (*BC1FL_OUT)(void);
167 void (*BC1FL_IDLE)(void);
168
169 // Shift instructions
170 void (*SLL)(void);
171 void (*SRL)(void);
172 void (*SRA)(void);
173 void (*SLLV)(void);
174 void (*SRLV)(void);
175 void (*SRAV)(void);
176
177 void (*DSLL)(void);
178 void (*DSRL)(void);
179 void (*DSRA)(void);
180 void (*DSLLV)(void);
181 void (*DSRLV)(void);
182 void (*DSRAV)(void);
183 void (*DSLL32)(void);
184 void (*DSRL32)(void);
185 void (*DSRA32)(void);
186
187 // COP0 instructions
188 void (*MTC0)(void);
189 void (*MFC0)(void);
190
191 void (*TLBR)(void);
192 void (*TLBWI)(void);
193 void (*TLBWR)(void);
194 void (*TLBP)(void);
195 void (*CACHE)(void);
196 void (*ERET)(void);
197
198 // COP1 instructions
199 void (*LWC1)(void);
200 void (*SWC1)(void);
201 void (*MTC1)(void);
202 void (*MFC1)(void);
203 void (*CTC1)(void);
204 void (*CFC1)(void);
205 void (*BC1T)(void);
206 void (*BC1T_OUT)(void);
207 void (*BC1T_IDLE)(void);
208 void (*BC1F)(void);
209 void (*BC1F_OUT)(void);
210 void (*BC1F_IDLE)(void);
211
212 void (*DMFC1)(void);
213 void (*DMTC1)(void);
214 void (*LDC1)(void);
215 void (*SDC1)(void);
216
217 void (*CVT_S_D)(void);
218 void (*CVT_S_W)(void);
219 void (*CVT_S_L)(void);
220 void (*CVT_D_S)(void);
221 void (*CVT_D_W)(void);
222 void (*CVT_D_L)(void);
223 void (*CVT_W_S)(void);
224 void (*CVT_W_D)(void);
225 void (*CVT_L_S)(void);
226 void (*CVT_L_D)(void);
227
228 void (*ROUND_W_S)(void);
229 void (*ROUND_W_D)(void);
230 void (*ROUND_L_S)(void);
231 void (*ROUND_L_D)(void);
232
233 void (*TRUNC_W_S)(void);
234 void (*TRUNC_W_D)(void);
235 void (*TRUNC_L_S)(void);
236 void (*TRUNC_L_D)(void);
237
238 void (*CEIL_W_S)(void);
239 void (*CEIL_W_D)(void);
240 void (*CEIL_L_S)(void);
241 void (*CEIL_L_D)(void);
242
243 void (*FLOOR_W_S)(void);
244 void (*FLOOR_W_D)(void);
245 void (*FLOOR_L_S)(void);
246 void (*FLOOR_L_D)(void);
247
248 void (*ADD_S)(void);
249 void (*ADD_D)(void);
250
251 void (*SUB_S)(void);
252 void (*SUB_D)(void);
253
254 void (*MUL_S)(void);
255 void (*MUL_D)(void);
256
257 void (*DIV_S)(void);
258 void (*DIV_D)(void);
259
260 void (*ABS_S)(void);
261 void (*ABS_D)(void);
262
263 void (*MOV_S)(void);
264 void (*MOV_D)(void);
265
266 void (*NEG_S)(void);
267 void (*NEG_D)(void);
268
269 void (*SQRT_S)(void);
270 void (*SQRT_D)(void);
271
272 void (*C_F_S)(void);
273 void (*C_F_D)(void);
274 void (*C_UN_S)(void);
275 void (*C_UN_D)(void);
276 void (*C_EQ_S)(void);
277 void (*C_EQ_D)(void);
278 void (*C_UEQ_S)(void);
279 void (*C_UEQ_D)(void);
280 void (*C_OLT_S)(void);
281 void (*C_OLT_D)(void);
282 void (*C_ULT_S)(void);
283 void (*C_ULT_D)(void);
284 void (*C_OLE_S)(void);
285 void (*C_OLE_D)(void);
286 void (*C_ULE_S)(void);
287 void (*C_ULE_D)(void);
288 void (*C_SF_S)(void);
289 void (*C_SF_D)(void);
290 void (*C_NGLE_S)(void);
291 void (*C_NGLE_D)(void);
292 void (*C_SEQ_S)(void);
293 void (*C_SEQ_D)(void);
294 void (*C_NGL_S)(void);
295 void (*C_NGL_D)(void);
296 void (*C_LT_S)(void);
297 void (*C_LT_D)(void);
298 void (*C_NGE_S)(void);
299 void (*C_NGE_D)(void);
300 void (*C_LE_S)(void);
301 void (*C_LE_D)(void);
302 void (*C_NGT_S)(void);
303 void (*C_NGT_D)(void);
304
305 // Special instructions
306 void (*SYSCALL)(void);
307
308 // Exception instructions
309 void (*TEQ)(void);
310
311 // Emulator helper functions
312 void (*NOP)(void); // No operation (used to nullify R0 writes)
313 void (*RESERVED)(void); // Reserved instruction handler
314 void (*NI)(void); // Not implemented instruction handler
315
316 void (*FIN_BLOCK)(void); // Handler for the end of a block
317 void (*NOTCOMPILED)(void); // Handler for not yet compiled code
318 void (*NOTCOMPILED2)(void); // TODOXXX
319} cpu_instruction_table;
320
321extern const cpu_instruction_table cached_interpreter_table;
322extern cpu_instruction_table current_instruction_table;