]> sourceware.org Git - newlib-cygwin.git/blame - include/xtensa-isa-internal.h
Cygwin: Makefile.am: fix DLL build rule
[newlib-cygwin.git] / include / xtensa-isa-internal.h
CommitLineData
5340a2ed 1/* Internal definitions for configurable Xtensa ISA support.
e63d7c59 2 Copyright 2003, 2004, 2005, 2008, 2010 Free Software Foundation, Inc.
5340a2ed
NC
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
e63d7c59 8 the Free Software Foundation; either version 3 of the License, or
5340a2ed
NC
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
d6f6f502
SA
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
19 USA. */
5340a2ed 20
b3a88ae9
BW
21#ifndef XTENSA_ISA_INTERNAL_H
22#define XTENSA_ISA_INTERNAL_H
5340a2ed 23
b3a88ae9 24/* Flags. */
5340a2ed 25
b3a88ae9
BW
26#define XTENSA_OPERAND_IS_REGISTER 0x00000001
27#define XTENSA_OPERAND_IS_PCRELATIVE 0x00000002
28#define XTENSA_OPERAND_IS_INVISIBLE 0x00000004
29#define XTENSA_OPERAND_IS_UNKNOWN 0x00000008
5340a2ed 30
b3a88ae9
BW
31#define XTENSA_OPCODE_IS_BRANCH 0x00000001
32#define XTENSA_OPCODE_IS_JUMP 0x00000002
33#define XTENSA_OPCODE_IS_LOOP 0x00000004
34#define XTENSA_OPCODE_IS_CALL 0x00000008
5340a2ed 35
b3a88ae9 36#define XTENSA_STATE_IS_EXPORTED 0x00000001
d6f6f502 37#define XTENSA_STATE_IS_SHARED_OR 0x00000002
5340a2ed 38
b3a88ae9 39#define XTENSA_INTERFACE_HAS_SIDE_EFFECT 0x00000001
5340a2ed 40
b3a88ae9
BW
41/* Function pointer typedefs */
42typedef void (*xtensa_format_encode_fn) (xtensa_insnbuf);
43typedef void (*xtensa_get_slot_fn) (const xtensa_insnbuf, xtensa_insnbuf);
44typedef void (*xtensa_set_slot_fn) (xtensa_insnbuf, const xtensa_insnbuf);
45typedef int (*xtensa_opcode_decode_fn) (const xtensa_insnbuf);
46typedef uint32 (*xtensa_get_field_fn) (const xtensa_insnbuf);
47typedef void (*xtensa_set_field_fn) (xtensa_insnbuf, uint32);
48typedef int (*xtensa_immed_decode_fn) (uint32 *);
49typedef int (*xtensa_immed_encode_fn) (uint32 *);
50typedef int (*xtensa_do_reloc_fn) (uint32 *, uint32);
51typedef int (*xtensa_undo_reloc_fn) (uint32 *, uint32);
52typedef void (*xtensa_opcode_encode_fn) (xtensa_insnbuf);
53typedef int (*xtensa_format_decode_fn) (const xtensa_insnbuf);
f46ddb81 54typedef int (*xtensa_length_decode_fn) (const unsigned char *);
b3a88ae9
BW
55
56typedef struct xtensa_format_internal_struct
57{
58 const char *name; /* Instruction format name. */
59 int length; /* Instruction length in bytes. */
60 xtensa_format_encode_fn encode_fn;
61 int num_slots;
62 int *slot_id; /* Array[num_slots] of slot IDs. */
63} xtensa_format_internal;
64
65typedef struct xtensa_slot_internal_struct
66{
67 const char *name; /* Not necessarily unique. */
68 const char *format;
69 int position;
70 xtensa_get_slot_fn get_fn;
71 xtensa_set_slot_fn set_fn;
72 xtensa_get_field_fn *get_field_fns; /* Array[field_id]. */
73 xtensa_set_field_fn *set_field_fns; /* Array[field_id]. */
74 xtensa_opcode_decode_fn opcode_decode_fn;
75 const char *nop_name;
76} xtensa_slot_internal;
5340a2ed
NC
77
78typedef struct xtensa_operand_internal_struct
79{
b3a88ae9
BW
80 const char *name;
81 int field_id;
82 xtensa_regfile regfile; /* Register file. */
83 int num_regs; /* Usually 1; 2 for reg pairs, etc. */
84 uint32 flags; /* See XTENSA_OPERAND_* flags. */
5340a2ed
NC
85 xtensa_immed_encode_fn encode; /* Encode the operand value. */
86 xtensa_immed_decode_fn decode; /* Decode the value from the field. */
b3a88ae9 87 xtensa_do_reloc_fn do_reloc; /* Perform a PC-relative reloc. */
5340a2ed
NC
88 xtensa_undo_reloc_fn undo_reloc; /* Undo a PC-relative relocation. */
89} xtensa_operand_internal;
90
b3a88ae9
BW
91typedef struct xtensa_arg_internal_struct
92{
93 union {
94 int operand_id; /* For normal operands. */
95 xtensa_state state; /* For stateOperands. */
96 } u;
97 char inout; /* Direction: 'i', 'o', or 'm'. */
98} xtensa_arg_internal;
5340a2ed
NC
99
100typedef struct xtensa_iclass_internal_struct
101{
102 int num_operands; /* Size of "operands" array. */
b3a88ae9 103 xtensa_arg_internal *operands; /* Array[num_operands]. */
5340a2ed 104
b3a88ae9
BW
105 int num_stateOperands; /* Size of "stateOperands" array. */
106 xtensa_arg_internal *stateOperands; /* Array[num_stateOperands]. */
107
108 int num_interfaceOperands; /* Size of "interfaceOperands". */
109 xtensa_interface *interfaceOperands; /* Array[num_interfaceOperands]. */
110} xtensa_iclass_internal;
5340a2ed
NC
111
112typedef struct xtensa_opcode_internal_struct
113{
114 const char *name; /* Opcode mnemonic. */
b3a88ae9
BW
115 int iclass_id; /* Iclass for this opcode. */
116 uint32 flags; /* See XTENSA_OPCODE_* flags. */
117 xtensa_opcode_encode_fn *encode_fns; /* Array[slot_id]. */
118 int num_funcUnit_uses; /* Number of funcUnit_use entries. */
119 xtensa_funcUnit_use *funcUnit_uses; /* Array[num_funcUnit_uses]. */
5340a2ed
NC
120} xtensa_opcode_internal;
121
b3a88ae9
BW
122typedef struct xtensa_regfile_internal_struct
123{
124 const char *name; /* Full name of the regfile. */
125 const char *shortname; /* Abbreviated name. */
126 xtensa_regfile parent; /* View parent (or identity). */
127 int num_bits; /* Width of the registers. */
128 int num_entries; /* Number of registers. */
129} xtensa_regfile_internal;
130
131typedef struct xtensa_interface_internal_struct
132{
133 const char *name; /* Interface name. */
134 int num_bits; /* Width of the interface. */
135 uint32 flags; /* See XTENSA_INTERFACE_* flags. */
390d719f 136 int class_id; /* Class of related interfaces. */
b3a88ae9
BW
137 char inout; /* "i" or "o". */
138} xtensa_interface_internal;
139
140typedef struct xtensa_funcUnit_internal_struct
141{
142 const char *name; /* Functional unit name. */
143 int num_copies; /* Number of instances. */
144} xtensa_funcUnit_internal;
5340a2ed 145
b3a88ae9 146typedef struct xtensa_state_internal_struct
5340a2ed 147{
b3a88ae9
BW
148 const char *name; /* State name. */
149 int num_bits; /* Number of state bits. */
150 uint32 flags; /* See XTENSA_STATE_* flags. */
151} xtensa_state_internal;
5340a2ed 152
b3a88ae9
BW
153typedef struct xtensa_sysreg_internal_struct
154{
155 const char *name; /* Register name. */
156 int number; /* Register number. */
157 int is_user; /* Non-zero if a "user register". */
158} xtensa_sysreg_internal;
159
160typedef struct xtensa_lookup_entry_struct
161{
162 const char *key;
163 union
164 {
165 xtensa_opcode opcode; /* Internal opcode number. */
166 xtensa_sysreg sysreg; /* Internal sysreg number. */
167 xtensa_state state; /* Internal state number. */
168 xtensa_interface intf; /* Internal interface number. */
169 xtensa_funcUnit fun; /* Internal funcUnit number. */
170 } u;
171} xtensa_lookup_entry;
5340a2ed
NC
172
173typedef struct xtensa_isa_internal_struct
174{
175 int is_big_endian; /* Endianness. */
176 int insn_size; /* Maximum length in bytes. */
177 int insnbuf_size; /* Number of insnbuf_words. */
5340a2ed 178
b3a88ae9
BW
179 int num_formats;
180 xtensa_format_internal *formats;
181 xtensa_format_decode_fn format_decode_fn;
182 xtensa_length_decode_fn length_decode_fn;
5340a2ed 183
b3a88ae9
BW
184 int num_slots;
185 xtensa_slot_internal *slots;
186
187 int num_fields;
188
189 int num_operands;
190 xtensa_operand_internal *operands;
191
192 int num_iclasses;
193 xtensa_iclass_internal *iclasses;
194
195 int num_opcodes;
196 xtensa_opcode_internal *opcodes;
197 xtensa_lookup_entry *opname_lookup_table;
198
199 int num_regfiles;
200 xtensa_regfile_internal *regfiles;
201
202 int num_states;
203 xtensa_state_internal *states;
204 xtensa_lookup_entry *state_lookup_table;
205
206 int num_sysregs;
207 xtensa_sysreg_internal *sysregs;
208 xtensa_lookup_entry *sysreg_lookup_table;
209
210 /* The current Xtensa ISA only supports 256 of each kind of sysreg so
211 we can get away with implementing lookups with tables indexed by
212 the register numbers. If we ever allow larger sysreg numbers, this
213 may have to be reimplemented. The first entry in the following
214 arrays corresponds to "special" registers and the second to "user"
215 registers. */
216 int max_sysreg_num[2];
217 xtensa_sysreg *sysreg_table[2];
218
219 int num_interfaces;
220 xtensa_interface_internal *interfaces;
221 xtensa_lookup_entry *interface_lookup_table;
222
223 int num_funcUnits;
224 xtensa_funcUnit_internal *funcUnits;
225 xtensa_lookup_entry *funcUnit_lookup_table;
226
227} xtensa_isa_internal;
228
229extern int xtensa_isa_name_compare (const void *, const void *);
5340a2ed 230
b3a88ae9
BW
231extern xtensa_isa_status xtisa_errno;
232extern char xtisa_error_msg[];
5340a2ed 233
b3a88ae9 234#endif /* !XTENSA_ISA_INTERNAL_H */
This page took 0.193139 seconds and 5 git commands to generate.