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

📄 fr30-dis.c

📁 基于4个mips核的noc设计
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Disassembler interface for targets using CGEN. -*- C -*-   CGEN: Cpu tools GENeratorTHIS FILE IS MACHINE GENERATED WITH CGEN.- the resultant file is machine generated, cgen-dis.in isn'tCopyright 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.This file is part of the GNU Binutils and GDB, the GNU debugger.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free Software Foundation, Inc.,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  *//* ??? Eventually more and more of this stuff can go to cpu-independent files.   Keep that in mind.  */#include "sysdep.h"#include <stdio.h>#include "ansidecl.h"#include "dis-asm.h"#include "bfd.h"#include "symcat.h"#include "fr30-desc.h"#include "fr30-opc.h"#include "opintl.h"/* Default text to print if an instruction isn't recognized.  */#define UNKNOWN_INSN_MSG _("*unknown*")static void print_normal     PARAMS ((CGEN_CPU_DESC, PTR, long, unsigned int, bfd_vma, int));static void print_address     PARAMS ((CGEN_CPU_DESC, PTR, bfd_vma, unsigned int, bfd_vma, int));static void print_keyword     PARAMS ((CGEN_CPU_DESC, PTR, CGEN_KEYWORD *, long, unsigned int));static void print_insn_normal     PARAMS ((CGEN_CPU_DESC, PTR, const CGEN_INSN *, CGEN_FIELDS *,	      bfd_vma, int));static int print_insn PARAMS ((CGEN_CPU_DESC, bfd_vma,			       disassemble_info *, char *, int));static int default_print_insn     PARAMS ((CGEN_CPU_DESC, bfd_vma, disassemble_info *));/* -- disassembler routines inserted here *//* -- dis.c */static voidprint_register_list (dis_info, value, offset, load_store)     PTR dis_info;     long value;     long offset;     int load_store; /* 0 == load, 1 == store */{  disassemble_info *info = dis_info;  int mask;  int index = 0;  char* comma = "";  if (load_store)    mask = 0x80;  else    mask = 1;  if (value & mask)    {      (*info->fprintf_func) (info->stream, "r%i", index + offset);      comma = ",";    }      for (index = 1; index <= 7; ++index)    {      if (load_store)	mask >>= 1;      else	mask <<= 1;      if (value & mask)	{	  (*info->fprintf_func) (info->stream, "%sr%i", comma, index + offset);	  comma = ",";	}    }}static voidprint_hi_register_list_ld (cd, dis_info, value, attrs, pc, length)     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;     PTR dis_info;     long value;     unsigned int attrs ATTRIBUTE_UNUSED;     bfd_vma pc ATTRIBUTE_UNUSED;     int length ATTRIBUTE_UNUSED;{  print_register_list (dis_info, value, 8, 0/*load*/);}static voidprint_low_register_list_ld (cd, dis_info, value, attrs, pc, length)     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;     PTR dis_info;     long value;     unsigned int attrs ATTRIBUTE_UNUSED;     bfd_vma pc ATTRIBUTE_UNUSED;     int length ATTRIBUTE_UNUSED;{  print_register_list (dis_info, value, 0, 0/*load*/);}static voidprint_hi_register_list_st (cd, dis_info, value, attrs, pc, length)     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;     PTR dis_info;     long value;     unsigned int attrs ATTRIBUTE_UNUSED;     bfd_vma pc ATTRIBUTE_UNUSED;     int length ATTRIBUTE_UNUSED;{  print_register_list (dis_info, value, 8, 1/*store*/);}static voidprint_low_register_list_st (cd, dis_info, value, attrs, pc, length)     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;     PTR dis_info;     long value;     unsigned int attrs ATTRIBUTE_UNUSED;     bfd_vma pc ATTRIBUTE_UNUSED;     int length ATTRIBUTE_UNUSED;{  print_register_list (dis_info, value, 0, 1/*store*/);}static voidprint_m4 (cd, dis_info, value, attrs, pc, length)     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;     PTR dis_info;     long value;     unsigned int attrs ATTRIBUTE_UNUSED;     bfd_vma pc ATTRIBUTE_UNUSED;     int length ATTRIBUTE_UNUSED;{  disassemble_info *info = (disassemble_info *) dis_info;  (*info->fprintf_func) (info->stream, "%ld", value);}/* -- *//* Main entry point for printing operands.   XINFO is a `void *' and not a `disassemble_info *' to not put a requirement   of dis-asm.h on cgen.h.   This function is basically just a big switch statement.  Earlier versions   used tables to look up the function to use, but   - if the table contains both assembler and disassembler functions then     the disassembler contains much of the assembler and vice-versa,   - there's a lot of inlining possibilities as things grow,   - using a switch statement avoids the function call overhead.   This function could be moved into `print_insn_normal', but keeping it   separate makes clear the interface between `print_insn_normal' and each of   the handlers.*/voidfr30_cgen_print_operand (cd, opindex, xinfo, fields, attrs, pc, length)     CGEN_CPU_DESC cd;     int opindex;     PTR xinfo;     CGEN_FIELDS *fields;     void const *attrs ATTRIBUTE_UNUSED;     bfd_vma pc;     int length;{ disassemble_info *info = (disassemble_info *) xinfo;  switch (opindex)    {    case FR30_OPERAND_CRI :      print_keyword (cd, info, & fr30_cgen_opval_cr_names, fields->f_CRi, 0);      break;    case FR30_OPERAND_CRJ :      print_keyword (cd, info, & fr30_cgen_opval_cr_names, fields->f_CRj, 0);      break;    case FR30_OPERAND_R13 :      print_keyword (cd, info, & fr30_cgen_opval_h_r13, 0, 0);      break;    case FR30_OPERAND_R14 :      print_keyword (cd, info, & fr30_cgen_opval_h_r14, 0, 0);      break;    case FR30_OPERAND_R15 :      print_keyword (cd, info, & fr30_cgen_opval_h_r15, 0, 0);      break;    case FR30_OPERAND_RI :      print_keyword (cd, info, & fr30_cgen_opval_gr_names, fields->f_Ri, 0);      break;    case FR30_OPERAND_RIC :      print_keyword (cd, info, & fr30_cgen_opval_gr_names, fields->f_Ric, 0);      break;    case FR30_OPERAND_RJ :      print_keyword (cd, info, & fr30_cgen_opval_gr_names, fields->f_Rj, 0);      break;    case FR30_OPERAND_RJC :      print_keyword (cd, info, & fr30_cgen_opval_gr_names, fields->f_Rjc, 0);      break;    case FR30_OPERAND_RS1 :      print_keyword (cd, info, & fr30_cgen_opval_dr_names, fields->f_Rs1, 0);      break;    case FR30_OPERAND_RS2 :      print_keyword (cd, info, & fr30_cgen_opval_dr_names, fields->f_Rs2, 0);      break;    case FR30_OPERAND_CC :      print_normal (cd, info, fields->f_cc, 0, pc, length);      break;    case FR30_OPERAND_CCC :      print_normal (cd, info, fields->f_ccc, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_DIR10 :      print_normal (cd, info, fields->f_dir10, 0, pc, length);      break;    case FR30_OPERAND_DIR8 :      print_normal (cd, info, fields->f_dir8, 0, pc, length);      break;    case FR30_OPERAND_DIR9 :      print_normal (cd, info, fields->f_dir9, 0, pc, length);      break;    case FR30_OPERAND_DISP10 :      print_normal (cd, info, fields->f_disp10, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_DISP8 :      print_normal (cd, info, fields->f_disp8, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_DISP9 :      print_normal (cd, info, fields->f_disp9, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_I20 :      print_normal (cd, info, fields->f_i20, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);      break;    case FR30_OPERAND_I32 :      print_normal (cd, info, fields->f_i32, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGN_OPT), pc, length);      break;    case FR30_OPERAND_I8 :      print_normal (cd, info, fields->f_i8, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_LABEL12 :      print_address (cd, info, fields->f_rel12, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);      break;    case FR30_OPERAND_LABEL9 :      print_address (cd, info, fields->f_rel9, 0|(1<<CGEN_OPERAND_PCREL_ADDR), pc, length);      break;    case FR30_OPERAND_M4 :      print_m4 (cd, info, fields->f_m4, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_PS :      print_keyword (cd, info, & fr30_cgen_opval_h_ps, 0, 0);      break;    case FR30_OPERAND_REGLIST_HI_LD :      print_hi_register_list_ld (cd, info, fields->f_reglist_hi_ld, 0, pc, length);      break;    case FR30_OPERAND_REGLIST_HI_ST :      print_hi_register_list_st (cd, info, fields->f_reglist_hi_st, 0, pc, length);      break;    case FR30_OPERAND_REGLIST_LOW_LD :      print_low_register_list_ld (cd, info, fields->f_reglist_low_ld, 0, pc, length);      break;    case FR30_OPERAND_REGLIST_LOW_ST :      print_low_register_list_st (cd, info, fields->f_reglist_low_st, 0, pc, length);      break;    case FR30_OPERAND_S10 :      print_normal (cd, info, fields->f_s10, 0|(1<<CGEN_OPERAND_SIGNED)|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_U10 :      print_normal (cd, info, fields->f_u10, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_U4 :      print_normal (cd, info, fields->f_u4, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_U4C :      print_normal (cd, info, fields->f_u4c, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_U8 :      print_normal (cd, info, fields->f_u8, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    case FR30_OPERAND_UDISP6 :      print_normal (cd, info, fields->f_udisp6, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);      break;    default :      /* xgettext:c-format */      fprintf (stderr, _("Unrecognized field %d while printing insn.\n"),	       opindex);    abort ();  }}cgen_print_fn * const fr30_cgen_print_handlers[] = {  print_insn_normal,};voidfr30_cgen_init_dis (cd)     CGEN_CPU_DESC cd;{  fr30_cgen_init_opcode_table (cd);  fr30_cgen_init_ibld_table (cd);  cd->print_handlers = & fr30_cgen_print_handlers[0];  cd->print_operand = fr30_cgen_print_operand;}/* Default print handler.  */static voidprint_normal (cd, dis_info, value, attrs, pc, length)#ifdef CGEN_PRINT_NORMAL     CGEN_CPU_DESC cd;#else     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;#endif     PTR dis_info;     long value;     unsigned int attrs;#ifdef CGEN_PRINT_NORMAL     bfd_vma pc;     int length;#else     bfd_vma pc ATTRIBUTE_UNUSED;     int length ATTRIBUTE_UNUSED;#endif{  disassemble_info *info = (disassemble_info *) dis_info;#ifdef CGEN_PRINT_NORMAL  CGEN_PRINT_NORMAL (cd, info, value, attrs, pc, length);#endif  /* Print the operand as directed by the attributes.  */

⌨️ 快捷键说明

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