/* This file is part of the program psim. Copyright 1994, 1995, 1996, 2003 Andrew Cagney This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, 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 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . */ /* # -- # # # Fields: # # 1 Instruction format as a `start-bit,content' pairs. # the content is one of a digit, field name or `/' (aka.0) # # 2 Format specifier # # 3 Flags: 64 - 64bit only # f - floating point enabled required # # 4 short name # # 5 Description # # # For flags marked 'model', the fields are interpreted as follows: # # 1 Not used # # 2 Not used # # 3 "macro" # # 4 String name for model # # 5 Specific CPU model, must be an identifier # # 6 Comma separated list of functional units */ /* Global constants */ enum { max_insn_bit_size = 32, }; typedef struct _insn_field insn_field; struct _insn_field { int first; int last; int width; int is_int; int is_slash; int is_string; int val_int; char *pos_string; char *val_string; insn_field *next; insn_field *prev; }; typedef struct _insn_fields insn_fields; struct _insn_fields { insn_field *bits[max_insn_bit_size]; insn_field *first; insn_field *last; unsigned value; }; /****************************************************************/ typedef struct _opcode_field opcode_field; struct _opcode_field { int first; int last; int is_boolean; unsigned boolean_constant; opcode_field *parent; }; /****************************************************************/ typedef struct _insn_bits insn_bits; struct _insn_bits { int is_expanded; int value; insn_field *field; opcode_field *opcode; insn_bits *last; }; /****************************************************************/ typedef enum { insn_format, insn_form, insn_flags, insn_mnemonic, insn_name, insn_comment, insn_field_6, insn_field_7, nr_insn_table_fields } insn_table_fields; typedef enum { function_type = insn_format, function_name = insn_name, function_param = insn_comment } function_table_fields; typedef enum { model_name = insn_mnemonic, model_identifer = insn_name, model_default = insn_comment, } model_table_fields; typedef enum { include_flags = insn_flags, include_path = insn_name, } model_include_fields; typedef enum { cache_type_def = insn_name, cache_derived_name = insn_comment, cache_name = insn_field_6, cache_expression = insn_field_7, } cache_fields; typedef struct _insn insn; struct _insn { table_entry *file_entry; insn_fields *fields; insn *next; }; typedef struct _insn_undef insn_undef; struct _insn_undef { insn_undef *next; char *name; }; typedef struct _model model; struct _model { model *next; char *name; char *printable_name; char *insn_default; table_model_entry *func_unit_start; table_model_entry *func_unit_end; }; typedef struct _insn_table insn_table; struct _insn_table { int opcode_nr; insn_bits *expanded_bits; int nr_insn; insn *insns; insn *functions; insn *last_function; decode_table *opcode_rule; opcode_field *opcode; int nr_entries; insn_table *entries; insn_table *sibling; insn_table *parent; }; typedef enum { insn_model_name, insn_model_fields, nr_insn_model_table_fields } insn_model_table_fields; extern insn_table *load_insn_table (const char *file_name, decode_table *decode_rules, filter *filters, table_include *includes, cache_table **cache_rules); extern model *models; extern insn *model_macros; extern insn *model_functions; extern insn *model_internal; extern insn *model_static; extern insn *model_data; extern int max_model_fields_len; extern void insn_table_insert_insn (insn_table *table, table_entry *file_entry, insn_fields *fields); /****************************************************************/ /****************************************************************/ typedef void leaf_handler (insn_table *entry, lf *file, void *data, int depth); typedef void insn_handler (insn_table *table, lf *file, void *data, insn *instruction, int depth); typedef void padding_handler (insn_table *table, lf *file, void *data, int depth, int opcode_nr); extern void insn_table_traverse_tree (insn_table *table, lf *file, void *data, int depth, leaf_handler *start, insn_handler *handler, leaf_handler *end, padding_handler *padding); extern void insn_table_traverse_insn (insn_table *table, lf *file, void *data, insn_handler *handler); /****************************************************************/ typedef void function_handler (insn_table *table, lf *file, void *data, table_entry *function); extern void insn_table_traverse_function (insn_table *table, lf *file, void *data, function_handler *leaf); /****************************************************************/ extern void insn_table_expand_insns (insn_table *table); extern int insn_table_depth (insn_table *table);