Core commit. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / ops.h
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
22 typedef 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
321 extern const cpu_instruction_table cached_interpreter_table;
322 extern cpu_instruction_table current_instruction_table;