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