1 /* Configurable Xtensa ISA support.
2 Copyright 2003, 2004, 2005, 2007 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 isa
->sysreg_table
[is_user
][sreg
->number
] = n
;
298 /* Set up the interface lookup table. */
299 isa
->interface_lookup_table
=
300 bfd_malloc (isa
->num_interfaces
* sizeof (xtensa_lookup_entry
));
301 CHECK_ALLOC_FOR_INIT (isa
->interface_lookup_table
, NULL
, errno_p
,
303 for (n
= 0; n
< isa
->num_interfaces
; n
++)
305 isa
->interface_lookup_table
[n
].key
= isa
->interfaces
[n
].name
;
306 isa
->interface_lookup_table
[n
].u
.intf
= n
;
308 qsort (isa
->interface_lookup_table
, isa
->num_interfaces
,
309 sizeof (xtensa_lookup_entry
), xtensa_isa_name_compare
);
311 /* Set up the funcUnit lookup table. */
312 isa
->funcUnit_lookup_table
=
313 bfd_malloc (isa
->num_funcUnits
* sizeof (xtensa_lookup_entry
));
314 CHECK_ALLOC_FOR_INIT (isa
->funcUnit_lookup_table
, NULL
, errno_p
,
316 for (n
= 0; n
< isa
->num_funcUnits
; n
++)
318 isa
->funcUnit_lookup_table
[n
].key
= isa
->funcUnits
[n
].name
;
319 isa
->funcUnit_lookup_table
[n
].u
.fun
= n
;
321 qsort (isa
->funcUnit_lookup_table
, isa
->num_funcUnits
,
322 sizeof (xtensa_lookup_entry
), xtensa_isa_name_compare
);
324 isa
->insnbuf_size
= ((isa
->insn_size
+ sizeof (xtensa_insnbuf_word
) - 1) /
325 sizeof (xtensa_insnbuf_word
));
327 return (xtensa_isa
) isa
;
332 xtensa_isa_free (xtensa_isa isa
)
334 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
337 /* With this version of the code, the xtensa_isa structure is not
338 dynamically allocated, so this function is not essential. Free
339 the memory allocated by xtensa_isa_init and restore the xtensa_isa
340 structure to its initial state. */
342 if (intisa
->opname_lookup_table
)
344 free (intisa
->opname_lookup_table
);
345 intisa
->opname_lookup_table
= 0;
348 if (intisa
->state_lookup_table
)
350 free (intisa
->state_lookup_table
);
351 intisa
->state_lookup_table
= 0;
354 if (intisa
->sysreg_lookup_table
)
356 free (intisa
->sysreg_lookup_table
);
357 intisa
->sysreg_lookup_table
= 0;
359 for (n
= 0; n
< 2; n
++)
361 if (intisa
->sysreg_table
[n
])
363 free (intisa
->sysreg_table
[n
]);
364 intisa
->sysreg_table
[n
] = 0;
368 if (intisa
->interface_lookup_table
)
370 free (intisa
->interface_lookup_table
);
371 intisa
->interface_lookup_table
= 0;
374 if (intisa
->funcUnit_lookup_table
)
376 free (intisa
->funcUnit_lookup_table
);
377 intisa
->funcUnit_lookup_table
= 0;
383 xtensa_isa_name_compare (const void *v1
, const void *v2
)
385 xtensa_lookup_entry
*e1
= (xtensa_lookup_entry
*) v1
;
386 xtensa_lookup_entry
*e2
= (xtensa_lookup_entry
*) v2
;
388 return strcasecmp (e1
->key
, e2
->key
);
393 xtensa_isa_maxlength (xtensa_isa isa
)
395 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
396 return intisa
->insn_size
;
401 xtensa_isa_length_from_chars (xtensa_isa isa
, const unsigned char *cp
)
403 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
404 return (intisa
->length_decode_fn
) (cp
);
409 xtensa_isa_num_pipe_stages (xtensa_isa isa
)
411 xtensa_opcode opcode
;
412 xtensa_funcUnit_use
*use
;
413 int num_opcodes
, num_uses
;
414 int i
, stage
, max_stage
= XTENSA_UNDEFINED
;
416 num_opcodes
= xtensa_isa_num_opcodes (isa
);
417 for (opcode
= 0; opcode
< num_opcodes
; opcode
++)
419 num_uses
= xtensa_opcode_num_funcUnit_uses (isa
, opcode
);
420 for (i
= 0; i
< num_uses
; i
++)
422 use
= xtensa_opcode_funcUnit_use (isa
, opcode
, i
);
424 if (stage
> max_stage
)
429 return max_stage
+ 1;
434 xtensa_isa_num_formats (xtensa_isa isa
)
436 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
437 return intisa
->num_formats
;
442 xtensa_isa_num_opcodes (xtensa_isa isa
)
444 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
445 return intisa
->num_opcodes
;
450 xtensa_isa_num_regfiles (xtensa_isa isa
)
452 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
453 return intisa
->num_regfiles
;
458 xtensa_isa_num_states (xtensa_isa isa
)
460 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
461 return intisa
->num_states
;
466 xtensa_isa_num_sysregs (xtensa_isa isa
)
468 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
469 return intisa
->num_sysregs
;
474 xtensa_isa_num_interfaces (xtensa_isa isa
)
476 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
477 return intisa
->num_interfaces
;
482 xtensa_isa_num_funcUnits (xtensa_isa isa
)
484 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
485 return intisa
->num_funcUnits
;
490 /* Instruction formats. */
493 #define CHECK_FORMAT(INTISA,FMT,ERRVAL) \
495 if ((FMT) < 0 || (FMT) >= (INTISA)->num_formats) \
497 xtisa_errno = xtensa_isa_bad_format; \
498 strcpy (xtisa_error_msg, "invalid format specifier"); \
504 #define CHECK_SLOT(INTISA,FMT,SLOT,ERRVAL) \
506 if ((SLOT) < 0 || (SLOT) >= (INTISA)->formats[FMT].num_slots) \
508 xtisa_errno = xtensa_isa_bad_slot; \
509 strcpy (xtisa_error_msg, "invalid slot specifier"); \
516 xtensa_format_name (xtensa_isa isa
, xtensa_format fmt
)
518 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
519 CHECK_FORMAT (intisa
, fmt
, NULL
);
520 return intisa
->formats
[fmt
].name
;
525 xtensa_format_lookup (xtensa_isa isa
, const char *fmtname
)
527 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
530 if (!fmtname
|| !*fmtname
)
532 xtisa_errno
= xtensa_isa_bad_format
;
533 strcpy (xtisa_error_msg
, "invalid format name");
534 return XTENSA_UNDEFINED
;
537 for (fmt
= 0; fmt
< intisa
->num_formats
; fmt
++)
539 if (strcasecmp (fmtname
, intisa
->formats
[fmt
].name
) == 0)
543 xtisa_errno
= xtensa_isa_bad_format
;
544 sprintf (xtisa_error_msg
, "format \"%s\" not recognized", fmtname
);
545 return XTENSA_UNDEFINED
;
550 xtensa_format_decode (xtensa_isa isa
, const xtensa_insnbuf insn
)
552 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
555 fmt
= (intisa
->format_decode_fn
) (insn
);
556 if (fmt
!= XTENSA_UNDEFINED
)
559 xtisa_errno
= xtensa_isa_bad_format
;
560 strcpy (xtisa_error_msg
, "cannot decode instruction format");
561 return XTENSA_UNDEFINED
;
566 xtensa_format_encode (xtensa_isa isa
, xtensa_format fmt
, xtensa_insnbuf insn
)
568 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
569 CHECK_FORMAT (intisa
, fmt
, -1);
570 (*intisa
->formats
[fmt
].encode_fn
) (insn
);
576 xtensa_format_length (xtensa_isa isa
, xtensa_format fmt
)
578 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
579 CHECK_FORMAT (intisa
, fmt
, XTENSA_UNDEFINED
);
580 return intisa
->formats
[fmt
].length
;
585 xtensa_format_num_slots (xtensa_isa isa
, xtensa_format fmt
)
587 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
588 CHECK_FORMAT (intisa
, fmt
, XTENSA_UNDEFINED
);
589 return intisa
->formats
[fmt
].num_slots
;
594 xtensa_format_slot_nop_opcode (xtensa_isa isa
, xtensa_format fmt
, int slot
)
596 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
599 CHECK_FORMAT (intisa
, fmt
, XTENSA_UNDEFINED
);
600 CHECK_SLOT (intisa
, fmt
, slot
, XTENSA_UNDEFINED
);
602 slot_id
= intisa
->formats
[fmt
].slot_id
[slot
];
603 return xtensa_opcode_lookup (isa
, intisa
->slots
[slot_id
].nop_name
);
608 xtensa_format_get_slot (xtensa_isa isa
, xtensa_format fmt
, int slot
,
609 const xtensa_insnbuf insn
, xtensa_insnbuf slotbuf
)
611 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
614 CHECK_FORMAT (intisa
, fmt
, -1);
615 CHECK_SLOT (intisa
, fmt
, slot
, -1);
617 slot_id
= intisa
->formats
[fmt
].slot_id
[slot
];
618 (*intisa
->slots
[slot_id
].get_fn
) (insn
, slotbuf
);
624 xtensa_format_set_slot (xtensa_isa isa
, xtensa_format fmt
, int slot
,
625 xtensa_insnbuf insn
, const xtensa_insnbuf slotbuf
)
627 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
630 CHECK_FORMAT (intisa
, fmt
, -1);
631 CHECK_SLOT (intisa
, fmt
, slot
, -1);
633 slot_id
= intisa
->formats
[fmt
].slot_id
[slot
];
634 (*intisa
->slots
[slot_id
].set_fn
) (insn
, slotbuf
);
640 /* Opcode information. */
643 #define CHECK_OPCODE(INTISA,OPC,ERRVAL) \
645 if ((OPC) < 0 || (OPC) >= (INTISA)->num_opcodes) \
647 xtisa_errno = xtensa_isa_bad_opcode; \
648 strcpy (xtisa_error_msg, "invalid opcode specifier"); \
655 xtensa_opcode_lookup (xtensa_isa isa
, const char *opname
)
657 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
658 xtensa_lookup_entry entry
, *result
= 0;
660 if (!opname
|| !*opname
)
662 xtisa_errno
= xtensa_isa_bad_opcode
;
663 strcpy (xtisa_error_msg
, "invalid opcode name");
664 return XTENSA_UNDEFINED
;
667 if (intisa
->num_opcodes
!= 0)
670 result
= bsearch (&entry
, intisa
->opname_lookup_table
,
671 intisa
->num_opcodes
, sizeof (xtensa_lookup_entry
),
672 xtensa_isa_name_compare
);
677 xtisa_errno
= xtensa_isa_bad_opcode
;
678 sprintf (xtisa_error_msg
, "opcode \"%s\" not recognized", opname
);
679 return XTENSA_UNDEFINED
;
682 return result
->u
.opcode
;
687 xtensa_opcode_decode (xtensa_isa isa
, xtensa_format fmt
, int slot
,
688 const xtensa_insnbuf slotbuf
)
690 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
694 CHECK_FORMAT (intisa
, fmt
, XTENSA_UNDEFINED
);
695 CHECK_SLOT (intisa
, fmt
, slot
, XTENSA_UNDEFINED
);
697 slot_id
= intisa
->formats
[fmt
].slot_id
[slot
];
699 opc
= (intisa
->slots
[slot_id
].opcode_decode_fn
) (slotbuf
);
700 if (opc
!= XTENSA_UNDEFINED
)
703 xtisa_errno
= xtensa_isa_bad_opcode
;
704 strcpy (xtisa_error_msg
, "cannot decode opcode");
705 return XTENSA_UNDEFINED
;
710 xtensa_opcode_encode (xtensa_isa isa
, xtensa_format fmt
, int slot
,
711 xtensa_insnbuf slotbuf
, xtensa_opcode opc
)
713 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
715 xtensa_opcode_encode_fn encode_fn
;
717 CHECK_FORMAT (intisa
, fmt
, -1);
718 CHECK_SLOT (intisa
, fmt
, slot
, -1);
719 CHECK_OPCODE (intisa
, opc
, -1);
721 slot_id
= intisa
->formats
[fmt
].slot_id
[slot
];
722 encode_fn
= intisa
->opcodes
[opc
].encode_fns
[slot_id
];
725 xtisa_errno
= xtensa_isa_wrong_slot
;
726 sprintf (xtisa_error_msg
,
727 "opcode \"%s\" is not allowed in slot %d of format \"%s\"",
728 intisa
->opcodes
[opc
].name
, slot
, intisa
->formats
[fmt
].name
);
731 (*encode_fn
) (slotbuf
);
737 xtensa_opcode_name (xtensa_isa isa
, xtensa_opcode opc
)
739 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
740 CHECK_OPCODE (intisa
, opc
, NULL
);
741 return intisa
->opcodes
[opc
].name
;
746 xtensa_opcode_is_branch (xtensa_isa isa
, xtensa_opcode opc
)
748 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
749 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
750 if ((intisa
->opcodes
[opc
].flags
& XTENSA_OPCODE_IS_BRANCH
) != 0)
757 xtensa_opcode_is_jump (xtensa_isa isa
, xtensa_opcode opc
)
759 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
760 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
761 if ((intisa
->opcodes
[opc
].flags
& XTENSA_OPCODE_IS_JUMP
) != 0)
768 xtensa_opcode_is_loop (xtensa_isa isa
, xtensa_opcode opc
)
770 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
771 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
772 if ((intisa
->opcodes
[opc
].flags
& XTENSA_OPCODE_IS_LOOP
) != 0)
779 xtensa_opcode_is_call (xtensa_isa isa
, xtensa_opcode opc
)
781 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
782 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
783 if ((intisa
->opcodes
[opc
].flags
& XTENSA_OPCODE_IS_CALL
) != 0)
790 xtensa_opcode_num_operands (xtensa_isa isa
, xtensa_opcode opc
)
792 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
795 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
796 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
797 return intisa
->iclasses
[iclass_id
].num_operands
;
802 xtensa_opcode_num_stateOperands (xtensa_isa isa
, xtensa_opcode opc
)
804 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
807 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
808 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
809 return intisa
->iclasses
[iclass_id
].num_stateOperands
;
814 xtensa_opcode_num_interfaceOperands (xtensa_isa isa
, xtensa_opcode opc
)
816 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
819 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
820 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
821 return intisa
->iclasses
[iclass_id
].num_interfaceOperands
;
826 xtensa_opcode_num_funcUnit_uses (xtensa_isa isa
, xtensa_opcode opc
)
828 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
829 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
830 return intisa
->opcodes
[opc
].num_funcUnit_uses
;
834 xtensa_funcUnit_use
*
835 xtensa_opcode_funcUnit_use (xtensa_isa isa
, xtensa_opcode opc
, int u
)
837 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
838 CHECK_OPCODE (intisa
, opc
, NULL
);
839 if (u
< 0 || u
>= intisa
->opcodes
[opc
].num_funcUnit_uses
)
841 xtisa_errno
= xtensa_isa_bad_funcUnit
;
842 sprintf (xtisa_error_msg
, "invalid functional unit use number (%d); "
843 "opcode \"%s\" has %d", u
, intisa
->opcodes
[opc
].name
,
844 intisa
->opcodes
[opc
].num_funcUnit_uses
);
847 return &intisa
->opcodes
[opc
].funcUnit_uses
[u
];
852 /* Operand information. */
855 #define CHECK_OPERAND(INTISA,OPC,ICLASS,OPND,ERRVAL) \
857 if ((OPND) < 0 || (OPND) >= (ICLASS)->num_operands) \
859 xtisa_errno = xtensa_isa_bad_operand; \
860 sprintf (xtisa_error_msg, "invalid operand number (%d); " \
861 "opcode \"%s\" has %d operands", (OPND), \
862 (INTISA)->opcodes[(OPC)].name, (ICLASS)->num_operands); \
868 static xtensa_operand_internal
*
869 get_operand (xtensa_isa_internal
*intisa
, xtensa_opcode opc
, int opnd
)
871 xtensa_iclass_internal
*iclass
;
872 int iclass_id
, operand_id
;
874 CHECK_OPCODE (intisa
, opc
, NULL
);
875 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
876 iclass
= &intisa
->iclasses
[iclass_id
];
877 CHECK_OPERAND (intisa
, opc
, iclass
, opnd
, NULL
);
878 operand_id
= iclass
->operands
[opnd
].u
.operand_id
;
879 return &intisa
->operands
[operand_id
];
884 xtensa_operand_name (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
886 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
887 xtensa_operand_internal
*intop
;
889 intop
= get_operand (intisa
, opc
, opnd
);
890 if (!intop
) return NULL
;
896 xtensa_operand_is_visible (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
898 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
899 xtensa_iclass_internal
*iclass
;
900 int iclass_id
, operand_id
;
901 xtensa_operand_internal
*intop
;
903 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
904 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
905 iclass
= &intisa
->iclasses
[iclass_id
];
906 CHECK_OPERAND (intisa
, opc
, iclass
, opnd
, XTENSA_UNDEFINED
);
908 /* Special case for "sout" operands. */
909 if (iclass
->operands
[opnd
].inout
== 's')
912 operand_id
= iclass
->operands
[opnd
].u
.operand_id
;
913 intop
= &intisa
->operands
[operand_id
];
915 if ((intop
->flags
& XTENSA_OPERAND_IS_INVISIBLE
) == 0)
922 xtensa_operand_inout (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
924 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
925 xtensa_iclass_internal
*iclass
;
929 CHECK_OPCODE (intisa
, opc
, 0);
930 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
931 iclass
= &intisa
->iclasses
[iclass_id
];
932 CHECK_OPERAND (intisa
, opc
, iclass
, opnd
, 0);
933 inout
= iclass
->operands
[opnd
].inout
;
935 /* Special case for "sout" operands. */
944 xtensa_operand_get_field (xtensa_isa isa
, xtensa_opcode opc
, int opnd
,
945 xtensa_format fmt
, int slot
,
946 const xtensa_insnbuf slotbuf
, uint32
*valp
)
948 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
949 xtensa_operand_internal
*intop
;
951 xtensa_get_field_fn get_fn
;
953 intop
= get_operand (intisa
, opc
, opnd
);
954 if (!intop
) return -1;
956 CHECK_FORMAT (intisa
, fmt
, -1);
957 CHECK_SLOT (intisa
, fmt
, slot
, -1);
959 slot_id
= intisa
->formats
[fmt
].slot_id
[slot
];
960 if (intop
->field_id
== XTENSA_UNDEFINED
)
962 xtisa_errno
= xtensa_isa_no_field
;
963 strcpy (xtisa_error_msg
, "implicit operand has no field");
966 get_fn
= intisa
->slots
[slot_id
].get_field_fns
[intop
->field_id
];
969 xtisa_errno
= xtensa_isa_wrong_slot
;
970 sprintf (xtisa_error_msg
,
971 "operand \"%s\" does not exist in slot %d of format \"%s\"",
972 intop
->name
, slot
, intisa
->formats
[fmt
].name
);
975 *valp
= (*get_fn
) (slotbuf
);
981 xtensa_operand_set_field (xtensa_isa isa
, xtensa_opcode opc
, int opnd
,
982 xtensa_format fmt
, int slot
,
983 xtensa_insnbuf slotbuf
, uint32 val
)
985 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
986 xtensa_operand_internal
*intop
;
988 xtensa_set_field_fn set_fn
;
990 intop
= get_operand (intisa
, opc
, opnd
);
991 if (!intop
) return -1;
993 CHECK_FORMAT (intisa
, fmt
, -1);
994 CHECK_SLOT (intisa
, fmt
, slot
, -1);
996 slot_id
= intisa
->formats
[fmt
].slot_id
[slot
];
997 if (intop
->field_id
== XTENSA_UNDEFINED
)
999 xtisa_errno
= xtensa_isa_no_field
;
1000 strcpy (xtisa_error_msg
, "implicit operand has no field");
1003 set_fn
= intisa
->slots
[slot_id
].set_field_fns
[intop
->field_id
];
1006 xtisa_errno
= xtensa_isa_wrong_slot
;
1007 sprintf (xtisa_error_msg
,
1008 "operand \"%s\" does not exist in slot %d of format \"%s\"",
1009 intop
->name
, slot
, intisa
->formats
[fmt
].name
);
1012 (*set_fn
) (slotbuf
, val
);
1018 xtensa_operand_encode (xtensa_isa isa
, xtensa_opcode opc
, int opnd
,
1021 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1022 xtensa_operand_internal
*intop
;
1023 uint32 test_val
, orig_val
;
1025 intop
= get_operand (intisa
, opc
, opnd
);
1026 if (!intop
) return -1;
1030 /* This is a default operand for a field. How can we tell if the
1031 value fits in the field? Write the value into the field,
1032 read it back, and then make sure we get the same value. */
1034 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1035 static xtensa_insnbuf tmpbuf
= 0;
1040 tmpbuf
= xtensa_insnbuf_alloc (isa
);
1041 CHECK_ALLOC (tmpbuf
, -1);
1044 /* A default operand is always associated with a field,
1045 but check just to be sure.... */
1046 if (intop
->field_id
== XTENSA_UNDEFINED
)
1048 xtisa_errno
= xtensa_isa_internal_error
;
1049 strcpy (xtisa_error_msg
, "operand has no field");
1053 /* Find some slot that includes the field. */
1054 for (slot_id
= 0; slot_id
< intisa
->num_slots
; slot_id
++)
1056 xtensa_get_field_fn get_fn
=
1057 intisa
->slots
[slot_id
].get_field_fns
[intop
->field_id
];
1058 xtensa_set_field_fn set_fn
=
1059 intisa
->slots
[slot_id
].set_field_fns
[intop
->field_id
];
1061 if (get_fn
&& set_fn
)
1063 (*set_fn
) (tmpbuf
, *valp
);
1064 return ((*get_fn
) (tmpbuf
) != *valp
);
1068 /* Couldn't find any slot containing the field.... */
1069 xtisa_errno
= xtensa_isa_no_field
;
1070 strcpy (xtisa_error_msg
, "field does not exist in any slot");
1074 /* Encode the value. In some cases, the encoding function may detect
1075 errors, but most of the time the only way to determine if the value
1076 was successfully encoded is to decode it and check if it matches
1077 the original value. */
1079 if ((*intop
->encode
) (valp
) ||
1080 (test_val
= *valp
, (*intop
->decode
) (&test_val
)) ||
1081 test_val
!= orig_val
)
1083 xtisa_errno
= xtensa_isa_bad_value
;
1084 sprintf (xtisa_error_msg
, "cannot encode operand value 0x%08x", *valp
);
1093 xtensa_operand_decode (xtensa_isa isa
, xtensa_opcode opc
, int opnd
,
1096 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1097 xtensa_operand_internal
*intop
;
1099 intop
= get_operand (intisa
, opc
, opnd
);
1100 if (!intop
) return -1;
1102 /* Use identity function for "default" operands. */
1106 if ((*intop
->decode
) (valp
))
1108 xtisa_errno
= xtensa_isa_bad_value
;
1109 sprintf (xtisa_error_msg
, "cannot decode operand value 0x%08x", *valp
);
1117 xtensa_operand_is_register (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
1119 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1120 xtensa_operand_internal
*intop
;
1122 intop
= get_operand (intisa
, opc
, opnd
);
1123 if (!intop
) return XTENSA_UNDEFINED
;
1125 if ((intop
->flags
& XTENSA_OPERAND_IS_REGISTER
) != 0)
1132 xtensa_operand_regfile (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
1134 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1135 xtensa_operand_internal
*intop
;
1137 intop
= get_operand (intisa
, opc
, opnd
);
1138 if (!intop
) return XTENSA_UNDEFINED
;
1140 return intop
->regfile
;
1145 xtensa_operand_num_regs (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
1147 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1148 xtensa_operand_internal
*intop
;
1150 intop
= get_operand (intisa
, opc
, opnd
);
1151 if (!intop
) return XTENSA_UNDEFINED
;
1153 return intop
->num_regs
;
1158 xtensa_operand_is_known_reg (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
1160 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1161 xtensa_operand_internal
*intop
;
1163 intop
= get_operand (intisa
, opc
, opnd
);
1164 if (!intop
) return XTENSA_UNDEFINED
;
1166 if ((intop
->flags
& XTENSA_OPERAND_IS_UNKNOWN
) == 0)
1173 xtensa_operand_is_PCrelative (xtensa_isa isa
, xtensa_opcode opc
, int opnd
)
1175 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1176 xtensa_operand_internal
*intop
;
1178 intop
= get_operand (intisa
, opc
, opnd
);
1179 if (!intop
) return XTENSA_UNDEFINED
;
1181 if ((intop
->flags
& XTENSA_OPERAND_IS_PCRELATIVE
) != 0)
1188 xtensa_operand_do_reloc (xtensa_isa isa
, xtensa_opcode opc
, int opnd
,
1189 uint32
*valp
, uint32 pc
)
1191 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1192 xtensa_operand_internal
*intop
;
1194 intop
= get_operand (intisa
, opc
, opnd
);
1195 if (!intop
) return -1;
1197 if ((intop
->flags
& XTENSA_OPERAND_IS_PCRELATIVE
) == 0)
1200 if (!intop
->do_reloc
)
1202 xtisa_errno
= xtensa_isa_internal_error
;
1203 strcpy (xtisa_error_msg
, "operand missing do_reloc function");
1207 if ((*intop
->do_reloc
) (valp
, pc
))
1209 xtisa_errno
= xtensa_isa_bad_value
;
1210 sprintf (xtisa_error_msg
,
1211 "do_reloc failed for value 0x%08x at PC 0x%08x", *valp
, pc
);
1220 xtensa_operand_undo_reloc (xtensa_isa isa
, xtensa_opcode opc
, int opnd
,
1221 uint32
*valp
, uint32 pc
)
1223 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1224 xtensa_operand_internal
*intop
;
1226 intop
= get_operand (intisa
, opc
, opnd
);
1227 if (!intop
) return -1;
1229 if ((intop
->flags
& XTENSA_OPERAND_IS_PCRELATIVE
) == 0)
1232 if (!intop
->undo_reloc
)
1234 xtisa_errno
= xtensa_isa_internal_error
;
1235 strcpy (xtisa_error_msg
, "operand missing undo_reloc function");
1239 if ((*intop
->undo_reloc
) (valp
, pc
))
1241 xtisa_errno
= xtensa_isa_bad_value
;
1242 sprintf (xtisa_error_msg
,
1243 "undo_reloc failed for value 0x%08x at PC 0x%08x", *valp
, pc
);
1252 /* State Operands. */
1255 #define CHECK_STATE_OPERAND(INTISA,OPC,ICLASS,STOP,ERRVAL) \
1257 if ((STOP) < 0 || (STOP) >= (ICLASS)->num_stateOperands) \
1259 xtisa_errno = xtensa_isa_bad_operand; \
1260 sprintf (xtisa_error_msg, "invalid state operand number (%d); " \
1261 "opcode \"%s\" has %d state operands", (STOP), \
1262 (INTISA)->opcodes[(OPC)].name, (ICLASS)->num_stateOperands); \
1269 xtensa_stateOperand_state (xtensa_isa isa
, xtensa_opcode opc
, int stOp
)
1271 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1272 xtensa_iclass_internal
*iclass
;
1275 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
1276 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
1277 iclass
= &intisa
->iclasses
[iclass_id
];
1278 CHECK_STATE_OPERAND (intisa
, opc
, iclass
, stOp
, XTENSA_UNDEFINED
);
1279 return iclass
->stateOperands
[stOp
].u
.state
;
1284 xtensa_stateOperand_inout (xtensa_isa isa
, xtensa_opcode opc
, int stOp
)
1286 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1287 xtensa_iclass_internal
*iclass
;
1290 CHECK_OPCODE (intisa
, opc
, 0);
1291 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
1292 iclass
= &intisa
->iclasses
[iclass_id
];
1293 CHECK_STATE_OPERAND (intisa
, opc
, iclass
, stOp
, 0);
1294 return iclass
->stateOperands
[stOp
].inout
;
1299 /* Interface Operands. */
1302 #define CHECK_INTERFACE_OPERAND(INTISA,OPC,ICLASS,IFOP,ERRVAL) \
1304 if ((IFOP) < 0 || (IFOP) >= (ICLASS)->num_interfaceOperands) \
1306 xtisa_errno = xtensa_isa_bad_operand; \
1307 sprintf (xtisa_error_msg, "invalid interface operand number (%d); " \
1308 "opcode \"%s\" has %d interface operands", (IFOP), \
1309 (INTISA)->opcodes[(OPC)].name, \
1310 (ICLASS)->num_interfaceOperands); \
1317 xtensa_interfaceOperand_interface (xtensa_isa isa
, xtensa_opcode opc
,
1320 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1321 xtensa_iclass_internal
*iclass
;
1324 CHECK_OPCODE (intisa
, opc
, XTENSA_UNDEFINED
);
1325 iclass_id
= intisa
->opcodes
[opc
].iclass_id
;
1326 iclass
= &intisa
->iclasses
[iclass_id
];
1327 CHECK_INTERFACE_OPERAND (intisa
, opc
, iclass
, ifOp
, XTENSA_UNDEFINED
);
1328 return iclass
->interfaceOperands
[ifOp
];
1333 /* Register Files. */
1336 #define CHECK_REGFILE(INTISA,RF,ERRVAL) \
1338 if ((RF) < 0 || (RF) >= (INTISA)->num_regfiles) \
1340 xtisa_errno = xtensa_isa_bad_regfile; \
1341 strcpy (xtisa_error_msg, "invalid regfile specifier"); \
1348 xtensa_regfile_lookup (xtensa_isa isa
, const char *name
)
1350 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1353 if (!name
|| !*name
)
1355 xtisa_errno
= xtensa_isa_bad_regfile
;
1356 strcpy (xtisa_error_msg
, "invalid regfile name");
1357 return XTENSA_UNDEFINED
;
1360 /* The expected number of regfiles is small; use a linear search. */
1361 for (n
= 0; n
< intisa
->num_regfiles
; n
++)
1363 if (!strcmp (intisa
->regfiles
[n
].name
, name
))
1367 xtisa_errno
= xtensa_isa_bad_regfile
;
1368 sprintf (xtisa_error_msg
, "regfile \"%s\" not recognized", name
);
1369 return XTENSA_UNDEFINED
;
1374 xtensa_regfile_lookup_shortname (xtensa_isa isa
, const char *shortname
)
1376 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1379 if (!shortname
|| !*shortname
)
1381 xtisa_errno
= xtensa_isa_bad_regfile
;
1382 strcpy (xtisa_error_msg
, "invalid regfile shortname");
1383 return XTENSA_UNDEFINED
;
1386 /* The expected number of regfiles is small; use a linear search. */
1387 for (n
= 0; n
< intisa
->num_regfiles
; n
++)
1389 /* Ignore regfile views since they always have the same shortnames
1390 as their parents. */
1391 if (intisa
->regfiles
[n
].parent
!= n
)
1393 if (!strcmp (intisa
->regfiles
[n
].shortname
, shortname
))
1397 xtisa_errno
= xtensa_isa_bad_regfile
;
1398 sprintf (xtisa_error_msg
, "regfile shortname \"%s\" not recognized",
1400 return XTENSA_UNDEFINED
;
1405 xtensa_regfile_name (xtensa_isa isa
, xtensa_regfile rf
)
1407 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1408 CHECK_REGFILE (intisa
, rf
, NULL
);
1409 return intisa
->regfiles
[rf
].name
;
1414 xtensa_regfile_shortname (xtensa_isa isa
, xtensa_regfile rf
)
1416 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1417 CHECK_REGFILE (intisa
, rf
, NULL
);
1418 return intisa
->regfiles
[rf
].shortname
;
1423 xtensa_regfile_view_parent (xtensa_isa isa
, xtensa_regfile rf
)
1425 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1426 CHECK_REGFILE (intisa
, rf
, XTENSA_UNDEFINED
);
1427 return intisa
->regfiles
[rf
].parent
;
1432 xtensa_regfile_num_bits (xtensa_isa isa
, xtensa_regfile rf
)
1434 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1435 CHECK_REGFILE (intisa
, rf
, XTENSA_UNDEFINED
);
1436 return intisa
->regfiles
[rf
].num_bits
;
1441 xtensa_regfile_num_entries (xtensa_isa isa
, xtensa_regfile rf
)
1443 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1444 CHECK_REGFILE (intisa
, rf
, XTENSA_UNDEFINED
);
1445 return intisa
->regfiles
[rf
].num_entries
;
1450 /* Processor States. */
1453 #define CHECK_STATE(INTISA,ST,ERRVAL) \
1455 if ((ST) < 0 || (ST) >= (INTISA)->num_states) \
1457 xtisa_errno = xtensa_isa_bad_state; \
1458 strcpy (xtisa_error_msg, "invalid state specifier"); \
1465 xtensa_state_lookup (xtensa_isa isa
, const char *name
)
1467 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1468 xtensa_lookup_entry entry
, *result
= 0;
1470 if (!name
|| !*name
)
1472 xtisa_errno
= xtensa_isa_bad_state
;
1473 strcpy (xtisa_error_msg
, "invalid state name");
1474 return XTENSA_UNDEFINED
;
1477 if (intisa
->num_states
!= 0)
1480 result
= bsearch (&entry
, intisa
->state_lookup_table
, intisa
->num_states
,
1481 sizeof (xtensa_lookup_entry
), xtensa_isa_name_compare
);
1486 xtisa_errno
= xtensa_isa_bad_state
;
1487 sprintf (xtisa_error_msg
, "state \"%s\" not recognized", name
);
1488 return XTENSA_UNDEFINED
;
1491 return result
->u
.state
;
1496 xtensa_state_name (xtensa_isa isa
, xtensa_state st
)
1498 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1499 CHECK_STATE (intisa
, st
, NULL
);
1500 return intisa
->states
[st
].name
;
1505 xtensa_state_num_bits (xtensa_isa isa
, xtensa_state st
)
1507 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1508 CHECK_STATE (intisa
, st
, XTENSA_UNDEFINED
);
1509 return intisa
->states
[st
].num_bits
;
1514 xtensa_state_is_exported (xtensa_isa isa
, xtensa_state st
)
1516 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1517 CHECK_STATE (intisa
, st
, XTENSA_UNDEFINED
);
1518 if ((intisa
->states
[st
].flags
& XTENSA_STATE_IS_EXPORTED
) != 0)
1528 #define CHECK_SYSREG(INTISA,SYSREG,ERRVAL) \
1530 if ((SYSREG) < 0 || (SYSREG) >= (INTISA)->num_sysregs) \
1532 xtisa_errno = xtensa_isa_bad_sysreg; \
1533 strcpy (xtisa_error_msg, "invalid sysreg specifier"); \
1540 xtensa_sysreg_lookup (xtensa_isa isa
, int num
, int is_user
)
1542 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1547 if (num
< 0 || num
> intisa
->max_sysreg_num
[is_user
]
1548 || intisa
->sysreg_table
[is_user
][num
] == XTENSA_UNDEFINED
)
1550 xtisa_errno
= xtensa_isa_bad_sysreg
;
1551 strcpy (xtisa_error_msg
, "sysreg not recognized");
1552 return XTENSA_UNDEFINED
;
1555 return intisa
->sysreg_table
[is_user
][num
];
1560 xtensa_sysreg_lookup_name (xtensa_isa isa
, const char *name
)
1562 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1563 xtensa_lookup_entry entry
, *result
= 0;
1565 if (!name
|| !*name
)
1567 xtisa_errno
= xtensa_isa_bad_sysreg
;
1568 strcpy (xtisa_error_msg
, "invalid sysreg name");
1569 return XTENSA_UNDEFINED
;
1572 if (intisa
->num_sysregs
!= 0)
1575 result
= bsearch (&entry
, intisa
->sysreg_lookup_table
,
1576 intisa
->num_sysregs
, sizeof (xtensa_lookup_entry
),
1577 xtensa_isa_name_compare
);
1582 xtisa_errno
= xtensa_isa_bad_sysreg
;
1583 sprintf (xtisa_error_msg
, "sysreg \"%s\" not recognized", name
);
1584 return XTENSA_UNDEFINED
;
1587 return result
->u
.sysreg
;
1592 xtensa_sysreg_name (xtensa_isa isa
, xtensa_sysreg sysreg
)
1594 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1595 CHECK_SYSREG (intisa
, sysreg
, NULL
);
1596 return intisa
->sysregs
[sysreg
].name
;
1601 xtensa_sysreg_number (xtensa_isa isa
, xtensa_sysreg sysreg
)
1603 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1604 CHECK_SYSREG (intisa
, sysreg
, XTENSA_UNDEFINED
);
1605 return intisa
->sysregs
[sysreg
].number
;
1610 xtensa_sysreg_is_user (xtensa_isa isa
, xtensa_sysreg sysreg
)
1612 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1613 CHECK_SYSREG (intisa
, sysreg
, XTENSA_UNDEFINED
);
1614 if (intisa
->sysregs
[sysreg
].is_user
)
1624 #define CHECK_INTERFACE(INTISA,INTF,ERRVAL) \
1626 if ((INTF) < 0 || (INTF) >= (INTISA)->num_interfaces) \
1628 xtisa_errno = xtensa_isa_bad_interface; \
1629 strcpy (xtisa_error_msg, "invalid interface specifier"); \
1636 xtensa_interface_lookup (xtensa_isa isa
, const char *ifname
)
1638 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1639 xtensa_lookup_entry entry
, *result
= 0;
1641 if (!ifname
|| !*ifname
)
1643 xtisa_errno
= xtensa_isa_bad_interface
;
1644 strcpy (xtisa_error_msg
, "invalid interface name");
1645 return XTENSA_UNDEFINED
;
1648 if (intisa
->num_interfaces
!= 0)
1651 result
= bsearch (&entry
, intisa
->interface_lookup_table
,
1652 intisa
->num_interfaces
, sizeof (xtensa_lookup_entry
),
1653 xtensa_isa_name_compare
);
1658 xtisa_errno
= xtensa_isa_bad_interface
;
1659 sprintf (xtisa_error_msg
, "interface \"%s\" not recognized", ifname
);
1660 return XTENSA_UNDEFINED
;
1663 return result
->u
.intf
;
1668 xtensa_interface_name (xtensa_isa isa
, xtensa_interface intf
)
1670 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1671 CHECK_INTERFACE (intisa
, intf
, NULL
);
1672 return intisa
->interfaces
[intf
].name
;
1677 xtensa_interface_num_bits (xtensa_isa isa
, xtensa_interface intf
)
1679 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1680 CHECK_INTERFACE (intisa
, intf
, XTENSA_UNDEFINED
);
1681 return intisa
->interfaces
[intf
].num_bits
;
1686 xtensa_interface_inout (xtensa_isa isa
, xtensa_interface intf
)
1688 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1689 CHECK_INTERFACE (intisa
, intf
, 0);
1690 return intisa
->interfaces
[intf
].inout
;
1695 xtensa_interface_has_side_effect (xtensa_isa isa
, xtensa_interface intf
)
1697 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1698 CHECK_INTERFACE (intisa
, intf
, XTENSA_UNDEFINED
);
1699 if ((intisa
->interfaces
[intf
].flags
& XTENSA_INTERFACE_HAS_SIDE_EFFECT
) != 0)
1706 xtensa_interface_class_id (xtensa_isa isa
, xtensa_interface intf
)
1708 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1709 CHECK_INTERFACE (intisa
, intf
, XTENSA_UNDEFINED
);
1710 return intisa
->interfaces
[intf
].class_id
;
1715 /* Functional Units. */
1718 #define CHECK_FUNCUNIT(INTISA,FUN,ERRVAL) \
1720 if ((FUN) < 0 || (FUN) >= (INTISA)->num_funcUnits) \
1722 xtisa_errno = xtensa_isa_bad_funcUnit; \
1723 strcpy (xtisa_error_msg, "invalid functional unit specifier"); \
1730 xtensa_funcUnit_lookup (xtensa_isa isa
, const char *fname
)
1732 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1733 xtensa_lookup_entry entry
, *result
= 0;
1735 if (!fname
|| !*fname
)
1737 xtisa_errno
= xtensa_isa_bad_funcUnit
;
1738 strcpy (xtisa_error_msg
, "invalid functional unit name");
1739 return XTENSA_UNDEFINED
;
1742 if (intisa
->num_funcUnits
!= 0)
1745 result
= bsearch (&entry
, intisa
->funcUnit_lookup_table
,
1746 intisa
->num_funcUnits
, sizeof (xtensa_lookup_entry
),
1747 xtensa_isa_name_compare
);
1752 xtisa_errno
= xtensa_isa_bad_funcUnit
;
1753 sprintf (xtisa_error_msg
,
1754 "functional unit \"%s\" not recognized", fname
);
1755 return XTENSA_UNDEFINED
;
1758 return result
->u
.fun
;
1763 xtensa_funcUnit_name (xtensa_isa isa
, xtensa_funcUnit fun
)
1765 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1766 CHECK_FUNCUNIT (intisa
, fun
, NULL
);
1767 return intisa
->funcUnits
[fun
].name
;
1772 xtensa_funcUnit_num_copies (xtensa_isa isa
, xtensa_funcUnit fun
)
1774 xtensa_isa_internal
*intisa
= (xtensa_isa_internal
*) isa
;
1775 CHECK_FUNCUNIT (intisa
, fun
, XTENSA_UNDEFINED
);
1776 return intisa
->funcUnits
[fun
].num_copies
;