16ca2c52aSchristos /* The IGEN simulator generator for GDB, the GNU Debugger.
26ca2c52aSchristos 
3*184b2d41Schristos    Copyright 2002-2020 Free Software Foundation, Inc.
46ca2c52aSchristos 
56ca2c52aSchristos    Contributed by Andrew Cagney.
66ca2c52aSchristos 
76ca2c52aSchristos    This file is part of GDB.
86ca2c52aSchristos 
96ca2c52aSchristos    This program is free software; you can redistribute it and/or modify
106ca2c52aSchristos    it under the terms of the GNU General Public License as published by
116ca2c52aSchristos    the Free Software Foundation; either version 3 of the License, or
126ca2c52aSchristos    (at your option) any later version.
136ca2c52aSchristos 
146ca2c52aSchristos    This program is distributed in the hope that it will be useful,
156ca2c52aSchristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
166ca2c52aSchristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
176ca2c52aSchristos    GNU General Public License for more details.
186ca2c52aSchristos 
196ca2c52aSchristos    You should have received a copy of the GNU General Public License
206ca2c52aSchristos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
216ca2c52aSchristos 
226ca2c52aSchristos 
236ca2c52aSchristos 
246ca2c52aSchristos typedef unsigned64 insn_uint;
256ca2c52aSchristos 
266ca2c52aSchristos 
276ca2c52aSchristos /* Common among most entries:
286ca2c52aSchristos 
296ca2c52aSchristos    All non instruction records have the format:
306ca2c52aSchristos 
316ca2c52aSchristos    <...> ::=
326ca2c52aSchristos        ":" <record-name>
336ca2c52aSchristos        ":" <filter-flags>
346ca2c52aSchristos        ":" <filter-models>
356ca2c52aSchristos        ":" ...
366ca2c52aSchristos 
376ca2c52aSchristos  */
386ca2c52aSchristos 
396ca2c52aSchristos enum
406ca2c52aSchristos {
416ca2c52aSchristos   record_type_field = 1,
426ca2c52aSchristos   old_record_type_field = 2,
436ca2c52aSchristos   record_filter_flags_field = 2,
446ca2c52aSchristos   record_filter_models_field = 3,
456ca2c52aSchristos };
466ca2c52aSchristos 
476ca2c52aSchristos 
486ca2c52aSchristos /* Include:
496ca2c52aSchristos 
506ca2c52aSchristos    Include the specified file.
516ca2c52aSchristos 
526ca2c52aSchristos    <include> ::=
536ca2c52aSchristos        ":" "include"
546ca2c52aSchristos        ":" <filter-flags>
556ca2c52aSchristos        ":" <filter-models>
566ca2c52aSchristos        ":" <filename>
576ca2c52aSchristos        <nl>
586ca2c52aSchristos        ;
596ca2c52aSchristos 
606ca2c52aSchristos    */
616ca2c52aSchristos 
626ca2c52aSchristos enum
636ca2c52aSchristos {
646ca2c52aSchristos   include_filename_field = 4,
656ca2c52aSchristos   nr_include_fields,
666ca2c52aSchristos };
676ca2c52aSchristos 
686ca2c52aSchristos 
696ca2c52aSchristos 
706ca2c52aSchristos /* Options:
716ca2c52aSchristos 
726ca2c52aSchristos    Valid options are: hi-bit-nr (default 0), insn-bit-size (default
736ca2c52aSchristos    32), insn-specifying-widths (default true), multi-sim (default false).
746ca2c52aSchristos 
756ca2c52aSchristos    <option> ::=
766ca2c52aSchristos        ":" "option"
776ca2c52aSchristos        ":" <filter-flags>
786ca2c52aSchristos        ":" <filter-models>
796ca2c52aSchristos        ":" <option-name>
806ca2c52aSchristos        ":" <option-value>
816ca2c52aSchristos        <nl>
826ca2c52aSchristos        ;
836ca2c52aSchristos 
846ca2c52aSchristos    <option-name> ::=
856ca2c52aSchristos        "insn-bit-size"
866ca2c52aSchristos        | "insn-specifying-widths"
876ca2c52aSchristos        | "hi-bit-nr"
886ca2c52aSchristos        | "flags-filter"
896ca2c52aSchristos        | "model-filter"
906ca2c52aSchristos        | "multi-sim"
916ca2c52aSchristos        | "format-names"
926ca2c52aSchristos        ;
936ca2c52aSchristos 
946ca2c52aSchristos    <option-value> ::=
956ca2c52aSchristos        "true"
966ca2c52aSchristos        | "false"
976ca2c52aSchristos        | <integer>
986ca2c52aSchristos        | <list>
996ca2c52aSchristos        ;
1006ca2c52aSchristos 
1016ca2c52aSchristos 
1026ca2c52aSchristos    These update the global options structure. */
1036ca2c52aSchristos 
1046ca2c52aSchristos 
1056ca2c52aSchristos enum
1066ca2c52aSchristos {
1076ca2c52aSchristos   option_name_field = 4,
1086ca2c52aSchristos   option_value_field,
1096ca2c52aSchristos   nr_option_fields,
1106ca2c52aSchristos };
1116ca2c52aSchristos 
1126ca2c52aSchristos 
1136ca2c52aSchristos 
1146ca2c52aSchristos /* Macro definitions:
1156ca2c52aSchristos 
1166ca2c52aSchristos    <insn-macro> ::=
1176ca2c52aSchristos        ":" "define"
1186ca2c52aSchristos        ":" <filter-flags>
1196ca2c52aSchristos        ":" <filter-models>
1206ca2c52aSchristos        ":" <name>
1216ca2c52aSchristos        ":" <arg-list>
1226ca2c52aSchristos        ":" <expression>
1236ca2c52aSchristos        <nl>
1246ca2c52aSchristos        ;
1256ca2c52aSchristos 
1266ca2c52aSchristos    <arg-list> ::=
1276ca2c52aSchristos        [ <name> { "," <arg-list> } ]
1286ca2c52aSchristos        ;
1296ca2c52aSchristos 
1306ca2c52aSchristos    */
1316ca2c52aSchristos 
1326ca2c52aSchristos 
1336ca2c52aSchristos enum
1346ca2c52aSchristos {
1356ca2c52aSchristos   macro_name_field = 4,
1366ca2c52aSchristos   macro_args_field,
1376ca2c52aSchristos   macro_expr_field,
1386ca2c52aSchristos   nr_macro_fields,
1396ca2c52aSchristos };
1406ca2c52aSchristos 
1416ca2c52aSchristos 
1426ca2c52aSchristos 
1436ca2c52aSchristos /* Functions and internal routins:
1446ca2c52aSchristos 
1456ca2c52aSchristos    NB: <filter-models> and <function-models> are equivalent.
1466ca2c52aSchristos 
1476ca2c52aSchristos 
1486ca2c52aSchristos    <function> ::=
1496ca2c52aSchristos        ":" "function"
1506ca2c52aSchristos        <function-spec>
1516ca2c52aSchristos        ;
1526ca2c52aSchristos 
1536ca2c52aSchristos    <internal> ::=
1546ca2c52aSchristos        ":" "internal"
1556ca2c52aSchristos        <function-spec>
1566ca2c52aSchristos        ;
1576ca2c52aSchristos 
1586ca2c52aSchristos    <format> ::=
1596ca2c52aSchristos        ":" ( "%s" | ... )
1606ca2c52aSchristos        <function-spec>
1616ca2c52aSchristos        ;
1626ca2c52aSchristos 
1636ca2c52aSchristos    <function-model> ::=
1646ca2c52aSchristos        "*" [ <processor-list> ]
1656ca2c52aSchristos        ":"
1666ca2c52aSchristos        <nl>
1676ca2c52aSchristos        ;
1686ca2c52aSchristos 
1696ca2c52aSchristos    <function-spec> ::=
1706ca2c52aSchristos        ":" <filter-flags>
1716ca2c52aSchristos        ":" <filter-models>
1726ca2c52aSchristos        ":" <typedef>
1736ca2c52aSchristos        ":" <name>
1746ca2c52aSchristos        [ ":" <parameter-list> ]
1756ca2c52aSchristos        <nl>
1766ca2c52aSchristos        [ <function-model> ]
1776ca2c52aSchristos        <code-block>
1786ca2c52aSchristos        ;
1796ca2c52aSchristos 
1806ca2c52aSchristos    */
1816ca2c52aSchristos 
1826ca2c52aSchristos enum
1836ca2c52aSchristos {
1846ca2c52aSchristos   function_typedef_field = 4,
1856ca2c52aSchristos   function_name_field,
1866ca2c52aSchristos   function_param_field,
1876ca2c52aSchristos   nr_function_fields,
1886ca2c52aSchristos };
1896ca2c52aSchristos 
1906ca2c52aSchristos enum
1916ca2c52aSchristos {
1926ca2c52aSchristos   function_model_name_field = 0,
1936ca2c52aSchristos   nr_function_model_fields = 1,
1946ca2c52aSchristos };
1956ca2c52aSchristos 
1966ca2c52aSchristos enum
1976ca2c52aSchristos {
1986ca2c52aSchristos   old_function_typedef_field = 0,
1996ca2c52aSchristos   old_function_type_field = 2,
2006ca2c52aSchristos   old_function_name_field = 4,
2016ca2c52aSchristos   old_function_param_field = 5,
2026ca2c52aSchristos   nr_old_function_fields = 5,	/* parameter-list is optional */
2036ca2c52aSchristos };
2046ca2c52aSchristos 
2056ca2c52aSchristos 
2066ca2c52aSchristos typedef struct _function_entry function_entry;
2076ca2c52aSchristos struct _function_entry
2086ca2c52aSchristos {
2096ca2c52aSchristos   line_ref *line;
2106ca2c52aSchristos   filter *flags;
2116ca2c52aSchristos   filter *models;
2126ca2c52aSchristos   char *type;
2136ca2c52aSchristos   char *name;
2146ca2c52aSchristos   char *param;
2156ca2c52aSchristos   table_entry *code;
2166ca2c52aSchristos   int is_internal;
2176ca2c52aSchristos   function_entry *next;
2186ca2c52aSchristos };
2196ca2c52aSchristos 
2206ca2c52aSchristos 
2216ca2c52aSchristos typedef void function_entry_handler
2226ca2c52aSchristos   (lf *file, function_entry * function, void *data);
2236ca2c52aSchristos 
2246ca2c52aSchristos extern void function_entry_traverse
2256ca2c52aSchristos   (lf *file,
2266ca2c52aSchristos    function_entry * functions, function_entry_handler * handler, void *data);
2276ca2c52aSchristos 
2286ca2c52aSchristos 
2296ca2c52aSchristos /* cache-macro:
2306ca2c52aSchristos 
2316ca2c52aSchristos    <cache-macro> ::=
2326ca2c52aSchristos        ":" <macro-type>
2336ca2c52aSchristos        ":" <filter-flags>
2346ca2c52aSchristos        ":" <filter-models>
2356ca2c52aSchristos        ":" <typedef>
2366ca2c52aSchristos        ":" <name>
2376ca2c52aSchristos        ":" <field-name> { "," <field-name> }
2386ca2c52aSchristos        ":" <expression>
2396ca2c52aSchristos        <nl>
2406ca2c52aSchristos        ;
2416ca2c52aSchristos 
2426ca2c52aSchristos    <cache-macro-type> ::=
2436ca2c52aSchristos        "scratch"
2446ca2c52aSchristos        | "cache"
2456ca2c52aSchristos        | "compute"
2466ca2c52aSchristos        ;
2476ca2c52aSchristos 
2486ca2c52aSchristos    <name> ::=
2496ca2c52aSchristos        <ident>
2506ca2c52aSchristos        | <ident> "_is_" <integer>
2516ca2c52aSchristos        ;
2526ca2c52aSchristos 
2536ca2c52aSchristos    A cache entry is defined (for an instruction) when all
2546ca2c52aSchristos    <field-name>s are present as named opcode fields within the
2556ca2c52aSchristos    instructions format.
2566ca2c52aSchristos 
2576ca2c52aSchristos    SCRATCH and CACHE macros are defined during the cache fill stage
2586ca2c52aSchristos    while CACHE and COMPUTE macros are defined during the instruction
2596ca2c52aSchristos    execution stage.
2606ca2c52aSchristos 
2616ca2c52aSchristos    */
2626ca2c52aSchristos 
2636ca2c52aSchristos enum
2646ca2c52aSchristos {
2656ca2c52aSchristos   cache_typedef_field = 4,
2666ca2c52aSchristos   cache_name_field,
2676ca2c52aSchristos   cache_original_fields_field,
2686ca2c52aSchristos   cache_expression_field,
2696ca2c52aSchristos   nr_cache_fields,
2706ca2c52aSchristos };
2716ca2c52aSchristos 
2726ca2c52aSchristos typedef enum
2736ca2c52aSchristos {
2746ca2c52aSchristos   scratch_value,
2756ca2c52aSchristos   cache_value,
2766ca2c52aSchristos   compute_value,
2776ca2c52aSchristos }
2786ca2c52aSchristos cache_entry_type;
2796ca2c52aSchristos 
2806ca2c52aSchristos typedef struct _cache_entry cache_entry;
2816ca2c52aSchristos struct _cache_entry
2826ca2c52aSchristos {
2836ca2c52aSchristos   line_ref *line;
2846ca2c52aSchristos   filter *flags;
2856ca2c52aSchristos   filter *models;
2866ca2c52aSchristos   cache_entry_type entry_type;
2876ca2c52aSchristos   char *name;
2886ca2c52aSchristos   filter *original_fields;
2896ca2c52aSchristos   char *type;
2906ca2c52aSchristos   char *expression;
2916ca2c52aSchristos   cache_entry *next;
2926ca2c52aSchristos };
2936ca2c52aSchristos 
2946ca2c52aSchristos 
2956ca2c52aSchristos 
2966ca2c52aSchristos /* Model specs:
2976ca2c52aSchristos 
2986ca2c52aSchristos    <model-processor> ::=
2996ca2c52aSchristos        ":" "model"
3006ca2c52aSchristos        ":" <filter-flags>
3016ca2c52aSchristos        ":" <filter-models>
3026ca2c52aSchristos        ":" <processor>
3036ca2c52aSchristos        ":" <BFD-processor>
3046ca2c52aSchristos        ":" <function-unit-data>
3056ca2c52aSchristos        <nl>
3066ca2c52aSchristos        ;
3076ca2c52aSchristos 
3086ca2c52aSchristos    <model-macro> ::=
3096ca2c52aSchristos        ":" "model-macro"
3106ca2c52aSchristos        ":" <filter-flags>
3116ca2c52aSchristos        ":" <filter-models>
3126ca2c52aSchristos        <nl>
3136ca2c52aSchristos        <code-block>
3146ca2c52aSchristos        ;
3156ca2c52aSchristos 
3166ca2c52aSchristos    <model-data> ::=
3176ca2c52aSchristos        ":" "model-data"
3186ca2c52aSchristos        ":" <filter-flags>
3196ca2c52aSchristos        ":" <filter-models>
3206ca2c52aSchristos        <nl>
3216ca2c52aSchristos        <code-block>
3226ca2c52aSchristos        ;
3236ca2c52aSchristos 
3246ca2c52aSchristos    <model-static> ::=
3256ca2c52aSchristos        ":" "model-static"
3266ca2c52aSchristos        <function-spec>
3276ca2c52aSchristos        ;
3286ca2c52aSchristos 
3296ca2c52aSchristos    <model-internal> ::=
3306ca2c52aSchristos        ":" "model-internal"
3316ca2c52aSchristos        <function-spec>
3326ca2c52aSchristos        ;
3336ca2c52aSchristos 
3346ca2c52aSchristos    <model-function> ::=
3356ca2c52aSchristos        ":" "model-internal"
3366ca2c52aSchristos        <function-spec>
3376ca2c52aSchristos        ;
3386ca2c52aSchristos 
3396ca2c52aSchristos  */
3406ca2c52aSchristos 
3416ca2c52aSchristos enum
3426ca2c52aSchristos {
3436ca2c52aSchristos   nr_model_macro_fields = 4,
3446ca2c52aSchristos   nr_model_data_fields = 4,
3456ca2c52aSchristos   nr_model_static_fields = nr_function_fields,
3466ca2c52aSchristos   nr_model_internal_fields = nr_function_fields,
3476ca2c52aSchristos   nr_model_function_fields = nr_function_fields,
3486ca2c52aSchristos };
3496ca2c52aSchristos 
3506ca2c52aSchristos typedef struct _model_data model_data;
3516ca2c52aSchristos struct _model_data
3526ca2c52aSchristos {
3536ca2c52aSchristos   line_ref *line;
3546ca2c52aSchristos   filter *flags;
3556ca2c52aSchristos   table_entry *entry;
3566ca2c52aSchristos   table_entry *code;
3576ca2c52aSchristos   model_data *next;
3586ca2c52aSchristos };
3596ca2c52aSchristos 
3606ca2c52aSchristos enum
3616ca2c52aSchristos {
3626ca2c52aSchristos   model_name_field = 4,
3636ca2c52aSchristos   model_full_name_field,
3646ca2c52aSchristos   model_unit_data_field,
3656ca2c52aSchristos   nr_model_processor_fields,
3666ca2c52aSchristos };
3676ca2c52aSchristos 
3686ca2c52aSchristos typedef struct _model_entry model_entry;
3696ca2c52aSchristos struct _model_entry
3706ca2c52aSchristos {
3716ca2c52aSchristos   line_ref *line;
3726ca2c52aSchristos   filter *flags;
3736ca2c52aSchristos   char *name;
3746ca2c52aSchristos   char *full_name;
3756ca2c52aSchristos   char *unit_data;
3766ca2c52aSchristos   model_entry *next;
3776ca2c52aSchristos };
3786ca2c52aSchristos 
3796ca2c52aSchristos 
3806ca2c52aSchristos typedef struct _model_table model_table;
3816ca2c52aSchristos struct _model_table
3826ca2c52aSchristos {
3836ca2c52aSchristos   filter *processors;
3846ca2c52aSchristos   int nr_models;
3856ca2c52aSchristos   model_entry *models;
3866ca2c52aSchristos   model_data *macros;
3876ca2c52aSchristos   model_data *data;
3886ca2c52aSchristos   function_entry *statics;
3896ca2c52aSchristos   function_entry *internals;
3906ca2c52aSchristos   function_entry *functions;
3916ca2c52aSchristos };
3926ca2c52aSchristos 
3936ca2c52aSchristos 
3946ca2c52aSchristos 
3956ca2c52aSchristos /* Instruction format:
3966ca2c52aSchristos 
3976ca2c52aSchristos    An instruction is composed of a sequence of N bit instruction
3986ca2c52aSchristos    words.  Each word broken into a number of instruction fields.
3996ca2c52aSchristos    Those fields being constant (ex. an opcode) or variable (register
4006ca2c52aSchristos    spec).
4016ca2c52aSchristos 
4026ca2c52aSchristos    <insn-word> ::=
4036ca2c52aSchristos        <insn-field> { "," <insn-field> } ;
4046ca2c52aSchristos 
4056ca2c52aSchristos    <insn-field> ::=
4066ca2c52aSchristos        ( <binary-value-implying-width>
4076ca2c52aSchristos        | <field-name-implying-width>
4086ca2c52aSchristos        | [ <start-or-width> "." ] <field>
4096ca2c52aSchristos        )
4106ca2c52aSchristos        { [ "!" | "=" ] [ <value> | <field-name> ] }
4116ca2c52aSchristos        ;
4126ca2c52aSchristos 
4136ca2c52aSchristos    <field> ::=
4146ca2c52aSchristos          { "*" }+
4156ca2c52aSchristos        | { "/" }+
4166ca2c52aSchristos        | <field-name>
4176ca2c52aSchristos        | "0x" <hex-value>
4186ca2c52aSchristos        | "0b" <binary-value>
4196ca2c52aSchristos        | "0" <octal-value>
4206ca2c52aSchristos        | <integer-value> ;
4216ca2c52aSchristos 
4226ca2c52aSchristos */
4236ca2c52aSchristos 
4246ca2c52aSchristos typedef enum _insn_field_cond_type
4256ca2c52aSchristos {
4266ca2c52aSchristos   insn_field_cond_value,
4276ca2c52aSchristos   insn_field_cond_field,
4286ca2c52aSchristos }
4296ca2c52aSchristos insn_field_cond_type;
4306ca2c52aSchristos typedef enum _insn_field_cond_test
4316ca2c52aSchristos {
4326ca2c52aSchristos   insn_field_cond_eq,
4336ca2c52aSchristos   insn_field_cond_ne,
4346ca2c52aSchristos }
4356ca2c52aSchristos insn_field_cond_test;
4366ca2c52aSchristos typedef struct _insn_field_cond insn_field_cond;
4376ca2c52aSchristos struct _insn_field_cond
4386ca2c52aSchristos {
4396ca2c52aSchristos   insn_field_cond_type type;
4406ca2c52aSchristos   insn_field_cond_test test;
4416ca2c52aSchristos   insn_uint value;
4426ca2c52aSchristos   struct _insn_field_entry *field;
4436ca2c52aSchristos   char *string;
4446ca2c52aSchristos   insn_field_cond *next;
4456ca2c52aSchristos };
4466ca2c52aSchristos 
4476ca2c52aSchristos 
4486ca2c52aSchristos typedef enum _insn_field_type
4496ca2c52aSchristos {
4506ca2c52aSchristos   insn_field_invalid,
4516ca2c52aSchristos   insn_field_int,
4526ca2c52aSchristos   insn_field_reserved,
4536ca2c52aSchristos   insn_field_wild,
4546ca2c52aSchristos   insn_field_string,
4556ca2c52aSchristos }
4566ca2c52aSchristos insn_field_type;
4576ca2c52aSchristos 
4586ca2c52aSchristos typedef struct _insn_field_entry insn_field_entry;
4596ca2c52aSchristos struct _insn_field_entry
4606ca2c52aSchristos {
4616ca2c52aSchristos   int first;
4626ca2c52aSchristos   int last;
4636ca2c52aSchristos   int width;
4646ca2c52aSchristos   int word_nr;
4656ca2c52aSchristos   insn_field_type type;
4666ca2c52aSchristos   insn_uint val_int;
4676ca2c52aSchristos   char *pos_string;
4686ca2c52aSchristos   char *val_string;
4696ca2c52aSchristos   insn_field_cond *conditions;
4706ca2c52aSchristos   insn_field_entry *next;
4716ca2c52aSchristos   insn_field_entry *prev;
4726ca2c52aSchristos };
4736ca2c52aSchristos 
4746ca2c52aSchristos typedef struct _insn_bit_entry insn_bit_entry;
4756ca2c52aSchristos struct _insn_bit_entry
4766ca2c52aSchristos {
4776ca2c52aSchristos   int value;
4786ca2c52aSchristos   int mask;
4796ca2c52aSchristos   insn_field_entry *field;
4806ca2c52aSchristos };
4816ca2c52aSchristos 
4826ca2c52aSchristos 
4836ca2c52aSchristos 
4846ca2c52aSchristos 
4856ca2c52aSchristos typedef struct _insn_entry insn_entry;	/* forward */
4866ca2c52aSchristos 
4876ca2c52aSchristos typedef struct _insn_word_entry insn_word_entry;
4886ca2c52aSchristos struct _insn_word_entry
4896ca2c52aSchristos {
4906ca2c52aSchristos   /* list of sub-fields making up the instruction.  bit provides
4916ca2c52aSchristos      faster access to the field data for bit N.  */
4926ca2c52aSchristos   insn_field_entry *first;
4936ca2c52aSchristos   insn_field_entry *last;
4946ca2c52aSchristos   insn_bit_entry *bit[max_insn_bit_size];
4956ca2c52aSchristos   /* set of all the string fields */
4966ca2c52aSchristos   filter *field_names;
4976ca2c52aSchristos   /* For multi-word instructions, The Nth word (from zero). */
4986ca2c52aSchristos   insn_word_entry *next;
4996ca2c52aSchristos };
5006ca2c52aSchristos 
5016ca2c52aSchristos 
5026ca2c52aSchristos 
5036ca2c52aSchristos /* Instruction model:
5046ca2c52aSchristos 
5056ca2c52aSchristos    Provides scheduling and other data for the code modeling the
5066ca2c52aSchristos    instruction unit.
5076ca2c52aSchristos 
5086ca2c52aSchristos    <insn-model> ::=
5096ca2c52aSchristos        "*" [ <processor-list> ]
5106ca2c52aSchristos        ":" [ <function-unit-data> ]
5116ca2c52aSchristos        <nl>
5126ca2c52aSchristos        ;
5136ca2c52aSchristos 
5146ca2c52aSchristos    <processor-list> ::=
5156ca2c52aSchristos        <processor> { "," <processor>" }
5166ca2c52aSchristos        ;
5176ca2c52aSchristos 
5186ca2c52aSchristos    If the <processor-list> is empty, the model is made the default for
5196ca2c52aSchristos    this instruction.
5206ca2c52aSchristos 
5216ca2c52aSchristos    */
5226ca2c52aSchristos 
5236ca2c52aSchristos enum
5246ca2c52aSchristos {
5256ca2c52aSchristos   insn_model_name_field = 0,
5266ca2c52aSchristos   insn_model_unit_data_field = 1,
5276ca2c52aSchristos   nr_insn_model_fields = 1,
5286ca2c52aSchristos };
5296ca2c52aSchristos 
5306ca2c52aSchristos typedef struct _insn_model_entry insn_model_entry;
5316ca2c52aSchristos struct _insn_model_entry
5326ca2c52aSchristos {
5336ca2c52aSchristos   line_ref *line;
5346ca2c52aSchristos   insn_entry *insn;
5356ca2c52aSchristos   filter *names;
5366ca2c52aSchristos   char *full_name;
5376ca2c52aSchristos   char *unit_data;
5386ca2c52aSchristos   insn_model_entry *next;
5396ca2c52aSchristos };
5406ca2c52aSchristos 
5416ca2c52aSchristos 
5426ca2c52aSchristos 
5436ca2c52aSchristos /* Instruction mnemonic:
5446ca2c52aSchristos 
5456ca2c52aSchristos    List of assembler mnemonics for the instruction.
5466ca2c52aSchristos 
5476ca2c52aSchristos    <insn-mnenonic> ::=
5486ca2c52aSchristos        "\"" <assembler-mnemonic> "\""
5496ca2c52aSchristos        [ ":" <conditional-expression> ]
5506ca2c52aSchristos        <nl>
5516ca2c52aSchristos        ;
5526ca2c52aSchristos 
5536ca2c52aSchristos    An assembler mnemonic string has the syntax:
5546ca2c52aSchristos 
5556ca2c52aSchristos    <assembler-mnemonic>  ::=
5566ca2c52aSchristos        ( [ "%" <format-spec> ] "<" <func> [ "#" <param-list> ] ">"
5576ca2c52aSchristos        | "%%"
5586ca2c52aSchristos        | <other-letter>
5596ca2c52aSchristos        )+
5606ca2c52aSchristos 
5616ca2c52aSchristos     Where, for instance, the text is translated into a printf format
5626ca2c52aSchristos     and argument pair:
5636ca2c52aSchristos 
5646ca2c52aSchristos        "<FUNC>"         : "%ld", (long) FUNC
5656ca2c52aSchristos        "%<FUNC>..."     : "%...", FUNC
5666ca2c52aSchristos        "%s<FUNC>"       : "%s", <%s>FUNC (SD_, FUNC)
5676ca2c52aSchristos        "%s<FUNC#P1,P2>" : "%s", <%s>FUNC (SD_, P1,P2)
5686ca2c52aSchristos        "%lx<FUNC>"      : "%lx", (unsigned long) FUNC
5696ca2c52aSchristos        "%08lx<FUNC>"    : "%08lx", (unsigned long) FUNC
5706ca2c52aSchristos 
5716ca2c52aSchristos     And "<%s>FUNC" denotes a function declared using the "%s" record
5726ca2c52aSchristos     specifier.
5736ca2c52aSchristos 
5746ca2c52aSchristos 
5756ca2c52aSchristos 
5766ca2c52aSchristos        ;
5776ca2c52aSchristos 
5786ca2c52aSchristos    */
5796ca2c52aSchristos 
5806ca2c52aSchristos enum
5816ca2c52aSchristos {
5826ca2c52aSchristos   insn_mnemonic_format_field = 0,
5836ca2c52aSchristos   insn_mnemonic_condition_field = 1,
5846ca2c52aSchristos   nr_insn_mnemonic_fields = 1,
5856ca2c52aSchristos };
5866ca2c52aSchristos 
5876ca2c52aSchristos typedef struct _insn_mnemonic_entry insn_mnemonic_entry;
5886ca2c52aSchristos struct _insn_mnemonic_entry
5896ca2c52aSchristos {
5906ca2c52aSchristos   line_ref *line;
5916ca2c52aSchristos   insn_entry *insn;
5926ca2c52aSchristos   char *format;
5936ca2c52aSchristos   char *condition;
5946ca2c52aSchristos   insn_mnemonic_entry *next;
5956ca2c52aSchristos };
5966ca2c52aSchristos 
5976ca2c52aSchristos 
5986ca2c52aSchristos 
5996ca2c52aSchristos /* Instruction:
6006ca2c52aSchristos 
6016ca2c52aSchristos    <insn> ::=
6026ca2c52aSchristos        <insn-word> { "+" <insn-word> }
6036ca2c52aSchristos        ":" <format-name>
6046ca2c52aSchristos        ":" <filter-flags>
6056ca2c52aSchristos        ":" <options>
6066ca2c52aSchristos        ":" <name>
6076ca2c52aSchristos        <nl>
6086ca2c52aSchristos        { <insn-model> }
6096ca2c52aSchristos        { <insn-mnemonic> }
6106ca2c52aSchristos        <code-block>
6116ca2c52aSchristos 
6126ca2c52aSchristos  */
6136ca2c52aSchristos 
6146ca2c52aSchristos enum
6156ca2c52aSchristos {
6166ca2c52aSchristos   insn_word_field = 0,
6176ca2c52aSchristos   insn_format_name_field = 1,
6186ca2c52aSchristos   insn_filter_flags_field = 2,
6196ca2c52aSchristos   insn_options_field = 3,
6206ca2c52aSchristos   insn_name_field = 4,
6216ca2c52aSchristos   nr_insn_fields = 5,
6226ca2c52aSchristos };
6236ca2c52aSchristos 
6246ca2c52aSchristos 
6256ca2c52aSchristos /* typedef struct _insn_entry insn_entry; */
6266ca2c52aSchristos struct _insn_entry
6276ca2c52aSchristos {
6286ca2c52aSchristos   line_ref *line;
6296ca2c52aSchristos   filter *flags;		/* filtered by options.filters */
6306ca2c52aSchristos   char *format_name;
6316ca2c52aSchristos   filter *options;
6326ca2c52aSchristos   char *name;
6336ca2c52aSchristos   /* the words that make up the instruction. Word provides direct
6346ca2c52aSchristos      access to word N. Pseudo instructions can be identified by
6356ca2c52aSchristos      nr_words == 0. */
6366ca2c52aSchristos   int nr_words;
6376ca2c52aSchristos   insn_word_entry *words;
6386ca2c52aSchristos   insn_word_entry **word;
6396ca2c52aSchristos   /* a set of all the fields from all the words */
6406ca2c52aSchristos   filter *field_names;
6416ca2c52aSchristos   /* an array of processor models, missing models are NULL! */
6426ca2c52aSchristos   int nr_models;
6436ca2c52aSchristos   insn_model_entry *models;
6446ca2c52aSchristos   insn_model_entry **model;
6456ca2c52aSchristos   filter *processors;
6466ca2c52aSchristos   /* list of assember formats */
6476ca2c52aSchristos   int nr_mnemonics;
6486ca2c52aSchristos   insn_mnemonic_entry *mnemonics;
6496ca2c52aSchristos   /* code body */
6506ca2c52aSchristos   table_entry *code;
6516ca2c52aSchristos   insn_entry *next;
6526ca2c52aSchristos };
6536ca2c52aSchristos 
6546ca2c52aSchristos 
6556ca2c52aSchristos /* Instruction table:
6566ca2c52aSchristos 
6576ca2c52aSchristos  */
6586ca2c52aSchristos 
6596ca2c52aSchristos typedef struct _insn_table insn_table;
6606ca2c52aSchristos struct _insn_table
6616ca2c52aSchristos {
6626ca2c52aSchristos   cache_entry *caches;
6636ca2c52aSchristos   int max_nr_words;
6646ca2c52aSchristos   int nr_insns;
6656ca2c52aSchristos   insn_entry *insns;
6666ca2c52aSchristos   function_entry *functions;
6676ca2c52aSchristos   insn_entry *illegal_insn;
6686ca2c52aSchristos   model_table *model;
6696ca2c52aSchristos   filter *options;
6706ca2c52aSchristos   filter *flags;
6716ca2c52aSchristos };
6726ca2c52aSchristos 
6736ca2c52aSchristos extern insn_table *load_insn_table (char *file_name, cache_entry *cache);
6746ca2c52aSchristos 
6756ca2c52aSchristos typedef void insn_entry_handler
6766ca2c52aSchristos   (lf *file, insn_table *isa, insn_entry * insn, void *data);
6776ca2c52aSchristos 
6786ca2c52aSchristos extern void insn_table_traverse_insn
6796ca2c52aSchristos   (lf *file, insn_table *isa, insn_entry_handler * handler, void *data);
6806ca2c52aSchristos 
6816ca2c52aSchristos 
6826ca2c52aSchristos 
6836ca2c52aSchristos /* Printing */
6846ca2c52aSchristos 
6856ca2c52aSchristos extern void print_insn_words (lf *file, insn_entry * insn);
6866ca2c52aSchristos 
6876ca2c52aSchristos 
6886ca2c52aSchristos 
6896ca2c52aSchristos /* Debugging */
6906ca2c52aSchristos 
6916ca2c52aSchristos void
6926ca2c52aSchristos   dump_insn_field
6936ca2c52aSchristos   (lf *file, char *prefix, insn_field_entry *field, char *suffix);
6946ca2c52aSchristos 
6956ca2c52aSchristos void
6966ca2c52aSchristos   dump_insn_word_entry
6976ca2c52aSchristos   (lf *file, char *prefix, insn_word_entry *word, char *suffix);
6986ca2c52aSchristos 
6996ca2c52aSchristos void
7006ca2c52aSchristos   dump_insn_entry (lf *file, char *prefix, insn_entry * insn, char *suffix);
7016ca2c52aSchristos 
7026ca2c52aSchristos void
7036ca2c52aSchristos   dump_cache_entries
7046ca2c52aSchristos   (lf *file, char *prefix, cache_entry *entry, char *suffix);
7056ca2c52aSchristos 
7066ca2c52aSchristos void dump_insn_table (lf *file, char *prefix, insn_table *isa, char *suffix);
707