⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mc_opc.c

📁 一个用在mips体系结构中的操作系统
💻 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 + -