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