📄 alpha.c
字号:
/* alpha.c - Alpha ISA definition routines *//* 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. */#include <stdio.h>#include <stdlib.h>#include "host.h"#include "misc.h"#include "machine.h"#include "eval.h"#include "regs.h"#if 0 /* cross-endian execution now works with EIO trace files only... *//* FIXME: currently SimpleScalar/AXP only builds on little-endian... */#if !defined(BYTES_LITTLE_ENDIAN) || !defined(WORDS_LITTLE_ENDIAN)#error SimpleScalar/AXP only builds on little-endian machines...#endif#endif/* FIXME: currently SimpleScalar/AXP only builds with qword support... */#if !defined(HOST_HAS_QWORD)#error SimpleScalar/AXP only builds on hosts with builtin qword support...#error Try building with GNU GCC, as it supports qwords on most machines.#endif/* preferred nop instruction definition */md_inst_t MD_NOP_INST = 0x43ff041f; /* addq r31,r31,r31 *//* 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] = { FUClamd_NA, /* NA */#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) RES,#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) FUClamd_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"};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 }, { "$v0", 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 }, { "$err", 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 }, { "$fp", rt_gpr, 15 }, { "$r16", rt_gpr, 16 }, { "$a0", rt_gpr, 16 }, { "$r17", rt_gpr, 17 }, { "$a1", rt_gpr, 17 }, { "$r18", rt_gpr, 18 }, { "$a2", rt_gpr, 18 }, { "$r19", rt_gpr, 19 }, { "$a3", rt_gpr, 19 }, { "$r20", rt_gpr, 20 }, { "$a4", rt_gpr, 20 }, { "$r21", rt_gpr, 21 }, { "$a5", rt_gpr, 21 }, { "$r22", rt_gpr, 22 }, { "$r23", rt_gpr, 23 }, { "$r24", rt_gpr, 24 }, { "$r25", rt_gpr, 25 }, { "$r26", rt_gpr, 26 }, { "$ra", rt_gpr, 26 }, { "$r27", rt_gpr, 27 }, { "$r28", rt_gpr, 28 }, { "$r29", rt_gpr, 29 }, { "$gp", rt_gpr, 29 }, { "$r30", rt_gpr, 30 }, { "$sp", rt_gpr, 30 }, { "$r31", rt_gpr, 31 }, { "$zero", rt_gpr, 31 }, /* floating point register file - double 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 - 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 */ { "$fpcr", rt_ctrl, 0 }, { "$uniq", rt_ctrl, 1 }, /* 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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -