📄 mc_opc.c
字号:
/* * Copyright (C) 1996-1998 by the Board of Trustees * of Leland Stanford Junior University. * * This file is part of the SimOS distribution. * See LICENSE file for terms of the license. * */ /* * mc_opc.c - Opcode tables and routines for the simulator * and compiler. When the opcode numbering changes * for any reason, these tables and routines need * to be updated. * * Jim Bennett * 1994, 1995 */#include "ms.h"#ifdef NEED_OPTABvoid (*optab[MAX_OP])(struct s_cpu_state *st, INST *ip, THREAD *th) = { opILL, opJ, opBEQ, opBNE, opBLEZ, opBGTZ, opBLTZ, opBGEZ, opBC1F, opBC1T, opBEQL, opBNEL, opBLEZL, opBGTZL, opBLTZL, opBGEZL, opBC1FL, opBC1TL, opJR, opJRET, opJAL, opBLTZAL, opBGEZAL, opBLTZALL, opBGEZALL, opJALR, opSYSCALL, opBREAK, opLB, opLH, opLWL, opLW, opLBU, opLHU, opLWR, opLWC1, opLDC1, opSB, opSH, opSWL, opSW, opSWR, opSWC1, opSDC1, opADDI, opADDIU, opSLTI, opSLTIU, opANDI, opORI, opXORI, opHCPY, opSLL, opSRL, opSRA, opSLLV, opSRLV, opSRAV, opMULT, opMULTU, opDIV, opDIVU, opADD, opADDU, opSUB, opSUBU, opAND, opOR, opXOR, opNOR, opSLT, opSLTU, opCPY, opCVTSW, opCVTDW, opFADDS, opFSUBS, opFMULS, opFDIVS, opFSQRTS, opFABSS, opFNEGS, opFROUNDS, opFTRUNCS, opFCEILS, opFFLOORS, opCVTDS, opCVTWS, opCUNS, opCUNS, opCUEQS, opCUEQS, opCULTS, opCULTS, opCULES, opCULES, opCNGLES, opCNGLES, opCNGLS, opCNGLS, opCNGES, opCNGES, opCNGTS, opCNGTS, opFADDD, opFSUBD, opFMULD, opFDIVD, opFSQRTD, opFABSD, opFMOVD, opFNEGD, opFROUNDD, opFTRUNCD, opFCEILD, opFFLOORD, opCVTSD, opCVTWD, opCUEQD, opCUEQD, opCULTD, opCULTD, opCULED, opCULED, opCNGLD, opCNGLD, opCNGED, opCNGED, opCNGTD, opCNGTD, opCTL_FPC, opCTL_CFC, opCTL_DLY, opCP0, opBDOOR, opLL, opSC, opCPY, opHCPY, opCP0, opPREF, opLDHACK, opSDHACK };#endifchar *opcode_mnemonics [MAX_OP] = { "ILLEGAL", "J", "BEQ", "BNE", "BLEZ", "BGTZ", "BLTZ", "BGEZ", "BC1F", "BC1T", "BEQL", "BNEL", "BLEZL", "BGTZL", "BLTZL", "BGEZL", "BC1FL", "BC1TL", "JR", "JRET", "JAL", "BLTZAL", "BGEZAL", "BLTZALL", "BGEZALL", "JALR", "SYSCALL", "BREAK", "LB", "LH", "LWL", "LW", "LBU", "LHU", "LWR", "LWC", "LDC", "SB", "SH", "SWL", "SW", "SWR", "SWC", "SDC", "ADDI", "ADDIU", "SLTI", "SLTIU", "ANDI", "ORI", "XORI", "HCPY", "SLL", "SRL", "SRA", "SLLV", "SRLV", "SRAV", "MULT", "MULTU", "DIV", "DIVU", "ADD", "ADDU", "SUB", "SUBU", "AND", "OR", "XOR", "NOR", "SLT", "SLTU", "CPY", "CVT.S.W", "CVT.D.W", "FADD.S", "FSUB.S", "FMUL.S", "FDIV.S", "FSQRT.S", "FABS.S", "FNEG.S", "FROUND.S", "FTRUNC.S", "FCEIL.S", "FFLOOR.S", "CVT.D.S", "CVT.W.S", "C.F", "C.UN", "C.EQ.S", "C.UEQ.S", "C.OLT.S", "C.ULT.S", "C.OLE.S", "C.ULE.S", "C.SF", "C.NGLE", "C.SEQ.S", "C.NGL.S", "C.LT.S", "C.NGE.S", "C.LE.S", "C.NGT.S", "FADD.D", "FSUB.D", "FMUL.D", "FDIV.D", "FSQRT.D", "FABS.D", "FMOV.D", "FNEG.D", "FROUND.D", "FTRUNC.D", "FCEIL.D", "FFLOOR.D", "CVT.S.D", "CVT.W.D", "C.EQ.D", "C.UEQ.D", "C.OLT.D", "C.ULT.D", "C.OLE.D", "C.ULE.D", "C.SEQ.D", "C.NGL.D", "C.LT.D", "C.NGE.D", "C.LE.D", "C.NGT.D", "CTL_FPC", "CTL_CFC", "CTL_DLY", "CP0", "BDOOR", "LL", "SC", "CPY_COP1", "HCPY_COP1", "CP0_SPEC", "PREF", "LDHACK", "SDHACK" };int lat_tab [MAX_OP] = /* Latency table for opcodes */ { /* 0 = OPILL - OPBC1T */ 10, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, /* 10 = OPBEQL - OPJRET */ BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, /* 20 = OPJAL - OPLH */ BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, BRANCH_LATENCY, 1, 1, PC_LATENCY, PC_LATENCY, /* 30 = OPLWL - OPSWL */ PC_LATENCY, PC_LATENCY, PC_LATENCY, PC_LATENCY, PC_LATENCY, PC_LATENCY, PC_LATENCY, 1, 1, 1, /* 40 = OPSW - OPORI */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 50 = OPXORI - OPMULTU */ 1, 1, 1, 1, 1, 1, 1, 1, MULT_LATENCY, MULT_LATENCY, /* 60 = OPDIV - OPNOR */ DIV_LATENCY, DIV_LATENCY, 1, 1, 1, 1, 1, 1, 1, 1, /* 70 = OPSLT - OPFSQRTS */ 1, 1, 1, FPCVTSW_LATENCY, FPCVTDW_LATENCY, FPADD_LATENCY, FPADD_LATENCY, FPMULS_LATENCY, FPDIVS_LATENCY, FPSQRTS_LATENCY, /* 80 = OPFABSS - OPCUNS */ FPABS_LATENCY, FPNEG_LATENCY, 1, 1, 1, 1, FPCVT_LATENCY, FPCVT_LATENCY, 1, 1, /* 90 = OPCEQS - OPCNGLS */ FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, 1, 1, FPCMP_LATENCY, FPCMP_LATENCY, /* 100 = OPCLTS - OPFABSD */ FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPADD_LATENCY, FPADD_LATENCY, FPMULD_LATENCY, FPDIVD_LATENCY, FPSQRTD_LATENCY, FPABS_LATENCY, /* 110 = OPFMOVD - OPCUEQD */ 1, FPNEG_LATENCY, 1, 1, 1, 1, FPCVT_LATENCY, FPCVT_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, /* 120 = OPCOLTD - OPCNGTD */ FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, FPCMP_LATENCY, 1, 1, 1, 1, 1, /* 130 = CTL_FPC - BDOOR */ PC_LATENCY, PC_LATENCY, /* 135 = LL, SC */ 1, 1, 1, /* 137 = OPCPYC1, OPHCPYC1, CP0_SPEC */ 1, 1, 1 /* 140 = PREF, LDHACK, SDHACK */ }; /* * immediate_unconditional - Return TRUE if the given * instruction is an immediate, unconditional branch. * * Branch likely instructions are never considered as * immediate_unconditional instructions, since they * need to fetch their branch delay slots first. */int immediate_unconditional (INST *ip) { switch (ip->op) { case OPJ: case OPJAL: return (1); case OPBEQ: if ((ip->r2 == 0) && (ip->r3 == 0)) return (1); break; case OPBLEZ: case OPBGEZ: case OPBGEZAL: if (ip->r2 == 0) return (1); break; default: break; } return (0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -