123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /* 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
|