1/*  This file is part of the program psim.
2
3    Copyright 1994, 1995, 1996, 2003 Andrew Cagney
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#
24#
25# Fields:
26#
27#	1	Instruction format as a `start-bit,content' pairs.
28#		the content is one of a digit, field name or `/' (aka.0)
29#
30#	2	Format specifier
31#
32#	3	Flags:	64 - 64bit only
33#			f - floating point enabled required
34#
35#	4 	short name
36#
37#	5	Description
38#
39#
40# For flags marked 'model', the fields are interpreted as follows:
41#
42#	1	Not used
43#
44#	2	Not used
45#
46#	3	"macro"
47#
48#	4	String name for model
49#
50#	5	Specific CPU model, must be an identifier
51#
52#	6	Comma separated list of functional units
53
54*/
55
56
57/* Global constants */
58
59enum {
60  max_insn_bit_size = 32,
61};
62
63
64typedef struct _insn_field insn_field;
65struct _insn_field {
66  int first;
67  int last;
68  int width;
69  int is_int;
70  int is_slash;
71  int is_string;
72  int val_int;
73  char *pos_string;
74  char *val_string;
75  insn_field *next;
76  insn_field *prev;
77};
78
79typedef struct _insn_fields insn_fields;
80struct _insn_fields {
81  insn_field *bits[max_insn_bit_size];
82  insn_field *first;
83  insn_field *last;
84  unsigned value;
85};
86
87
88/****************************************************************/
89
90typedef struct _opcode_field opcode_field;
91struct _opcode_field {
92  int first;
93  int last;
94  int is_boolean;
95  unsigned boolean_constant;
96  opcode_field *parent;
97};
98
99
100/****************************************************************/
101
102typedef struct _insn_bits insn_bits;
103struct _insn_bits {
104  int is_expanded;
105  int value;
106  insn_field *field;
107  opcode_field *opcode;
108  insn_bits *last;
109};
110
111
112/****************************************************************/
113
114
115typedef enum {
116  insn_format,
117  insn_form,
118  insn_flags,
119  insn_mnemonic,
120  insn_name,
121  insn_comment,
122  insn_field_6,
123  insn_field_7,
124  nr_insn_table_fields
125} insn_table_fields;
126
127typedef enum {
128  function_type = insn_format,
129  function_name = insn_name,
130  function_param = insn_comment
131} function_table_fields;
132
133typedef enum {
134  model_name = insn_mnemonic,
135  model_identifer = insn_name,
136  model_default = insn_comment,
137} model_table_fields;
138
139typedef enum {
140  include_flags = insn_flags,
141  include_path = insn_name,
142} model_include_fields;
143
144typedef enum {
145  cache_type_def = insn_name,
146  cache_derived_name = insn_comment,
147  cache_name = insn_field_6,
148  cache_expression = insn_field_7,
149} cache_fields;
150
151typedef struct _insn insn;
152struct _insn {
153  table_entry *file_entry;
154  insn_fields *fields;
155  insn *next;
156};
157
158typedef struct _insn_undef insn_undef;
159struct _insn_undef {
160  insn_undef *next;
161  char *name;
162};
163
164typedef struct _model model;
165struct _model {
166  model *next;
167  char *name;
168  char *printable_name;
169  char *insn_default;
170  table_model_entry *func_unit_start;
171  table_model_entry *func_unit_end;
172};
173
174typedef struct _insn_table insn_table;
175struct _insn_table {
176  int opcode_nr;
177  insn_bits *expanded_bits;
178  int nr_insn;
179  insn *insns;
180  insn *functions;
181  insn *last_function;
182  decode_table *opcode_rule;
183  opcode_field *opcode;
184  int nr_entries;
185  insn_table *entries;
186  insn_table *sibling;
187  insn_table *parent;
188};
189
190typedef enum {
191  insn_model_name,
192  insn_model_fields,
193  nr_insn_model_table_fields
194} insn_model_table_fields;
195
196
197extern insn_table *load_insn_table
198(const char *file_name,
199 decode_table *decode_rules,
200 filter *filters,
201 table_include *includes,
202 cache_table **cache_rules);
203
204model *models;
205model *last_model;
206
207insn *model_macros;
208insn *last_model_macro;
209
210insn *model_functions;
211insn *last_model_function;
212
213insn *model_internal;
214insn *last_model_internal;
215
216insn *model_static;
217insn *last_model_static;
218
219insn *model_data;
220insn *last_model_data;
221
222int max_model_fields_len;
223
224extern void insn_table_insert_insn
225(insn_table *table,
226 table_entry *file_entry,
227 insn_fields *fields);
228
229
230/****************************************************************/
231
232/****************************************************************/
233
234typedef void leaf_handler
235(insn_table *entry,
236 lf *file,
237 void *data,
238 int depth);
239
240typedef void insn_handler
241(insn_table *table,
242 lf *file,
243 void *data,
244 insn *instruction,
245 int depth);
246
247typedef void padding_handler
248(insn_table *table,
249 lf *file,
250 void *data,
251 int depth,
252 int opcode_nr);
253
254
255extern void insn_table_traverse_tree
256(insn_table *table,
257 lf *file,
258 void *data,
259 int depth,
260 leaf_handler *start,
261 insn_handler *handler,
262 leaf_handler *end,
263 padding_handler *padding);
264
265
266extern void insn_table_traverse_insn
267(insn_table *table,
268 lf *file,
269 void *data,
270 insn_handler *handler);
271
272
273
274/****************************************************************/
275
276typedef void function_handler
277(insn_table *table,
278 lf *file,
279 void *data,
280 table_entry *function);
281
282extern void
283insn_table_traverse_function
284(insn_table *table,
285 lf *file,
286 void *data,
287 function_handler *leaf);
288
289/****************************************************************/
290
291
292
293extern void insn_table_expand_insns
294(insn_table *table);
295
296extern int insn_table_depth
297(insn_table *table);
298