sim/testsuite/: split up arch-specific changelogs
[deliverable/binutils-gdb.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);
This page took 0.185721 seconds and 4 git commands to generate.