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