* Contribute CGEN simulator build support code.
[binutils-gdb.git] / sim / ppc / ld-insn.h
blobe800f0dac23681502eb55a9f0849ade4811f3066
1 /* This file is part of the program psim.
3 Copyright (C) 1994,1995,1996, Andrew Cagney <cagney@highland.com.au>
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.
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.
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.
22 # --
25 # Fields:
27 # 1 Instruction format as a `start-bit,content' pairs.
28 # the content is one of a digit, field name or `/' (aka.0)
30 # 2 Format specifier
32 # 3 Flags: 64 - 64bit only
33 # f - floating point enabled required
35 # 4 short name
37 # 5 Description
40 # For flags marked 'model', the fields are interpreted as follows:
42 # 1 Not used
44 # 2 Not used
46 # 3 "macro"
48 # 4 String name for model
50 # 5 Specific CPU model, must be an identifier
52 # 6 Comma separated list of functional units
57 /* Global constants */
59 enum {
60 max_insn_bit_size = 32,
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;
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;
88 /****************************************************************/
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;
100 /****************************************************************/
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;
112 /****************************************************************/
115 typedef enum {
116 insn_format,
117 insn_form,
118 insn_flags,
119 insn_mnemonic,
120 insn_name,
121 insn_comment,
122 nr_insn_table_fields
123 } insn_table_fields;
125 typedef enum {
126 function_type = insn_format,
127 function_name = insn_name,
128 function_param = insn_comment
129 } function_table_fields;
131 typedef enum {
132 model_name = insn_mnemonic,
133 model_identifer = insn_name,
134 model_default = insn_comment,
135 } model_table_fields;
137 typedef struct _insn insn;
138 struct _insn {
139 table_entry *file_entry;
140 insn_fields *fields;
141 insn *next;
144 typedef struct _insn_undef insn_undef;
145 struct _insn_undef {
146 insn_undef *next;
147 char *name;
150 typedef struct _model model;
151 struct _model {
152 model *next;
153 char *name;
154 char *printable_name;
155 char *insn_default;
156 table_model_entry *func_unit_start;
157 table_model_entry *func_unit_end;
160 typedef struct _insn_table insn_table;
161 struct _insn_table {
162 int opcode_nr;
163 insn_bits *expanded_bits;
164 int nr_insn;
165 insn *insns;
166 insn *functions;
167 insn *last_function;
168 decode_table *opcode_rule;
169 opcode_field *opcode;
170 int nr_entries;
171 insn_table *entries;
172 insn_table *sibling;
173 insn_table *parent;
176 typedef enum {
177 insn_model_name,
178 insn_model_fields,
179 nr_insn_model_table_fields
180 } insn_model_table_fields;
183 extern insn_table *load_insn_table
184 (const char *file_name,
185 decode_table *decode_rules,
186 filter *filters);
188 model *models;
189 model *last_model;
191 insn *model_macros;
192 insn *last_model_macro;
194 insn *model_functions;
195 insn *last_model_function;
197 insn *model_internal;
198 insn *last_model_internal;
200 insn *model_static;
201 insn *last_model_static;
203 insn *model_data;
204 insn *last_model_data;
206 int max_model_fields_len;
208 extern void insn_table_insert_insn
209 (insn_table *table,
210 table_entry *file_entry,
211 insn_fields *fields);
214 /****************************************************************/
216 /****************************************************************/
218 typedef void leaf_handler
219 (insn_table *entry,
220 lf *file,
221 void *data,
222 int depth);
224 typedef void insn_handler
225 (insn_table *table,
226 lf *file,
227 void *data,
228 insn *instruction,
229 int depth);
231 typedef void padding_handler
232 (insn_table *table,
233 lf *file,
234 void *data,
235 int depth,
236 int opcode_nr);
239 extern void insn_table_traverse_tree
240 (insn_table *table,
241 lf *file,
242 void *data,
243 int depth,
244 leaf_handler *start,
245 insn_handler *handler,
246 leaf_handler *end,
247 padding_handler *padding);
250 extern void insn_table_traverse_insn
251 (insn_table *table,
252 lf *file,
253 void *data,
254 insn_handler *handler);
258 /****************************************************************/
260 typedef void function_handler
261 (insn_table *table,
262 lf *file,
263 void *data,
264 table_entry *function);
266 extern void
267 insn_table_traverse_function
268 (insn_table *table,
269 lf *file,
270 void *data,
271 function_handler *leaf);
273 /****************************************************************/
277 extern void insn_table_expand_insns
278 (insn_table *table);
280 extern int insn_table_depth
281 (insn_table *table);