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

📄 pisa.h

📁 一个很有名的硬件模拟器。可以模拟CPU
💻 H
📖 第 1 页 / 共 2 页
字号:
/* pisa.h - SimpleScaler portable ISA (pisa) definitions *//* SimpleScalar(TM) Tool Suite * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. * All Rights Reserved.  *  * THIS IS A LEGAL DOCUMENT, BY USING SIMPLESCALAR, * YOU ARE AGREEING TO THESE TERMS AND CONDITIONS. *  * No portion of this work may be used by any commercial entity, or for any * commercial purpose, without the prior, written permission of SimpleScalar, * LLC (info@simplescalar.com). Nonprofit and noncommercial use is permitted * as described below. *  * 1. SimpleScalar is provided AS IS, with no warranty of any kind, express * or implied. The user of the program accepts full responsibility for the * application of the program and the use of any results. *  * 2. Nonprofit and noncommercial use is encouraged. SimpleScalar may be * downloaded, compiled, executed, copied, and modified solely for nonprofit, * educational, noncommercial research, and noncommercial scholarship * purposes provided that this notice in its entirety accompanies all copies. * Copies of the modified software can be delivered to persons who use it * solely for nonprofit, educational, noncommercial research, and * noncommercial scholarship purposes provided that this notice in its * entirety accompanies all copies. *  * 3. ALL COMMERCIAL USE, AND ALL USE BY FOR PROFIT ENTITIES, IS EXPRESSLY * PROHIBITED WITHOUT A LICENSE FROM SIMPLESCALAR, LLC (info@simplescalar.com). *  * 4. No nonprofit user may place any restrictions on the use of this software, * including as modified by the user, by any other authorized user. *  * 5. Noncommercial and nonprofit users may distribute copies of SimpleScalar * in compiled or executable form as set forth in Section 2, provided that * either: (A) it is accompanied by the corresponding machine-readable source * code, or (B) it is accompanied by a written offer, with no time limit, to * give anyone a machine-readable copy of the corresponding source code in * return for reimbursement of the cost of distribution. This written offer * must permit verbatim duplication by anyone, or (C) it is distributed by * someone who received only the executable form, and is accompanied by a * copy of the written offer of source code. *  * 6. SimpleScalar was developed by Todd M. Austin, Ph.D. The tool suite is * currently maintained by SimpleScalar LLC (info@simplescalar.com). US Mail: * 2395 Timbercrest Court, Ann Arbor, MI 48105. *  * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. */#ifndef PISA_H#define PISA_H#include <stdio.h>#include "host.h"#include "misc.h"#include "config.h"#include "endian.h"/* * This file contains various definitions needed to decode, disassemble, and * execute PISA (portable ISA) instructions. *//* build for PISA target */#define TARGET_PISA#ifndef TARGET_PISA_BIG#ifndef TARGET_PISA_LITTLE/* no cross-endian support, default to host endian */#ifdef BYTES_BIG_ENDIAN#define TARGET_PISA_BIG#else#define TARGET_PISA_LITTLE#endif#endif /* TARGET_PISA_LITTLE */#endif /* TARGET_PISA_BIG *//* probe cross-endian execution */#if defined(BYTES_BIG_ENDIAN) && defined(TARGET_PISA_LITTLE)#define MD_CROSS_ENDIAN#endif#if defined(BYTES_LITTLE_ENDIAN) && defined(TARGET_PISA_BIG)#define MD_CROSS_ENDIAN#endif/* not applicable/available, usable in most definition contexts */#define NA		0/* * target-dependent type definitions *//* define MD_QWORD_ADDRS if the target requires 64-bit (qword) addresses */#undef MD_QWORD_ADDRS/* address type definition */typedef word_t md_addr_t;/* * target-dependent memory module configuration *//* physical memory page size (must be a power-of-two) */#define MD_PAGE_SIZE		4096#define MD_LOG_PAGE_SIZE	12/* * target-dependent instruction faults */enum md_fault_type {  md_fault_none = 0,		/* no fault */  md_fault_access,		/* storage access fault */  md_fault_alignment,		/* storage alignment fault */  md_fault_overflow,		/* signed arithmetic overflow fault */  md_fault_div0,		/* division by zero fault */  md_fault_break,		/* BREAK instruction fault */  md_fault_unimpl,		/* unimplemented instruction fault */  md_fault_internal		/* internal S/W fault */};/* * target-dependent register file definitions, used by regs.[hc] *//* number of integer registers */#define MD_NUM_IREGS		32/* number of floating point registers */#define MD_NUM_FREGS		32/* number of control registers */#define MD_NUM_CREGS		3/* total number of registers, excluding PC and NPC */#define MD_TOTAL_REGS							\  (/*int*/32 + /*fp*/32 + /*misc*/3 + /*tmp*/1 + /*mem*/1 + /*ctrl*/1)/* general purpose (integer) register file entry type */typedef sword_t md_gpr_t[MD_NUM_IREGS];/* floating point register file entry type */typedef union {  sword_t l[MD_NUM_FREGS];	/* integer word view */  sfloat_t f[MD_NUM_FREGS];	/* single-precision floating point view */  dfloat_t d[MD_NUM_FREGS/2];	/* double-prediction floating point view */} md_fpr_t;/* control register file contents */typedef struct {  sword_t hi, lo;		/* multiplier HI/LO result registers */  int fcc;			/* floating point condition codes */} md_ctrl_t;/* well known registers */enum md_reg_names {  MD_REG_ZERO = 0,	/* zero register */  MD_REG_GP = 28,	/* global data section pointer */  MD_REG_SP = 29,	/* stack pointer */  MD_REG_FP = 30	/* frame pointer */};/* * target-dependent instruction format definition *//* instruction formats */typedef struct {  word_t a;		/* simplescalar opcode (must be unsigned) */  word_t b;		/* simplescalar unsigned immediate fields */} md_inst_t;/* preferred nop instruction definition */extern md_inst_t MD_NOP_INST;/* target swap support */#ifdef MD_CROSS_ENDIAN#define MD_SWAPH(X)		SWAP_HALF(X)#define MD_SWAPW(X)		SWAP_WORD(X)#define MD_SWAPQ(X)		SWAP_QWORD(X)#define MD_SWAPI(X)		((X).a = SWAP_WORD((X).a),		\				 (X).b = SWAP_WORD((X).b))#else /* !MD_CROSS_ENDIAN */#define MD_SWAPH(X)		(X)#define MD_SWAPW(X)		(X)#define MD_SWAPQ(X)		(X)#define MD_SWAPD(X)		(X)#define MD_SWAPI(X)		(X)#endif/* fetch an instruction */#define MD_FETCH_INST(INST, MEM, PC)					\  { inst.a = MEM_READ_WORD(mem, (PC));					\    inst.b = MEM_READ_WORD(mem, (PC) + sizeof(word_t)); }/* * target-dependent loader module configuration *//* virtual memory segment limits */#define MD_TEXT_BASE		0x00400000#define MD_DATA_BASE		0x10000000#define MD_STACK_BASE 		0x7fffc000/* maximum size of argc+argv+envp environment */#define MD_MAX_ENVIRON		16384/* * machine.def specific definitions *//* returns the opcode field value of SimpleScalar instruction INST */#define MD_OPFIELD(INST)		(INST.a & 0xff)#define MD_SET_OPCODE(OP, INST)	((OP) = ((INST).a & 0xff))/* largest opcode field value (currently upper 8-bit are used for pre/post-   incr/decr operation specifiers */#define MD_MAX_MASK		255/* global opcode names, these are returned by the decoder (MD_OP_ENUM()) */enum md_opcode {  OP_NA = 0,	/* NA */#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) OP,#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) OP,#define CONNECT(OP)#include "machine.def"  OP_MAX	/* number of opcodes + NA */};/* inst -> enum md_opcode mapping, use this macro to decode insts */#define MD_OP_ENUM(MSK)		(md_mask2op[MSK])extern enum md_opcode md_mask2op[];/* enum md_opcode -> description string */#define MD_OP_NAME(OP)		(md_op2name[OP])extern char *md_op2name[];/* enum md_opcode -> opcode operand format, used by disassembler */#define MD_OP_FORMAT(OP)	(md_op2format[OP])extern char *md_op2format[];/* function unit classes, update md_fu2name if you update this definition */enum md_fu_class {  FUClass_NA = 0,	/* inst does not use a functional unit */  IntALU,		/* integer ALU */  IntMULT,		/* integer multiplier */  IntDIV,		/* integer divider */  FloatADD,		/* floating point adder/subtractor */  FloatCMP,		/* floating point comparator */  FloatCVT,		/* floating point<->integer converter */  FloatMULT,		/* floating point multiplier */  FloatDIV,		/* floating point divider */  FloatSQRT,		/* floating point square root */  RdPort,		/* memory read port */  WrPort,		/* memory write port */  NUM_FU_CLASSES	/* total functional unit classes */};/* enum md_opcode -> enum md_fu_class, used by performance simulators */#define MD_OP_FUCLASS(OP)	(md_op2fu[OP])extern enum md_fu_class md_op2fu[];/* enum md_fu_class -> description string */#define MD_FU_NAME(FU)		(md_fu2name[FU])extern char *md_fu2name[];/* instruction flags */#define F_ICOMP		0x00000001	/* integer computation */#define F_FCOMP		0x00000002	/* FP computation */#define F_CTRL		0x00000004	/* control inst */#define F_UNCOND	0x00000008	/*   unconditional change */#define F_COND		0x00000010	/*   conditional change */#define F_MEM		0x00000020	/* memory access inst */#define F_LOAD		0x00000040	/*   load inst */#define F_STORE		0x00000080	/*   store inst */#define F_DISP		0x00000100	/*   displaced (R+C) addr mode */#define F_RR		0x00000200	/*   R+R addr mode */#define F_DIRECT	0x00000400	/*   direct addressing mode */#define F_TRAP		0x00000800	/* traping inst */#define F_LONGLAT	0x00001000	/* long latency inst (for sched) */#define F_DIRJMP	0x00002000	/* direct jump */#define F_INDIRJMP	0x00004000	/* indirect jump */#define F_CALL		0x00008000	/* function call */#define F_FPCOND	0x00010000	/* FP conditional branch */#define F_IMM		0x00020000	/* instruction has immediate operand *//* enum md_opcode -> opcode flags, used by simulators */#define MD_OP_FLAGS(OP)		(md_op2flags[OP])extern unsigned int md_op2flags[];/* integer register specifiers */#undef  RS	/* defined in /usr/include/sys/syscall.h on HPUX boxes */#define RS		(inst.b >> 24)			/* reg source #1 */#define RT		((inst.b >> 16) & 0xff)		/* reg source #2 */#define RD		((inst.b >> 8) & 0xff)		/* reg dest *//* returns shift amount field value */#define SHAMT		(inst.b & 0xff)/* floating point register field synonyms */#define FS		RS#define FT		RT#define FD		RD/* returns 16-bit signed immediate field value */#define IMM		((int)((/* signed */short)(inst.b & 0xffff)))/* returns 16-bit unsigned immediate field value */#define UIMM		(inst.b & 0xffff)/* returns 26-bit unsigned absolute jump target field value */#define TARG		(inst.b & 0x3ffffff)/* returns break code immediate field value */#define BCODE		(inst.b & 0xfffff)/* load/store 16-bit signed offset field value, synonym for imm field */#define OFS		IMM		/* alias to IMM *//* load/store base register specifier, synonym for RS field */#define BS		RS		/* alias to rs *//* largest signed integer */#define MAXINT_VAL	0x7fffffff/* check for overflow in X+Y, both signed */#define OVER(X,Y)							\  ((((X) > 0) && ((Y) > 0) && (MAXINT_VAL - (X) < (Y)))			\   || (((X) < 0) && ((Y) < 0) && (-MAXINT_VAL - (X) > (Y))))/* check for underflow in X-Y, both signed */#define UNDER(X,Y)							\  ((((X) > 0) && ((Y) < 0) && (MAXINT_VAL + (Y) < (X)))			\   || (((X) < 0) && ((Y) > 0) && (-MAXINT_VAL + (Y) > (X))))/* default target PC handling */#ifndef SET_TPC#define SET_TPC(PC)	(void)0#endif /* SET_TPC */#ifdef BYTES_BIG_ENDIAN/* lwl/swl defs */#define WL_SIZE(ADDR)		((ADDR) & 0x03)#define WL_BASE(ADDR)		((ADDR) & ~0x03)#define WL_PROT_MASK(ADDR)	(md_lr_masks[4-WL_SIZE(ADDR)])#define WL_PROT_MASK1(ADDR)	(md_lr_masks[WL_SIZE(ADDR)])#define WL_PROT_MASK2(ADDR)	(md_lr_masks[4-WL_SIZE(ADDR)])/* lwr/swr defs */#define WR_SIZE(ADDR)		(((ADDR) & 0x03)+1)#define WR_BASE(ADDR)		((ADDR) & ~0x03)#define WR_PROT_MASK(ADDR)	(~(md_lr_masks[WR_SIZE(ADDR)]))#define WR_PROT_MASK1(ADDR)	((md_lr_masks[WR_SIZE(ADDR)]))#define WR_PROT_MASK2(ADDR)	(md_lr_masks[4-WR_SIZE(ADDR)])#else /* BYTES_LITTLE_ENDIAN *//* lwl/swl defs */#define WL_SIZE(ADDR)		(4-((ADDR) & 0x03))#define WL_BASE(ADDR)		((ADDR) & ~0x03)#define WL_PROT_MASK(ADDR)	(md_lr_masks[4-WL_SIZE(ADDR)])#define WL_PROT_MASK1(ADDR)	(md_lr_masks[WL_SIZE(ADDR)])#define WL_PROT_MASK2(ADDR)	(md_lr_masks[4-WL_SIZE(ADDR)])/* lwr/swr defs */#define WR_SIZE(ADDR)		(((ADDR) & 0x03)+1)#define WR_BASE(ADDR)		((ADDR) & ~0x03)#define WR_PROT_MASK(ADDR)	(~(md_lr_masks[WR_SIZE(ADDR)]))#define WR_PROT_MASK1(ADDR)	((md_lr_masks[WR_SIZE(ADDR)]))#define WR_PROT_MASK2(ADDR)	(md_lr_masks[4-WR_SIZE(ADDR)])#endif  /* mask table used to speed up LWL/LWR implementation */extern word_t md_lr_masks[];#if 0/* lwl/swl defs */#define WL_SIZE(ADDR)       (4-((ADDR) & 0x03))#define WL_BASE(ADDR)       ((ADDR) & ~0x03)#define WL_PROT_MASK(ADDR)  (md_lr_masks[4-WL_SIZE(ADDR)])/* lwr/swr defs */#define WR_SIZE(ADDR)       (((ADDR) & 0x03)+1)#define WR_BASE(ADDR)       ((ADDR) & ~0x03)#define WR_PROT_MASK(ADDR)  (~(md_lr_masks[WR_SIZE(ADDR)]))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -