xref: /openbmc/qemu/include/hw/xtensa/xtensa-isa.h (revision 7f709ce739d46ecd6df98921a20e9dce1dcc421b)
1*7f709ce7SMax Filippov /* Interface definition for configurable Xtensa ISA support.
2*7f709ce7SMax Filippov  *
3*7f709ce7SMax Filippov  * Copyright (c) 2001-2013 Tensilica Inc.
4*7f709ce7SMax Filippov  *
5*7f709ce7SMax Filippov  * Permission is hereby granted, free of charge, to any person obtaining
6*7f709ce7SMax Filippov  * a copy of this software and associated documentation files (the
7*7f709ce7SMax Filippov  * "Software"), to deal in the Software without restriction, including
8*7f709ce7SMax Filippov  * without limitation the rights to use, copy, modify, merge, publish,
9*7f709ce7SMax Filippov  * distribute, sublicense, and/or sell copies of the Software, and to
10*7f709ce7SMax Filippov  * permit persons to whom the Software is furnished to do so, subject to
11*7f709ce7SMax Filippov  * the following conditions:
12*7f709ce7SMax Filippov  *
13*7f709ce7SMax Filippov  * The above copyright notice and this permission notice shall be included
14*7f709ce7SMax Filippov  * in all copies or substantial portions of the Software.
15*7f709ce7SMax Filippov  *
16*7f709ce7SMax Filippov  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17*7f709ce7SMax Filippov  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18*7f709ce7SMax Filippov  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19*7f709ce7SMax Filippov  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20*7f709ce7SMax Filippov  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21*7f709ce7SMax Filippov  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22*7f709ce7SMax Filippov  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23*7f709ce7SMax Filippov  */
24*7f709ce7SMax Filippov 
25*7f709ce7SMax Filippov #ifndef XTENSA_LIBISA_H
26*7f709ce7SMax Filippov #define XTENSA_LIBISA_H
27*7f709ce7SMax Filippov 
28*7f709ce7SMax Filippov #include <stdint.h>
29*7f709ce7SMax Filippov 
30*7f709ce7SMax Filippov #ifdef __cplusplus
31*7f709ce7SMax Filippov extern "C" {
32*7f709ce7SMax Filippov #endif
33*7f709ce7SMax Filippov 
34*7f709ce7SMax Filippov /*
35*7f709ce7SMax Filippov  * Version number: This is intended to help support code that works with
36*7f709ce7SMax Filippov  * versions of this library from multiple Xtensa releases.
37*7f709ce7SMax Filippov  */
38*7f709ce7SMax Filippov 
39*7f709ce7SMax Filippov #define XTENSA_ISA_VERSION 7000
40*7f709ce7SMax Filippov 
41*7f709ce7SMax Filippov /*
42*7f709ce7SMax Filippov  * This file defines the interface to the Xtensa ISA library. This
43*7f709ce7SMax Filippov  * library contains most of the ISA-specific information for a
44*7f709ce7SMax Filippov  * particular Xtensa processor. For example, the set of valid
45*7f709ce7SMax Filippov  * instructions, their opcode encodings and operand fields are all
46*7f709ce7SMax Filippov  * included here.
47*7f709ce7SMax Filippov  *
48*7f709ce7SMax Filippov  * This interface basically defines a number of abstract data types.
49*7f709ce7SMax Filippov  *
50*7f709ce7SMax Filippov  * . an instruction buffer - for holding the raw instruction bits
51*7f709ce7SMax Filippov  * . ISA info - information about the ISA as a whole
52*7f709ce7SMax Filippov  * . instruction formats - instruction size and slot structure
53*7f709ce7SMax Filippov  * . opcodes - information about individual instructions
54*7f709ce7SMax Filippov  * . operands - information about register and immediate instruction operands
55*7f709ce7SMax Filippov  * . stateOperands - information about processor state instruction operands
56*7f709ce7SMax Filippov  * . interfaceOperands - information about interface instruction operands
57*7f709ce7SMax Filippov  * . register files - register file information
58*7f709ce7SMax Filippov  * . processor states - internal processor state information
59*7f709ce7SMax Filippov  * . system registers - "special registers" and "user registers"
60*7f709ce7SMax Filippov  * . interfaces - TIE interfaces that are external to the processor
61*7f709ce7SMax Filippov  * . functional units - TIE shared functions
62*7f709ce7SMax Filippov  *
63*7f709ce7SMax Filippov  * The interface defines a set of functions to access each data type.
64*7f709ce7SMax Filippov  * With the exception of the instruction buffer, the internal
65*7f709ce7SMax Filippov  * representations of the data structures are hidden. All accesses must
66*7f709ce7SMax Filippov  * be made through the functions defined here.
67*7f709ce7SMax Filippov  */
68*7f709ce7SMax Filippov 
69*7f709ce7SMax Filippov typedef struct xtensa_isa_opaque { int unused; } *xtensa_isa;
70*7f709ce7SMax Filippov 
71*7f709ce7SMax Filippov 
72*7f709ce7SMax Filippov /*
73*7f709ce7SMax Filippov  * Most of the Xtensa ISA entities (e.g., opcodes, regfiles, etc.) are
74*7f709ce7SMax Filippov  * represented here using sequential integers beginning with 0. The
75*7f709ce7SMax Filippov  * specific values are only fixed for a particular instantiation of an
76*7f709ce7SMax Filippov  * xtensa_isa structure, so these values should only be used
77*7f709ce7SMax Filippov  * internally.
78*7f709ce7SMax Filippov  */
79*7f709ce7SMax Filippov 
80*7f709ce7SMax Filippov typedef int xtensa_opcode;
81*7f709ce7SMax Filippov typedef int xtensa_format;
82*7f709ce7SMax Filippov typedef int xtensa_regfile;
83*7f709ce7SMax Filippov typedef int xtensa_state;
84*7f709ce7SMax Filippov typedef int xtensa_sysreg;
85*7f709ce7SMax Filippov typedef int xtensa_interface;
86*7f709ce7SMax Filippov typedef int xtensa_funcUnit;
87*7f709ce7SMax Filippov 
88*7f709ce7SMax Filippov 
89*7f709ce7SMax Filippov /* Define a unique value for undefined items. */
90*7f709ce7SMax Filippov 
91*7f709ce7SMax Filippov #define XTENSA_UNDEFINED -1
92*7f709ce7SMax Filippov 
93*7f709ce7SMax Filippov 
94*7f709ce7SMax Filippov /*
95*7f709ce7SMax Filippov  * Overview of using this interface to decode/encode instructions:
96*7f709ce7SMax Filippov  *
97*7f709ce7SMax Filippov  * Each Xtensa instruction is associated with a particular instruction
98*7f709ce7SMax Filippov  * format, where the format defines a fixed number of slots for
99*7f709ce7SMax Filippov  * operations. The formats for the core Xtensa ISA have only one slot,
100*7f709ce7SMax Filippov  * but FLIX instructions may have multiple slots. Within each slot,
101*7f709ce7SMax Filippov  * there is a single opcode and some number of associated operands.
102*7f709ce7SMax Filippov  *
103*7f709ce7SMax Filippov  * The encoding and decoding functions operate on instruction buffers,
104*7f709ce7SMax Filippov  * not on the raw bytes of the instructions. The same instruction
105*7f709ce7SMax Filippov  * buffer data structure is used for both entire instructions and
106*7f709ce7SMax Filippov  * individual slots in those instructions -- the contents of a slot need
107*7f709ce7SMax Filippov  * to be extracted from or inserted into the buffer for the instruction
108*7f709ce7SMax Filippov  * as a whole.
109*7f709ce7SMax Filippov  *
110*7f709ce7SMax Filippov  * Decoding an instruction involves first finding the format, which
111*7f709ce7SMax Filippov  * identifies the number of slots, and then decoding each slot
112*7f709ce7SMax Filippov  * separately. A slot is decoded by finding the opcode and then using
113*7f709ce7SMax Filippov  * the opcode to determine how many operands there are. For example:
114*7f709ce7SMax Filippov  *
115*7f709ce7SMax Filippov  * xtensa_insnbuf_from_chars
116*7f709ce7SMax Filippov  * xtensa_format_decode
117*7f709ce7SMax Filippov  * for each slot {
118*7f709ce7SMax Filippov  *   xtensa_format_get_slot
119*7f709ce7SMax Filippov  *   xtensa_opcode_decode
120*7f709ce7SMax Filippov  *   for each operand {
121*7f709ce7SMax Filippov  *     xtensa_operand_get_field
122*7f709ce7SMax Filippov  *     xtensa_operand_decode
123*7f709ce7SMax Filippov  *   }
124*7f709ce7SMax Filippov  * }
125*7f709ce7SMax Filippov  *
126*7f709ce7SMax Filippov  * Encoding an instruction is roughly the same procedure in reverse:
127*7f709ce7SMax Filippov  *
128*7f709ce7SMax Filippov  * xtensa_format_encode
129*7f709ce7SMax Filippov  * for each slot {
130*7f709ce7SMax Filippov  *   xtensa_opcode_encode
131*7f709ce7SMax Filippov  *   for each operand {
132*7f709ce7SMax Filippov  *     xtensa_operand_encode
133*7f709ce7SMax Filippov  *     xtensa_operand_set_field
134*7f709ce7SMax Filippov  *   }
135*7f709ce7SMax Filippov  *   xtensa_format_set_slot
136*7f709ce7SMax Filippov  * }
137*7f709ce7SMax Filippov  * xtensa_insnbuf_to_chars
138*7f709ce7SMax Filippov  */
139*7f709ce7SMax Filippov 
140*7f709ce7SMax Filippov 
141*7f709ce7SMax Filippov /* Error handling. */
142*7f709ce7SMax Filippov 
143*7f709ce7SMax Filippov /*
144*7f709ce7SMax Filippov  * Error codes. The code for the most recent error condition can be
145*7f709ce7SMax Filippov  * retrieved with the "errno" function. For any result other than
146*7f709ce7SMax Filippov  * xtensa_isa_ok, an error message containing additional information
147*7f709ce7SMax Filippov  * about the problem can be retrieved using the "error_msg" function.
148*7f709ce7SMax Filippov  * The error messages are stored in an internal buffer, which should
149*7f709ce7SMax Filippov  * not be freed and may be overwritten by subsequent operations.
150*7f709ce7SMax Filippov  */
151*7f709ce7SMax Filippov 
152*7f709ce7SMax Filippov typedef enum xtensa_isa_status_enum {
153*7f709ce7SMax Filippov     xtensa_isa_ok = 0,
154*7f709ce7SMax Filippov     xtensa_isa_bad_format,
155*7f709ce7SMax Filippov     xtensa_isa_bad_slot,
156*7f709ce7SMax Filippov     xtensa_isa_bad_opcode,
157*7f709ce7SMax Filippov     xtensa_isa_bad_operand,
158*7f709ce7SMax Filippov     xtensa_isa_bad_field,
159*7f709ce7SMax Filippov     xtensa_isa_bad_iclass,
160*7f709ce7SMax Filippov     xtensa_isa_bad_regfile,
161*7f709ce7SMax Filippov     xtensa_isa_bad_sysreg,
162*7f709ce7SMax Filippov     xtensa_isa_bad_state,
163*7f709ce7SMax Filippov     xtensa_isa_bad_interface,
164*7f709ce7SMax Filippov     xtensa_isa_bad_funcUnit,
165*7f709ce7SMax Filippov     xtensa_isa_wrong_slot,
166*7f709ce7SMax Filippov     xtensa_isa_no_field,
167*7f709ce7SMax Filippov     xtensa_isa_out_of_memory,
168*7f709ce7SMax Filippov     xtensa_isa_buffer_overflow,
169*7f709ce7SMax Filippov     xtensa_isa_internal_error,
170*7f709ce7SMax Filippov     xtensa_isa_bad_value
171*7f709ce7SMax Filippov } xtensa_isa_status;
172*7f709ce7SMax Filippov 
173*7f709ce7SMax Filippov xtensa_isa_status xtensa_isa_errno(xtensa_isa isa);
174*7f709ce7SMax Filippov 
175*7f709ce7SMax Filippov char *xtensa_isa_error_msg(xtensa_isa isa);
176*7f709ce7SMax Filippov 
177*7f709ce7SMax Filippov 
178*7f709ce7SMax Filippov 
179*7f709ce7SMax Filippov /* Instruction buffers. */
180*7f709ce7SMax Filippov 
181*7f709ce7SMax Filippov typedef uint32_t xtensa_insnbuf_word;
182*7f709ce7SMax Filippov typedef xtensa_insnbuf_word *xtensa_insnbuf;
183*7f709ce7SMax Filippov 
184*7f709ce7SMax Filippov 
185*7f709ce7SMax Filippov /* Get the size in "insnbuf_words" of the xtensa_insnbuf array. */
186*7f709ce7SMax Filippov 
187*7f709ce7SMax Filippov int xtensa_insnbuf_size(xtensa_isa isa);
188*7f709ce7SMax Filippov 
189*7f709ce7SMax Filippov 
190*7f709ce7SMax Filippov /* Allocate an xtensa_insnbuf of the right size. */
191*7f709ce7SMax Filippov 
192*7f709ce7SMax Filippov xtensa_insnbuf xtensa_insnbuf_alloc(xtensa_isa isa);
193*7f709ce7SMax Filippov 
194*7f709ce7SMax Filippov 
195*7f709ce7SMax Filippov /* Release an xtensa_insnbuf. */
196*7f709ce7SMax Filippov 
197*7f709ce7SMax Filippov void xtensa_insnbuf_free(xtensa_isa isa, xtensa_insnbuf buf);
198*7f709ce7SMax Filippov 
199*7f709ce7SMax Filippov 
200*7f709ce7SMax Filippov /*
201*7f709ce7SMax Filippov  * Conversion between raw memory (char arrays) and our internal
202*7f709ce7SMax Filippov  * instruction representation. This is complicated by the Xtensa ISA's
203*7f709ce7SMax Filippov  * variable instruction lengths. When converting to chars, the buffer
204*7f709ce7SMax Filippov  * must contain a valid instruction so we know how many bytes to copy;
205*7f709ce7SMax Filippov  * thus, the "to_chars" function returns the number of bytes copied or
206*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error. The "from_chars" function first reads the
207*7f709ce7SMax Filippov  * minimal number of bytes required to decode the instruction length and
208*7f709ce7SMax Filippov  * then proceeds to copy the entire instruction into the buffer; if the
209*7f709ce7SMax Filippov  * memory does not contain a valid instruction, it copies the maximum
210*7f709ce7SMax Filippov  * number of bytes required for the longest Xtensa instruction. The
211*7f709ce7SMax Filippov  * "num_chars" argument may be used to limit the number of bytes that
212*7f709ce7SMax Filippov  * can be read or written. Otherwise, if "num_chars" is zero, the
213*7f709ce7SMax Filippov  * functions may read or write past the end of the code.
214*7f709ce7SMax Filippov  */
215*7f709ce7SMax Filippov 
216*7f709ce7SMax Filippov int xtensa_insnbuf_to_chars(xtensa_isa isa, const xtensa_insnbuf insn,
217*7f709ce7SMax Filippov                             unsigned char *cp, int num_chars);
218*7f709ce7SMax Filippov 
219*7f709ce7SMax Filippov void xtensa_insnbuf_from_chars(xtensa_isa isa, xtensa_insnbuf insn,
220*7f709ce7SMax Filippov                                const unsigned char *cp, int num_chars);
221*7f709ce7SMax Filippov 
222*7f709ce7SMax Filippov 
223*7f709ce7SMax Filippov 
224*7f709ce7SMax Filippov /* ISA information. */
225*7f709ce7SMax Filippov 
226*7f709ce7SMax Filippov /* Initialize the ISA information. */
227*7f709ce7SMax Filippov 
228*7f709ce7SMax Filippov xtensa_isa xtensa_isa_init(void *xtensa_modules, xtensa_isa_status *errno_p,
229*7f709ce7SMax Filippov                            char **error_msg_p);
230*7f709ce7SMax Filippov 
231*7f709ce7SMax Filippov 
232*7f709ce7SMax Filippov /* Deallocate an xtensa_isa structure. */
233*7f709ce7SMax Filippov 
234*7f709ce7SMax Filippov void xtensa_isa_free(xtensa_isa isa);
235*7f709ce7SMax Filippov 
236*7f709ce7SMax Filippov 
237*7f709ce7SMax Filippov /* Get the maximum instruction size in bytes. */
238*7f709ce7SMax Filippov 
239*7f709ce7SMax Filippov int xtensa_isa_maxlength(xtensa_isa isa);
240*7f709ce7SMax Filippov 
241*7f709ce7SMax Filippov 
242*7f709ce7SMax Filippov /*
243*7f709ce7SMax Filippov  * Decode the length in bytes of an instruction in raw memory (not an
244*7f709ce7SMax Filippov  * insnbuf). This function reads only the minimal number of bytes
245*7f709ce7SMax Filippov  * required to decode the instruction length. Returns
246*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error.
247*7f709ce7SMax Filippov  */
248*7f709ce7SMax Filippov 
249*7f709ce7SMax Filippov int xtensa_isa_length_from_chars(xtensa_isa isa, const unsigned char *cp);
250*7f709ce7SMax Filippov 
251*7f709ce7SMax Filippov 
252*7f709ce7SMax Filippov /*
253*7f709ce7SMax Filippov  * Get the number of stages in the processor's pipeline. The pipeline
254*7f709ce7SMax Filippov  * stage values returned by other functions in this library will range
255*7f709ce7SMax Filippov  * from 0 to N-1, where N is the value returned by this function.
256*7f709ce7SMax Filippov  * Note that the stage numbers used here may not correspond to the
257*7f709ce7SMax Filippov  * actual processor hardware, e.g., the hardware may have additional
258*7f709ce7SMax Filippov  * stages before stage 0. Returns XTENSA_UNDEFINED on error.
259*7f709ce7SMax Filippov  */
260*7f709ce7SMax Filippov 
261*7f709ce7SMax Filippov int xtensa_isa_num_pipe_stages(xtensa_isa isa);
262*7f709ce7SMax Filippov 
263*7f709ce7SMax Filippov 
264*7f709ce7SMax Filippov /* Get the number of various entities that are defined for this processor. */
265*7f709ce7SMax Filippov 
266*7f709ce7SMax Filippov int xtensa_isa_num_formats(xtensa_isa isa);
267*7f709ce7SMax Filippov 
268*7f709ce7SMax Filippov int xtensa_isa_num_opcodes(xtensa_isa isa);
269*7f709ce7SMax Filippov 
270*7f709ce7SMax Filippov int xtensa_isa_num_regfiles(xtensa_isa isa);
271*7f709ce7SMax Filippov 
272*7f709ce7SMax Filippov int xtensa_isa_num_states(xtensa_isa isa);
273*7f709ce7SMax Filippov 
274*7f709ce7SMax Filippov int xtensa_isa_num_sysregs(xtensa_isa isa);
275*7f709ce7SMax Filippov 
276*7f709ce7SMax Filippov int xtensa_isa_num_interfaces(xtensa_isa isa);
277*7f709ce7SMax Filippov 
278*7f709ce7SMax Filippov int xtensa_isa_num_funcUnits(xtensa_isa isa);
279*7f709ce7SMax Filippov 
280*7f709ce7SMax Filippov 
281*7f709ce7SMax Filippov 
282*7f709ce7SMax Filippov /* Instruction formats. */
283*7f709ce7SMax Filippov 
284*7f709ce7SMax Filippov /* Get the name of a format. Returns null on error. */
285*7f709ce7SMax Filippov 
286*7f709ce7SMax Filippov const char *xtensa_format_name(xtensa_isa isa, xtensa_format fmt);
287*7f709ce7SMax Filippov 
288*7f709ce7SMax Filippov 
289*7f709ce7SMax Filippov /*
290*7f709ce7SMax Filippov  * Given a format name, return the format number. Returns
291*7f709ce7SMax Filippov  * XTENSA_UNDEFINED if the name is not a valid format.
292*7f709ce7SMax Filippov  */
293*7f709ce7SMax Filippov 
294*7f709ce7SMax Filippov xtensa_format xtensa_format_lookup(xtensa_isa isa, const char *fmtname);
295*7f709ce7SMax Filippov 
296*7f709ce7SMax Filippov 
297*7f709ce7SMax Filippov /*
298*7f709ce7SMax Filippov  * Decode the instruction format from a binary instruction buffer.
299*7f709ce7SMax Filippov  * Returns XTENSA_UNDEFINED if the format is not recognized.
300*7f709ce7SMax Filippov  */
301*7f709ce7SMax Filippov 
302*7f709ce7SMax Filippov xtensa_format xtensa_format_decode(xtensa_isa isa, const xtensa_insnbuf insn);
303*7f709ce7SMax Filippov 
304*7f709ce7SMax Filippov 
305*7f709ce7SMax Filippov /*
306*7f709ce7SMax Filippov  * Set the instruction format field(s) in a binary instruction buffer.
307*7f709ce7SMax Filippov  * All the other fields are set to zero. Returns non-zero on error.
308*7f709ce7SMax Filippov  */
309*7f709ce7SMax Filippov 
310*7f709ce7SMax Filippov int xtensa_format_encode(xtensa_isa isa, xtensa_format fmt,
311*7f709ce7SMax Filippov                          xtensa_insnbuf insn);
312*7f709ce7SMax Filippov 
313*7f709ce7SMax Filippov 
314*7f709ce7SMax Filippov /*
315*7f709ce7SMax Filippov  * Find the length (in bytes) of an instruction. Returns
316*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error.
317*7f709ce7SMax Filippov  */
318*7f709ce7SMax Filippov 
319*7f709ce7SMax Filippov int xtensa_format_length(xtensa_isa isa, xtensa_format fmt);
320*7f709ce7SMax Filippov 
321*7f709ce7SMax Filippov 
322*7f709ce7SMax Filippov /*
323*7f709ce7SMax Filippov  * Get the number of slots in an instruction. Returns XTENSA_UNDEFINED
324*7f709ce7SMax Filippov  * on error.
325*7f709ce7SMax Filippov  */
326*7f709ce7SMax Filippov 
327*7f709ce7SMax Filippov int xtensa_format_num_slots(xtensa_isa isa, xtensa_format fmt);
328*7f709ce7SMax Filippov 
329*7f709ce7SMax Filippov 
330*7f709ce7SMax Filippov /*
331*7f709ce7SMax Filippov  * Get the opcode for a no-op in a particular slot.
332*7f709ce7SMax Filippov  * Returns XTENSA_UNDEFINED on error.
333*7f709ce7SMax Filippov  */
334*7f709ce7SMax Filippov 
335*7f709ce7SMax Filippov xtensa_opcode xtensa_format_slot_nop_opcode(xtensa_isa isa, xtensa_format fmt,
336*7f709ce7SMax Filippov                                             int slot);
337*7f709ce7SMax Filippov 
338*7f709ce7SMax Filippov 
339*7f709ce7SMax Filippov /*
340*7f709ce7SMax Filippov  * Get the bits for a specified slot out of an insnbuf for the
341*7f709ce7SMax Filippov  * instruction as a whole and put them into an insnbuf for that one
342*7f709ce7SMax Filippov  * slot, and do the opposite to set a slot. Return non-zero on error.
343*7f709ce7SMax Filippov  */
344*7f709ce7SMax Filippov 
345*7f709ce7SMax Filippov int xtensa_format_get_slot(xtensa_isa isa, xtensa_format fmt, int slot,
346*7f709ce7SMax Filippov                            const xtensa_insnbuf insn, xtensa_insnbuf slotbuf);
347*7f709ce7SMax Filippov 
348*7f709ce7SMax Filippov int xtensa_format_set_slot(xtensa_isa isa, xtensa_format fmt, int slot,
349*7f709ce7SMax Filippov                            xtensa_insnbuf insn, const xtensa_insnbuf slotbuf);
350*7f709ce7SMax Filippov 
351*7f709ce7SMax Filippov 
352*7f709ce7SMax Filippov 
353*7f709ce7SMax Filippov /* Opcode information. */
354*7f709ce7SMax Filippov 
355*7f709ce7SMax Filippov /*
356*7f709ce7SMax Filippov  * Translate a mnemonic name to an opcode. Returns XTENSA_UNDEFINED if
357*7f709ce7SMax Filippov  * the name is not a valid opcode mnemonic.
358*7f709ce7SMax Filippov  */
359*7f709ce7SMax Filippov 
360*7f709ce7SMax Filippov xtensa_opcode xtensa_opcode_lookup(xtensa_isa isa, const char *opname);
361*7f709ce7SMax Filippov 
362*7f709ce7SMax Filippov 
363*7f709ce7SMax Filippov /*
364*7f709ce7SMax Filippov  * Decode the opcode for one instruction slot from a binary instruction
365*7f709ce7SMax Filippov  * buffer. Returns the opcode or XTENSA_UNDEFINED if the opcode is
366*7f709ce7SMax Filippov  * illegal.
367*7f709ce7SMax Filippov  */
368*7f709ce7SMax Filippov 
369*7f709ce7SMax Filippov xtensa_opcode xtensa_opcode_decode(xtensa_isa isa, xtensa_format fmt, int slot,
370*7f709ce7SMax Filippov                                    const xtensa_insnbuf slotbuf);
371*7f709ce7SMax Filippov 
372*7f709ce7SMax Filippov 
373*7f709ce7SMax Filippov /*
374*7f709ce7SMax Filippov  * Set the opcode field(s) for an instruction slot. All other fields
375*7f709ce7SMax Filippov  * in the slot are set to zero. Returns non-zero if the opcode cannot
376*7f709ce7SMax Filippov  * be encoded.
377*7f709ce7SMax Filippov  */
378*7f709ce7SMax Filippov 
379*7f709ce7SMax Filippov int xtensa_opcode_encode(xtensa_isa isa, xtensa_format fmt, int slot,
380*7f709ce7SMax Filippov                          xtensa_insnbuf slotbuf, xtensa_opcode opc);
381*7f709ce7SMax Filippov 
382*7f709ce7SMax Filippov 
383*7f709ce7SMax Filippov /* Get the mnemonic name for an opcode. Returns null on error. */
384*7f709ce7SMax Filippov 
385*7f709ce7SMax Filippov const char *xtensa_opcode_name(xtensa_isa isa, xtensa_opcode opc);
386*7f709ce7SMax Filippov 
387*7f709ce7SMax Filippov 
388*7f709ce7SMax Filippov /* Check various properties of opcodes. These functions return 0 if
389*7f709ce7SMax Filippov  * the condition is false, 1 if the condition is true, and
390*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error. The instructions are classified as
391*7f709ce7SMax Filippov  * follows:
392*7f709ce7SMax Filippov  *
393*7f709ce7SMax Filippov  * branch: conditional branch; may fall through to next instruction (B*)
394*7f709ce7SMax Filippov  * jump: unconditional branch (J, JX, RET*, RF*)
395*7f709ce7SMax Filippov  * loop: zero-overhead loop (LOOP*)
396*7f709ce7SMax Filippov  * call: unconditional call; control returns to next instruction (CALL*)
397*7f709ce7SMax Filippov  *
398*7f709ce7SMax Filippov  * For the opcodes that affect control flow in some way, the branch
399*7f709ce7SMax Filippov  * target may be specified by an immediate operand or it may be an
400*7f709ce7SMax Filippov  * address stored in a register. You can distinguish these by
401*7f709ce7SMax Filippov  * checking if the instruction has a PC-relative immediate
402*7f709ce7SMax Filippov  * operand.
403*7f709ce7SMax Filippov  */
404*7f709ce7SMax Filippov 
405*7f709ce7SMax Filippov int xtensa_opcode_is_branch(xtensa_isa isa, xtensa_opcode opc);
406*7f709ce7SMax Filippov 
407*7f709ce7SMax Filippov int xtensa_opcode_is_jump(xtensa_isa isa, xtensa_opcode opc);
408*7f709ce7SMax Filippov 
409*7f709ce7SMax Filippov int xtensa_opcode_is_loop(xtensa_isa isa, xtensa_opcode opc);
410*7f709ce7SMax Filippov 
411*7f709ce7SMax Filippov int xtensa_opcode_is_call(xtensa_isa isa, xtensa_opcode opc);
412*7f709ce7SMax Filippov 
413*7f709ce7SMax Filippov 
414*7f709ce7SMax Filippov /*
415*7f709ce7SMax Filippov  * Find the number of ordinary operands, state operands, and interface
416*7f709ce7SMax Filippov  * operands for an instruction. These return XTENSA_UNDEFINED on
417*7f709ce7SMax Filippov  * error.
418*7f709ce7SMax Filippov  */
419*7f709ce7SMax Filippov 
420*7f709ce7SMax Filippov int xtensa_opcode_num_operands(xtensa_isa isa, xtensa_opcode opc);
421*7f709ce7SMax Filippov 
422*7f709ce7SMax Filippov int xtensa_opcode_num_stateOperands(xtensa_isa isa, xtensa_opcode opc);
423*7f709ce7SMax Filippov 
424*7f709ce7SMax Filippov int xtensa_opcode_num_interfaceOperands(xtensa_isa isa, xtensa_opcode opc);
425*7f709ce7SMax Filippov 
426*7f709ce7SMax Filippov 
427*7f709ce7SMax Filippov /*
428*7f709ce7SMax Filippov  * Get functional unit usage requirements for an opcode. Each "use"
429*7f709ce7SMax Filippov  * is identified by a <functional unit, pipeline stage> pair. The
430*7f709ce7SMax Filippov  * "num_funcUnit_uses" function returns the number of these "uses" or
431*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error. The "funcUnit_use" function returns
432*7f709ce7SMax Filippov  * a pointer to a "use" pair or null on error.
433*7f709ce7SMax Filippov  */
434*7f709ce7SMax Filippov 
435*7f709ce7SMax Filippov typedef struct xtensa_funcUnit_use_struct {
436*7f709ce7SMax Filippov     xtensa_funcUnit unit;
437*7f709ce7SMax Filippov     int stage;
438*7f709ce7SMax Filippov } xtensa_funcUnit_use;
439*7f709ce7SMax Filippov 
440*7f709ce7SMax Filippov int xtensa_opcode_num_funcUnit_uses(xtensa_isa isa, xtensa_opcode opc);
441*7f709ce7SMax Filippov 
442*7f709ce7SMax Filippov xtensa_funcUnit_use *xtensa_opcode_funcUnit_use(xtensa_isa isa,
443*7f709ce7SMax Filippov                                                 xtensa_opcode opc, int u);
444*7f709ce7SMax Filippov 
445*7f709ce7SMax Filippov 
446*7f709ce7SMax Filippov 
447*7f709ce7SMax Filippov /* Operand information. */
448*7f709ce7SMax Filippov 
449*7f709ce7SMax Filippov /* Get the name of an operand. Returns null on error. */
450*7f709ce7SMax Filippov 
451*7f709ce7SMax Filippov const char *xtensa_operand_name(xtensa_isa isa, xtensa_opcode opc, int opnd);
452*7f709ce7SMax Filippov 
453*7f709ce7SMax Filippov 
454*7f709ce7SMax Filippov /*
455*7f709ce7SMax Filippov  * Some operands are "invisible", i.e., not explicitly specified in
456*7f709ce7SMax Filippov  * assembly language. When assembling an instruction, you need not set
457*7f709ce7SMax Filippov  * the values of invisible operands, since they are either hardwired or
458*7f709ce7SMax Filippov  * derived from other field values. The values of invisible operands
459*7f709ce7SMax Filippov  * can be examined in the same way as other operands, but remember that
460*7f709ce7SMax Filippov  * an invisible operand may get its value from another visible one, so
461*7f709ce7SMax Filippov  * the entire instruction must be available before examining the
462*7f709ce7SMax Filippov  * invisible operand values. This function returns 1 if an operand is
463*7f709ce7SMax Filippov  * visible, 0 if it is invisible, or XTENSA_UNDEFINED on error. Note
464*7f709ce7SMax Filippov  * that whether an operand is visible is orthogonal to whether it is
465*7f709ce7SMax Filippov  * "implicit", i.e., whether it is encoded in a field in the
466*7f709ce7SMax Filippov  * instruction.
467*7f709ce7SMax Filippov  */
468*7f709ce7SMax Filippov 
469*7f709ce7SMax Filippov int xtensa_operand_is_visible(xtensa_isa isa, xtensa_opcode opc, int opnd);
470*7f709ce7SMax Filippov 
471*7f709ce7SMax Filippov 
472*7f709ce7SMax Filippov /*
473*7f709ce7SMax Filippov  * Check if an operand is an input ('i'), output ('o'), or inout ('m')
474*7f709ce7SMax Filippov  * operand. Note: The output operand of a conditional assignment
475*7f709ce7SMax Filippov  * (e.g., movnez) appears here as an inout ('m') even if it is declared
476*7f709ce7SMax Filippov  * in the TIE code as an output ('o'); this allows the compiler to
477*7f709ce7SMax Filippov  * properly handle register allocation for conditional assignments.
478*7f709ce7SMax Filippov  * Returns 0 on error.
479*7f709ce7SMax Filippov  */
480*7f709ce7SMax Filippov 
481*7f709ce7SMax Filippov char xtensa_operand_inout(xtensa_isa isa, xtensa_opcode opc, int opnd);
482*7f709ce7SMax Filippov 
483*7f709ce7SMax Filippov 
484*7f709ce7SMax Filippov /*
485*7f709ce7SMax Filippov  * Get and set the raw (encoded) value of the field for the specified
486*7f709ce7SMax Filippov  * operand. The "set" function does not check if the value fits in the
487*7f709ce7SMax Filippov  * field; that is done by the "encode" function below. Both of these
488*7f709ce7SMax Filippov  * functions return non-zero on error, e.g., if the field is not defined
489*7f709ce7SMax Filippov  * for the specified slot.
490*7f709ce7SMax Filippov  */
491*7f709ce7SMax Filippov 
492*7f709ce7SMax Filippov int xtensa_operand_get_field(xtensa_isa isa, xtensa_opcode opc, int opnd,
493*7f709ce7SMax Filippov                              xtensa_format fmt, int slot,
494*7f709ce7SMax Filippov                              const xtensa_insnbuf slotbuf, uint32_t *valp);
495*7f709ce7SMax Filippov 
496*7f709ce7SMax Filippov int xtensa_operand_set_field(xtensa_isa isa, xtensa_opcode opc, int opnd,
497*7f709ce7SMax Filippov                              xtensa_format fmt, int slot,
498*7f709ce7SMax Filippov                              xtensa_insnbuf slotbuf, uint32_t val);
499*7f709ce7SMax Filippov 
500*7f709ce7SMax Filippov 
501*7f709ce7SMax Filippov /*
502*7f709ce7SMax Filippov  * Encode and decode operands. The raw bits in the operand field may
503*7f709ce7SMax Filippov  * be encoded in a variety of different ways. These functions hide
504*7f709ce7SMax Filippov  * the details of that encoding. The result values are returned through
505*7f709ce7SMax Filippov  * the argument pointer. The return value is non-zero on error.
506*7f709ce7SMax Filippov  */
507*7f709ce7SMax Filippov 
508*7f709ce7SMax Filippov int xtensa_operand_encode(xtensa_isa isa, xtensa_opcode opc, int opnd,
509*7f709ce7SMax Filippov                           uint32_t *valp);
510*7f709ce7SMax Filippov 
511*7f709ce7SMax Filippov int xtensa_operand_decode(xtensa_isa isa, xtensa_opcode opc, int opnd,
512*7f709ce7SMax Filippov                           uint32_t *valp);
513*7f709ce7SMax Filippov 
514*7f709ce7SMax Filippov 
515*7f709ce7SMax Filippov /*
516*7f709ce7SMax Filippov  * An operand may be either a register operand or an immediate of some
517*7f709ce7SMax Filippov  * sort (e.g., PC-relative or not). The "is_register" function returns
518*7f709ce7SMax Filippov  * 0 if the operand is an immediate, 1 if it is a register, and
519*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error. The "regfile" function returns the
520*7f709ce7SMax Filippov  * regfile for a register operand, or XTENSA_UNDEFINED on error.
521*7f709ce7SMax Filippov  */
522*7f709ce7SMax Filippov 
523*7f709ce7SMax Filippov int xtensa_operand_is_register(xtensa_isa isa, xtensa_opcode opc, int opnd);
524*7f709ce7SMax Filippov 
525*7f709ce7SMax Filippov xtensa_regfile xtensa_operand_regfile(xtensa_isa isa, xtensa_opcode opc,
526*7f709ce7SMax Filippov                                       int opnd);
527*7f709ce7SMax Filippov 
528*7f709ce7SMax Filippov 
529*7f709ce7SMax Filippov /*
530*7f709ce7SMax Filippov  * Register operands may span multiple consecutive registers, e.g., a
531*7f709ce7SMax Filippov  * 64-bit data type may occupy two 32-bit registers. Only the first
532*7f709ce7SMax Filippov  * register is encoded in the operand field. This function specifies
533*7f709ce7SMax Filippov  * the number of consecutive registers occupied by this operand. For
534*7f709ce7SMax Filippov  * non-register operands, the return value is undefined. Returns
535*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error.
536*7f709ce7SMax Filippov  */
537*7f709ce7SMax Filippov 
538*7f709ce7SMax Filippov int xtensa_operand_num_regs(xtensa_isa isa, xtensa_opcode opc, int opnd);
539*7f709ce7SMax Filippov 
540*7f709ce7SMax Filippov 
541*7f709ce7SMax Filippov /*
542*7f709ce7SMax Filippov  * Some register operands do not completely identify the register being
543*7f709ce7SMax Filippov  * accessed. For example, the operand value may be added to an internal
544*7f709ce7SMax Filippov  * state value. By definition, this implies that the corresponding
545*7f709ce7SMax Filippov  * regfile is not allocatable. Unknown registers should generally be
546*7f709ce7SMax Filippov  * treated with worst-case assumptions. The function returns 0 if the
547*7f709ce7SMax Filippov  * register value is unknown, 1 if known, and XTENSA_UNDEFINED on
548*7f709ce7SMax Filippov  * error.
549*7f709ce7SMax Filippov  */
550*7f709ce7SMax Filippov 
551*7f709ce7SMax Filippov int xtensa_operand_is_known_reg(xtensa_isa isa, xtensa_opcode opc, int opnd);
552*7f709ce7SMax Filippov 
553*7f709ce7SMax Filippov 
554*7f709ce7SMax Filippov /*
555*7f709ce7SMax Filippov  * Check if an immediate operand is PC-relative. Returns 0 for register
556*7f709ce7SMax Filippov  * operands and non-PC-relative immediates, 1 for PC-relative
557*7f709ce7SMax Filippov  * immediates, and XTENSA_UNDEFINED on error.
558*7f709ce7SMax Filippov  */
559*7f709ce7SMax Filippov 
560*7f709ce7SMax Filippov int xtensa_operand_is_PCrelative(xtensa_isa isa, xtensa_opcode opc, int opnd);
561*7f709ce7SMax Filippov 
562*7f709ce7SMax Filippov 
563*7f709ce7SMax Filippov /*
564*7f709ce7SMax Filippov  * For PC-relative offset operands, the interpretation of the offset may
565*7f709ce7SMax Filippov  * vary between opcodes, e.g., is it relative to the current PC or that
566*7f709ce7SMax Filippov  * of the next instruction?  The following functions are defined to
567*7f709ce7SMax Filippov  * perform PC-relative relocations and to undo them (as in the
568*7f709ce7SMax Filippov  * disassembler). The "do_reloc" function takes the desired address
569*7f709ce7SMax Filippov  * value and the PC of the current instruction and sets the value to the
570*7f709ce7SMax Filippov  * corresponding PC-relative offset (which can then be encoded and
571*7f709ce7SMax Filippov  * stored into the operand field). The "undo_reloc" function takes the
572*7f709ce7SMax Filippov  * unencoded offset value and the current PC and sets the value to the
573*7f709ce7SMax Filippov  * appropriate address. The return values are non-zero on error. Note
574*7f709ce7SMax Filippov  * that these functions do not replace the encode/decode functions; the
575*7f709ce7SMax Filippov  * operands must be encoded/decoded separately and the encode functions
576*7f709ce7SMax Filippov  * are responsible for detecting invalid operand values.
577*7f709ce7SMax Filippov  */
578*7f709ce7SMax Filippov 
579*7f709ce7SMax Filippov int xtensa_operand_do_reloc(xtensa_isa isa, xtensa_opcode opc, int opnd,
580*7f709ce7SMax Filippov                             uint32_t *valp, uint32_t pc);
581*7f709ce7SMax Filippov 
582*7f709ce7SMax Filippov int xtensa_operand_undo_reloc(xtensa_isa isa, xtensa_opcode opc, int opnd,
583*7f709ce7SMax Filippov                               uint32_t *valp, uint32_t pc);
584*7f709ce7SMax Filippov 
585*7f709ce7SMax Filippov 
586*7f709ce7SMax Filippov 
587*7f709ce7SMax Filippov /* State Operands. */
588*7f709ce7SMax Filippov 
589*7f709ce7SMax Filippov /*
590*7f709ce7SMax Filippov  * Get the state accessed by a state operand. Returns XTENSA_UNDEFINED
591*7f709ce7SMax Filippov  * on error.
592*7f709ce7SMax Filippov  */
593*7f709ce7SMax Filippov 
594*7f709ce7SMax Filippov xtensa_state xtensa_stateOperand_state(xtensa_isa isa, xtensa_opcode opc,
595*7f709ce7SMax Filippov                                        int stOp);
596*7f709ce7SMax Filippov 
597*7f709ce7SMax Filippov 
598*7f709ce7SMax Filippov /*
599*7f709ce7SMax Filippov  * Check if a state operand is an input ('i'), output ('o'), or inout
600*7f709ce7SMax Filippov  * ('m') operand. Returns 0 on error.
601*7f709ce7SMax Filippov  */
602*7f709ce7SMax Filippov 
603*7f709ce7SMax Filippov char xtensa_stateOperand_inout(xtensa_isa isa, xtensa_opcode opc, int stOp);
604*7f709ce7SMax Filippov 
605*7f709ce7SMax Filippov 
606*7f709ce7SMax Filippov 
607*7f709ce7SMax Filippov /* Interface Operands. */
608*7f709ce7SMax Filippov 
609*7f709ce7SMax Filippov /*
610*7f709ce7SMax Filippov  * Get the external interface accessed by an interface operand.
611*7f709ce7SMax Filippov  * Returns XTENSA_UNDEFINED on error.
612*7f709ce7SMax Filippov  */
613*7f709ce7SMax Filippov 
614*7f709ce7SMax Filippov xtensa_interface xtensa_interfaceOperand_interface(xtensa_isa isa,
615*7f709ce7SMax Filippov                                                    xtensa_opcode opc,
616*7f709ce7SMax Filippov                                                    int ifOp);
617*7f709ce7SMax Filippov 
618*7f709ce7SMax Filippov 
619*7f709ce7SMax Filippov 
620*7f709ce7SMax Filippov /* Register Files. */
621*7f709ce7SMax Filippov 
622*7f709ce7SMax Filippov /*
623*7f709ce7SMax Filippov  * Regfiles include both "real" regfiles and "views", where a view
624*7f709ce7SMax Filippov  * allows a group of adjacent registers in a real "parent" regfile to be
625*7f709ce7SMax Filippov  * viewed as a single register. A regfile view has all the same
626*7f709ce7SMax Filippov  * properties as its parent except for its (long) name, bit width, number
627*7f709ce7SMax Filippov  * of entries, and default ctype. You can use the parent function to
628*7f709ce7SMax Filippov  * distinguish these two classes.
629*7f709ce7SMax Filippov  */
630*7f709ce7SMax Filippov 
631*7f709ce7SMax Filippov /*
632*7f709ce7SMax Filippov  * Look up a regfile by either its name or its abbreviated "short name".
633*7f709ce7SMax Filippov  * Returns XTENSA_UNDEFINED on error. The "lookup_shortname" function
634*7f709ce7SMax Filippov  * ignores "view" regfiles since they always have the same shortname as
635*7f709ce7SMax Filippov  * their parents.
636*7f709ce7SMax Filippov  */
637*7f709ce7SMax Filippov 
638*7f709ce7SMax Filippov xtensa_regfile xtensa_regfile_lookup(xtensa_isa isa, const char *name);
639*7f709ce7SMax Filippov 
640*7f709ce7SMax Filippov xtensa_regfile xtensa_regfile_lookup_shortname(xtensa_isa isa,
641*7f709ce7SMax Filippov                                                const char *shortname);
642*7f709ce7SMax Filippov 
643*7f709ce7SMax Filippov 
644*7f709ce7SMax Filippov /*
645*7f709ce7SMax Filippov  * Get the name or abbreviated "short name" of a regfile.
646*7f709ce7SMax Filippov  * Returns null on error.
647*7f709ce7SMax Filippov  */
648*7f709ce7SMax Filippov 
649*7f709ce7SMax Filippov const char *xtensa_regfile_name(xtensa_isa isa, xtensa_regfile rf);
650*7f709ce7SMax Filippov 
651*7f709ce7SMax Filippov const char *xtensa_regfile_shortname(xtensa_isa isa, xtensa_regfile rf);
652*7f709ce7SMax Filippov 
653*7f709ce7SMax Filippov 
654*7f709ce7SMax Filippov /*
655*7f709ce7SMax Filippov  * Get the parent regfile of a "view" regfile. If the regfile is not a
656*7f709ce7SMax Filippov  * view, the result is the same as the input parameter. Returns
657*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error.
658*7f709ce7SMax Filippov  */
659*7f709ce7SMax Filippov 
660*7f709ce7SMax Filippov xtensa_regfile xtensa_regfile_view_parent(xtensa_isa isa, xtensa_regfile rf);
661*7f709ce7SMax Filippov 
662*7f709ce7SMax Filippov 
663*7f709ce7SMax Filippov /*
664*7f709ce7SMax Filippov  * Get the bit width of a regfile or regfile view.
665*7f709ce7SMax Filippov  * Returns XTENSA_UNDEFINED on error.
666*7f709ce7SMax Filippov  */
667*7f709ce7SMax Filippov 
668*7f709ce7SMax Filippov int xtensa_regfile_num_bits(xtensa_isa isa, xtensa_regfile rf);
669*7f709ce7SMax Filippov 
670*7f709ce7SMax Filippov 
671*7f709ce7SMax Filippov /*
672*7f709ce7SMax Filippov  * Get the number of regfile entries. Returns XTENSA_UNDEFINED on
673*7f709ce7SMax Filippov  * error.
674*7f709ce7SMax Filippov  */
675*7f709ce7SMax Filippov 
676*7f709ce7SMax Filippov int xtensa_regfile_num_entries(xtensa_isa isa, xtensa_regfile rf);
677*7f709ce7SMax Filippov 
678*7f709ce7SMax Filippov 
679*7f709ce7SMax Filippov 
680*7f709ce7SMax Filippov /* Processor States. */
681*7f709ce7SMax Filippov 
682*7f709ce7SMax Filippov /* Look up a state by name. Returns XTENSA_UNDEFINED on error. */
683*7f709ce7SMax Filippov 
684*7f709ce7SMax Filippov xtensa_state xtensa_state_lookup(xtensa_isa isa, const char *name);
685*7f709ce7SMax Filippov 
686*7f709ce7SMax Filippov 
687*7f709ce7SMax Filippov /* Get the name for a processor state. Returns null on error. */
688*7f709ce7SMax Filippov 
689*7f709ce7SMax Filippov const char *xtensa_state_name(xtensa_isa isa, xtensa_state st);
690*7f709ce7SMax Filippov 
691*7f709ce7SMax Filippov 
692*7f709ce7SMax Filippov /*
693*7f709ce7SMax Filippov  * Get the bit width for a processor state.
694*7f709ce7SMax Filippov  * Returns XTENSA_UNDEFINED on error.
695*7f709ce7SMax Filippov  */
696*7f709ce7SMax Filippov 
697*7f709ce7SMax Filippov int xtensa_state_num_bits(xtensa_isa isa, xtensa_state st);
698*7f709ce7SMax Filippov 
699*7f709ce7SMax Filippov 
700*7f709ce7SMax Filippov /*
701*7f709ce7SMax Filippov  * Check if a state is exported from the processor core. Returns 0 if
702*7f709ce7SMax Filippov  * the condition is false, 1 if the condition is true, and
703*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error.
704*7f709ce7SMax Filippov  */
705*7f709ce7SMax Filippov 
706*7f709ce7SMax Filippov int xtensa_state_is_exported(xtensa_isa isa, xtensa_state st);
707*7f709ce7SMax Filippov 
708*7f709ce7SMax Filippov 
709*7f709ce7SMax Filippov /*
710*7f709ce7SMax Filippov  * Check for a "shared_or" state. Returns 0 if the condition is false,
711*7f709ce7SMax Filippov  * 1 if the condition is true, and XTENSA_UNDEFINED on error.
712*7f709ce7SMax Filippov  */
713*7f709ce7SMax Filippov 
714*7f709ce7SMax Filippov int xtensa_state_is_shared_or(xtensa_isa isa, xtensa_state st);
715*7f709ce7SMax Filippov 
716*7f709ce7SMax Filippov 
717*7f709ce7SMax Filippov 
718*7f709ce7SMax Filippov /* Sysregs ("special registers" and "user registers"). */
719*7f709ce7SMax Filippov 
720*7f709ce7SMax Filippov /*
721*7f709ce7SMax Filippov  * Look up a register by its number and whether it is a "user register"
722*7f709ce7SMax Filippov  * or a "special register". Returns XTENSA_UNDEFINED if the sysreg does
723*7f709ce7SMax Filippov  * not exist.
724*7f709ce7SMax Filippov  */
725*7f709ce7SMax Filippov 
726*7f709ce7SMax Filippov xtensa_sysreg xtensa_sysreg_lookup(xtensa_isa isa, int num, int is_user);
727*7f709ce7SMax Filippov 
728*7f709ce7SMax Filippov 
729*7f709ce7SMax Filippov /*
730*7f709ce7SMax Filippov  * Check if there exists a sysreg with a given name.
731*7f709ce7SMax Filippov  * If not, this function returns XTENSA_UNDEFINED.
732*7f709ce7SMax Filippov  */
733*7f709ce7SMax Filippov 
734*7f709ce7SMax Filippov xtensa_sysreg xtensa_sysreg_lookup_name(xtensa_isa isa, const char *name);
735*7f709ce7SMax Filippov 
736*7f709ce7SMax Filippov 
737*7f709ce7SMax Filippov /* Get the name of a sysreg. Returns null on error. */
738*7f709ce7SMax Filippov 
739*7f709ce7SMax Filippov const char *xtensa_sysreg_name(xtensa_isa isa, xtensa_sysreg sysreg);
740*7f709ce7SMax Filippov 
741*7f709ce7SMax Filippov 
742*7f709ce7SMax Filippov /* Get the register number. Returns XTENSA_UNDEFINED on error. */
743*7f709ce7SMax Filippov 
744*7f709ce7SMax Filippov int xtensa_sysreg_number(xtensa_isa isa, xtensa_sysreg sysreg);
745*7f709ce7SMax Filippov 
746*7f709ce7SMax Filippov 
747*7f709ce7SMax Filippov /*
748*7f709ce7SMax Filippov  * Check if a sysreg is a "special register" or a "user register".
749*7f709ce7SMax Filippov  * Returns 0 for special registers, 1 for user registers and
750*7f709ce7SMax Filippov  * XTENSA_UNDEFINED on error.
751*7f709ce7SMax Filippov  */
752*7f709ce7SMax Filippov 
753*7f709ce7SMax Filippov int xtensa_sysreg_is_user(xtensa_isa isa, xtensa_sysreg sysreg);
754*7f709ce7SMax Filippov 
755*7f709ce7SMax Filippov 
756*7f709ce7SMax Filippov 
757*7f709ce7SMax Filippov /* Interfaces. */
758*7f709ce7SMax Filippov 
759*7f709ce7SMax Filippov /*
760*7f709ce7SMax Filippov  * Find an interface by name. The return value is XTENSA_UNDEFINED if
761*7f709ce7SMax Filippov  * the specified interface is not found.
762*7f709ce7SMax Filippov  */
763*7f709ce7SMax Filippov 
764*7f709ce7SMax Filippov xtensa_interface xtensa_interface_lookup(xtensa_isa isa, const char *ifname);
765*7f709ce7SMax Filippov 
766*7f709ce7SMax Filippov 
767*7f709ce7SMax Filippov /* Get the name of an interface. Returns null on error. */
768*7f709ce7SMax Filippov 
769*7f709ce7SMax Filippov const char *xtensa_interface_name(xtensa_isa isa, xtensa_interface intf);
770*7f709ce7SMax Filippov 
771*7f709ce7SMax Filippov 
772*7f709ce7SMax Filippov /*
773*7f709ce7SMax Filippov  * Get the bit width for an interface.
774*7f709ce7SMax Filippov  * Returns XTENSA_UNDEFINED on error.
775*7f709ce7SMax Filippov  */
776*7f709ce7SMax Filippov 
777*7f709ce7SMax Filippov int xtensa_interface_num_bits(xtensa_isa isa, xtensa_interface intf);
778*7f709ce7SMax Filippov 
779*7f709ce7SMax Filippov 
780*7f709ce7SMax Filippov /*
781*7f709ce7SMax Filippov  * Check if an interface is an input ('i') or output ('o') with respect
782*7f709ce7SMax Filippov  * to the Xtensa processor core. Returns 0 on error.
783*7f709ce7SMax Filippov  */
784*7f709ce7SMax Filippov 
785*7f709ce7SMax Filippov char xtensa_interface_inout(xtensa_isa isa, xtensa_interface intf);
786*7f709ce7SMax Filippov 
787*7f709ce7SMax Filippov 
788*7f709ce7SMax Filippov /*
789*7f709ce7SMax Filippov  * Check if accessing an interface has potential side effects.
790*7f709ce7SMax Filippov  * Currently "data" interfaces have side effects and "control"
791*7f709ce7SMax Filippov  * interfaces do not. Returns 1 if there are side effects, 0 if not,
792*7f709ce7SMax Filippov  * and XTENSA_UNDEFINED on error.
793*7f709ce7SMax Filippov  */
794*7f709ce7SMax Filippov 
795*7f709ce7SMax Filippov int xtensa_interface_has_side_effect(xtensa_isa isa, xtensa_interface intf);
796*7f709ce7SMax Filippov 
797*7f709ce7SMax Filippov 
798*7f709ce7SMax Filippov /*
799*7f709ce7SMax Filippov  * Some interfaces may be related such that accessing one interface
800*7f709ce7SMax Filippov  * has side effects on a set of related interfaces. The interfaces
801*7f709ce7SMax Filippov  * are partitioned into equivalence classes of related interfaces, and
802*7f709ce7SMax Filippov  * each class is assigned a unique identifier number. This function
803*7f709ce7SMax Filippov  * returns the class identifier for an interface, or XTENSA_UNDEFINED
804*7f709ce7SMax Filippov  * on error. These identifiers can be compared to determine if two
805*7f709ce7SMax Filippov  * interfaces are related; the specific values of the identifiers have
806*7f709ce7SMax Filippov  * no particular meaning otherwise.
807*7f709ce7SMax Filippov  */
808*7f709ce7SMax Filippov 
809*7f709ce7SMax Filippov int xtensa_interface_class_id(xtensa_isa isa, xtensa_interface intf);
810*7f709ce7SMax Filippov 
811*7f709ce7SMax Filippov 
812*7f709ce7SMax Filippov /* Functional Units. */
813*7f709ce7SMax Filippov 
814*7f709ce7SMax Filippov /*
815*7f709ce7SMax Filippov  * Find a functional unit by name. The return value is XTENSA_UNDEFINED if
816*7f709ce7SMax Filippov  * the specified unit is not found.
817*7f709ce7SMax Filippov  */
818*7f709ce7SMax Filippov 
819*7f709ce7SMax Filippov xtensa_funcUnit xtensa_funcUnit_lookup(xtensa_isa isa, const char *fname);
820*7f709ce7SMax Filippov 
821*7f709ce7SMax Filippov 
822*7f709ce7SMax Filippov /* Get the name of a functional unit. Returns null on error. */
823*7f709ce7SMax Filippov 
824*7f709ce7SMax Filippov const char *xtensa_funcUnit_name(xtensa_isa isa, xtensa_funcUnit fun);
825*7f709ce7SMax Filippov 
826*7f709ce7SMax Filippov 
827*7f709ce7SMax Filippov /*
828*7f709ce7SMax Filippov  * Functional units may be replicated. See how many instances of a
829*7f709ce7SMax Filippov  * particular function unit exist. Returns XTENSA_UNDEFINED on error.
830*7f709ce7SMax Filippov  */
831*7f709ce7SMax Filippov 
832*7f709ce7SMax Filippov int xtensa_funcUnit_num_copies(xtensa_isa isa, xtensa_funcUnit fun);
833*7f709ce7SMax Filippov 
834*7f709ce7SMax Filippov 
835*7f709ce7SMax Filippov #ifdef __cplusplus
836*7f709ce7SMax Filippov }
837*7f709ce7SMax Filippov #endif
838*7f709ce7SMax Filippov #endif /* XTENSA_LIBISA_H */
839