Home | History | Annotate | Download | only in bfd
      1 /* Configurable Xtensa ISA support.
      2    Copyright (C) 2003-2016 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 #include "sysdep.h"
     22 #include "bfd.h"
     23 #include "libbfd.h"
     24 #include "xtensa-isa.h"
     25 #include "xtensa-isa-internal.h"
     26 
     27 xtensa_isa_status xtisa_errno;
     28 char xtisa_error_msg[1024];
     29 
     30 
     31 xtensa_isa_status
     32 xtensa_isa_errno (xtensa_isa isa __attribute__ ((unused)))
     33 {
     34   return xtisa_errno;
     35 }
     36 
     37 
     38 char *
     39 xtensa_isa_error_msg (xtensa_isa isa __attribute__ ((unused)))
     40 {
     41   return xtisa_error_msg;
     42 }
     43 
     44 
     45 #define CHECK_ALLOC(MEM,ERRVAL) \
     46   do { \
     47     if ((MEM) == 0) \
     48       { \
     49 	xtisa_errno = xtensa_isa_out_of_memory; \
     50 	strcpy (xtisa_error_msg, "out of memory"); \
     51 	return (ERRVAL); \
     52       } \
     53   } while (0)
     54 
     55 #define CHECK_ALLOC_FOR_INIT(MEM,ERRVAL,ERRNO_P,ERROR_MSG_P) \
     56   do { \
     57     if ((MEM) == 0) \
     58       { \
     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; \
     63 	return (ERRVAL); \
     64       } \
     65   } while (0)
     66 
     67 
     68 
     69 /* Instruction buffers.  */
     71 
     72 int
     73 xtensa_insnbuf_size (xtensa_isa isa)
     74 {
     75   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
     76   return intisa->insnbuf_size;
     77 }
     78 
     79 
     80 xtensa_insnbuf
     81 xtensa_insnbuf_alloc (xtensa_isa isa)
     82 {
     83   xtensa_insnbuf result = (xtensa_insnbuf)
     84     malloc (xtensa_insnbuf_size (isa) * sizeof (xtensa_insnbuf_word));
     85   CHECK_ALLOC (result, 0);
     86   return result;
     87 }
     88 
     89 
     90 void
     91 xtensa_insnbuf_free (xtensa_isa isa __attribute__ ((unused)),
     92 		     xtensa_insnbuf buf)
     93 {
     94   free (buf);
     95 }
     96 
     97 
     98 /* Given <byte_index>, the index of a byte in a xtensa_insnbuf, our
     99    internal representation of a xtensa instruction word, return the index of
    100    its word and the bit index of its low order byte in the xtensa_insnbuf.  */
    101 
    102 static inline int
    103 byte_to_word_index (int byte_index)
    104 {
    105   return byte_index / sizeof (xtensa_insnbuf_word);
    106 }
    107 
    108 
    109 static inline int
    110 byte_to_bit_index (int byte_index)
    111 {
    112   return (byte_index & 0x3) * 8;
    113 }
    114 
    115 
    116 /* Copy an instruction in the 32-bit words pointed at by "insn" to
    117    characters pointed at by "cp".  This is more complicated than you
    118    might think because we want 16-bit instructions in bytes 2 & 3 for
    119    big-endian configurations.  This function allows us to specify
    120    which byte in "insn" to start with and which way to increment,
    121    allowing trivial implementation for both big- and little-endian
    122    configurations....and it seems to make pretty good code for
    123    both.  */
    124 
    125 int
    126 xtensa_insnbuf_to_chars (xtensa_isa isa,
    127 			 const xtensa_insnbuf insn,
    128 			 unsigned char *cp,
    129 			 int num_chars)
    130 {
    131   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    132   int insn_size = xtensa_isa_maxlength (isa);
    133   int fence_post, start, increment, i, byte_count;
    134   xtensa_format fmt;
    135 
    136   if (num_chars == 0)
    137     num_chars = insn_size;
    138 
    139   if (intisa->is_big_endian)
    140     {
    141       start = insn_size - 1;
    142       increment = -1;
    143     }
    144   else
    145     {
    146       start = 0;
    147       increment = 1;
    148     }
    149 
    150   /* Find the instruction format.  Do nothing if the buffer does not contain
    151      a valid instruction since we need to know how many bytes to copy.  */
    152   fmt = xtensa_format_decode (isa, insn);
    153   if (fmt == XTENSA_UNDEFINED)
    154     return XTENSA_UNDEFINED;
    155 
    156   byte_count = xtensa_format_length (isa, fmt);
    157   if (byte_count == XTENSA_UNDEFINED)
    158     return XTENSA_UNDEFINED;
    159 
    160   if (byte_count > num_chars)
    161     {
    162       xtisa_errno = xtensa_isa_buffer_overflow;
    163       strcpy (xtisa_error_msg, "output buffer too small for instruction");
    164       return XTENSA_UNDEFINED;
    165     }
    166 
    167   fence_post = start + (byte_count * increment);
    168 
    169   for (i = start; i != fence_post; i += increment, ++cp)
    170     {
    171       int word_inx = byte_to_word_index (i);
    172       int bit_inx = byte_to_bit_index (i);
    173 
    174       *cp = (insn[word_inx] >> bit_inx) & 0xff;
    175     }
    176 
    177   return byte_count;
    178 }
    179 
    180 
    181 /* Inward conversion from byte stream to xtensa_insnbuf.  See
    182    xtensa_insnbuf_to_chars for a discussion of why this is complicated
    183    by endianness.  */
    184 
    185 void
    186 xtensa_insnbuf_from_chars (xtensa_isa isa,
    187 			   xtensa_insnbuf insn,
    188 			   const unsigned char *cp,
    189 			   int num_chars)
    190 {
    191   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    192   int max_size, insn_size, fence_post, start, increment, i;
    193 
    194   max_size = xtensa_isa_maxlength (isa);
    195 
    196   /* Decode the instruction length so we know how many bytes to read.  */
    197   insn_size = (intisa->length_decode_fn) (cp);
    198   if (insn_size == XTENSA_UNDEFINED)
    199     {
    200       /* This should never happen when the byte stream contains a
    201 	 valid instruction.  Just read the maximum number of bytes....  */
    202       insn_size = max_size;
    203     }
    204 
    205   if (num_chars == 0 || num_chars > insn_size)
    206     num_chars = insn_size;
    207 
    208   if (intisa->is_big_endian)
    209     {
    210       start = max_size - 1;
    211       increment = -1;
    212     }
    213   else
    214     {
    215       start = 0;
    216       increment = 1;
    217     }
    218 
    219   fence_post = start + (num_chars * increment);
    220   memset (insn, 0, xtensa_insnbuf_size (isa) * sizeof (xtensa_insnbuf_word));
    221 
    222   for (i = start; i != fence_post; i += increment, ++cp)
    223     {
    224       int word_inx = byte_to_word_index (i);
    225       int bit_inx = byte_to_bit_index (i);
    226 
    227       insn[word_inx] |= (*cp & 0xff) << bit_inx;
    228     }
    229 }
    230 
    231 
    232 
    233 /* ISA information.  */
    235 
    236 extern xtensa_isa_internal xtensa_modules;
    237 
    238 xtensa_isa
    239 xtensa_isa_init (xtensa_isa_status *errno_p, char **error_msg_p)
    240 {
    241   xtensa_isa_internal *isa = &xtensa_modules;
    242   int n, is_user;
    243 
    244   /* Set up the opcode name lookup table.  */
    245   isa->opname_lookup_table =
    246     bfd_malloc (isa->num_opcodes * sizeof (xtensa_lookup_entry));
    247   CHECK_ALLOC_FOR_INIT (isa->opname_lookup_table, NULL, errno_p, error_msg_p);
    248   for (n = 0; n < isa->num_opcodes; n++)
    249     {
    250       isa->opname_lookup_table[n].key = isa->opcodes[n].name;
    251       isa->opname_lookup_table[n].u.opcode = n;
    252     }
    253   qsort (isa->opname_lookup_table, isa->num_opcodes,
    254 	 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
    255 
    256   /* Set up the state name lookup table.  */
    257   isa->state_lookup_table =
    258     bfd_malloc (isa->num_states * sizeof (xtensa_lookup_entry));
    259   CHECK_ALLOC_FOR_INIT (isa->state_lookup_table, NULL, errno_p, error_msg_p);
    260   for (n = 0; n < isa->num_states; n++)
    261     {
    262       isa->state_lookup_table[n].key = isa->states[n].name;
    263       isa->state_lookup_table[n].u.state = n;
    264     }
    265   qsort (isa->state_lookup_table, isa->num_states,
    266 	 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
    267 
    268   /* Set up the sysreg name lookup table.  */
    269   isa->sysreg_lookup_table =
    270     bfd_malloc (isa->num_sysregs * sizeof (xtensa_lookup_entry));
    271   CHECK_ALLOC_FOR_INIT (isa->sysreg_lookup_table, NULL, errno_p, error_msg_p);
    272   for (n = 0; n < isa->num_sysregs; n++)
    273     {
    274       isa->sysreg_lookup_table[n].key = isa->sysregs[n].name;
    275       isa->sysreg_lookup_table[n].u.sysreg = n;
    276     }
    277   qsort (isa->sysreg_lookup_table, isa->num_sysregs,
    278 	 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
    279 
    280   /* Set up the user & system sysreg number tables.  */
    281   for (is_user = 0; is_user < 2; is_user++)
    282     {
    283       isa->sysreg_table[is_user] =
    284 	bfd_malloc ((isa->max_sysreg_num[is_user] + 1)
    285 		    * sizeof (xtensa_sysreg));
    286       CHECK_ALLOC_FOR_INIT (isa->sysreg_table[is_user], NULL,
    287 			    errno_p, error_msg_p);
    288 
    289       for (n = 0; n <= isa->max_sysreg_num[is_user]; n++)
    290 	isa->sysreg_table[is_user][n] = XTENSA_UNDEFINED;
    291     }
    292   for (n = 0; n < isa->num_sysregs; n++)
    293     {
    294       xtensa_sysreg_internal *sreg = &isa->sysregs[n];
    295       is_user = sreg->is_user;
    296 
    297       isa->sysreg_table[is_user][sreg->number] = n;
    298     }
    299 
    300   /* Set up the interface lookup table.  */
    301   isa->interface_lookup_table =
    302     bfd_malloc (isa->num_interfaces * sizeof (xtensa_lookup_entry));
    303   CHECK_ALLOC_FOR_INIT (isa->interface_lookup_table, NULL, errno_p,
    304 			error_msg_p);
    305   for (n = 0; n < isa->num_interfaces; n++)
    306     {
    307       isa->interface_lookup_table[n].key = isa->interfaces[n].name;
    308       isa->interface_lookup_table[n].u.intf = n;
    309     }
    310   qsort (isa->interface_lookup_table, isa->num_interfaces,
    311 	 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
    312 
    313   /* Set up the funcUnit lookup table.  */
    314   isa->funcUnit_lookup_table =
    315     bfd_malloc (isa->num_funcUnits * sizeof (xtensa_lookup_entry));
    316   CHECK_ALLOC_FOR_INIT (isa->funcUnit_lookup_table, NULL, errno_p,
    317 			error_msg_p);
    318   for (n = 0; n < isa->num_funcUnits; n++)
    319     {
    320       isa->funcUnit_lookup_table[n].key = isa->funcUnits[n].name;
    321       isa->funcUnit_lookup_table[n].u.fun = n;
    322     }
    323   qsort (isa->funcUnit_lookup_table, isa->num_funcUnits,
    324 	 sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
    325 
    326   isa->insnbuf_size = ((isa->insn_size + sizeof (xtensa_insnbuf_word) - 1) /
    327 		       sizeof (xtensa_insnbuf_word));
    328 
    329   return (xtensa_isa) isa;
    330 }
    331 
    332 
    333 void
    334 xtensa_isa_free (xtensa_isa isa)
    335 {
    336   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    337   int n;
    338 
    339   /* With this version of the code, the xtensa_isa structure is not
    340      dynamically allocated, so this function is not essential.  Free
    341      the memory allocated by xtensa_isa_init and restore the xtensa_isa
    342      structure to its initial state.  */
    343 
    344   if (intisa->opname_lookup_table)
    345     {
    346       free (intisa->opname_lookup_table);
    347       intisa->opname_lookup_table = 0;
    348     }
    349 
    350   if (intisa->state_lookup_table)
    351     {
    352       free (intisa->state_lookup_table);
    353       intisa->state_lookup_table = 0;
    354     }
    355 
    356   if (intisa->sysreg_lookup_table)
    357     {
    358       free (intisa->sysreg_lookup_table);
    359       intisa->sysreg_lookup_table = 0;
    360     }
    361   for (n = 0; n < 2; n++)
    362     {
    363       if (intisa->sysreg_table[n])
    364 	{
    365 	  free (intisa->sysreg_table[n]);
    366 	  intisa->sysreg_table[n] = 0;
    367 	}
    368     }
    369 
    370   if (intisa->interface_lookup_table)
    371     {
    372       free (intisa->interface_lookup_table);
    373       intisa->interface_lookup_table = 0;
    374     }
    375 
    376   if (intisa->funcUnit_lookup_table)
    377     {
    378       free (intisa->funcUnit_lookup_table);
    379       intisa->funcUnit_lookup_table = 0;
    380     }
    381 }
    382 
    383 
    384 int
    385 xtensa_isa_name_compare (const void *v1, const void *v2)
    386 {
    387   xtensa_lookup_entry *e1 = (xtensa_lookup_entry *) v1;
    388   xtensa_lookup_entry *e2 = (xtensa_lookup_entry *) v2;
    389 
    390   return strcasecmp (e1->key, e2->key);
    391 }
    392 
    393 
    394 int
    395 xtensa_isa_maxlength (xtensa_isa isa)
    396 {
    397   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    398   return intisa->insn_size;
    399 }
    400 
    401 
    402 int
    403 xtensa_isa_length_from_chars (xtensa_isa isa, const unsigned char *cp)
    404 {
    405   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    406   return (intisa->length_decode_fn) (cp);
    407 }
    408 
    409 
    410 int
    411 xtensa_isa_num_pipe_stages (xtensa_isa isa)
    412 {
    413   xtensa_opcode opcode;
    414   xtensa_funcUnit_use *use;
    415   int num_opcodes, num_uses;
    416   int i, stage;
    417   static int max_stage = XTENSA_UNDEFINED;
    418 
    419   /* Only compute the value once.  */
    420   if (max_stage != XTENSA_UNDEFINED)
    421     return max_stage + 1;
    422 
    423   num_opcodes = xtensa_isa_num_opcodes (isa);
    424   for (opcode = 0; opcode < num_opcodes; opcode++)
    425     {
    426       num_uses = xtensa_opcode_num_funcUnit_uses (isa, opcode);
    427       for (i = 0; i < num_uses; i++)
    428 	{
    429 	  use = xtensa_opcode_funcUnit_use (isa, opcode, i);
    430 	  stage = use->stage;
    431 	  if (stage > max_stage)
    432 	    max_stage = stage;
    433 	}
    434     }
    435 
    436   return max_stage + 1;
    437 }
    438 
    439 
    440 int
    441 xtensa_isa_num_formats (xtensa_isa isa)
    442 {
    443   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    444   return intisa->num_formats;
    445 }
    446 
    447 
    448 int
    449 xtensa_isa_num_opcodes (xtensa_isa isa)
    450 {
    451   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    452   return intisa->num_opcodes;
    453 }
    454 
    455 
    456 int
    457 xtensa_isa_num_regfiles (xtensa_isa isa)
    458 {
    459   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    460   return intisa->num_regfiles;
    461 }
    462 
    463 
    464 int
    465 xtensa_isa_num_states (xtensa_isa isa)
    466 {
    467   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    468   return intisa->num_states;
    469 }
    470 
    471 
    472 int
    473 xtensa_isa_num_sysregs (xtensa_isa isa)
    474 {
    475   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    476   return intisa->num_sysregs;
    477 }
    478 
    479 
    480 int
    481 xtensa_isa_num_interfaces (xtensa_isa isa)
    482 {
    483   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    484   return intisa->num_interfaces;
    485 }
    486 
    487 
    488 int
    489 xtensa_isa_num_funcUnits (xtensa_isa isa)
    490 {
    491   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    492   return intisa->num_funcUnits;
    493 }
    494 
    495 
    496 
    497 /* Instruction formats.  */
    499 
    500 
    501 #define CHECK_FORMAT(INTISA,FMT,ERRVAL) \
    502   do { \
    503     if ((FMT) < 0 || (FMT) >= (INTISA)->num_formats) \
    504       { \
    505 	xtisa_errno = xtensa_isa_bad_format; \
    506 	strcpy (xtisa_error_msg, "invalid format specifier"); \
    507 	return (ERRVAL); \
    508       } \
    509   } while (0)
    510 
    511 
    512 #define CHECK_SLOT(INTISA,FMT,SLOT,ERRVAL) \
    513   do { \
    514     if ((SLOT) < 0 || (SLOT) >= (INTISA)->formats[FMT].num_slots) \
    515       { \
    516 	xtisa_errno = xtensa_isa_bad_slot; \
    517 	strcpy (xtisa_error_msg, "invalid slot specifier"); \
    518 	return (ERRVAL); \
    519       } \
    520   } while (0)
    521 
    522 
    523 const char *
    524 xtensa_format_name (xtensa_isa isa, xtensa_format fmt)
    525 {
    526   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    527   CHECK_FORMAT (intisa, fmt, NULL);
    528   return intisa->formats[fmt].name;
    529 }
    530 
    531 
    532 xtensa_format
    533 xtensa_format_lookup (xtensa_isa isa, const char *fmtname)
    534 {
    535   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    536   int fmt;
    537 
    538   if (!fmtname || !*fmtname)
    539     {
    540       xtisa_errno = xtensa_isa_bad_format;
    541       strcpy (xtisa_error_msg, "invalid format name");
    542       return XTENSA_UNDEFINED;
    543     }
    544 
    545   for (fmt = 0; fmt < intisa->num_formats; fmt++)
    546     {
    547       if (strcasecmp (fmtname, intisa->formats[fmt].name) == 0)
    548 	return fmt;
    549     }
    550 
    551   xtisa_errno = xtensa_isa_bad_format;
    552   sprintf (xtisa_error_msg, "format \"%s\" not recognized", fmtname);
    553   return XTENSA_UNDEFINED;
    554 }
    555 
    556 
    557 xtensa_format
    558 xtensa_format_decode (xtensa_isa isa, const xtensa_insnbuf insn)
    559 {
    560   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    561   xtensa_format fmt;
    562 
    563   fmt = (intisa->format_decode_fn) (insn);
    564   if (fmt != XTENSA_UNDEFINED)
    565     return fmt;
    566 
    567   xtisa_errno = xtensa_isa_bad_format;
    568   strcpy (xtisa_error_msg, "cannot decode instruction format");
    569   return XTENSA_UNDEFINED;
    570 }
    571 
    572 
    573 int
    574 xtensa_format_encode (xtensa_isa isa, xtensa_format fmt, xtensa_insnbuf insn)
    575 {
    576   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    577   CHECK_FORMAT (intisa, fmt, -1);
    578   (*intisa->formats[fmt].encode_fn) (insn);
    579   return 0;
    580 }
    581 
    582 
    583 int
    584 xtensa_format_length (xtensa_isa isa, xtensa_format fmt)
    585 {
    586   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    587   CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
    588   return intisa->formats[fmt].length;
    589 }
    590 
    591 
    592 int
    593 xtensa_format_num_slots (xtensa_isa isa, xtensa_format fmt)
    594 {
    595   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    596   CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
    597   return intisa->formats[fmt].num_slots;
    598 }
    599 
    600 
    601 xtensa_opcode
    602 xtensa_format_slot_nop_opcode (xtensa_isa isa, xtensa_format fmt, int slot)
    603 {
    604   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    605   int slot_id;
    606 
    607   CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
    608   CHECK_SLOT (intisa, fmt, slot, XTENSA_UNDEFINED);
    609 
    610   slot_id = intisa->formats[fmt].slot_id[slot];
    611   return xtensa_opcode_lookup (isa, intisa->slots[slot_id].nop_name);
    612 }
    613 
    614 
    615 int
    616 xtensa_format_get_slot (xtensa_isa isa, xtensa_format fmt, int slot,
    617 			const xtensa_insnbuf insn, xtensa_insnbuf slotbuf)
    618 {
    619   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    620   int slot_id;
    621 
    622   CHECK_FORMAT (intisa, fmt, -1);
    623   CHECK_SLOT (intisa, fmt, slot, -1);
    624 
    625   slot_id = intisa->formats[fmt].slot_id[slot];
    626   (*intisa->slots[slot_id].get_fn) (insn, slotbuf);
    627   return 0;
    628 }
    629 
    630 
    631 int
    632 xtensa_format_set_slot (xtensa_isa isa, xtensa_format fmt, int slot,
    633 			xtensa_insnbuf insn, const xtensa_insnbuf slotbuf)
    634 {
    635   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    636   int slot_id;
    637 
    638   CHECK_FORMAT (intisa, fmt, -1);
    639   CHECK_SLOT (intisa, fmt, slot, -1);
    640 
    641   slot_id = intisa->formats[fmt].slot_id[slot];
    642   (*intisa->slots[slot_id].set_fn) (insn, slotbuf);
    643   return 0;
    644 }
    645 
    646 
    647 
    648 /* Opcode information.  */
    650 
    651 
    652 #define CHECK_OPCODE(INTISA,OPC,ERRVAL) \
    653   do { \
    654     if ((OPC) < 0 || (OPC) >= (INTISA)->num_opcodes) \
    655       { \
    656 	xtisa_errno = xtensa_isa_bad_opcode; \
    657 	strcpy (xtisa_error_msg, "invalid opcode specifier"); \
    658 	return (ERRVAL); \
    659       } \
    660   } while (0)
    661 
    662 
    663 xtensa_opcode
    664 xtensa_opcode_lookup (xtensa_isa isa, const char *opname)
    665 {
    666   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    667   xtensa_lookup_entry entry, *result = 0;
    668 
    669   if (!opname || !*opname)
    670     {
    671       xtisa_errno = xtensa_isa_bad_opcode;
    672       strcpy (xtisa_error_msg, "invalid opcode name");
    673       return XTENSA_UNDEFINED;
    674     }
    675 
    676   if (intisa->num_opcodes != 0)
    677     {
    678       entry.key = opname;
    679       result = bsearch (&entry, intisa->opname_lookup_table,
    680 			intisa->num_opcodes, sizeof (xtensa_lookup_entry),
    681 			xtensa_isa_name_compare);
    682     }
    683 
    684   if (!result)
    685     {
    686       xtisa_errno = xtensa_isa_bad_opcode;
    687       sprintf (xtisa_error_msg, "opcode \"%s\" not recognized", opname);
    688       return XTENSA_UNDEFINED;
    689     }
    690 
    691   return result->u.opcode;
    692 }
    693 
    694 
    695 xtensa_opcode
    696 xtensa_opcode_decode (xtensa_isa isa, xtensa_format fmt, int slot,
    697 		      const xtensa_insnbuf slotbuf)
    698 {
    699   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    700   int slot_id;
    701   xtensa_opcode opc;
    702 
    703   CHECK_FORMAT (intisa, fmt, XTENSA_UNDEFINED);
    704   CHECK_SLOT (intisa, fmt, slot, XTENSA_UNDEFINED);
    705 
    706   slot_id = intisa->formats[fmt].slot_id[slot];
    707 
    708   opc = (intisa->slots[slot_id].opcode_decode_fn) (slotbuf);
    709   if (opc != XTENSA_UNDEFINED)
    710     return opc;
    711 
    712   xtisa_errno = xtensa_isa_bad_opcode;
    713   strcpy (xtisa_error_msg, "cannot decode opcode");
    714   return XTENSA_UNDEFINED;
    715 }
    716 
    717 
    718 int
    719 xtensa_opcode_encode (xtensa_isa isa, xtensa_format fmt, int slot,
    720 		      xtensa_insnbuf slotbuf, xtensa_opcode opc)
    721 {
    722   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    723   int slot_id;
    724   xtensa_opcode_encode_fn encode_fn;
    725 
    726   CHECK_FORMAT (intisa, fmt, -1);
    727   CHECK_SLOT (intisa, fmt, slot, -1);
    728   CHECK_OPCODE (intisa, opc, -1);
    729 
    730   slot_id = intisa->formats[fmt].slot_id[slot];
    731   encode_fn = intisa->opcodes[opc].encode_fns[slot_id];
    732   if (!encode_fn)
    733     {
    734       xtisa_errno = xtensa_isa_wrong_slot;
    735       sprintf (xtisa_error_msg,
    736 	       "opcode \"%s\" is not allowed in slot %d of format \"%s\"",
    737 	       intisa->opcodes[opc].name, slot, intisa->formats[fmt].name);
    738       return -1;
    739     }
    740   (*encode_fn) (slotbuf);
    741   return 0;
    742 }
    743 
    744 
    745 const char *
    746 xtensa_opcode_name (xtensa_isa isa, xtensa_opcode opc)
    747 {
    748   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    749   CHECK_OPCODE (intisa, opc, NULL);
    750   return intisa->opcodes[opc].name;
    751 }
    752 
    753 
    754 int
    755 xtensa_opcode_is_branch (xtensa_isa isa, xtensa_opcode opc)
    756 {
    757   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    758   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    759   if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_BRANCH) != 0)
    760     return 1;
    761   return 0;
    762 }
    763 
    764 
    765 int
    766 xtensa_opcode_is_jump (xtensa_isa isa, xtensa_opcode opc)
    767 {
    768   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    769   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    770   if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_JUMP) != 0)
    771     return 1;
    772   return 0;
    773 }
    774 
    775 
    776 int
    777 xtensa_opcode_is_loop (xtensa_isa isa, xtensa_opcode opc)
    778 {
    779   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    780   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    781   if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_LOOP) != 0)
    782     return 1;
    783   return 0;
    784 }
    785 
    786 
    787 int
    788 xtensa_opcode_is_call (xtensa_isa isa, xtensa_opcode opc)
    789 {
    790   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    791   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    792   if ((intisa->opcodes[opc].flags & XTENSA_OPCODE_IS_CALL) != 0)
    793     return 1;
    794   return 0;
    795 }
    796 
    797 
    798 int
    799 xtensa_opcode_num_operands (xtensa_isa isa, xtensa_opcode opc)
    800 {
    801   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    802   int iclass_id;
    803 
    804   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    805   iclass_id = intisa->opcodes[opc].iclass_id;
    806   return intisa->iclasses[iclass_id].num_operands;
    807 }
    808 
    809 
    810 int
    811 xtensa_opcode_num_stateOperands (xtensa_isa isa, xtensa_opcode opc)
    812 {
    813   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    814   int iclass_id;
    815 
    816   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    817   iclass_id = intisa->opcodes[opc].iclass_id;
    818   return intisa->iclasses[iclass_id].num_stateOperands;
    819 }
    820 
    821 
    822 int
    823 xtensa_opcode_num_interfaceOperands (xtensa_isa isa, xtensa_opcode opc)
    824 {
    825   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    826   int iclass_id;
    827 
    828   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    829   iclass_id = intisa->opcodes[opc].iclass_id;
    830   return intisa->iclasses[iclass_id].num_interfaceOperands;
    831 }
    832 
    833 
    834 int
    835 xtensa_opcode_num_funcUnit_uses (xtensa_isa isa, xtensa_opcode opc)
    836 {
    837   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    838   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    839   return intisa->opcodes[opc].num_funcUnit_uses;
    840 }
    841 
    842 
    843 xtensa_funcUnit_use *
    844 xtensa_opcode_funcUnit_use (xtensa_isa isa, xtensa_opcode opc, int u)
    845 {
    846   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    847   CHECK_OPCODE (intisa, opc, NULL);
    848   if (u < 0 || u >= intisa->opcodes[opc].num_funcUnit_uses)
    849     {
    850       xtisa_errno = xtensa_isa_bad_funcUnit;
    851       sprintf (xtisa_error_msg, "invalid functional unit use number (%d); "
    852 	       "opcode \"%s\" has %d", u, intisa->opcodes[opc].name,
    853 	       intisa->opcodes[opc].num_funcUnit_uses);
    854       return NULL;
    855     }
    856   return &intisa->opcodes[opc].funcUnit_uses[u];
    857 }
    858 
    859 
    860 
    861 /* Operand information.  */
    863 
    864 
    865 #define CHECK_OPERAND(INTISA,OPC,ICLASS,OPND,ERRVAL) \
    866   do { \
    867     if ((OPND) < 0 || (OPND) >= (ICLASS)->num_operands) \
    868       { \
    869 	xtisa_errno = xtensa_isa_bad_operand; \
    870 	sprintf (xtisa_error_msg, "invalid operand number (%d); " \
    871 		 "opcode \"%s\" has %d operands", (OPND), \
    872 		 (INTISA)->opcodes[(OPC)].name, (ICLASS)->num_operands); \
    873 	return (ERRVAL); \
    874       } \
    875   } while (0)
    876 
    877 
    878 static xtensa_operand_internal *
    879 get_operand (xtensa_isa_internal *intisa, xtensa_opcode opc, int opnd)
    880 {
    881   xtensa_iclass_internal *iclass;
    882   int iclass_id, operand_id;
    883 
    884   CHECK_OPCODE (intisa, opc, NULL);
    885   iclass_id = intisa->opcodes[opc].iclass_id;
    886   iclass = &intisa->iclasses[iclass_id];
    887   CHECK_OPERAND (intisa, opc, iclass, opnd, NULL);
    888   operand_id = iclass->operands[opnd].u.operand_id;
    889   return &intisa->operands[operand_id];
    890 }
    891 
    892 
    893 const char *
    894 xtensa_operand_name (xtensa_isa isa, xtensa_opcode opc, int opnd)
    895 {
    896   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    897   xtensa_operand_internal *intop;
    898 
    899   intop = get_operand (intisa, opc, opnd);
    900   if (!intop) return NULL;
    901   return intop->name;
    902 }
    903 
    904 
    905 int
    906 xtensa_operand_is_visible (xtensa_isa isa, xtensa_opcode opc, int opnd)
    907 {
    908   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    909   xtensa_iclass_internal *iclass;
    910   int iclass_id, operand_id;
    911   xtensa_operand_internal *intop;
    912 
    913   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
    914   iclass_id = intisa->opcodes[opc].iclass_id;
    915   iclass = &intisa->iclasses[iclass_id];
    916   CHECK_OPERAND (intisa, opc, iclass, opnd, XTENSA_UNDEFINED);
    917 
    918   /* Special case for "sout" operands.  */
    919   if (iclass->operands[opnd].inout == 's')
    920     return 0;
    921 
    922   operand_id = iclass->operands[opnd].u.operand_id;
    923   intop = &intisa->operands[operand_id];
    924 
    925   if ((intop->flags & XTENSA_OPERAND_IS_INVISIBLE) == 0)
    926     return 1;
    927   return 0;
    928 }
    929 
    930 
    931 char
    932 xtensa_operand_inout (xtensa_isa isa, xtensa_opcode opc, int opnd)
    933 {
    934   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    935   xtensa_iclass_internal *iclass;
    936   int iclass_id;
    937   char inout;
    938 
    939   CHECK_OPCODE (intisa, opc, 0);
    940   iclass_id = intisa->opcodes[opc].iclass_id;
    941   iclass = &intisa->iclasses[iclass_id];
    942   CHECK_OPERAND (intisa, opc, iclass, opnd, 0);
    943   inout = iclass->operands[opnd].inout;
    944 
    945   /* Special case for "sout" operands.  */
    946   if (inout == 's')
    947     return 'o';
    948 
    949   return inout;
    950 }
    951 
    952 
    953 int
    954 xtensa_operand_get_field (xtensa_isa isa, xtensa_opcode opc, int opnd,
    955 			  xtensa_format fmt, int slot,
    956 			  const xtensa_insnbuf slotbuf, uint32 *valp)
    957 {
    958   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    959   xtensa_operand_internal *intop;
    960   int slot_id;
    961   xtensa_get_field_fn get_fn;
    962 
    963   intop = get_operand (intisa, opc, opnd);
    964   if (!intop) return -1;
    965 
    966   CHECK_FORMAT (intisa, fmt, -1);
    967   CHECK_SLOT (intisa, fmt, slot, -1);
    968 
    969   slot_id = intisa->formats[fmt].slot_id[slot];
    970   if (intop->field_id == XTENSA_UNDEFINED)
    971     {
    972       xtisa_errno = xtensa_isa_no_field;
    973       strcpy (xtisa_error_msg, "implicit operand has no field");
    974       return -1;
    975     }
    976   get_fn = intisa->slots[slot_id].get_field_fns[intop->field_id];
    977   if (!get_fn)
    978     {
    979       xtisa_errno = xtensa_isa_wrong_slot;
    980       sprintf (xtisa_error_msg,
    981 	       "operand \"%s\" does not exist in slot %d of format \"%s\"",
    982 	       intop->name, slot, intisa->formats[fmt].name);
    983       return -1;
    984     }
    985   *valp = (*get_fn) (slotbuf);
    986   return 0;
    987 }
    988 
    989 
    990 int
    991 xtensa_operand_set_field (xtensa_isa isa, xtensa_opcode opc, int opnd,
    992 			  xtensa_format fmt, int slot,
    993 			  xtensa_insnbuf slotbuf, uint32 val)
    994 {
    995   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
    996   xtensa_operand_internal *intop;
    997   int slot_id;
    998   xtensa_set_field_fn set_fn;
    999 
   1000   intop = get_operand (intisa, opc, opnd);
   1001   if (!intop) return -1;
   1002 
   1003   CHECK_FORMAT (intisa, fmt, -1);
   1004   CHECK_SLOT (intisa, fmt, slot, -1);
   1005 
   1006   slot_id = intisa->formats[fmt].slot_id[slot];
   1007   if (intop->field_id == XTENSA_UNDEFINED)
   1008     {
   1009       xtisa_errno = xtensa_isa_no_field;
   1010       strcpy (xtisa_error_msg, "implicit operand has no field");
   1011       return -1;
   1012     }
   1013   set_fn = intisa->slots[slot_id].set_field_fns[intop->field_id];
   1014   if (!set_fn)
   1015     {
   1016       xtisa_errno = xtensa_isa_wrong_slot;
   1017       sprintf (xtisa_error_msg,
   1018 	       "operand \"%s\" does not exist in slot %d of format \"%s\"",
   1019 	       intop->name, slot, intisa->formats[fmt].name);
   1020       return -1;
   1021     }
   1022   (*set_fn) (slotbuf, val);
   1023   return 0;
   1024 }
   1025 
   1026 
   1027 int
   1028 xtensa_operand_encode (xtensa_isa isa, xtensa_opcode opc, int opnd,
   1029 		       uint32 *valp)
   1030 {
   1031   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1032   xtensa_operand_internal *intop;
   1033   uint32 test_val, orig_val;
   1034 
   1035   intop = get_operand (intisa, opc, opnd);
   1036   if (!intop)
   1037     return -1;
   1038 
   1039   if (!intop->encode)
   1040     {
   1041       /* This is a default operand for a field.  How can we tell if the
   1042 	 value fits in the field?  Write the value into the field,
   1043 	 read it back, and then make sure we get the same value.  */
   1044       static xtensa_insnbuf tmpbuf = 0;
   1045       int slot_id;
   1046 
   1047       if (!tmpbuf)
   1048 	{
   1049 	  tmpbuf = xtensa_insnbuf_alloc (isa);
   1050 	  CHECK_ALLOC (tmpbuf, -1);
   1051 	}
   1052 
   1053       /* A default operand is always associated with a field,
   1054 	 but check just to be sure....  */
   1055       if (intop->field_id == XTENSA_UNDEFINED)
   1056 	{
   1057 	  xtisa_errno = xtensa_isa_internal_error;
   1058 	  strcpy (xtisa_error_msg, "operand has no field");
   1059 	  return -1;
   1060 	}
   1061 
   1062       /* Find some slot that includes the field.  */
   1063       for (slot_id = 0; slot_id < intisa->num_slots; slot_id++)
   1064 	{
   1065 	  xtensa_get_field_fn get_fn =
   1066 	    intisa->slots[slot_id].get_field_fns[intop->field_id];
   1067 	  xtensa_set_field_fn set_fn =
   1068 	    intisa->slots[slot_id].set_field_fns[intop->field_id];
   1069 
   1070 	  if (get_fn && set_fn)
   1071 	    {
   1072 	      (*set_fn) (tmpbuf, *valp);
   1073 	      return ((*get_fn) (tmpbuf) != *valp);
   1074 	    }
   1075 	}
   1076 
   1077       /* Couldn't find any slot containing the field....  */
   1078       xtisa_errno = xtensa_isa_no_field;
   1079       strcpy (xtisa_error_msg, "field does not exist in any slot");
   1080       return -1;
   1081     }
   1082 
   1083   /* Encode the value.  In some cases, the encoding function may detect
   1084      errors, but most of the time the only way to determine if the value
   1085      was successfully encoded is to decode it and check if it matches
   1086      the original value.  */
   1087   orig_val = *valp;
   1088   if ((*intop->encode) (valp)
   1089       || (test_val = *valp, (*intop->decode) (&test_val))
   1090       || test_val != orig_val)
   1091     {
   1092       xtisa_errno = xtensa_isa_bad_value;
   1093       sprintf (xtisa_error_msg, "cannot encode operand value 0x%08x", *valp);
   1094       return -1;
   1095     }
   1096 
   1097   return 0;
   1098 }
   1099 
   1100 
   1101 int
   1102 xtensa_operand_decode (xtensa_isa isa, xtensa_opcode opc, int opnd,
   1103 		       uint32 *valp)
   1104 {
   1105   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1106   xtensa_operand_internal *intop;
   1107 
   1108   intop = get_operand (intisa, opc, opnd);
   1109   if (!intop) return -1;
   1110 
   1111   /* Use identity function for "default" operands.  */
   1112   if (!intop->decode)
   1113     return 0;
   1114 
   1115   if ((*intop->decode) (valp))
   1116     {
   1117       xtisa_errno = xtensa_isa_bad_value;
   1118       sprintf (xtisa_error_msg, "cannot decode operand value 0x%08x", *valp);
   1119       return -1;
   1120     }
   1121   return 0;
   1122 }
   1123 
   1124 
   1125 int
   1126 xtensa_operand_is_register (xtensa_isa isa, xtensa_opcode opc, int opnd)
   1127 {
   1128   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1129   xtensa_operand_internal *intop;
   1130 
   1131   intop = get_operand (intisa, opc, opnd);
   1132   if (!intop) return XTENSA_UNDEFINED;
   1133 
   1134   if ((intop->flags & XTENSA_OPERAND_IS_REGISTER) != 0)
   1135     return 1;
   1136   return 0;
   1137 }
   1138 
   1139 
   1140 xtensa_regfile
   1141 xtensa_operand_regfile (xtensa_isa isa, xtensa_opcode opc, int opnd)
   1142 {
   1143   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1144   xtensa_operand_internal *intop;
   1145 
   1146   intop = get_operand (intisa, opc, opnd);
   1147   if (!intop) return XTENSA_UNDEFINED;
   1148 
   1149   return intop->regfile;
   1150 }
   1151 
   1152 
   1153 int
   1154 xtensa_operand_num_regs (xtensa_isa isa, xtensa_opcode opc, int opnd)
   1155 {
   1156   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1157   xtensa_operand_internal *intop;
   1158 
   1159   intop = get_operand (intisa, opc, opnd);
   1160   if (!intop) return XTENSA_UNDEFINED;
   1161 
   1162   return intop->num_regs;
   1163 }
   1164 
   1165 
   1166 int
   1167 xtensa_operand_is_known_reg (xtensa_isa isa, xtensa_opcode opc, int opnd)
   1168 {
   1169   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1170   xtensa_operand_internal *intop;
   1171 
   1172   intop = get_operand (intisa, opc, opnd);
   1173   if (!intop) return XTENSA_UNDEFINED;
   1174 
   1175   if ((intop->flags & XTENSA_OPERAND_IS_UNKNOWN) == 0)
   1176     return 1;
   1177   return 0;
   1178 }
   1179 
   1180 
   1181 int
   1182 xtensa_operand_is_PCrelative (xtensa_isa isa, xtensa_opcode opc, int opnd)
   1183 {
   1184   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1185   xtensa_operand_internal *intop;
   1186 
   1187   intop = get_operand (intisa, opc, opnd);
   1188   if (!intop) return XTENSA_UNDEFINED;
   1189 
   1190   if ((intop->flags & XTENSA_OPERAND_IS_PCRELATIVE) != 0)
   1191     return 1;
   1192   return 0;
   1193 }
   1194 
   1195 
   1196 int
   1197 xtensa_operand_do_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd,
   1198 			 uint32 *valp, uint32 pc)
   1199 {
   1200   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1201   xtensa_operand_internal *intop;
   1202 
   1203   intop = get_operand (intisa, opc, opnd);
   1204   if (!intop) return -1;
   1205 
   1206   if ((intop->flags & XTENSA_OPERAND_IS_PCRELATIVE) == 0)
   1207     return 0;
   1208 
   1209   if (!intop->do_reloc)
   1210     {
   1211       xtisa_errno = xtensa_isa_internal_error;
   1212       strcpy (xtisa_error_msg, "operand missing do_reloc function");
   1213       return -1;
   1214     }
   1215 
   1216   if ((*intop->do_reloc) (valp, pc))
   1217     {
   1218       xtisa_errno = xtensa_isa_bad_value;
   1219       sprintf (xtisa_error_msg,
   1220 	       "do_reloc failed for value 0x%08x at PC 0x%08x", *valp, pc);
   1221       return -1;
   1222     }
   1223 
   1224   return 0;
   1225 }
   1226 
   1227 
   1228 int
   1229 xtensa_operand_undo_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd,
   1230 			   uint32 *valp, uint32 pc)
   1231 {
   1232   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1233   xtensa_operand_internal *intop;
   1234 
   1235   intop = get_operand (intisa, opc, opnd);
   1236   if (!intop) return -1;
   1237 
   1238   if ((intop->flags & XTENSA_OPERAND_IS_PCRELATIVE) == 0)
   1239     return 0;
   1240 
   1241   if (!intop->undo_reloc)
   1242     {
   1243       xtisa_errno = xtensa_isa_internal_error;
   1244       strcpy (xtisa_error_msg, "operand missing undo_reloc function");
   1245       return -1;
   1246     }
   1247 
   1248   if ((*intop->undo_reloc) (valp, pc))
   1249     {
   1250       xtisa_errno = xtensa_isa_bad_value;
   1251       sprintf (xtisa_error_msg,
   1252 	       "undo_reloc failed for value 0x%08x at PC 0x%08x", *valp, pc);
   1253       return -1;
   1254     }
   1255 
   1256   return 0;
   1257 }
   1258 
   1259 
   1260 
   1261 /* State Operands.  */
   1263 
   1264 
   1265 #define CHECK_STATE_OPERAND(INTISA,OPC,ICLASS,STOP,ERRVAL) \
   1266   do { \
   1267     if ((STOP) < 0 || (STOP) >= (ICLASS)->num_stateOperands) \
   1268       { \
   1269 	xtisa_errno = xtensa_isa_bad_operand; \
   1270 	sprintf (xtisa_error_msg, "invalid state operand number (%d); " \
   1271 		 "opcode \"%s\" has %d state operands", (STOP), \
   1272 		 (INTISA)->opcodes[(OPC)].name, (ICLASS)->num_stateOperands); \
   1273 	return (ERRVAL); \
   1274       } \
   1275   } while (0)
   1276 
   1277 
   1278 xtensa_state
   1279 xtensa_stateOperand_state (xtensa_isa isa, xtensa_opcode opc, int stOp)
   1280 {
   1281   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1282   xtensa_iclass_internal *iclass;
   1283   int iclass_id;
   1284 
   1285   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
   1286   iclass_id = intisa->opcodes[opc].iclass_id;
   1287   iclass = &intisa->iclasses[iclass_id];
   1288   CHECK_STATE_OPERAND (intisa, opc, iclass, stOp, XTENSA_UNDEFINED);
   1289   return iclass->stateOperands[stOp].u.state;
   1290 }
   1291 
   1292 
   1293 char
   1294 xtensa_stateOperand_inout (xtensa_isa isa, xtensa_opcode opc, int stOp)
   1295 {
   1296   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1297   xtensa_iclass_internal *iclass;
   1298   int iclass_id;
   1299 
   1300   CHECK_OPCODE (intisa, opc, 0);
   1301   iclass_id = intisa->opcodes[opc].iclass_id;
   1302   iclass = &intisa->iclasses[iclass_id];
   1303   CHECK_STATE_OPERAND (intisa, opc, iclass, stOp, 0);
   1304   return iclass->stateOperands[stOp].inout;
   1305 }
   1306 
   1307 
   1308 
   1309 /* Interface Operands.  */
   1311 
   1312 
   1313 #define CHECK_INTERFACE_OPERAND(INTISA,OPC,ICLASS,IFOP,ERRVAL) \
   1314   do { \
   1315     if ((IFOP) < 0 || (IFOP) >= (ICLASS)->num_interfaceOperands) \
   1316       { \
   1317 	xtisa_errno = xtensa_isa_bad_operand; \
   1318 	sprintf (xtisa_error_msg, "invalid interface operand number (%d); " \
   1319 		 "opcode \"%s\" has %d interface operands", (IFOP), \
   1320 		 (INTISA)->opcodes[(OPC)].name, \
   1321 		 (ICLASS)->num_interfaceOperands); \
   1322 	return (ERRVAL); \
   1323       } \
   1324   } while (0)
   1325 
   1326 
   1327 xtensa_interface
   1328 xtensa_interfaceOperand_interface (xtensa_isa isa, xtensa_opcode opc,
   1329 				   int ifOp)
   1330 {
   1331   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1332   xtensa_iclass_internal *iclass;
   1333   int iclass_id;
   1334 
   1335   CHECK_OPCODE (intisa, opc, XTENSA_UNDEFINED);
   1336   iclass_id = intisa->opcodes[opc].iclass_id;
   1337   iclass = &intisa->iclasses[iclass_id];
   1338   CHECK_INTERFACE_OPERAND (intisa, opc, iclass, ifOp, XTENSA_UNDEFINED);
   1339   return iclass->interfaceOperands[ifOp];
   1340 }
   1341 
   1342 
   1343 
   1344 /* Register Files.  */
   1346 
   1347 
   1348 #define CHECK_REGFILE(INTISA,RF,ERRVAL) \
   1349   do { \
   1350     if ((RF) < 0 || (RF) >= (INTISA)->num_regfiles) \
   1351       { \
   1352 	xtisa_errno = xtensa_isa_bad_regfile; \
   1353 	strcpy (xtisa_error_msg, "invalid regfile specifier"); \
   1354 	return (ERRVAL); \
   1355       } \
   1356   } while (0)
   1357 
   1358 
   1359 xtensa_regfile
   1360 xtensa_regfile_lookup (xtensa_isa isa, const char *name)
   1361 {
   1362   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1363   int n;
   1364 
   1365   if (!name || !*name)
   1366     {
   1367       xtisa_errno = xtensa_isa_bad_regfile;
   1368       strcpy (xtisa_error_msg, "invalid regfile name");
   1369       return XTENSA_UNDEFINED;
   1370     }
   1371 
   1372   /* The expected number of regfiles is small; use a linear search.  */
   1373   for (n = 0; n < intisa->num_regfiles; n++)
   1374     {
   1375       if (!filename_cmp (intisa->regfiles[n].name, name))
   1376 	return n;
   1377     }
   1378 
   1379   xtisa_errno = xtensa_isa_bad_regfile;
   1380   sprintf (xtisa_error_msg, "regfile \"%s\" not recognized", name);
   1381   return XTENSA_UNDEFINED;
   1382 }
   1383 
   1384 
   1385 xtensa_regfile
   1386 xtensa_regfile_lookup_shortname (xtensa_isa isa, const char *shortname)
   1387 {
   1388   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1389   int n;
   1390 
   1391   if (!shortname || !*shortname)
   1392     {
   1393       xtisa_errno = xtensa_isa_bad_regfile;
   1394       strcpy (xtisa_error_msg, "invalid regfile shortname");
   1395       return XTENSA_UNDEFINED;
   1396     }
   1397 
   1398   /* The expected number of regfiles is small; use a linear search.  */
   1399   for (n = 0; n < intisa->num_regfiles; n++)
   1400     {
   1401       /* Ignore regfile views since they always have the same shortnames
   1402 	 as their parents.  */
   1403       if (intisa->regfiles[n].parent != n)
   1404 	continue;
   1405       if (!filename_cmp (intisa->regfiles[n].shortname, shortname))
   1406 	return n;
   1407     }
   1408 
   1409   xtisa_errno = xtensa_isa_bad_regfile;
   1410   sprintf (xtisa_error_msg, "regfile shortname \"%s\" not recognized",
   1411 	   shortname);
   1412   return XTENSA_UNDEFINED;
   1413 }
   1414 
   1415 
   1416 const char *
   1417 xtensa_regfile_name (xtensa_isa isa, xtensa_regfile rf)
   1418 {
   1419   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1420   CHECK_REGFILE (intisa, rf, NULL);
   1421   return intisa->regfiles[rf].name;
   1422 }
   1423 
   1424 
   1425 const char *
   1426 xtensa_regfile_shortname (xtensa_isa isa, xtensa_regfile rf)
   1427 {
   1428   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1429   CHECK_REGFILE (intisa, rf, NULL);
   1430   return intisa->regfiles[rf].shortname;
   1431 }
   1432 
   1433 
   1434 xtensa_regfile
   1435 xtensa_regfile_view_parent (xtensa_isa isa, xtensa_regfile rf)
   1436 {
   1437   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1438   CHECK_REGFILE (intisa, rf, XTENSA_UNDEFINED);
   1439   return intisa->regfiles[rf].parent;
   1440 }
   1441 
   1442 
   1443 int
   1444 xtensa_regfile_num_bits (xtensa_isa isa, xtensa_regfile rf)
   1445 {
   1446   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1447   CHECK_REGFILE (intisa, rf, XTENSA_UNDEFINED);
   1448   return intisa->regfiles[rf].num_bits;
   1449 }
   1450 
   1451 
   1452 int
   1453 xtensa_regfile_num_entries (xtensa_isa isa, xtensa_regfile rf)
   1454 {
   1455   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1456   CHECK_REGFILE (intisa, rf, XTENSA_UNDEFINED);
   1457   return intisa->regfiles[rf].num_entries;
   1458 }
   1459 
   1460 
   1461 
   1462 /* Processor States.  */
   1464 
   1465 
   1466 #define CHECK_STATE(INTISA,ST,ERRVAL) \
   1467   do { \
   1468     if ((ST) < 0 || (ST) >= (INTISA)->num_states) \
   1469       { \
   1470 	xtisa_errno = xtensa_isa_bad_state; \
   1471 	strcpy (xtisa_error_msg, "invalid state specifier"); \
   1472 	return (ERRVAL); \
   1473       } \
   1474   } while (0)
   1475 
   1476 
   1477 xtensa_state
   1478 xtensa_state_lookup (xtensa_isa isa, const char *name)
   1479 {
   1480   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1481   xtensa_lookup_entry entry, *result = 0;
   1482 
   1483   if (!name || !*name)
   1484     {
   1485       xtisa_errno = xtensa_isa_bad_state;
   1486       strcpy (xtisa_error_msg, "invalid state name");
   1487       return XTENSA_UNDEFINED;
   1488     }
   1489 
   1490   if (intisa->num_states != 0)
   1491     {
   1492       entry.key = name;
   1493       result = bsearch (&entry, intisa->state_lookup_table, intisa->num_states,
   1494 			sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
   1495     }
   1496 
   1497   if (!result)
   1498     {
   1499       xtisa_errno = xtensa_isa_bad_state;
   1500       sprintf (xtisa_error_msg, "state \"%s\" not recognized", name);
   1501       return XTENSA_UNDEFINED;
   1502     }
   1503 
   1504   return result->u.state;
   1505 }
   1506 
   1507 
   1508 const char *
   1509 xtensa_state_name (xtensa_isa isa, xtensa_state st)
   1510 {
   1511   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1512   CHECK_STATE (intisa, st, NULL);
   1513   return intisa->states[st].name;
   1514 }
   1515 
   1516 
   1517 int
   1518 xtensa_state_num_bits (xtensa_isa isa, xtensa_state st)
   1519 {
   1520   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1521   CHECK_STATE (intisa, st, XTENSA_UNDEFINED);
   1522   return intisa->states[st].num_bits;
   1523 }
   1524 
   1525 
   1526 int
   1527 xtensa_state_is_exported (xtensa_isa isa, xtensa_state st)
   1528 {
   1529   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1530   CHECK_STATE (intisa, st, XTENSA_UNDEFINED);
   1531   if ((intisa->states[st].flags & XTENSA_STATE_IS_EXPORTED) != 0)
   1532     return 1;
   1533   return 0;
   1534 }
   1535 
   1536 
   1537 int
   1538 xtensa_state_is_shared_or (xtensa_isa isa, xtensa_state st)
   1539 {
   1540   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1541   CHECK_STATE (intisa, st, XTENSA_UNDEFINED);
   1542   if ((intisa->states[st].flags & XTENSA_STATE_IS_SHARED_OR) != 0)
   1543     return 1;
   1544   return 0;
   1545 }
   1546 
   1547 
   1548 
   1549 /* Sysregs.  */
   1551 
   1552 
   1553 #define CHECK_SYSREG(INTISA,SYSREG,ERRVAL) \
   1554   do { \
   1555     if ((SYSREG) < 0 || (SYSREG) >= (INTISA)->num_sysregs) \
   1556       { \
   1557 	xtisa_errno = xtensa_isa_bad_sysreg; \
   1558 	strcpy (xtisa_error_msg, "invalid sysreg specifier"); \
   1559 	return (ERRVAL); \
   1560       } \
   1561   } while (0)
   1562 
   1563 
   1564 xtensa_sysreg
   1565 xtensa_sysreg_lookup (xtensa_isa isa, int num, int is_user)
   1566 {
   1567   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1568 
   1569   if (is_user != 0)
   1570     is_user = 1;
   1571 
   1572   if (num < 0 || num > intisa->max_sysreg_num[is_user]
   1573       || intisa->sysreg_table[is_user][num] == XTENSA_UNDEFINED)
   1574     {
   1575       xtisa_errno = xtensa_isa_bad_sysreg;
   1576       strcpy (xtisa_error_msg, "sysreg not recognized");
   1577       return XTENSA_UNDEFINED;
   1578     }
   1579 
   1580   return intisa->sysreg_table[is_user][num];
   1581 }
   1582 
   1583 
   1584 xtensa_sysreg
   1585 xtensa_sysreg_lookup_name (xtensa_isa isa, const char *name)
   1586 {
   1587   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1588   xtensa_lookup_entry entry, *result = 0;
   1589 
   1590   if (!name || !*name)
   1591     {
   1592       xtisa_errno = xtensa_isa_bad_sysreg;
   1593       strcpy (xtisa_error_msg, "invalid sysreg name");
   1594       return XTENSA_UNDEFINED;
   1595     }
   1596 
   1597   if (intisa->num_sysregs != 0)
   1598     {
   1599       entry.key = name;
   1600       result = bsearch (&entry, intisa->sysreg_lookup_table,
   1601 			intisa->num_sysregs, sizeof (xtensa_lookup_entry),
   1602 			xtensa_isa_name_compare);
   1603     }
   1604 
   1605   if (!result)
   1606     {
   1607       xtisa_errno = xtensa_isa_bad_sysreg;
   1608       sprintf (xtisa_error_msg, "sysreg \"%s\" not recognized", name);
   1609       return XTENSA_UNDEFINED;
   1610     }
   1611 
   1612   return result->u.sysreg;
   1613 }
   1614 
   1615 
   1616 const char *
   1617 xtensa_sysreg_name (xtensa_isa isa, xtensa_sysreg sysreg)
   1618 {
   1619   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1620   CHECK_SYSREG (intisa, sysreg, NULL);
   1621   return intisa->sysregs[sysreg].name;
   1622 }
   1623 
   1624 
   1625 int
   1626 xtensa_sysreg_number (xtensa_isa isa, xtensa_sysreg sysreg)
   1627 {
   1628   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1629   CHECK_SYSREG (intisa, sysreg, XTENSA_UNDEFINED);
   1630   return intisa->sysregs[sysreg].number;
   1631 }
   1632 
   1633 
   1634 int
   1635 xtensa_sysreg_is_user (xtensa_isa isa, xtensa_sysreg sysreg)
   1636 {
   1637   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1638   CHECK_SYSREG (intisa, sysreg, XTENSA_UNDEFINED);
   1639   if (intisa->sysregs[sysreg].is_user)
   1640     return 1;
   1641   return 0;
   1642 }
   1643 
   1644 
   1645 
   1646 /* Interfaces.  */
   1648 
   1649 
   1650 #define CHECK_INTERFACE(INTISA,INTF,ERRVAL) \
   1651   do { \
   1652     if ((INTF) < 0 || (INTF) >= (INTISA)->num_interfaces) \
   1653       { \
   1654 	xtisa_errno = xtensa_isa_bad_interface; \
   1655 	strcpy (xtisa_error_msg, "invalid interface specifier"); \
   1656 	return (ERRVAL); \
   1657       } \
   1658   } while (0)
   1659 
   1660 
   1661 xtensa_interface
   1662 xtensa_interface_lookup (xtensa_isa isa, const char *ifname)
   1663 {
   1664   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1665   xtensa_lookup_entry entry, *result = 0;
   1666 
   1667   if (!ifname || !*ifname)
   1668     {
   1669       xtisa_errno = xtensa_isa_bad_interface;
   1670       strcpy (xtisa_error_msg, "invalid interface name");
   1671       return XTENSA_UNDEFINED;
   1672     }
   1673 
   1674   if (intisa->num_interfaces != 0)
   1675     {
   1676       entry.key = ifname;
   1677       result = bsearch (&entry, intisa->interface_lookup_table,
   1678 			intisa->num_interfaces, sizeof (xtensa_lookup_entry),
   1679 			xtensa_isa_name_compare);
   1680     }
   1681 
   1682   if (!result)
   1683     {
   1684       xtisa_errno = xtensa_isa_bad_interface;
   1685       sprintf (xtisa_error_msg, "interface \"%s\" not recognized", ifname);
   1686       return XTENSA_UNDEFINED;
   1687     }
   1688 
   1689   return result->u.intf;
   1690 }
   1691 
   1692 
   1693 const char *
   1694 xtensa_interface_name (xtensa_isa isa, xtensa_interface intf)
   1695 {
   1696   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1697   CHECK_INTERFACE (intisa, intf, NULL);
   1698   return intisa->interfaces[intf].name;
   1699 }
   1700 
   1701 
   1702 int
   1703 xtensa_interface_num_bits (xtensa_isa isa, xtensa_interface intf)
   1704 {
   1705   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1706   CHECK_INTERFACE (intisa, intf, XTENSA_UNDEFINED);
   1707   return intisa->interfaces[intf].num_bits;
   1708 }
   1709 
   1710 
   1711 char
   1712 xtensa_interface_inout (xtensa_isa isa, xtensa_interface intf)
   1713 {
   1714   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1715   CHECK_INTERFACE (intisa, intf, 0);
   1716   return intisa->interfaces[intf].inout;
   1717 }
   1718 
   1719 
   1720 int
   1721 xtensa_interface_has_side_effect (xtensa_isa isa, xtensa_interface intf)
   1722 {
   1723   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1724   CHECK_INTERFACE (intisa, intf, XTENSA_UNDEFINED);
   1725   if ((intisa->interfaces[intf].flags & XTENSA_INTERFACE_HAS_SIDE_EFFECT) != 0)
   1726     return 1;
   1727   return 0;
   1728 }
   1729 
   1730 
   1731 int
   1732 xtensa_interface_class_id (xtensa_isa isa, xtensa_interface intf)
   1733 {
   1734   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1735   CHECK_INTERFACE (intisa, intf, XTENSA_UNDEFINED);
   1736   return intisa->interfaces[intf].class_id;
   1737 }
   1738 
   1739 
   1740 
   1741 /* Functional Units.  */
   1743 
   1744 
   1745 #define CHECK_FUNCUNIT(INTISA,FUN,ERRVAL) \
   1746   do { \
   1747     if ((FUN) < 0 || (FUN) >= (INTISA)->num_funcUnits) \
   1748       { \
   1749 	xtisa_errno = xtensa_isa_bad_funcUnit; \
   1750 	strcpy (xtisa_error_msg, "invalid functional unit specifier"); \
   1751 	return (ERRVAL); \
   1752       } \
   1753   } while (0)
   1754 
   1755 
   1756 xtensa_funcUnit
   1757 xtensa_funcUnit_lookup (xtensa_isa isa, const char *fname)
   1758 {
   1759   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1760   xtensa_lookup_entry entry, *result = 0;
   1761 
   1762   if (!fname || !*fname)
   1763     {
   1764       xtisa_errno = xtensa_isa_bad_funcUnit;
   1765       strcpy (xtisa_error_msg, "invalid functional unit name");
   1766       return XTENSA_UNDEFINED;
   1767     }
   1768 
   1769   if (intisa->num_funcUnits != 0)
   1770     {
   1771       entry.key = fname;
   1772       result = bsearch (&entry, intisa->funcUnit_lookup_table,
   1773 			intisa->num_funcUnits, sizeof (xtensa_lookup_entry),
   1774 			xtensa_isa_name_compare);
   1775     }
   1776 
   1777   if (!result)
   1778     {
   1779       xtisa_errno = xtensa_isa_bad_funcUnit;
   1780       sprintf (xtisa_error_msg,
   1781 	       "functional unit \"%s\" not recognized", fname);
   1782       return XTENSA_UNDEFINED;
   1783     }
   1784 
   1785   return result->u.fun;
   1786 }
   1787 
   1788 
   1789 const char *
   1790 xtensa_funcUnit_name (xtensa_isa isa, xtensa_funcUnit fun)
   1791 {
   1792   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1793   CHECK_FUNCUNIT (intisa, fun, NULL);
   1794   return intisa->funcUnits[fun].name;
   1795 }
   1796 
   1797 
   1798 int
   1799 xtensa_funcUnit_num_copies (xtensa_isa isa, xtensa_funcUnit fun)
   1800 {
   1801   xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
   1802   CHECK_FUNCUNIT (intisa, fun, XTENSA_UNDEFINED);
   1803   return intisa->funcUnits[fun].num_copies;
   1804 }
   1805 
   1806