| /* ia64-asmtab.h -- Header for compacted IA-64 opcode tables. |
| Copyright (C) 1999-2022 Free Software Foundation, Inc. |
| Contributed by Bob Manson of Cygnus Support <manson@cygnus.com> |
| |
| This file is part of the GNU opcodes library. |
| |
| This library is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3, or (at your option) |
| any later version. |
| |
| It is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
| or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
| License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this file; see the file COPYING. If not, write to the |
| Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
| MA 02110-1301, USA. */ |
| |
| #ifndef IA64_ASMTAB_H |
| #define IA64_ASMTAB_H |
| |
| #include "opcode/ia64.h" |
| |
| /* The primary opcode table is made up of the following: */ |
| struct ia64_main_table |
| { |
| /* The entry in the string table that corresponds to the name of this |
| opcode. */ |
| unsigned short name_index; |
| |
| /* The type of opcode; corresponds to the TYPE field in |
| struct ia64_opcode. */ |
| unsigned char opcode_type; |
| |
| /* The number of outputs for this opcode. */ |
| unsigned char num_outputs; |
| |
| /* The base insn value for this opcode. It may be modified by completers. */ |
| ia64_insn opcode; |
| |
| /* The mask of valid bits in OPCODE. Zeros indicate operand fields. */ |
| ia64_insn mask; |
| |
| /* The operands of this instruction. Corresponds to the OPERANDS field |
| in struct ia64_opcode. */ |
| unsigned char operands[5]; |
| |
| /* The flags for this instruction. Corresponds to the FLAGS field in |
| struct ia64_opcode. */ |
| short flags; |
| |
| /* The tree of completers for this instruction; this is an offset into |
| completer_table. */ |
| short completers; |
| }; |
| |
| /* Each instruction has a set of possible "completers", or additional |
| suffixes that can alter the instruction's behavior, and which has |
| potentially different dependencies. |
| |
| The completer entries modify certain bits in the instruction opcode. |
| Which bits are to be modified are marked by the BITS, MASK and |
| OFFSET fields. The completer entry may also note dependencies for the |
| opcode. |
| |
| These completers are arranged in a DAG; the pointers are indexes |
| into the completer_table array. The completer DAG is searched by |
| find_completer () and ia64_find_matching_opcode (). |
| |
| Note that each completer needs to be applied in turn, so that if we |
| have the instruction |
| cmp.lt.unc |
| the completer entries for both "lt" and "unc" would need to be applied |
| to the opcode's value. |
| |
| Some instructions do not require any completers; these contain an |
| empty completer entry. Instructions that require a completer do |
| not contain an empty entry. |
| |
| Terminal completers (those completers that validly complete an |
| instruction) are marked by having the TERMINAL_COMPLETER flag set. |
| |
| Only dependencies listed in the terminal completer for an opcode are |
| considered to apply to that opcode instance. */ |
| |
| struct ia64_completer_table |
| { |
| /* The bit value that this completer sets. */ |
| unsigned int bits; |
| |
| /* And its mask. 1s are bits that are to be modified in the |
| instruction. */ |
| unsigned int mask; |
| |
| /* The entry in the string table that corresponds to the name of this |
| completer. */ |
| unsigned short name_index; |
| |
| /* An alternative completer, or -1 if this is the end of the chain. */ |
| short alternative; |
| |
| /* A pointer to the DAG of completers that can potentially follow |
| this one, or -1. */ |
| short subentries; |
| |
| /* The bit offset in the instruction where BITS and MASK should be |
| applied. */ |
| unsigned char offset : 7; |
| |
| unsigned char terminal_completer : 1; |
| |
| /* Index into the dependency list table */ |
| short dependencies; |
| }; |
| |
| /* This contains sufficient information for the disassembler to resolve |
| the complete name of the original instruction. */ |
| struct ia64_dis_names |
| { |
| /* COMPLETER_INDEX represents the tree of completers that make up |
| the instruction. The LSB represents the top of the tree for the |
| specified instruction. |
| |
| A 0 bit indicates to go to the next alternate completer via the |
| alternative field; a 1 bit indicates that the current completer |
| is part of the instruction, and to go down the subentries index. |
| We know we've reached the final completer when we run out of 1 |
| bits. |
| |
| There is always at least one 1 bit. */ |
| unsigned int completer_index ; |
| |
| /* The index in the main_table[] array for the instruction. */ |
| unsigned short insn_index : 11; |
| |
| /* If set, the next entry in this table is an alternate possibility |
| for this instruction encoding. Which one to use is determined by |
| the instruction type and other factors (see opcode_verify ()). */ |
| unsigned int next_flag : 1; |
| |
| /* The disassembly priority of this entry among instructions. */ |
| unsigned short priority; |
| }; |
| |
| #endif |