This commit was generated by cvs2svn to track changes on a CVS vendor
[external/binutils.git] / sim / igen / ld-insn.h
1 /*  This file is part of the program psim.
2
3     Copyright (C) 1994-1998 Andrew Cagney <cagney@highland.com.au>
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  
19     */
20
21
22
23 typedef unsigned64 insn_uint;
24
25
26 /* Common among most entries:
27
28    All non instruction records have the format:
29
30    <...> ::=
31        ":" <record-name>
32        ":" <filter-flags>
33        ":" <filter-models>
34        ":" ...
35    
36  */
37
38 enum {
39   record_type_field = 1,
40   old_record_type_field = 2,
41   record_filter_flags_field = 2,
42   record_filter_models_field = 3,
43 };
44
45
46 /* Include:
47
48    Include the specified file.
49
50    <include> ::=
51        ":" "include"
52        ":" <filter-flags>
53        ":" <filter-models>
54        ":" <filename>
55        <nl>
56        ;
57
58    */
59
60 enum {
61   include_filename_field = 4,
62   nr_include_fields,
63 };
64
65
66
67 /* Options:
68
69    Valid options are: hi-bit-nr (default 0), insn-bit-size (default
70    32), insn-specifying-widths (default true), multi-sim (default false).
71
72    <option> ::=
73        ":" "option"
74        ":" <filter-flags>
75        ":" <filter-models>
76        ":" <option-name>
77        ":" <option-value>
78        <nl>
79        ;
80
81    <option-name> ::=
82        "insn-bit-size"
83        | "insn-specifying-widths"
84        | "hi-bit-nr"
85        | "flags-filter"
86        | "model-filter"
87        | "multi-sim"
88        | "format-names"
89        ;
90
91    <option-value> ::=
92        "true"
93        | "false"
94        | <integer>
95        | <list>
96        ;
97
98
99    These update the global options structure. */       
100
101
102 enum {
103   option_name_field = 4,
104   option_value_field,
105   nr_option_fields,
106 };
107
108
109
110 /* Macro definitions:
111
112    <insn-macro> ::=
113        ":" "define"
114        ":" <filter-flags>
115        ":" <filter-models>
116        ":" <name>
117        ":" <arg-list>
118        ":" <expression>
119        <nl>
120        ;
121
122    <arg-list> ::=
123        [ <name> { "," <arg-list> } ]
124        ;
125
126    */
127
128
129 enum {
130   macro_name_field = 4,
131   macro_args_field,
132   macro_expr_field,
133   nr_macro_fields,
134 };
135
136
137
138 /* Functions and internal routins:
139
140    NB: <filter-models> and <function-models> are equivalent.
141
142
143    <function> ::=
144        ":" "function"
145        <function-spec>
146        ;
147
148    <internal> ::=
149        ":" "internal"
150        <function-spec>
151        ;
152
153    <format> ::=
154        ":" ( "%s" | ... )
155        <function-spec>
156        ;
157
158    <function-model> ::=
159        "*" [ <processor-list> ]
160        ":"
161        <nl>
162        ;
163
164    <function-spec> ::=
165        ":" <filter-flags>
166        ":" <filter-models>
167        ":" <typedef>
168        ":" <name>
169        [ ":" <parameter-list> ]
170        <nl>
171        [ <function-model> ]
172        <code-block>
173        ;
174
175    */
176
177 enum {
178   function_typedef_field = 4,
179   function_name_field,
180   function_param_field,
181   nr_function_fields,
182 };
183
184 enum {
185   function_model_name_field = 0,
186   nr_function_model_fields = 1,
187 };
188
189 enum {
190   old_function_typedef_field = 0,
191   old_function_type_field = 2,
192   old_function_name_field = 4,
193   old_function_param_field = 5,
194   nr_old_function_fields = 5, /* parameter-list is optional */
195 };
196
197
198 typedef struct _function_entry function_entry;
199 struct _function_entry {
200   line_ref *line;
201   filter *flags;
202   filter *models;
203   char *type;
204   char *name;
205   char *param;
206   table_entry *code;
207   int is_internal;
208   function_entry *next;
209 };
210
211
212 typedef void function_entry_handler
213 (lf *file,
214  function_entry *function,
215  void *data);
216
217 extern void function_entry_traverse
218 (lf *file,
219  function_entry *functions,
220  function_entry_handler *handler,
221  void *data);
222
223
224 /* cache-macro:
225
226    <cache-macro> ::=
227        ":" <macro-type>
228        ":" <filter-flags>
229        ":" <filter-models>
230        ":" <typedef>
231        ":" <name>
232        ":" <field-name> { "," <field-name> }
233        ":" <expression>
234        <nl>
235        ;
236
237    <cache-macro-type> ::=
238        "scratch"
239        | "cache"
240        | "compute"
241        ;
242
243    <name> ::=
244        <ident>
245        | <ident> "_is_" <integer>
246        ;
247
248    A cache entry is defined (for an instruction) when all
249    <field-name>s are present as named opcode fields within the
250    instructions format.
251
252    SCRATCH and CACHE macros are defined during the cache fill stage
253    while CACHE and COMPUTE macros are defined during the instruction
254    execution stage.
255
256    */
257
258 enum {
259   cache_typedef_field = 4,
260   cache_name_field,
261   cache_original_fields_field,
262   cache_expression_field,
263   nr_cache_fields,
264 };
265
266 typedef enum {
267   scratch_value,
268   cache_value,
269   compute_value,
270 } cache_entry_type;
271
272 typedef struct _cache_entry cache_entry;
273 struct _cache_entry {
274   line_ref *line;
275   filter *flags;
276   filter *models;
277   cache_entry_type entry_type;
278   char *name;
279   filter *original_fields;
280   char *type;
281   char *expression;
282   cache_entry *next;
283 };
284
285
286
287 /* Model specs:
288
289    <model-processor> ::=
290        ":" "model"
291        ":" <filter-flags>
292        ":" <filter-models>
293        ":" <processor>
294        ":" <BFD-processor>
295        ":" <function-unit-data>
296        <nl>
297        ;
298
299    <model-macro> ::=
300        ":" "model-macro"
301        ":" <filter-flags>
302        ":" <filter-models>
303        <nl>
304        <code-block>
305        ;
306
307    <model-data> ::=
308        ":" "model-data"
309        ":" <filter-flags>
310        ":" <filter-models>
311        <nl>
312        <code-block>
313        ;
314
315    <model-static> ::=
316        ":" "model-static"
317        <function-spec>
318        ;
319
320    <model-internal> ::=
321        ":" "model-internal"
322        <function-spec>
323        ;
324
325    <model-function> ::=
326        ":" "model-internal"
327        <function-spec>
328        ;
329
330  */
331
332 enum {
333   nr_model_macro_fields = 4,
334   nr_model_data_fields = 4,
335   nr_model_static_fields = nr_function_fields,
336   nr_model_internal_fields = nr_function_fields,
337   nr_model_function_fields = nr_function_fields,
338 };
339
340 typedef struct _model_data model_data;
341 struct _model_data {
342   line_ref *line;
343   filter *flags;
344   table_entry *entry;
345   table_entry *code;
346   model_data *next;
347 };
348
349 enum {
350   model_name_field = 4,
351   model_full_name_field,
352   model_unit_data_field,
353   nr_model_processor_fields,
354 };
355
356 typedef struct _model_entry model_entry;
357 struct _model_entry {
358   line_ref *line;
359   filter *flags;
360   char *name;
361   char *full_name;
362   char *unit_data;
363   model_entry *next;
364 };
365
366
367 typedef struct _model_table model_table;
368 struct _model_table {
369   filter *processors;
370   int nr_models;
371   model_entry *models;
372   model_data *macros;
373   model_data *data;
374   function_entry *statics;
375   function_entry *internals;
376   function_entry *functions;
377 };
378
379
380
381 /* Instruction format:
382
383    An instruction is composed of a sequence of N bit instruction
384    words.  Each word broken into a number of instruction fields.
385    Those fields being constant (ex. an opcode) or variable (register
386    spec).
387
388    <insn-word> ::=
389        <insn-field> { "," <insn-field> } ;
390
391    <insn-field> ::=
392        ( <binary-value-implying-width>
393        | <field-name-implying-width>
394        | [ <start-or-width> "." ] <field> 
395        )
396        { [ "!" | "=" ] [ <value> | <field-name> ] }
397        ;
398
399    <field> ::=
400          { "*" }+
401        | { "/" }+
402        | <field-name>
403        | "0x" <hex-value>
404        | "0b" <binary-value>
405        | "0" <octal-value>
406        | <integer-value> ;
407
408 */
409
410 typedef enum _insn_field_cond_type {
411   insn_field_cond_value,
412   insn_field_cond_field,
413 } insn_field_cond_type;
414 typedef enum _insn_field_cond_test {
415   insn_field_cond_eq,
416   insn_field_cond_ne,
417 } insn_field_cond_test;
418 typedef struct _insn_field_cond insn_field_cond;
419 struct _insn_field_cond {
420   insn_field_cond_type type;
421   insn_field_cond_test test;
422   insn_uint value;
423   struct _insn_field_entry *field;
424   char *string;
425   insn_field_cond *next;
426 };
427
428
429 typedef enum _insn_field_type {
430   insn_field_invalid,
431   insn_field_int,
432   insn_field_reserved,
433   insn_field_wild,
434   insn_field_string,
435 } insn_field_type;
436
437 typedef struct _insn_field_entry insn_field_entry;
438 struct _insn_field_entry {
439   int first;
440   int last;
441   int width;
442   int word_nr;
443   insn_field_type type;
444   insn_uint val_int;
445   char *pos_string;
446   char *val_string;
447   insn_field_cond *conditions;
448   insn_field_entry *next;
449   insn_field_entry *prev;
450 };
451
452 typedef struct _insn_bit_entry insn_bit_entry;
453 struct _insn_bit_entry {
454   int value;
455   int mask;
456   insn_field_entry *field;
457 };
458
459
460
461
462 typedef struct _insn_entry insn_entry; /* forward */
463
464 typedef struct _insn_word_entry insn_word_entry;
465 struct _insn_word_entry {
466   /* list of sub-fields making up the instruction.  bit provides
467      faster access to the field data for bit N.  */
468   insn_field_entry *first;
469   insn_field_entry *last;
470   insn_bit_entry *bit[max_insn_bit_size];
471   /* set of all the string fields */
472   filter *field_names;
473   /* For multi-word instructions, The Nth word (from zero). */
474   insn_word_entry *next;
475 };
476
477
478
479 /* Instruction model:
480
481    Provides scheduling and other data for the code modeling the
482    instruction unit.
483
484    <insn-model> ::=
485        "*" [ <processor-list> ]
486        ":" [ <function-unit-data> ]
487        <nl>
488        ;
489
490    <processor-list> ::=
491        <processor> { "," <processor>" }
492        ;
493
494    If the <processor-list> is empty, the model is made the default for
495    this instruction.
496
497    */
498
499 enum {
500   insn_model_name_field = 0,
501   insn_model_unit_data_field = 1,
502   nr_insn_model_fields = 1,
503 };
504
505 typedef struct _insn_model_entry insn_model_entry;
506 struct _insn_model_entry {
507   line_ref *line;
508   insn_entry *insn;
509   filter *names;
510   char *full_name;
511   char *unit_data;
512   insn_model_entry *next;
513 };
514
515
516
517 /* Instruction mnemonic:
518
519    List of assembler mnemonics for the instruction.
520
521    <insn-mnenonic> ::=
522        "\"" <assembler-mnemonic> "\""
523        [ ":" <conditional-expression> ]
524        <nl>
525        ;
526
527    An assembler mnemonic string has the syntax:
528
529    <assembler-mnemonic>  ::=
530        ( [ "%" <format-spec> ] "<" <func> [ "#" <param-list> ] ">"
531        | "%%"
532        | <other-letter>
533        )+
534
535     Where, for instance, the text is translated into a printf format
536     and argument pair:
537
538        "<FUNC>"         : "%ld", (long) FUNC
539        "%<FUNC>..."     : "%...", FUNC
540        "%s<FUNC>"       : "%s", <%s>FUNC (SD_, FUNC)
541        "%s<FUNC#P1,P2>" : "%s", <%s>FUNC (SD_, P1,P2)
542        "%lx<FUNC>"      : "%lx", (unsigned long) FUNC
543        "%08lx<FUNC>"    : "%08lx", (unsigned long) FUNC
544
545     And "<%s>FUNC" denotes a function declared using the "%s" record
546     specifier.
547
548
549
550        ;
551
552    */
553
554 enum {
555   insn_mnemonic_format_field = 0,
556   insn_mnemonic_condition_field = 1,
557   nr_insn_mnemonic_fields = 1,
558 };
559
560 typedef struct _insn_mnemonic_entry insn_mnemonic_entry;
561 struct _insn_mnemonic_entry {
562   line_ref *line;
563   insn_entry *insn;
564   char *format;
565   char *condition;
566   insn_mnemonic_entry *next;
567 };
568
569
570
571 /* Instruction:
572
573    <insn> ::=
574        <insn-word> { "+" <insn-word> }
575        ":" <format-name>
576        ":" <filter-flags>
577        ":" <options>
578        ":" <name>
579        <nl>
580        { <insn-model> }
581        { <insn-mnemonic> }
582        <code-block>
583
584  */
585
586 enum {
587   insn_word_field = 0,
588   insn_format_name_field = 1,
589   insn_filter_flags_field = 2,
590   insn_options_field = 3,
591   insn_name_field = 4,
592   nr_insn_fields = 5,
593 };
594
595
596 /* typedef struct _insn_entry insn_entry; */
597 struct _insn_entry {
598   line_ref *line;
599   filter *flags; /* filtered by options.filters */
600   char *format_name;
601   filter *options;
602   char *name;
603   /* the words that make up the instruction. Word provides direct
604      access to word N. Pseudo instructions can be identified by
605      nr_words == 0. */
606   int nr_words;
607   insn_word_entry *words;
608   insn_word_entry **word;
609   /* a set of all the fields from all the words */
610   filter *field_names;
611   /* an array of processor models, missing models are NULL! */
612   int nr_models;
613   insn_model_entry *models;
614   insn_model_entry **model;
615   filter *processors;
616   /* list of assember formats */
617   int nr_mnemonics;
618   insn_mnemonic_entry *mnemonics;
619   /* code body */
620   table_entry *code;
621   insn_entry *next;
622 };
623
624
625 /* Instruction table:
626
627  */
628
629 typedef struct _insn_table insn_table;
630 struct _insn_table {
631   cache_entry *caches;
632   int max_nr_words;
633   int nr_insns;
634   insn_entry *insns;
635   function_entry *functions;
636   insn_entry *illegal_insn;
637   model_table *model;
638   filter *options;
639   filter *flags;
640 };
641
642 extern insn_table *load_insn_table
643 (char *file_name,
644  cache_entry *cache);
645
646 typedef void insn_entry_handler
647 (lf *file,
648  insn_table *isa,
649  insn_entry *insn,
650  void *data);
651
652 extern void insn_table_traverse_insn
653 (lf *file,
654  insn_table *isa,
655  insn_entry_handler *handler,
656  void *data);
657
658
659
660 /* Printing */
661
662 extern void print_insn_words
663 (lf *file,
664  insn_entry *insn);
665
666
667
668 /* Debugging */
669
670 void
671 dump_insn_field
672 (lf *file,
673  char *prefix,
674  insn_field_entry *field,
675  char *suffix);
676
677 void
678 dump_insn_word_entry
679 (lf *file,
680  char *prefix,
681  insn_word_entry *word,
682  char *suffix);
683
684 void
685 dump_insn_entry
686 (lf *file,
687  char *prefix,
688  insn_entry *insn,
689  char *suffix);
690
691 void
692 dump_cache_entries
693 (lf *file,
694  char *prefix,
695  cache_entry *entry,
696  char *suffix);
697
698 void
699 dump_insn_table
700 (lf *file,
701  char *prefix,
702  insn_table *isa,
703  char *suffix);