📄 fr30-dis.c
字号:
/* 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 + -