1 /* Configurable Xtensa ISA support.
2 Copyright (C) 2003-2019 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,
19 MA 02110-1301, USA. */
24 #include "xtensa-isa.h"
25 #include "xtensa-isa-internal.h"
27 xtensa_isa_status xtisa_errno;
28 char xtisa_error_msg[1024];
32 xtensa_isa_errno (xtensa_isa isa __attribute__ ((unused)))
39 xtensa_isa_error_msg (xtensa_isa isa __attribute__ ((unused)))
41 return xtisa_error_msg;
45 #define CHECK_ALLOC(MEM,ERRVAL) \
49 xtisa_errno = xtensa_isa_out_of_memory; \
50 strcpy (xtisa_error_msg, "out of memory"); \
55 #define CHECK_ALLOC_FOR_INIT(MEM,ERRVAL,ERRNO_P,ERROR_MSG_P) \
59 xtisa_errno = xtensa_isa_out_of_memory; \
60 strcpy (xtisa_error_msg, "out of memory"); \
61 if (ERRNO_P) *(ERRNO_P) = xtisa_errno; \
62 if (ERROR_MSG_P) *(ERROR_MSG_P) = xtisa_error_msg; \
69 /* Instruction buffers. */
72 xtensa_insnbuf_size (xtensa_isa isa)
74 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
75 return intisa->insnbuf_size;
80 xtensa_insnbuf_alloc (xtensa_isa isa)
82 xtensa_insnbuf result = (xtensa_insnbuf)
83 malloc (xtensa_insnbuf_size (isa) * sizeof (xtensa_insnbuf_word));
84 CHECK_ALLOC (result, 0);
90 xtensa_insnbuf_free (xtensa_isa isa __attribute__ ((unused)),
97 /* Given <byte_index>, the index of a byte in a xtensa_insnbuf, our
98 internal representation of a xtensa instruction word, return the index of
99 its word and the bit index of its low order byte in the xtensa_insnbuf. */
102 byte_to_word_index (int byte_index)
104 return byte_index / sizeof (xtensa_insnbuf_word);
109 byte_to_bit_index (int byte_index)
111 return (byte_index & 0x3) * 8;
115 /* Copy an instruction in the 32-bit words pointed at by "insn" to
116 characters pointed at by "cp". This is more complicated than you
117 might think because we want 16-bit instructions in bytes 2 & 3 for
118 big-endian configurations. This function allows us to specify
119 which byte in "insn" to start with and which way to increment,
120 allowing trivial implementation for both big- and little-endian
121 configurations....and it seems to make pretty good code for
125 xtensa_insnbuf_to_chars (xtensa_isa isa,
126 const xtensa_insnbuf insn,
130 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
131 int insn_size = xtensa_isa_maxlength (isa);
132 int fence_post, start, increment, i, byte_count;
136 num_chars = insn_size;
138 if (intisa->is_big_endian)
140 start = insn_size - 1;
149 /* Find the instruction format. Do nothing if the buffer does not contain
150 a valid instruction since we need to know how many bytes to copy. */
151 fmt = xtensa_format_decode (isa, insn);
152 if (fmt == XTENSA_UNDEFINED)
153 return XTENSA_UNDEFINED;
155 byte_count = xtensa_format_length (isa, fmt);
156 if (byte_count == XTENSA_UNDEFINED)
157 return XTENSA_UNDEFINED;
159 if (byte_count > num_chars)
161 xtisa_errno = xtensa_isa_buffer_overflow;
162 strcpy (xtisa_error_msg, "output buffer too small for instruction");
163 return XTENSA_UNDEFINED;
166 fence_post = start + (byte_count * increment);
168 for (i = start; i != fence_post; i += increment, ++cp)
170 int word_inx = byte_to_word_index (i);
171 int bit_inx = byte_to_bit_index (i);
173 *cp = (insn[word_inx] >> bit_inx) & 0xff;
180 /* Inward conversion from byte stream to xtensa_insnbuf. See
181 xtensa_insnbuf_to_chars for a discussion of why this is complicated
185 xtensa_insnbuf_from_chars (xtensa_isa isa,
187 const unsigned char *cp,
190 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
191 int max_size, insn_size, fence_post, start, increment, i;
193 max_size = xtensa_isa_maxlength (isa);
195 /* Decode the instruction length so we know how many bytes to read. */
196 insn_size = (intisa->length_decode_fn) (cp);
197 if (insn_size == XTENSA_UNDEFINED)
199 /* This should never happen when the byte stream contains a
200 valid instruction. Just read the maximum number of bytes.... */
201 insn_size = max_size;
204 if (num_chars == 0 || num_chars > insn_size)
205 num_chars = insn_size;
207 if (intisa->is_big_endian)
209 start = max_size - 1;
218 fence_post = start + (num_chars * increment);
219 memset (insn, 0, xtensa_insnbuf_size (isa) * sizeof (xtensa_insnbuf_word));
221 for (i = start; i != fence_post; i += increment, ++cp)
223 int word_inx = byte_to_word_index (i);
224 int bit_inx = byte_to_bit_index (i);
226 insn[word_inx] |= (*cp & 0xff) << bit_inx;
232 /* ISA information. */
234 extern xtensa_isa_internal xtensa_modules;
237 xtensa_isa_init (xtensa_isa_status *errno_p, char **error_msg_p)
239 xtensa_isa_internal *isa = &xtensa_modules;
242 /* Set up the opcode name lookup table. */
243 isa->opname_lookup_table =
244 bfd_malloc (isa->num_opcodes * sizeof (xtensa_lookup_entry));
245 CHECK_ALLOC_FOR_INIT (isa->opname_lookup_table, NULL, errno_p, error_msg_p);
246 for (n = 0; n < isa->num_opcodes; n++)
248 isa->opname_lookup_table[n].key = isa->opcodes[n].name;
249 isa->opname_lookup_table[n].u.opcode = n;
251 qsort (isa->opname_lookup_table, isa->num_opcodes,
252 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
254 /* Set up the state name lookup table. */
255 isa->state_lookup_table =
256 bfd_malloc (isa->num_states * sizeof (xtensa_lookup_entry));
257 CHECK_ALLOC_FOR_INIT (isa->state_lookup_table, NULL, errno_p, error_msg_p);
258 for (n = 0; n < isa->num_states; n++)
260 isa->state_lookup_table[n].key = isa->states[n].name;
261 isa->state_lookup_table[n].u.state = n;
263 qsort (isa->state_lookup_table, isa->num_states,
264 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
266 /* Set up the sysreg name lookup table. */
267 isa->sysreg_lookup_table =
268 bfd_malloc (isa->num_sysregs * sizeof (xtensa_lookup_entry));
269 CHECK_ALLOC_FOR_INIT (isa->sysreg_lookup_table, NULL, errno_p, error_msg_p);
270 for (n = 0; n < isa->num_sysregs; n++)
272 isa->sysreg_lookup_table[n].key = isa->sysregs[n].name;
273 isa->sysreg_lookup_table[n].u.sysreg = n;
275 qsort (isa->sysreg_lookup_table, isa->num_sysregs,
276 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
278 /* Set up the user & system sysreg number tables. */
279 for (is_user = 0; is_user < 2; is_user++)
281 isa->sysreg_table[is_user] =
282 bfd_malloc ((isa->max_sysreg_num[is_user] + 1)
283 * sizeof (xtensa_sysreg));
284 CHECK_ALLOC_FOR_INIT (isa->sysreg_table[is_user], NULL,
285 errno_p, error_msg_p);
287 for (n = 0; n <= isa->max_sysreg_num[is_user]; n++)
288 isa->sysreg_table[is_user][n] = XTENSA_UNDEFINED;
290 for (n = 0; n < isa->num_sysregs; n++)
292 xtensa_sysreg_internal *sreg = &isa->sysregs[n];
293 is_user = sreg->is_user;
295 if (sreg->number >= 0)
296 isa->sysreg_table[is_user][sreg->number] = n;
299 /* Set up the interface lookup table. */
300 isa->interface_lookup_table =
301 bfd_malloc (isa->num_interfaces * sizeof (xtensa_lookup_entry));
302 CHECK_ALLOC_FOR_INIT (isa->interface_lookup_table, NULL, errno_p,
304 for (n = 0; n < isa->num_interfaces; n++)
306 isa->interface_lookup_table[n].key = isa->interfaces[n].name;
307 isa->interface_lookup_table[n].u.intf = n;
309 qsort (isa->interface_lookup_table, isa->num_interfaces,
310 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
312 /* Set up the funcUnit lookup table. */
313 isa->funcUnit_lookup_table =
314 bfd_malloc (isa->num_funcUnits * sizeof (xtensa_lookup_entry));
315 CHECK_ALLOC_FOR_INIT (isa->funcUnit_lookup_table, NULL, errno_p,
317 for (n = 0; n < isa->num_funcUnits; n++)
319 isa->funcUnit_lookup_table[n].key = isa->funcUnits[n].name;
320 isa->funcUnit_lookup_table[n].u.fun = n;
322 qsort (isa->funcUnit_lookup_table, isa->num_funcUnits,
323 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
325 isa->insnbuf_size = ((isa->insn_size + sizeof (xtensa_insnbuf_word) - 1) /
326 sizeof (xtensa_insnbuf_word));
328 return (xtensa_isa) isa;
333 xtensa_isa_free (xtensa_isa isa)
335 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
338 /* With this version of the code, the xtensa_isa structure is not
339 dynamically allocated, so this function is not essential. Free
340 the memory allocated by xtensa_isa_init and restore the xtensa_isa
341 structure to its initial state. */
343 if (intisa->opname_lookup_table)
345 free (intisa->opname_lookup_table);
346 intisa->opname_lookup_table = 0;
349 if (intisa->state_lookup_table)
351 free (intisa->state_lookup_table);
352 intisa->state_lookup_table = 0;
355 if (intisa->sysreg_lookup_table)
357 free (intisa->sysreg_lookup_table);
358 intisa->sysreg_lookup_table = 0;
360 for (n = 0; n < 2; n++)
362 if (intisa->sysreg_table[n])
364 free (intisa->sysreg_table[n]);
365 intisa->sysreg_table[n] = 0;
369 if (intisa->interface_lookup_table)
371 free (intisa->interface_lookup_table);
372 intisa->interface_lookup_table = 0;
375 if (intisa->funcUnit_lookup_table)
377 free (intisa->funcUnit_lookup_table);
378 intisa->funcUnit_lookup_table = 0;
384 xtensa_isa_name_compare (const void *v1, const void *v2)
386 xtensa_lookup_entry *e1 = (xtensa_lookup_entry *) v1;
387 xtensa_lookup_entry *e2 = (xtensa_lookup_entry *) v2;
389 return strcasecmp (e1->key, e2->key);
394 xtensa_isa_maxlength (xtensa_isa isa)
396 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
397 return intisa->insn_size;
402 xtensa_isa_length_from_chars (xtensa_isa isa, const unsigned char *cp)
404 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
405 return (intisa->length_decode_fn) (cp);
410 xtensa_isa_num_pipe_stages (xtensa_isa isa)
412 xtensa_opcode opcode;
413 xtensa_funcUnit_use *use;
414 int num_opcodes, num_uses;
416 static int max_stage = XTENSA_UNDEFINED;
418 /* Only compute the value once. */
419 if (max_stage != XTENSA_UNDEFINED)
420 return max_stage + 1;
422 num_opcodes = xtensa_isa_num_opcodes (isa);
423 for (opcode = 0; opcode < num_opcodes; opcode++)
425 num_uses = xtensa_opcode_num_funcUnit_uses (isa, opcode);
426 for (i = 0; i < num_uses; i++)
428 use = xtensa_opcode_funcUnit_use (isa, opcode, i);
430 if (stage > max_stage)
435 return max_stage + 1;
440 xtensa_isa_num_formats (xtensa_isa isa)
442 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
443 return intisa->num_formats;
448 xtensa_isa_num_opcodes (xtensa_isa isa)
450 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
451 return intisa->num_opcodes;
456 xtensa_isa_num_regfiles (xtensa_isa isa)
458 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
459 return intisa->num_regfiles;
464 xtensa_isa_num_states (xtensa_isa isa)
466 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
467 return intisa->num_states;
472 xtensa_isa_num_sysregs (xtensa_isa isa)
474 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
475 return intisa->num_sysregs;
480 xtensa_isa_num_interfaces (xtensa_isa isa)
482 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
483 return intisa->num_interfaces;
488 xtensa_isa_num_funcUnits (xtensa_isa isa)
490 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
491 return intisa->num_funcUnits;
496 /* Instruction formats. */
499 #define CHECK_FORMAT(INTISA,FMT,ERRVAL) \
501 if ((FMT) < 0 || (FMT) >= (INTISA)->num_formats) \
503 xtisa_errno = xtensa_isa_bad_format; \
504 strcpy (xtisa_error_msg, "invalid format specifier"); \
510 #define CHECK_SLOT(INTISA,FMT,SLOT,ERRVAL) \
512 if ((SLOT) < 0 || (SLOT) >= (INTISA)->formats[FMT].num_slots) \
514 xtisa_errno = xtensa_isa_bad_slot; \
515 strcpy (xtisa_error_msg, "invalid slot specifier"); \
522 xtensa_format_name (xtensa_isa isa, xtensa_format fmt)
524 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
525 CHECK_FORMAT (intisa, fmt, NULL);
526 return intisa->formats[fmt].name;
531 xtensa_format_lookup (xtensa_isa isa, const char *fmtname)
533 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
536 if (!fmtname || !*fmtname)
538 xtisa_errno = xtensa_isa_bad_format;
539 strcpy (xtisa_error_msg, "invalid format name");
540 return XTENSA_UNDEFINED;
543 for (fmt = 0; fmt < intisa->num_formats; fmt++)
545 if (strcasecmp (fmtname, intisa->formats[fmt].name) == 0)
549 xtisa_errno = xtensa_isa_bad_format;
550 sprintf (xtisa_error_msg, "format \"%s\" not recognized", fmtname);
551 return XTENSA_UNDEFINED;
556 xtensa_format_decode (xtensa_isa isa, const xtensa_insnbuf insn)
558 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
561 fmt = (intisa->format_decode_fn) (insn);
562 if (fmt != XTENSA_UNDEFINED)
565 xtisa_errno = xtensa_isa_bad_format;
566 strcpy (xtisa_error_msg, "cannot decode instruction format");
567 return XTENSA_UNDEFINED;
572 xtensa_format_encode (xtensa_isa isa, xtensa_format fmt, xtensa_insnbuf insn)
574 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
575 CHECK_FORMAT (intisa, fmt, -1);
576 (*intisa->formats[fmt].encode_fn) (insn);
582 xtensa_format_length (xtensa_isa isa, xtensa_format fmt)
584 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
585 CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
586 return intisa->formats[fmt].length;
591 xtensa_format_num_slots (xtensa_isa isa, xtensa_format fmt)
593 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
594 CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
595 return intisa->formats[fmt].num_slots;
600 xtensa_format_slot_nop_opcode (xtensa_isa isa, xtensa_format fmt, int slot)
602 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
605 CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
606 CHECK_SLOT (intisa, fmt, slot, XTENSA_UNDEFINED);
608 slot_id = intisa->formats[fmt].slot_id[slot];
609 return xtensa_opcode_lookup (isa, intisa->slots[slot_id].nop_name);
614 xtensa_format_get_slot (xtensa_isa isa, xtensa_format fmt, int slot,
615 const xtensa_insnbuf insn, xtensa_insnbuf slotbuf)
617 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
620 CHECK_FORMAT (intisa, fmt, -1);
621 CHECK_SLOT (intisa, fmt, slot, -1);
623 slot_id = intisa->formats[fmt].slot_id[slot];
624 (*intisa->slots[slot_id].get_fn) (insn, slotbuf);
630 xtensa_format_set_slot (xtensa_isa isa, xtensa_format fmt, int slot,
631 xtensa_insnbuf insn, const xtensa_insnbuf slotbuf)
633 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
636 CHECK_FORMAT (intisa, fmt, -1);
637 CHECK_SLOT (intisa, fmt, slot, -1);
639 slot_id = intisa->formats[fmt].slot_id[slot];
640 (*intisa->slots[slot_id].set_fn) (insn, slotbuf);
646 /* Opcode information. */
649 #define CHECK_OPCODE(INTISA,OPC,ERRVAL) \
651 if ((OPC) < 0 || (OPC) >= (INTISA)->num_opcodes) \
653 xtisa_errno = xtensa_isa_bad_opcode; \
654 strcpy (xtisa_error_msg, "invalid opcode specifier"); \
661 xtensa_opcode_lookup (xtensa_isa isa, const char *opname)
663 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
664 xtensa_lookup_entry entry, *result = 0;
666 if (!opname || !*opname)
668 xtisa_errno = xtensa_isa_bad_opcode;
669 strcpy (xtisa_error_msg, "invalid opcode name");
670 return XTENSA_UNDEFINED;
673 if (intisa->num_opcodes != 0)
676 result = bsearch (&entry, intisa->opname_lookup_table,
677 intisa->num_opcodes, sizeof (xtensa_lookup_entry),
678 xtensa_isa_name_compare);
683 xtisa_errno = xtensa_isa_bad_opcode;
684 sprintf (xtisa_error_msg, "opcode \"%s\" not recognized", opname);
685 return XTENSA_UNDEFINED;
688 return result->u.opcode;
693 xtensa_opcode_decode (xtensa_isa isa, xtensa_format fmt, int slot,
694 const xtensa_insnbuf slotbuf)
696 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
700 CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
701 CHECK_SLOT (intisa, fmt, slot, XTENSA_UNDEFINED);
703 slot_id = intisa->formats[fmt].slot_id[slot];
705 opc = (intisa->slots[slot_id].opcode_decode_fn) (slotbuf);
706 if (opc != XTENSA_UNDEFINED)
709 xtisa_errno = xtensa_isa_bad_opcode;
710 strcpy (xtisa_error_msg, "cannot decode opcode");
711 return XTENSA_UNDEFINED;
716 xtensa_opcode_encode (xtensa_isa isa, xtensa_format fmt, int slot,
717 xtensa_insnbuf slotbuf, xtensa_opcode opc)
719 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
721 xtensa_opcode_encode_fn encode_fn;
723 CHECK_FORMAT (intisa, fmt, -1);
724 CHECK_SLOT (intisa, fmt, slot, -1);
725 CHECK_OPCODE (intisa, opc, -1);
727 slot_id = intisa->formats[fmt].slot_id[slot];
728 encode_fn = intisa->opcodes[opc].encode_fns[slot_id];
731 xtisa_errno = xtensa_isa_wrong_slot;
732 sprintf (xtisa_error_msg,
733 "opcode \"%s\" is not allowed in slot %d of format \"%s\"",
734 intisa->opcodes[opc].name, slot, intisa->formats[fmt].name);
737 (*encode_fn) (slotbuf);
743 xtensa_opcode_name (xtensa_isa isa, xtensa_opcode opc)
745 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
746 CHECK_OPCODE (intisa, opc, NULL);
747 return intisa->opcodes[opc].name;
752 xtensa_opcode_is_branch (xtensa_isa isa, xtensa_opcode opc)
754 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
755 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
756 if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_BRANCH) != 0)
763 xtensa_opcode_is_jump (xtensa_isa isa, xtensa_opcode opc)
765 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
766 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
767 if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_JUMP) != 0)
774 xtensa_opcode_is_loop (xtensa_isa isa, xtensa_opcode opc)
776 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
777 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
778 if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_LOOP) != 0)
785 xtensa_opcode_is_call (xtensa_isa isa, xtensa_opcode opc)
787 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
788 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
789 if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_CALL) != 0)
796 xtensa_opcode_num_operands (xtensa_isa isa, xtensa_opcode opc)
798 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
801 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
802 iclass_id = intisa->opcodes[opc].iclass_id;
803 return intisa->iclasses[iclass_id].num_operands;
808 xtensa_opcode_num_stateOperands (xtensa_isa isa, xtensa_opcode opc)
810 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
813 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
814 iclass_id = intisa->opcodes[opc].iclass_id;
815 return intisa->iclasses[iclass_id].num_stateOperands;
820 xtensa_opcode_num_interfaceOperands (xtensa_isa isa, xtensa_opcode opc)
822 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
825 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
826 iclass_id = intisa->opcodes[opc].iclass_id;
827 return intisa->iclasses[iclass_id].num_interfaceOperands;
832 xtensa_opcode_num_funcUnit_uses (xtensa_isa isa, xtensa_opcode opc)
834 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
835 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
836 return intisa->opcodes[opc].num_funcUnit_uses;
840 xtensa_funcUnit_use *
841 xtensa_opcode_funcUnit_use (xtensa_isa isa, xtensa_opcode opc, int u)
843 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
844 CHECK_OPCODE (intisa, opc, NULL);
845 if (u < 0 || u >= intisa->opcodes[opc].num_funcUnit_uses)
847 xtisa_errno = xtensa_isa_bad_funcUnit;
848 sprintf (xtisa_error_msg, "invalid functional unit use number (%d); "
849 "opcode \"%s\" has %d", u, intisa->opcodes[opc].name,
850 intisa->opcodes[opc].num_funcUnit_uses);
853 return &intisa->opcodes[opc].funcUnit_uses[u];
858 /* Operand information. */
861 #define CHECK_OPERAND(INTISA,OPC,ICLASS,OPND,ERRVAL) \
863 if ((OPND) < 0 || (OPND) >= (ICLASS)->num_operands) \
865 xtisa_errno = xtensa_isa_bad_operand; \
866 sprintf (xtisa_error_msg, "invalid operand number (%d); " \
867 "opcode \"%s\" has %d operands", (OPND), \
868 (INTISA)->opcodes[(OPC)].name, (ICLASS)->num_operands); \
874 static xtensa_operand_internal *
875 get_operand (xtensa_isa_internal *intisa, xtensa_opcode opc, int opnd)
877 xtensa_iclass_internal *iclass;
878 int iclass_id, operand_id;
880 CHECK_OPCODE (intisa, opc, NULL);
881 iclass_id = intisa->opcodes[opc].iclass_id;
882 iclass = &intisa->iclasses[iclass_id];
883 CHECK_OPERAND (intisa, opc, iclass, opnd, NULL);
884 operand_id = iclass->operands[opnd].u.operand_id;
885 return &intisa->operands[operand_id];
890 xtensa_operand_name (xtensa_isa isa, xtensa_opcode opc, int opnd)
892 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
893 xtensa_operand_internal *intop;
895 intop = get_operand (intisa, opc, opnd);
896 if (!intop) return NULL;
902 xtensa_operand_is_visible (xtensa_isa isa, xtensa_opcode opc, int opnd)
904 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
905 xtensa_iclass_internal *iclass;
906 int iclass_id, operand_id;
907 xtensa_operand_internal *intop;
909 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
910 iclass_id = intisa->opcodes[opc].iclass_id;
911 iclass = &intisa->iclasses[iclass_id];
912 CHECK_OPERAND (intisa, opc, iclass, opnd, XTENSA_UNDEFINED);
914 /* Special case for "sout" operands. */
915 if (iclass->operands[opnd].inout == 's')
918 operand_id = iclass->operands[opnd].u.operand_id;
919 intop = &intisa->operands[operand_id];
921 if ((intop->flags & XTENSA_OPERAND_IS_INVISIBLE) == 0)
928 xtensa_operand_inout (xtensa_isa isa, xtensa_opcode opc, int opnd)
930 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
931 xtensa_iclass_internal *iclass;
935 CHECK_OPCODE (intisa, opc, 0);
936 iclass_id = intisa->opcodes[opc].iclass_id;
937 iclass = &intisa->iclasses[iclass_id];
938 CHECK_OPERAND (intisa, opc, iclass, opnd, 0);
939 inout = iclass->operands[opnd].inout;
941 /* Special case for "sout" operands. */
950 xtensa_operand_get_field (xtensa_isa isa, xtensa_opcode opc, int opnd,
951 xtensa_format fmt, int slot,
952 const xtensa_insnbuf slotbuf, uint32 *valp)
954 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
955 xtensa_operand_internal *intop;
957 xtensa_get_field_fn get_fn;
959 intop = get_operand (intisa, opc, opnd);
960 if (!intop) return -1;
962 CHECK_FORMAT (intisa, fmt, -1);
963 CHECK_SLOT (intisa, fmt, slot, -1);
965 slot_id = intisa->formats[fmt].slot_id[slot];
966 if (intop->field_id == XTENSA_UNDEFINED)
968 xtisa_errno = xtensa_isa_no_field;
969 strcpy (xtisa_error_msg, "implicit operand has no field");
972 get_fn = intisa->slots[slot_id].get_field_fns[intop->field_id];
975 xtisa_errno = xtensa_isa_wrong_slot;
976 sprintf (xtisa_error_msg,
977 "operand \"%s\" does not exist in slot %d of format \"%s\"",
978 intop->name, slot, intisa->formats[fmt].name);
981 *valp = (*get_fn) (slotbuf);
987 xtensa_operand_set_field (xtensa_isa isa, xtensa_opcode opc, int opnd,
988 xtensa_format fmt, int slot,
989 xtensa_insnbuf slotbuf, uint32 val)
991 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
992 xtensa_operand_internal *intop;
994 xtensa_set_field_fn set_fn;
996 intop = get_operand (intisa, opc, opnd);
997 if (!intop) return -1;
999 CHECK_FORMAT (intisa, fmt, -1);
1000 CHECK_SLOT (intisa, fmt, slot, -1);
1002 slot_id = intisa->formats[fmt].slot_id[slot];
1003 if (intop->field_id == XTENSA_UNDEFINED)
1005 xtisa_errno = xtensa_isa_no_field;
1006 strcpy (xtisa_error_msg, "implicit operand has no field");
1009 set_fn = intisa->slots[slot_id].set_field_fns[intop->field_id];
1012 xtisa_errno = xtensa_isa_wrong_slot;
1013 sprintf (xtisa_error_msg,
1014 "operand \"%s\" does not exist in slot %d of format \"%s\"",
1015 intop->name, slot, intisa->formats[fmt].name);
1018 (*set_fn) (slotbuf, val);
1024 xtensa_operand_encode (xtensa_isa isa, xtensa_opcode opc, int opnd,
1027 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1028 xtensa_operand_internal *intop;
1029 uint32 test_val, orig_val;
1031 intop = get_operand (intisa, opc, opnd);
1037 /* This is a default operand for a field. How can we tell if the
1038 value fits in the field? Write the value into the field,
1039 read it back, and then make sure we get the same value. */
1040 static xtensa_insnbuf tmpbuf = 0;
1045 tmpbuf = xtensa_insnbuf_alloc (isa);
1046 CHECK_ALLOC (tmpbuf, -1);
1049 /* A default operand is always associated with a field,
1050 but check just to be sure.... */
1051 if (intop->field_id == XTENSA_UNDEFINED)
1053 xtisa_errno = xtensa_isa_internal_error;
1054 strcpy (xtisa_error_msg, "operand has no field");
1058 /* Find some slot that includes the field. */
1059 for (slot_id = 0; slot_id < intisa->num_slots; slot_id++)
1061 xtensa_get_field_fn get_fn =
1062 intisa->slots[slot_id].get_field_fns[intop->field_id];
1063 xtensa_set_field_fn set_fn =
1064 intisa->slots[slot_id].set_field_fns[intop->field_id];
1066 if (get_fn && set_fn)
1068 (*set_fn) (tmpbuf, *valp);
1069 return ((*get_fn) (tmpbuf) != *valp);
1073 /* Couldn't find any slot containing the field.... */
1074 xtisa_errno = xtensa_isa_no_field;
1075 strcpy (xtisa_error_msg, "field does not exist in any slot");
1079 /* Encode the value. In some cases, the encoding function may detect
1080 errors, but most of the time the only way to determine if the value
1081 was successfully encoded is to decode it and check if it matches
1082 the original value. */
1084 if ((*intop->encode) (valp)
1085 || (test_val = *valp, (*intop->decode) (&test_val))
1086 || test_val != orig_val)
1088 xtisa_errno = xtensa_isa_bad_value;
1089 sprintf (xtisa_error_msg, "cannot encode operand value 0x%08x", *valp);
1098 xtensa_operand_decode (xtensa_isa isa, xtensa_opcode opc, int opnd,
1101 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1102 xtensa_operand_internal *intop;
1104 intop = get_operand (intisa, opc, opnd);
1105 if (!intop) return -1;
1107 /* Use identity function for "default" operands. */
1111 if ((*intop->decode) (valp))
1113 xtisa_errno = xtensa_isa_bad_value;
1114 sprintf (xtisa_error_msg, "cannot decode operand value 0x%08x", *valp);
1122 xtensa_operand_is_register (xtensa_isa isa, xtensa_opcode opc, int opnd)
1124 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1125 xtensa_operand_internal *intop;
1127 intop = get_operand (intisa, opc, opnd);
1128 if (!intop) return XTENSA_UNDEFINED;
1130 if ((intop->flags & XTENSA_OPERAND_IS_REGISTER) != 0)
1137 xtensa_operand_regfile (xtensa_isa isa, xtensa_opcode opc, int opnd)
1139 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1140 xtensa_operand_internal *intop;
1142 intop = get_operand (intisa, opc, opnd);
1143 if (!intop) return XTENSA_UNDEFINED;
1145 return intop->regfile;
1150 xtensa_operand_num_regs (xtensa_isa isa, xtensa_opcode opc, int opnd)
1152 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1153 xtensa_operand_internal *intop;
1155 intop = get_operand (intisa, opc, opnd);
1156 if (!intop) return XTENSA_UNDEFINED;
1158 return intop->num_regs;
1163 xtensa_operand_is_known_reg (xtensa_isa isa, xtensa_opcode opc, int opnd)
1165 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1166 xtensa_operand_internal *intop;
1168 intop = get_operand (intisa, opc, opnd);
1169 if (!intop) return XTENSA_UNDEFINED;
1171 if ((intop->flags & XTENSA_OPERAND_IS_UNKNOWN) == 0)
1178 xtensa_operand_is_PCrelative (xtensa_isa isa, xtensa_opcode opc, int opnd)
1180 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1181 xtensa_operand_internal *intop;
1183 intop = get_operand (intisa, opc, opnd);
1184 if (!intop) return XTENSA_UNDEFINED;
1186 if ((intop->flags & XTENSA_OPERAND_IS_PCRELATIVE) != 0)
1193 xtensa_operand_do_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd,
1194 uint32 *valp, uint32 pc)
1196 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1197 xtensa_operand_internal *intop;
1199 intop = get_operand (intisa, opc, opnd);
1200 if (!intop) return -1;
1202 if ((intop->flags & XTENSA_OPERAND_IS_PCRELATIVE) == 0)
1205 if (!intop->do_reloc)
1207 xtisa_errno = xtensa_isa_internal_error;
1208 strcpy (xtisa_error_msg, "operand missing do_reloc function");
1212 if ((*intop->do_reloc) (valp, pc))
1214 xtisa_errno = xtensa_isa_bad_value;
1215 sprintf (xtisa_error_msg,
1216 "do_reloc failed for value 0x%08x at PC 0x%08x", *valp, pc);
1225 xtensa_operand_undo_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd,
1226 uint32 *valp, uint32 pc)
1228 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1229 xtensa_operand_internal *intop;
1231 intop = get_operand (intisa, opc, opnd);
1232 if (!intop) return -1;
1234 if ((intop->flags & XTENSA_OPERAND_IS_PCRELATIVE) == 0)
1237 if (!intop->undo_reloc)
1239 xtisa_errno = xtensa_isa_internal_error;
1240 strcpy (xtisa_error_msg, "operand missing undo_reloc function");
1244 if ((*intop->undo_reloc) (valp, pc))
1246 xtisa_errno = xtensa_isa_bad_value;
1247 sprintf (xtisa_error_msg,
1248 "undo_reloc failed for value 0x%08x at PC 0x%08x", *valp, pc);
1257 /* State Operands. */
1260 #define CHECK_STATE_OPERAND(INTISA,OPC,ICLASS,STOP,ERRVAL) \
1262 if ((STOP) < 0 || (STOP) >= (ICLASS)->num_stateOperands) \
1264 xtisa_errno = xtensa_isa_bad_operand; \
1265 sprintf (xtisa_error_msg, "invalid state operand number (%d); " \
1266 "opcode \"%s\" has %d state operands", (STOP), \
1267 (INTISA)->opcodes[(OPC)].name, (ICLASS)->num_stateOperands); \
1274 xtensa_stateOperand_state (xtensa_isa isa, xtensa_opcode opc, int stOp)
1276 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1277 xtensa_iclass_internal *iclass;
1280 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
1281 iclass_id = intisa->opcodes[opc].iclass_id;
1282 iclass = &intisa->iclasses[iclass_id];
1283 CHECK_STATE_OPERAND (intisa, opc, iclass, stOp, XTENSA_UNDEFINED);
1284 return iclass->stateOperands[stOp].u.state;
1289 xtensa_stateOperand_inout (xtensa_isa isa, xtensa_opcode opc, int stOp)
1291 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1292 xtensa_iclass_internal *iclass;
1295 CHECK_OPCODE (intisa, opc, 0);
1296 iclass_id = intisa->opcodes[opc].iclass_id;
1297 iclass = &intisa->iclasses[iclass_id];
1298 CHECK_STATE_OPERAND (intisa, opc, iclass, stOp, 0);
1299 return iclass->stateOperands[stOp].inout;
1304 /* Interface Operands. */
1307 #define CHECK_INTERFACE_OPERAND(INTISA,OPC,ICLASS,IFOP,ERRVAL) \
1309 if ((IFOP) < 0 || (IFOP) >= (ICLASS)->num_interfaceOperands) \
1311 xtisa_errno = xtensa_isa_bad_operand; \
1312 sprintf (xtisa_error_msg, "invalid interface operand number (%d); " \
1313 "opcode \"%s\" has %d interface operands", (IFOP), \
1314 (INTISA)->opcodes[(OPC)].name, \
1315 (ICLASS)->num_interfaceOperands); \
1322 xtensa_interfaceOperand_interface (xtensa_isa isa, xtensa_opcode opc,
1325 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1326 xtensa_iclass_internal *iclass;
1329 CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
1330 iclass_id = intisa->opcodes[opc].iclass_id;
1331 iclass = &intisa->iclasses[iclass_id];
1332 CHECK_INTERFACE_OPERAND (intisa, opc, iclass, ifOp, XTENSA_UNDEFINED);
1333 return iclass->interfaceOperands[ifOp];
1338 /* Register Files. */
1341 #define CHECK_REGFILE(INTISA,RF,ERRVAL) \
1343 if ((RF) < 0 || (RF) >= (INTISA)->num_regfiles) \
1345 xtisa_errno = xtensa_isa_bad_regfile; \
1346 strcpy (xtisa_error_msg, "invalid regfile specifier"); \
1353 xtensa_regfile_lookup (xtensa_isa isa, const char *name)
1355 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1358 if (!name || !*name)
1360 xtisa_errno = xtensa_isa_bad_regfile;
1361 strcpy (xtisa_error_msg, "invalid regfile name");
1362 return XTENSA_UNDEFINED;
1365 /* The expected number of regfiles is small; use a linear search. */
1366 for (n = 0; n < intisa->num_regfiles; n++)
1368 if (!filename_cmp (intisa->regfiles[n].name, name))
1372 xtisa_errno = xtensa_isa_bad_regfile;
1373 sprintf (xtisa_error_msg, "regfile \"%s\" not recognized", name);
1374 return XTENSA_UNDEFINED;
1379 xtensa_regfile_lookup_shortname (xtensa_isa isa, const char *shortname)
1381 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1384 if (!shortname || !*shortname)
1386 xtisa_errno = xtensa_isa_bad_regfile;
1387 strcpy (xtisa_error_msg, "invalid regfile shortname");
1388 return XTENSA_UNDEFINED;
1391 /* The expected number of regfiles is small; use a linear search. */
1392 for (n = 0; n < intisa->num_regfiles; n++)
1394 /* Ignore regfile views since they always have the same shortnames
1395 as their parents. */
1396 if (intisa->regfiles[n].parent != n)
1398 if (!filename_cmp (intisa->regfiles[n].shortname, shortname))
1402 xtisa_errno = xtensa_isa_bad_regfile;
1403 sprintf (xtisa_error_msg, "regfile shortname \"%s\" not recognized",
1405 return XTENSA_UNDEFINED;
1410 xtensa_regfile_name (xtensa_isa isa, xtensa_regfile rf)
1412 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1413 CHECK_REGFILE (intisa, rf, NULL);
1414 return intisa->regfiles[rf].name;
1419 xtensa_regfile_shortname (xtensa_isa isa, xtensa_regfile rf)
1421 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1422 CHECK_REGFILE (intisa, rf, NULL);
1423 return intisa->regfiles[rf].shortname;
1428 xtensa_regfile_view_parent (xtensa_isa isa, xtensa_regfile rf)
1430 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1431 CHECK_REGFILE (intisa, rf, XTENSA_UNDEFINED);
1432 return intisa->regfiles[rf].parent;
1437 xtensa_regfile_num_bits (xtensa_isa isa, xtensa_regfile rf)
1439 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1440 CHECK_REGFILE (intisa, rf, XTENSA_UNDEFINED);
1441 return intisa->regfiles[rf].num_bits;
1446 xtensa_regfile_num_entries (xtensa_isa isa, xtensa_regfile rf)
1448 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1449 CHECK_REGFILE (intisa, rf, XTENSA_UNDEFINED);
1450 return intisa->regfiles[rf].num_entries;
1455 /* Processor States. */
1458 #define CHECK_STATE(INTISA,ST,ERRVAL) \
1460 if ((ST) < 0 || (ST) >= (INTISA)->num_states) \
1462 xtisa_errno = xtensa_isa_bad_state; \
1463 strcpy (xtisa_error_msg, "invalid state specifier"); \
1470 xtensa_state_lookup (xtensa_isa isa, const char *name)
1472 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1473 xtensa_lookup_entry entry, *result = 0;
1475 if (!name || !*name)
1477 xtisa_errno = xtensa_isa_bad_state;
1478 strcpy (xtisa_error_msg, "invalid state name");
1479 return XTENSA_UNDEFINED;
1482 if (intisa->num_states != 0)
1485 result = bsearch (&entry, intisa->state_lookup_table, intisa->num_states,
1486 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
1491 xtisa_errno = xtensa_isa_bad_state;
1492 sprintf (xtisa_error_msg, "state \"%s\" not recognized", name);
1493 return XTENSA_UNDEFINED;
1496 return result->u.state;
1501 xtensa_state_name (xtensa_isa isa, xtensa_state st)
1503 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1504 CHECK_STATE (intisa, st, NULL);
1505 return intisa->states[st].name;
1510 xtensa_state_num_bits (xtensa_isa isa, xtensa_state st)
1512 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1513 CHECK_STATE (intisa, st, XTENSA_UNDEFINED);
1514 return intisa->states[st].num_bits;
1519 xtensa_state_is_exported (xtensa_isa isa, xtensa_state st)
1521 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1522 CHECK_STATE (intisa, st, XTENSA_UNDEFINED);
1523 if ((intisa->states[st].flags & XTENSA_STATE_IS_EXPORTED) != 0)
1530 xtensa_state_is_shared_or (xtensa_isa isa, xtensa_state st)
1532 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1533 CHECK_STATE (intisa, st, XTENSA_UNDEFINED);
1534 if ((intisa->states[st].flags & XTENSA_STATE_IS_SHARED_OR) != 0)
1544 #define CHECK_SYSREG(INTISA,SYSREG,ERRVAL) \
1546 if ((SYSREG) < 0 || (SYSREG) >= (INTISA)->num_sysregs) \
1548 xtisa_errno = xtensa_isa_bad_sysreg; \
1549 strcpy (xtisa_error_msg, "invalid sysreg specifier"); \
1556 xtensa_sysreg_lookup (xtensa_isa isa, int num, int is_user)
1558 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1563 if (num < 0 || num > intisa->max_sysreg_num[is_user]
1564 || intisa->sysreg_table[is_user][num] == XTENSA_UNDEFINED)
1566 xtisa_errno = xtensa_isa_bad_sysreg;
1567 strcpy (xtisa_error_msg, "sysreg not recognized");
1568 return XTENSA_UNDEFINED;
1571 return intisa->sysreg_table[is_user][num];
1576 xtensa_sysreg_lookup_name (xtensa_isa isa, const char *name)
1578 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1579 xtensa_lookup_entry entry, *result = 0;
1581 if (!name || !*name)
1583 xtisa_errno = xtensa_isa_bad_sysreg;
1584 strcpy (xtisa_error_msg, "invalid sysreg name");
1585 return XTENSA_UNDEFINED;
1588 if (intisa->num_sysregs != 0)
1591 result = bsearch (&entry, intisa->sysreg_lookup_table,
1592 intisa->num_sysregs, sizeof (xtensa_lookup_entry),
1593 xtensa_isa_name_compare);
1598 xtisa_errno = xtensa_isa_bad_sysreg;
1599 sprintf (xtisa_error_msg, "sysreg \"%s\" not recognized", name);
1600 return XTENSA_UNDEFINED;
1603 return result->u.sysreg;
1608 xtensa_sysreg_name (xtensa_isa isa, xtensa_sysreg sysreg)
1610 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1611 CHECK_SYSREG (intisa, sysreg, NULL);
1612 return intisa->sysregs[sysreg].name;
1617 xtensa_sysreg_number (xtensa_isa isa, xtensa_sysreg sysreg)
1619 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1620 CHECK_SYSREG (intisa, sysreg, XTENSA_UNDEFINED);
1621 return intisa->sysregs[sysreg].number;
1626 xtensa_sysreg_is_user (xtensa_isa isa, xtensa_sysreg sysreg)
1628 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1629 CHECK_SYSREG (intisa, sysreg, XTENSA_UNDEFINED);
1630 if (intisa->sysregs[sysreg].is_user)
1640 #define CHECK_INTERFACE(INTISA,INTF,ERRVAL) \
1642 if ((INTF) < 0 || (INTF) >= (INTISA)->num_interfaces) \
1644 xtisa_errno = xtensa_isa_bad_interface; \
1645 strcpy (xtisa_error_msg, "invalid interface specifier"); \
1652 xtensa_interface_lookup (xtensa_isa isa, const char *ifname)
1654 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1655 xtensa_lookup_entry entry, *result = 0;
1657 if (!ifname || !*ifname)
1659 xtisa_errno = xtensa_isa_bad_interface;
1660 strcpy (xtisa_error_msg, "invalid interface name");
1661 return XTENSA_UNDEFINED;
1664 if (intisa->num_interfaces != 0)
1667 result = bsearch (&entry, intisa->interface_lookup_table,
1668 intisa->num_interfaces, sizeof (xtensa_lookup_entry),
1669 xtensa_isa_name_compare);
1674 xtisa_errno = xtensa_isa_bad_interface;
1675 sprintf (xtisa_error_msg, "interface \"%s\" not recognized", ifname);
1676 return XTENSA_UNDEFINED;
1679 return result->u.intf;
1684 xtensa_interface_name (xtensa_isa isa, xtensa_interface intf)
1686 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1687 CHECK_INTERFACE (intisa, intf, NULL);
1688 return intisa->interfaces[intf].name;
1693 xtensa_interface_num_bits (xtensa_isa isa, xtensa_interface intf)
1695 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1696 CHECK_INTERFACE (intisa, intf, XTENSA_UNDEFINED);
1697 return intisa->interfaces[intf].num_bits;
1702 xtensa_interface_inout (xtensa_isa isa, xtensa_interface intf)
1704 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1705 CHECK_INTERFACE (intisa, intf, 0);
1706 return intisa->interfaces[intf].inout;
1711 xtensa_interface_has_side_effect (xtensa_isa isa, xtensa_interface intf)
1713 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1714 CHECK_INTERFACE (intisa, intf, XTENSA_UNDEFINED);
1715 if ((intisa->interfaces[intf].flags & XTENSA_INTERFACE_HAS_SIDE_EFFECT) != 0)
1722 xtensa_interface_class_id (xtensa_isa isa, xtensa_interface intf)
1724 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1725 CHECK_INTERFACE (intisa, intf, XTENSA_UNDEFINED);
1726 return intisa->interfaces[intf].class_id;
1731 /* Functional Units. */
1734 #define CHECK_FUNCUNIT(INTISA,FUN,ERRVAL) \
1736 if ((FUN) < 0 || (FUN) >= (INTISA)->num_funcUnits) \
1738 xtisa_errno = xtensa_isa_bad_funcUnit; \
1739 strcpy (xtisa_error_msg, "invalid functional unit specifier"); \
1746 xtensa_funcUnit_lookup (xtensa_isa isa, const char *fname)
1748 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1749 xtensa_lookup_entry entry, *result = 0;
1751 if (!fname || !*fname)
1753 xtisa_errno = xtensa_isa_bad_funcUnit;
1754 strcpy (xtisa_error_msg, "invalid functional unit name");
1755 return XTENSA_UNDEFINED;
1758 if (intisa->num_funcUnits != 0)
1761 result = bsearch (&entry, intisa->funcUnit_lookup_table,
1762 intisa->num_funcUnits, sizeof (xtensa_lookup_entry),
1763 xtensa_isa_name_compare);
1768 xtisa_errno = xtensa_isa_bad_funcUnit;
1769 sprintf (xtisa_error_msg,
1770 "functional unit \"%s\" not recognized", fname);
1771 return XTENSA_UNDEFINED;
1774 return result->u.fun;
1779 xtensa_funcUnit_name (xtensa_isa isa, xtensa_funcUnit fun)
1781 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1782 CHECK_FUNCUNIT (intisa, fun, NULL);
1783 return intisa->funcUnits[fun].name;
1788 xtensa_funcUnit_num_copies (xtensa_isa isa, xtensa_funcUnit fun)
1790 xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
1791 CHECK_FUNCUNIT (intisa, fun, XTENSA_UNDEFINED);
1792 return intisa->funcUnits[fun].num_copies;