Patch reviewed and approved by Daniel Jacobowitz <drow@false.org>.
[external/binutils.git] / sim / ppc / ld-insn.h
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
59 enum {
60   max_insn_bit_size = 32,
61 };
62
63
64 typedef struct _insn_field insn_field;
65 struct _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
79 typedef struct _insn_fields insn_fields;
80 struct _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
90 typedef struct _opcode_field opcode_field;
91 struct _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
102 typedef struct _insn_bits insn_bits;
103 struct _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
115 typedef 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
127 typedef enum {
128   function_type = insn_format,
129   function_name = insn_name,
130   function_param = insn_comment
131 } function_table_fields;
132
133 typedef enum {
134   model_name = insn_mnemonic,
135   model_identifer = insn_name,
136   model_default = insn_comment,
137 } model_table_fields;
138
139 typedef enum {
140   include_flags = insn_flags,
141   include_path = insn_name,
142 } model_include_fields;
143
144 typedef 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
151 typedef struct _insn insn;
152 struct _insn {
153   table_entry *file_entry;
154   insn_fields *fields;
155   insn *next;
156 };
157
158 typedef struct _insn_undef insn_undef;
159 struct _insn_undef {
160   insn_undef *next;
161   char *name;
162 };
163
164 typedef struct _model model;
165 struct _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   
174 typedef struct _insn_table insn_table;
175 struct _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
190 typedef enum {
191   insn_model_name,
192   insn_model_fields,
193   nr_insn_model_table_fields
194 } insn_model_table_fields;
195
196
197 extern 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
204 model *models;
205 model *last_model;
206
207 insn *model_macros;
208 insn *last_model_macro;
209
210 insn *model_functions;
211 insn *last_model_function;
212
213 insn *model_internal;
214 insn *last_model_internal;
215
216 insn *model_static;
217 insn *last_model_static;
218
219 insn *model_data;
220 insn *last_model_data;
221
222 int max_model_fields_len;
223
224 extern void insn_table_insert_insn
225 (insn_table *table,
226  table_entry *file_entry,
227  insn_fields *fields);
228
229
230 /****************************************************************/
231
232 /****************************************************************/
233
234 typedef void leaf_handler
235 (insn_table *entry,
236  lf *file,
237  void *data,
238  int depth);
239
240 typedef void insn_handler
241 (insn_table *table,
242  lf *file,
243  void *data,
244  insn *instruction,
245  int depth);
246
247 typedef void padding_handler
248 (insn_table *table,
249  lf *file,
250  void *data,
251  int depth,
252  int opcode_nr);
253
254
255 extern 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
266 extern void insn_table_traverse_insn
267 (insn_table *table,
268  lf *file,
269  void *data,
270  insn_handler *handler);
271
272
273
274 /****************************************************************/
275
276 typedef void function_handler
277 (insn_table *table,
278  lf *file,
279  void *data,
280  table_entry *function);
281
282 extern void
283 insn_table_traverse_function
284 (insn_table *table,
285  lf *file,
286  void *data,
287  function_handler *leaf);
288
289 /****************************************************************/
290
291
292
293 extern void insn_table_expand_insns
294 (insn_table *table);
295
296 extern int insn_table_depth
297 (insn_table *table);