1
/* Internal definitions for configurable Xtensa ISA support.
2
Copyright 2003, 2004, 2005, 2008, 2010 Free Software Foundation, Inc.
4
This file is part of BFD, the Binary File Descriptor library.
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
8
the Free Software Foundation; either version 3 of the License, or
9
(at your option) any later version.
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.
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
18
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
21
#ifndef XTENSA_ISA_INTERNAL_H
22
#define XTENSA_ISA_INTERNAL_H
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
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
36
#define XTENSA_STATE_IS_EXPORTED 0x00000001
37
#define XTENSA_STATE_IS_SHARED_OR 0x00000002
39
#define XTENSA_INTERFACE_HAS_SIDE_EFFECT 0x00000001
41
/* Function pointer typedefs */
42
typedef void (*xtensa_format_encode_fn) (xtensa_insnbuf);
43
typedef void (*xtensa_get_slot_fn) (const xtensa_insnbuf, xtensa_insnbuf);
44
typedef void (*xtensa_set_slot_fn) (xtensa_insnbuf, const xtensa_insnbuf);
45
typedef int (*xtensa_opcode_decode_fn) (const xtensa_insnbuf);
46
typedef uint32 (*xtensa_get_field_fn) (const xtensa_insnbuf);
47
typedef void (*xtensa_set_field_fn) (xtensa_insnbuf, uint32);
48
typedef int (*xtensa_immed_decode_fn) (uint32 *);
49
typedef int (*xtensa_immed_encode_fn) (uint32 *);
50
typedef int (*xtensa_do_reloc_fn) (uint32 *, uint32);
51
typedef int (*xtensa_undo_reloc_fn) (uint32 *, uint32);
52
typedef void (*xtensa_opcode_encode_fn) (xtensa_insnbuf);
53
typedef int (*xtensa_format_decode_fn) (const xtensa_insnbuf);
54
typedef int (*xtensa_length_decode_fn) (const unsigned char *);
56
typedef struct xtensa_format_internal_struct
58
const char *name; /* Instruction format name. */
59
int length; /* Instruction length in bytes. */
60
xtensa_format_encode_fn encode_fn;
62
int *slot_id; /* Array[num_slots] of slot IDs. */
63
} xtensa_format_internal;
65
typedef struct xtensa_slot_internal_struct
67
const char *name; /* Not necessarily unique. */
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;
76
} xtensa_slot_internal;
78
typedef struct xtensa_operand_internal_struct
82
xtensa_regfile regfile; /* Register file. */
83
int num_regs; /* Usually 1; 2 for reg pairs, etc. */
84
uint32 flags; /* See XTENSA_OPERAND_* flags. */
85
xtensa_immed_encode_fn encode; /* Encode the operand value. */
86
xtensa_immed_decode_fn decode; /* Decode the value from the field. */
87
xtensa_do_reloc_fn do_reloc; /* Perform a PC-relative reloc. */
88
xtensa_undo_reloc_fn undo_reloc; /* Undo a PC-relative relocation. */
89
} xtensa_operand_internal;
91
typedef struct xtensa_arg_internal_struct
94
int operand_id; /* For normal operands. */
95
xtensa_state state; /* For stateOperands. */
97
char inout; /* Direction: 'i', 'o', or 'm'. */
98
} xtensa_arg_internal;
100
typedef struct xtensa_iclass_internal_struct
102
int num_operands; /* Size of "operands" array. */
103
xtensa_arg_internal *operands; /* Array[num_operands]. */
105
int num_stateOperands; /* Size of "stateOperands" array. */
106
xtensa_arg_internal *stateOperands; /* Array[num_stateOperands]. */
108
int num_interfaceOperands; /* Size of "interfaceOperands". */
109
xtensa_interface *interfaceOperands; /* Array[num_interfaceOperands]. */
110
} xtensa_iclass_internal;
112
typedef struct xtensa_opcode_internal_struct
114
const char *name; /* Opcode mnemonic. */
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]. */
120
} xtensa_opcode_internal;
122
typedef struct xtensa_regfile_internal_struct
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;
131
typedef struct xtensa_interface_internal_struct
133
const char *name; /* Interface name. */
134
int num_bits; /* Width of the interface. */
135
uint32 flags; /* See XTENSA_INTERFACE_* flags. */
136
int class_id; /* Class of related interfaces. */
137
char inout; /* "i" or "o". */
138
} xtensa_interface_internal;
140
typedef struct xtensa_funcUnit_internal_struct
142
const char *name; /* Functional unit name. */
143
int num_copies; /* Number of instances. */
144
} xtensa_funcUnit_internal;
146
typedef struct xtensa_state_internal_struct
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;
153
typedef struct xtensa_sysreg_internal_struct
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;
160
typedef struct xtensa_lookup_entry_struct
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. */
171
} xtensa_lookup_entry;
173
typedef struct xtensa_isa_internal_struct
175
int is_big_endian; /* Endianness. */
176
int insn_size; /* Maximum length in bytes. */
177
int insnbuf_size; /* Number of insnbuf_words. */
180
xtensa_format_internal *formats;
181
xtensa_format_decode_fn format_decode_fn;
182
xtensa_length_decode_fn length_decode_fn;
185
xtensa_slot_internal *slots;
190
xtensa_operand_internal *operands;
193
xtensa_iclass_internal *iclasses;
196
xtensa_opcode_internal *opcodes;
197
xtensa_lookup_entry *opname_lookup_table;
200
xtensa_regfile_internal *regfiles;
203
xtensa_state_internal *states;
204
xtensa_lookup_entry *state_lookup_table;
207
xtensa_sysreg_internal *sysregs;
208
xtensa_lookup_entry *sysreg_lookup_table;
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"
216
int max_sysreg_num[2];
217
xtensa_sysreg *sysreg_table[2];
220
xtensa_interface_internal *interfaces;
221
xtensa_lookup_entry *interface_lookup_table;
224
xtensa_funcUnit_internal *funcUnits;
225
xtensa_lookup_entry *funcUnit_lookup_table;
227
} xtensa_isa_internal;
229
extern int xtensa_isa_name_compare (const void *, const void *);
231
extern xtensa_isa_status xtisa_errno;
232
extern char xtisa_error_msg[];
234
#endif /* !XTENSA_ISA_INTERNAL_H */