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