daily update
[deliverable/binutils-gdb.git] / sim / ppc / ld-insn.h
CommitLineData
c906108c
SS
1/* This file is part of the program psim.
2
3 Copyright (C) 1994,1995,1996, 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#
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 nr_insn_table_fields
123} insn_table_fields;
124
125typedef enum {
126 function_type = insn_format,
127 function_name = insn_name,
128 function_param = insn_comment
129} function_table_fields;
130
131typedef enum {
132 model_name = insn_mnemonic,
133 model_identifer = insn_name,
134 model_default = insn_comment,
135} model_table_fields;
136
43c4bab0
MG
137typedef enum {
138 include_flags = insn_flags,
139 include_path = insn_name,
140} model_include_fields;
141
c906108c
SS
142typedef struct _insn insn;
143struct _insn {
144 table_entry *file_entry;
145 insn_fields *fields;
146 insn *next;
147};
148
149typedef struct _insn_undef insn_undef;
150struct _insn_undef {
151 insn_undef *next;
152 char *name;
153};
154
155typedef struct _model model;
156struct _model {
157 model *next;
158 char *name;
159 char *printable_name;
160 char *insn_default;
161 table_model_entry *func_unit_start;
162 table_model_entry *func_unit_end;
163};
164
165typedef struct _insn_table insn_table;
166struct _insn_table {
167 int opcode_nr;
168 insn_bits *expanded_bits;
169 int nr_insn;
170 insn *insns;
171 insn *functions;
172 insn *last_function;
173 decode_table *opcode_rule;
174 opcode_field *opcode;
175 int nr_entries;
176 insn_table *entries;
177 insn_table *sibling;
178 insn_table *parent;
179};
180
181typedef enum {
182 insn_model_name,
183 insn_model_fields,
184 nr_insn_model_table_fields
185} insn_model_table_fields;
186
187
188extern insn_table *load_insn_table
189(const char *file_name,
190 decode_table *decode_rules,
43c4bab0
MG
191 filter *filters,
192 table_include *includes);
c906108c
SS
193
194model *models;
195model *last_model;
196
197insn *model_macros;
198insn *last_model_macro;
199
200insn *model_functions;
201insn *last_model_function;
202
203insn *model_internal;
204insn *last_model_internal;
205
206insn *model_static;
207insn *last_model_static;
208
209insn *model_data;
210insn *last_model_data;
211
212int max_model_fields_len;
213
214extern void insn_table_insert_insn
215(insn_table *table,
216 table_entry *file_entry,
217 insn_fields *fields);
218
219
220/****************************************************************/
221
222/****************************************************************/
223
224typedef void leaf_handler
225(insn_table *entry,
226 lf *file,
227 void *data,
228 int depth);
229
230typedef void insn_handler
231(insn_table *table,
232 lf *file,
233 void *data,
234 insn *instruction,
235 int depth);
236
237typedef void padding_handler
238(insn_table *table,
239 lf *file,
240 void *data,
241 int depth,
242 int opcode_nr);
243
244
245extern void insn_table_traverse_tree
246(insn_table *table,
247 lf *file,
248 void *data,
249 int depth,
250 leaf_handler *start,
251 insn_handler *handler,
252 leaf_handler *end,
253 padding_handler *padding);
254
255
256extern void insn_table_traverse_insn
257(insn_table *table,
258 lf *file,
259 void *data,
260 insn_handler *handler);
261
262
263
264/****************************************************************/
265
266typedef void function_handler
267(insn_table *table,
268 lf *file,
269 void *data,
270 table_entry *function);
271
272extern void
273insn_table_traverse_function
274(insn_table *table,
275 lf *file,
276 void *data,
277 function_handler *leaf);
278
279/****************************************************************/
280
281
282
283extern void insn_table_expand_insns
284(insn_table *table);
285
286extern int insn_table_depth
287(insn_table *table);
This page took 0.133075 seconds and 4 git commands to generate.