📄 mips.c.svn-base
字号:
/*
* mips.c - SimpleScalar MIPS ISA (mips) definition routines
*
* This file is a part of the SimpleScalar tool suite written by
* Todd M. Austin as a part of the Multiscalar Research Project.
*
* The tool suite is currently maintained by Doug Burger and Todd M. Austin.
*
* Copyright (C) 1994, 1995, 1996, 1997, 1998 by Todd M. Austin
*
* This source file is distributed "as is" in the hope that it will be
* useful. The tool set comes with no warranty, and no author or
* distributor accepts any responsibility for the consequences of its
* use.
*
* Everyone is granted permission to copy, modify and redistribute
* this tool set under the following conditions:
*
* This source code is distributed for non-commercial use only.
* Please contact the maintainer for restrictions applying to
* commercial use.
*
* Permission is granted to anyone to make or distribute copies
* of this source code, either as received or modified, in any
* medium, provided that all copyright notices, permission and
* nonwarranty notices are preserved, and that the distributor
* grants the recipient permission for further redistribution as
* permitted by this document.
*
* Permission is granted to distribute this file in compiled
* or executable form under the same conditions that apply for
* source code, provided that either:
*
* A. it is accompanied by the corresponding machine-readable
* source code,
* 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 that they received concurrently.
*
* In other words, you are welcome to use, share and improve this
* source file. You are forbidden to forbid anyone else to use, share
* and improve what you give them.
*
* INTERNET: dburger@cs.wisc.edu
* US Mail: 1210 W. Dayton Street, Madison, WI 53706
*
* $Id: mips.c,v 1.1.1.1 2006/09/08 09:21:43 cvsuser Exp $
*
* $Log: mips.c,v $
* Revision 1.1.1.1 2006/09/08 09:21:43 cvsuser
* Godson-3 simulator
*
* Revision 1.1 2005/01/27 03:18:24 fxzhang
* create godson2 cvs
*
* Revision 1.2 2004/12/14 08:51:50 fxzhang
* add sim-godson
*
* Revision 1.1.1.1 2004/12/05 14:36:32 fxzhang
* initial import of ss-mips
*
* Revision 1.3 2004/08/03 09:50:06 fxzhang
* merge back changes on AMD64
*
* Revision 1.3 2004/08/02 01:37:27 fxzhang
* add readline support for dlite
* fix sc implementation(eon runs now)
*
* Revision 1.2 2004/07/30 02:48:22 fxzhang
* fix stat64/lstat64
*
* Revision 1.2 2004/07/15 07:31:03 fxzhang
* fix syscall on x86-64
*
* Revision 1.1.1.1 2004/07/15 01:26:34 fxzhang
* import
*
* Revision 1.2 2004/07/14 07:38:06 fxzhang
* add bbtracker( simpoint ) support
*
* Revision 1.1.1.1 2004/07/10 16:46:48 fxzhang
* initial
*
* Revision 1.1.1.1 2000/05/26 15:21:54 taustin
* SimpleScalar Tool Set
*
*
* Revision 1.8 1999/12/31 19:02:13 taustin
* decoders are more bulletproof (check for array overflows)
*
* Revision 1.7 1999/12/13 19:00:26 taustin
* cross endian execution support added
* crc support added (for debug)
*
* Revision 1.6 1998/08/31 17:13:00 taustin
* added register checksuming routines
*
* Revision 1.5 1998/08/27 17:00:28 taustin
* implemented host interface description in host.h
* added target interface support
* added support for register and memory contexts
* added register pretty printing routines
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "host.h"
#include "misc.h"
#include "machine.h"
#include "eval.h"
#include "regs.h"
#include "memory.h"
/* preferred nop instruction definition */
md_inst_t MD_NOP_INST = 0x0;
/* opcode mask -> enum md_opcodem, used by decoder (MD_OP_ENUM()) */
enum md_opcode md_mask2op[MD_MAX_MASK+1];
unsigned int md_opoffset[OP_MAX];
/* enum md_opcode -> mask for decoding next level */
unsigned int md_opmask[OP_MAX] = {
0, /* NA */
#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) 0,
#define DEFLINK(OP,MSK,NAME,SHIFT,MASK) MASK,
#define CONNECT(OP)
#include "machine.def"
};
/* enum md_opcode -> shift for decoding next level */
unsigned int md_opshift[OP_MAX] = {
0, /* NA */
#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) 0,
#define DEFLINK(OP,MSK,NAME,SHIFT,MASK) SHIFT,
#define CONNECT(OP)
#include "machine.def"
};
/* enum md_opcode -> description string */
char *md_op2name[OP_MAX] = {
NULL, /* NA */
#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) NAME,
#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) NAME,
#define CONNECT(OP)
#include "machine.def"
};
/* enum md_opcode -> opcode operand format, used by disassembler */
char *md_op2format[OP_MAX] = {
NULL, /* NA */
#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) OPFORM,
#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) NULL,
#define CONNECT(OP)
#include "machine.def"
};
/* enum md_opcode -> enum md_fu_class, used by performance simulators */
enum md_fu_class md_op2fu[OP_MAX] = {
FUClass_NA, /* NA */
#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) RES,
#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) FUClass_NA,
#define CONNECT(OP)
#include "machine.def"
};
/* enum md_fu_class -> description string */
char *md_fu2name[NUM_FU_CLASSES] = {
NULL, /* NA */
"fu-int-ALU",
"fu-int-multiply",
"fu-int-divide",
"fu-FP-add/sub",
"fu-FP-comparison",
"fu-FP-conversion",
"fu-FP-multiply",
"fu-FP-divide",
"fu-FP-sqrt",
"rd-port",
"wr-port"
};
/* lwl/lwr/swl/swr masks */
word_t md_lr_masks[] = {
#ifdef BYTES_BIG_ENDIAN
0x00000000,
0x000000ff,
0x0000ffff,
0x00ffffff,
0xffffffff,
#else
0xffffffff,
0x00ffffff,
0x0000ffff,
0x000000ff,
0x00000000,
#endif
};
char *md_amode_str[md_amode_NUM] =
{
"(const)", /* immediate addressing mode */
"(gp + const)", /* global data access through global pointer */
"(sp + const)", /* stack access through stack pointer */
"(fp + const)", /* stack access through frame pointer */
"(reg + const)", /* (reg + const) addressing */
"(reg + reg)" /* (reg + reg) addressing */
};
/* symbolic register names, parser is case-insensitive */
struct md_reg_names_t md_reg_names[] =
{
/* name */ /* file */ /* reg */
/* integer register file */
{ "$r0", rt_gpr, 0 },
{ "$zero", rt_gpr, 0 },
{ "$r1", rt_gpr, 1 },
{ "$r2", rt_gpr, 2 },
{ "$r3", rt_gpr, 3 },
{ "$r4", rt_gpr, 4 },
{ "$r5", rt_gpr, 5 },
{ "$r6", rt_gpr, 6 },
{ "$r7", rt_gpr, 7 },
{ "$r8", rt_gpr, 8 },
{ "$r9", rt_gpr, 9 },
{ "$r10", rt_gpr, 10 },
{ "$r11", rt_gpr, 11 },
{ "$r12", rt_gpr, 12 },
{ "$r13", rt_gpr, 13 },
{ "$r14", rt_gpr, 14 },
{ "$r15", rt_gpr, 15 },
{ "$r16", rt_gpr, 16 },
{ "$r17", rt_gpr, 17 },
{ "$r18", rt_gpr, 18 },
{ "$r19", rt_gpr, 19 },
{ "$r20", rt_gpr, 20 },
{ "$r21", rt_gpr, 21 },
{ "$r22", rt_gpr, 22 },
{ "$r23", rt_gpr, 23 },
{ "$r24", rt_gpr, 24 },
{ "$r25", rt_gpr, 25 },
{ "$r26", rt_gpr, 26 },
{ "$r27", rt_gpr, 27 },
{ "$r28", rt_gpr, 28 },
{ "$gp", rt_gpr, 28 },
{ "$r29", rt_gpr, 29 },
{ "$sp", rt_gpr, 29 },
{ "$r30", rt_gpr, 30 },
{ "$fp", rt_gpr, 30 },
{ "$r31", rt_gpr, 31 },
/* floating point register file - single precision */
{ "$f0", rt_fpr, 0 },
{ "$f1", rt_fpr, 1 },
{ "$f2", rt_fpr, 2 },
{ "$f3", rt_fpr, 3 },
{ "$f4", rt_fpr, 4 },
{ "$f5", rt_fpr, 5 },
{ "$f6", rt_fpr, 6 },
{ "$f7", rt_fpr, 7 },
{ "$f8", rt_fpr, 8 },
{ "$f9", rt_fpr, 9 },
{ "$f10", rt_fpr, 10 },
{ "$f11", rt_fpr, 11 },
{ "$f12", rt_fpr, 12 },
{ "$f13", rt_fpr, 13 },
{ "$f14", rt_fpr, 14 },
{ "$f15", rt_fpr, 15 },
{ "$f16", rt_fpr, 16 },
{ "$f17", rt_fpr, 17 },
{ "$f18", rt_fpr, 18 },
{ "$f19", rt_fpr, 19 },
{ "$f20", rt_fpr, 20 },
{ "$f21", rt_fpr, 21 },
{ "$f22", rt_fpr, 22 },
{ "$f23", rt_fpr, 23 },
{ "$f24", rt_fpr, 24 },
{ "$f25", rt_fpr, 25 },
{ "$f26", rt_fpr, 26 },
{ "$f27", rt_fpr, 27 },
{ "$f28", rt_fpr, 28 },
{ "$f29", rt_fpr, 29 },
{ "$f30", rt_fpr, 30 },
{ "$f31", rt_fpr, 31 },
/* floating point register file - double precision */
{ "$d0", rt_dpr, 0 },
{ "$d1", rt_dpr, 1 },
{ "$d2", rt_dpr, 2 },
{ "$d3", rt_dpr, 3 },
{ "$d4", rt_dpr, 4 },
{ "$d5", rt_dpr, 5 },
{ "$d6", rt_dpr, 6 },
{ "$d7", rt_dpr, 7 },
{ "$d8", rt_dpr, 8 },
{ "$d9", rt_dpr, 9 },
{ "$d10", rt_dpr, 10 },
{ "$d11", rt_dpr, 11 },
{ "$d12", rt_dpr, 12 },
{ "$d13", rt_dpr, 13 },
{ "$d14", rt_dpr, 14 },
{ "$d15", rt_dpr, 15 },
/* floating point register file - integer precision */
{ "$l0", rt_lpr, 0 },
{ "$l1", rt_lpr, 1 },
{ "$l2", rt_lpr, 2 },
{ "$l3", rt_lpr, 3 },
{ "$l4", rt_lpr, 4 },
{ "$l5", rt_lpr, 5 },
{ "$l6", rt_lpr, 6 },
{ "$l7", rt_lpr, 7 },
{ "$l8", rt_lpr, 8 },
{ "$l9", rt_lpr, 9 },
{ "$l10", rt_lpr, 10 },
{ "$l11", rt_lpr, 11 },
{ "$l12", rt_lpr, 12 },
{ "$l13", rt_lpr, 13 },
{ "$l14", rt_lpr, 14 },
{ "$l15", rt_lpr, 15 },
{ "$l16", rt_lpr, 16 },
{ "$l17", rt_lpr, 17 },
{ "$l18", rt_lpr, 18 },
{ "$l19", rt_lpr, 19 },
{ "$l20", rt_lpr, 20 },
{ "$l21", rt_lpr, 21 },
{ "$l22", rt_lpr, 22 },
{ "$l23", rt_lpr, 23 },
{ "$l24", rt_lpr, 24 },
{ "$l25", rt_lpr, 25 },
{ "$l26", rt_lpr, 26 },
{ "$l27", rt_lpr, 27 },
{ "$l28", rt_lpr, 28 },
{ "$l29", rt_lpr, 29 },
{ "$l30", rt_lpr, 30 },
{ "$l31", rt_lpr, 31 },
/* miscellaneous registers */
{ "$hi", rt_ctrl, 0 },
{ "$lo", rt_ctrl, 1 },
{ "$fcc", rt_ctrl, 2 },
/* program counters */
{ "$pc", rt_PC, 0 },
{ "$npc", rt_NPC, 0 },
/* sentinel */
{ NULL, rt_gpr, 0 }
};
/* returns a register name string */
char *
md_reg_name(enum md_reg_type rt, int reg)
{
int i;
for (i=0; md_reg_names[i].str != NULL; i++)
{
if (md_reg_names[i].file == rt && md_reg_names[i].reg == reg)
return md_reg_names[i].str;
}
/* no found... */
return NULL;
}
char * /* err str, NULL for no err */
md_reg_obj(struct regs_t *regs, /* registers to access */
int is_write, /* access type */
enum md_reg_type rt, /* reg bank to probe */
int reg, /* register number */
struct eval_value_t *val) /* input, output */
{
switch (rt)
{
case rt_gpr:
if (reg < 0 || reg >= MD_NUM_IREGS)
return "register number out of range";
if (!is_write)
{
val->type = et_uint;
val->value.as_uint = regs->regs_R[reg];
}
else
regs->regs_R[reg] = eval_as_uint(*val);
break;
case rt_lpr:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -