Home | History | Annotate | Line # | Download | only in opcode
aarch64.h revision 1.1.1.1.4.2
      1  1.1.1.1.4.2  yamt /* AArch64 assembler/disassembler support.
      2  1.1.1.1.4.2  yamt 
      3  1.1.1.1.4.2  yamt    Copyright 2009, 2010, 2011, 2012, 2013  Free Software Foundation, Inc.
      4  1.1.1.1.4.2  yamt    Contributed by ARM Ltd.
      5  1.1.1.1.4.2  yamt 
      6  1.1.1.1.4.2  yamt    This file is part of GNU Binutils.
      7  1.1.1.1.4.2  yamt 
      8  1.1.1.1.4.2  yamt    This program is free software; you can redistribute it and/or modify
      9  1.1.1.1.4.2  yamt    it under the terms of the GNU General Public License as published by
     10  1.1.1.1.4.2  yamt    the Free Software Foundation; either version 3 of the license, or
     11  1.1.1.1.4.2  yamt    (at your option) any later version.
     12  1.1.1.1.4.2  yamt 
     13  1.1.1.1.4.2  yamt    This program is distributed in the hope that it will be useful,
     14  1.1.1.1.4.2  yamt    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1.1.1.4.2  yamt    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1.1.1.4.2  yamt    GNU General Public License for more details.
     17  1.1.1.1.4.2  yamt 
     18  1.1.1.1.4.2  yamt    You should have received a copy of the GNU General Public License
     19  1.1.1.1.4.2  yamt    along with this program; see the file COPYING3. If not,
     20  1.1.1.1.4.2  yamt    see <http://www.gnu.org/licenses/>.  */
     21  1.1.1.1.4.2  yamt 
     22  1.1.1.1.4.2  yamt #ifndef OPCODE_AARCH64_H
     23  1.1.1.1.4.2  yamt #define OPCODE_AARCH64_H
     24  1.1.1.1.4.2  yamt 
     25  1.1.1.1.4.2  yamt #include "bfd.h"
     26  1.1.1.1.4.2  yamt #include "bfd_stdint.h"
     27  1.1.1.1.4.2  yamt #include <assert.h>
     28  1.1.1.1.4.2  yamt #include <stdlib.h>
     29  1.1.1.1.4.2  yamt 
     30  1.1.1.1.4.2  yamt /* The offset for pc-relative addressing is currently defined to be 0.  */
     31  1.1.1.1.4.2  yamt #define AARCH64_PCREL_OFFSET		0
     32  1.1.1.1.4.2  yamt 
     33  1.1.1.1.4.2  yamt typedef uint32_t aarch64_insn;
     34  1.1.1.1.4.2  yamt 
     35  1.1.1.1.4.2  yamt /* The following bitmasks control CPU features.  */
     36  1.1.1.1.4.2  yamt #define AARCH64_FEATURE_V8	0x00000001	/* All processors.  */
     37  1.1.1.1.4.2  yamt #define AARCH64_FEATURE_CRYPTO	0x00010000	/* Crypto instructions. */
     38  1.1.1.1.4.2  yamt #define AARCH64_FEATURE_FP	0x00020000	/* FP instructions.  */
     39  1.1.1.1.4.2  yamt #define AARCH64_FEATURE_SIMD	0x00040000	/* SIMD instructions.  */
     40  1.1.1.1.4.2  yamt 
     41  1.1.1.1.4.2  yamt /* Architectures are the sum of the base and extensions.  */
     42  1.1.1.1.4.2  yamt #define AARCH64_ARCH_V8		AARCH64_FEATURE (AARCH64_FEATURE_V8, \
     43  1.1.1.1.4.2  yamt 						 AARCH64_FEATURE_FP  \
     44  1.1.1.1.4.2  yamt 						 | AARCH64_FEATURE_SIMD)
     45  1.1.1.1.4.2  yamt #define AARCH64_ARCH_NONE	AARCH64_FEATURE (0, 0)
     46  1.1.1.1.4.2  yamt #define AARCH64_ANY		AARCH64_FEATURE (-1, 0)	/* Any basic core.  */
     47  1.1.1.1.4.2  yamt 
     48  1.1.1.1.4.2  yamt /* CPU-specific features */
     49  1.1.1.1.4.2  yamt typedef unsigned long aarch64_feature_set;
     50  1.1.1.1.4.2  yamt 
     51  1.1.1.1.4.2  yamt #define AARCH64_CPU_HAS_FEATURE(CPU,FEAT)	\
     52  1.1.1.1.4.2  yamt   (((CPU) & (FEAT)) != 0)
     53  1.1.1.1.4.2  yamt 
     54  1.1.1.1.4.2  yamt #define AARCH64_MERGE_FEATURE_SETS(TARG,F1,F2)	\
     55  1.1.1.1.4.2  yamt   do {						\
     56  1.1.1.1.4.2  yamt     (TARG) = (F1) | (F2);			\
     57  1.1.1.1.4.2  yamt   } while (0)
     58  1.1.1.1.4.2  yamt 
     59  1.1.1.1.4.2  yamt #define AARCH64_CLEAR_FEATURE(TARG,F1,F2)	\
     60  1.1.1.1.4.2  yamt   do {						\
     61  1.1.1.1.4.2  yamt     (TARG) = (F1) &~ (F2);			\
     62  1.1.1.1.4.2  yamt   } while (0)
     63  1.1.1.1.4.2  yamt 
     64  1.1.1.1.4.2  yamt #define AARCH64_FEATURE(core,coproc) ((core) | (coproc))
     65  1.1.1.1.4.2  yamt 
     66  1.1.1.1.4.2  yamt #define AARCH64_OPCODE_HAS_FEATURE(OPC,FEAT)	\
     67  1.1.1.1.4.2  yamt   (((OPC) & (FEAT)) != 0)
     68  1.1.1.1.4.2  yamt 
     69  1.1.1.1.4.2  yamt enum aarch64_operand_class
     70  1.1.1.1.4.2  yamt {
     71  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_NIL,
     72  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_INT_REG,
     73  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_MODIFIED_REG,
     74  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_FP_REG,
     75  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_SIMD_REG,
     76  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_SIMD_ELEMENT,
     77  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_SISD_REG,
     78  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_SIMD_REGLIST,
     79  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_CP_REG,
     80  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_ADDRESS,
     81  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_IMMEDIATE,
     82  1.1.1.1.4.2  yamt   AARCH64_OPND_CLASS_SYSTEM,
     83  1.1.1.1.4.2  yamt };
     84  1.1.1.1.4.2  yamt 
     85  1.1.1.1.4.2  yamt /* Operand code that helps both parsing and coding.
     86  1.1.1.1.4.2  yamt    Keep AARCH64_OPERANDS synced.  */
     87  1.1.1.1.4.2  yamt 
     88  1.1.1.1.4.2  yamt enum aarch64_opnd
     89  1.1.1.1.4.2  yamt {
     90  1.1.1.1.4.2  yamt   AARCH64_OPND_NIL,	/* no operand---MUST BE FIRST!*/
     91  1.1.1.1.4.2  yamt 
     92  1.1.1.1.4.2  yamt   AARCH64_OPND_Rd,	/* Integer register as destination.  */
     93  1.1.1.1.4.2  yamt   AARCH64_OPND_Rn,	/* Integer register as source.  */
     94  1.1.1.1.4.2  yamt   AARCH64_OPND_Rm,	/* Integer register as source.  */
     95  1.1.1.1.4.2  yamt   AARCH64_OPND_Rt,	/* Integer register used in ld/st instructions.  */
     96  1.1.1.1.4.2  yamt   AARCH64_OPND_Rt2,	/* Integer register used in ld/st pair instructions.  */
     97  1.1.1.1.4.2  yamt   AARCH64_OPND_Rs,	/* Integer register used in ld/st exclusive.  */
     98  1.1.1.1.4.2  yamt   AARCH64_OPND_Ra,	/* Integer register used in ddp_3src instructions.  */
     99  1.1.1.1.4.2  yamt   AARCH64_OPND_Rt_SYS,	/* Integer register used in system instructions.  */
    100  1.1.1.1.4.2  yamt 
    101  1.1.1.1.4.2  yamt   AARCH64_OPND_Rd_SP,	/* Integer Rd or SP.  */
    102  1.1.1.1.4.2  yamt   AARCH64_OPND_Rn_SP,	/* Integer Rn or SP.  */
    103  1.1.1.1.4.2  yamt   AARCH64_OPND_Rm_EXT,	/* Integer Rm extended.  */
    104  1.1.1.1.4.2  yamt   AARCH64_OPND_Rm_SFT,	/* Integer Rm shifted.  */
    105  1.1.1.1.4.2  yamt 
    106  1.1.1.1.4.2  yamt   AARCH64_OPND_Fd,	/* Floating-point Fd.  */
    107  1.1.1.1.4.2  yamt   AARCH64_OPND_Fn,	/* Floating-point Fn.  */
    108  1.1.1.1.4.2  yamt   AARCH64_OPND_Fm,	/* Floating-point Fm.  */
    109  1.1.1.1.4.2  yamt   AARCH64_OPND_Fa,	/* Floating-point Fa.  */
    110  1.1.1.1.4.2  yamt   AARCH64_OPND_Ft,	/* Floating-point Ft.  */
    111  1.1.1.1.4.2  yamt   AARCH64_OPND_Ft2,	/* Floating-point Ft2.  */
    112  1.1.1.1.4.2  yamt 
    113  1.1.1.1.4.2  yamt   AARCH64_OPND_Sd,	/* AdvSIMD Scalar Sd.  */
    114  1.1.1.1.4.2  yamt   AARCH64_OPND_Sn,	/* AdvSIMD Scalar Sn.  */
    115  1.1.1.1.4.2  yamt   AARCH64_OPND_Sm,	/* AdvSIMD Scalar Sm.  */
    116  1.1.1.1.4.2  yamt 
    117  1.1.1.1.4.2  yamt   AARCH64_OPND_Vd,	/* AdvSIMD Vector Vd.  */
    118  1.1.1.1.4.2  yamt   AARCH64_OPND_Vn,	/* AdvSIMD Vector Vn.  */
    119  1.1.1.1.4.2  yamt   AARCH64_OPND_Vm,	/* AdvSIMD Vector Vm.  */
    120  1.1.1.1.4.2  yamt   AARCH64_OPND_VdD1,	/* AdvSIMD <Vd>.D[1]; for FMOV only.  */
    121  1.1.1.1.4.2  yamt   AARCH64_OPND_VnD1,	/* AdvSIMD <Vn>.D[1]; for FMOV only.  */
    122  1.1.1.1.4.2  yamt   AARCH64_OPND_Ed,	/* AdvSIMD Vector Element Vd.  */
    123  1.1.1.1.4.2  yamt   AARCH64_OPND_En,	/* AdvSIMD Vector Element Vn.  */
    124  1.1.1.1.4.2  yamt   AARCH64_OPND_Em,	/* AdvSIMD Vector Element Vm.  */
    125  1.1.1.1.4.2  yamt   AARCH64_OPND_LVn,	/* AdvSIMD Vector register list used in e.g. TBL.  */
    126  1.1.1.1.4.2  yamt   AARCH64_OPND_LVt,	/* AdvSIMD Vector register list used in ld/st.  */
    127  1.1.1.1.4.2  yamt   AARCH64_OPND_LVt_AL,	/* AdvSIMD Vector register list for loading single
    128  1.1.1.1.4.2  yamt 			   structure to all lanes.  */
    129  1.1.1.1.4.2  yamt   AARCH64_OPND_LEt,	/* AdvSIMD Vector Element list.  */
    130  1.1.1.1.4.2  yamt 
    131  1.1.1.1.4.2  yamt   AARCH64_OPND_Cn,	/* Co-processor register in CRn field.  */
    132  1.1.1.1.4.2  yamt   AARCH64_OPND_Cm,	/* Co-processor register in CRm field.  */
    133  1.1.1.1.4.2  yamt 
    134  1.1.1.1.4.2  yamt   AARCH64_OPND_IDX,	/* AdvSIMD EXT index operand.  */
    135  1.1.1.1.4.2  yamt   AARCH64_OPND_IMM_VLSL,/* Immediate for shifting vector registers left.  */
    136  1.1.1.1.4.2  yamt   AARCH64_OPND_IMM_VLSR,/* Immediate for shifting vector registers right.  */
    137  1.1.1.1.4.2  yamt   AARCH64_OPND_SIMD_IMM,/* AdvSIMD modified immediate without shift.  */
    138  1.1.1.1.4.2  yamt   AARCH64_OPND_SIMD_IMM_SFT,	/* AdvSIMD modified immediate with shift.  */
    139  1.1.1.1.4.2  yamt   AARCH64_OPND_SIMD_FPIMM,/* AdvSIMD 8-bit fp immediate.  */
    140  1.1.1.1.4.2  yamt   AARCH64_OPND_SHLL_IMM,/* Immediate shift for AdvSIMD SHLL instruction
    141  1.1.1.1.4.2  yamt 			   (no encoding).  */
    142  1.1.1.1.4.2  yamt   AARCH64_OPND_IMM0,	/* Immediate for #0.  */
    143  1.1.1.1.4.2  yamt   AARCH64_OPND_FPIMM0,	/* Immediate for #0.0.  */
    144  1.1.1.1.4.2  yamt   AARCH64_OPND_FPIMM,	/* Floating-point Immediate.  */
    145  1.1.1.1.4.2  yamt   AARCH64_OPND_IMMR,	/* Immediate #<immr> in e.g. BFM.  */
    146  1.1.1.1.4.2  yamt   AARCH64_OPND_IMMS,	/* Immediate #<imms> in e.g. BFM.  */
    147  1.1.1.1.4.2  yamt   AARCH64_OPND_WIDTH,	/* Immediate #<width> in e.g. BFI.  */
    148  1.1.1.1.4.2  yamt   AARCH64_OPND_IMM,	/* Immediate.  */
    149  1.1.1.1.4.2  yamt   AARCH64_OPND_UIMM3_OP1,/* Unsigned 3-bit immediate in the op1 field.  */
    150  1.1.1.1.4.2  yamt   AARCH64_OPND_UIMM3_OP2,/* Unsigned 3-bit immediate in the op2 field.  */
    151  1.1.1.1.4.2  yamt   AARCH64_OPND_UIMM4,	/* Unsigned 4-bit immediate in the CRm field.  */
    152  1.1.1.1.4.2  yamt   AARCH64_OPND_UIMM7,	/* Unsigned 7-bit immediate in the CRm:op2 fields.  */
    153  1.1.1.1.4.2  yamt   AARCH64_OPND_BIT_NUM,	/* Immediate.  */
    154  1.1.1.1.4.2  yamt   AARCH64_OPND_EXCEPTION,/* imm16 operand in exception instructions.  */
    155  1.1.1.1.4.2  yamt   AARCH64_OPND_CCMP_IMM,/* Immediate in conditional compare instructions.  */
    156  1.1.1.1.4.2  yamt   AARCH64_OPND_NZCV,	/* Flag bit specifier giving an alternative value for
    157  1.1.1.1.4.2  yamt 			   each condition flag.  */
    158  1.1.1.1.4.2  yamt 
    159  1.1.1.1.4.2  yamt   AARCH64_OPND_LIMM,	/* Logical Immediate.  */
    160  1.1.1.1.4.2  yamt   AARCH64_OPND_AIMM,	/* Arithmetic immediate.  */
    161  1.1.1.1.4.2  yamt   AARCH64_OPND_HALF,	/* #<imm16>{, LSL #<shift>} operand in move wide.  */
    162  1.1.1.1.4.2  yamt   AARCH64_OPND_FBITS,	/* FP #<fbits> operand in e.g. SCVTF */
    163  1.1.1.1.4.2  yamt   AARCH64_OPND_IMM_MOV,	/* Immediate operand for the MOV alias.  */
    164  1.1.1.1.4.2  yamt 
    165  1.1.1.1.4.2  yamt   AARCH64_OPND_COND,	/* Standard condition as the last operand.  */
    166  1.1.1.1.4.2  yamt 
    167  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_ADRP,	/* Memory address for ADRP */
    168  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_PCREL14,	/* 14-bit PC-relative address for e.g. TBZ.  */
    169  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_PCREL19,	/* 19-bit PC-relative address for e.g. LDR.  */
    170  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_PCREL21,	/* 21-bit PC-relative address for e.g. ADR.  */
    171  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_PCREL26,	/* 26-bit PC-relative address for e.g. BL.  */
    172  1.1.1.1.4.2  yamt 
    173  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_SIMPLE,	/* Address of ld/st exclusive.  */
    174  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_REGOFF,	/* Address of register offset.  */
    175  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_SIMM7,	/* Address of signed 7-bit immediate.  */
    176  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_SIMM9,	/* Address of signed 9-bit immediate.  */
    177  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_SIMM9_2,	/* Same as the above, but the immediate is
    178  1.1.1.1.4.2  yamt 				   negative or unaligned and there is
    179  1.1.1.1.4.2  yamt 				   no writeback allowed.  This operand code
    180  1.1.1.1.4.2  yamt 				   is only used to support the programmer-
    181  1.1.1.1.4.2  yamt 				   friendly feature of using LDR/STR as the
    182  1.1.1.1.4.2  yamt 				   the mnemonic name for LDUR/STUR instructions
    183  1.1.1.1.4.2  yamt 				   wherever there is no ambiguity.  */
    184  1.1.1.1.4.2  yamt   AARCH64_OPND_ADDR_UIMM12,	/* Address of unsigned 12-bit immediate.  */
    185  1.1.1.1.4.2  yamt   AARCH64_OPND_SIMD_ADDR_SIMPLE,/* Address of ld/st multiple structures.  */
    186  1.1.1.1.4.2  yamt   AARCH64_OPND_SIMD_ADDR_POST,	/* Address of ld/st multiple post-indexed.  */
    187  1.1.1.1.4.2  yamt 
    188  1.1.1.1.4.2  yamt   AARCH64_OPND_SYSREG,		/* System register operand.  */
    189  1.1.1.1.4.2  yamt   AARCH64_OPND_PSTATEFIELD,	/* PSTATE field name operand.  */
    190  1.1.1.1.4.2  yamt   AARCH64_OPND_SYSREG_AT,	/* System register <at_op> operand.  */
    191  1.1.1.1.4.2  yamt   AARCH64_OPND_SYSREG_DC,	/* System register <dc_op> operand.  */
    192  1.1.1.1.4.2  yamt   AARCH64_OPND_SYSREG_IC,	/* System register <ic_op> operand.  */
    193  1.1.1.1.4.2  yamt   AARCH64_OPND_SYSREG_TLBI,	/* System register <tlbi_op> operand.  */
    194  1.1.1.1.4.2  yamt   AARCH64_OPND_BARRIER,		/* Barrier operand.  */
    195  1.1.1.1.4.2  yamt   AARCH64_OPND_BARRIER_ISB,	/* Barrier operand for ISB.  */
    196  1.1.1.1.4.2  yamt   AARCH64_OPND_PRFOP,		/* Prefetch operation.  */
    197  1.1.1.1.4.2  yamt };
    198  1.1.1.1.4.2  yamt 
    199  1.1.1.1.4.2  yamt /* Qualifier constrains an operand.  It either specifies a variant of an
    200  1.1.1.1.4.2  yamt    operand type or limits values available to an operand type.
    201  1.1.1.1.4.2  yamt 
    202  1.1.1.1.4.2  yamt    N.B. Order is important; keep aarch64_opnd_qualifiers synced.  */
    203  1.1.1.1.4.2  yamt 
    204  1.1.1.1.4.2  yamt enum aarch64_opnd_qualifier
    205  1.1.1.1.4.2  yamt {
    206  1.1.1.1.4.2  yamt   /* Indicating no further qualification on an operand.  */
    207  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_NIL,
    208  1.1.1.1.4.2  yamt 
    209  1.1.1.1.4.2  yamt   /* Qualifying an operand which is a general purpose (integer) register;
    210  1.1.1.1.4.2  yamt      indicating the operand data size or a specific register.  */
    211  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_W,	/* Wn, WZR or WSP.  */
    212  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_X,	/* Xn, XZR or XSP.  */
    213  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_WSP,	/* WSP.  */
    214  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_SP,	/* SP.  */
    215  1.1.1.1.4.2  yamt 
    216  1.1.1.1.4.2  yamt   /* Qualifying an operand which is a floating-point register, a SIMD
    217  1.1.1.1.4.2  yamt      vector element or a SIMD vector element list; indicating operand data
    218  1.1.1.1.4.2  yamt      size or the size of each SIMD vector element in the case of a SIMD
    219  1.1.1.1.4.2  yamt      vector element list.
    220  1.1.1.1.4.2  yamt      These qualifiers are also used to qualify an address operand to
    221  1.1.1.1.4.2  yamt      indicate the size of data element a load/store instruction is
    222  1.1.1.1.4.2  yamt      accessing.
    223  1.1.1.1.4.2  yamt      They are also used for the immediate shift operand in e.g. SSHR.  Such
    224  1.1.1.1.4.2  yamt      a use is only for the ease of operand encoding/decoding and qualifier
    225  1.1.1.1.4.2  yamt      sequence matching; such a use should not be applied widely; use the value
    226  1.1.1.1.4.2  yamt      constraint qualifiers for immediate operands wherever possible.  */
    227  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_S_B,
    228  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_S_H,
    229  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_S_S,
    230  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_S_D,
    231  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_S_Q,
    232  1.1.1.1.4.2  yamt 
    233  1.1.1.1.4.2  yamt   /* Qualifying an operand which is a SIMD vector register or a SIMD vector
    234  1.1.1.1.4.2  yamt      register list; indicating register shape.
    235  1.1.1.1.4.2  yamt      They are also used for the immediate shift operand in e.g. SSHR.  Such
    236  1.1.1.1.4.2  yamt      a use is only for the ease of operand encoding/decoding and qualifier
    237  1.1.1.1.4.2  yamt      sequence matching; such a use should not be applied widely; use the value
    238  1.1.1.1.4.2  yamt      constraint qualifiers for immediate operands wherever possible.  */
    239  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_8B,
    240  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_16B,
    241  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_4H,
    242  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_8H,
    243  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_2S,
    244  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_4S,
    245  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_1D,
    246  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_2D,
    247  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_V_1Q,
    248  1.1.1.1.4.2  yamt 
    249  1.1.1.1.4.2  yamt   /* Constraint on value.  */
    250  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_imm_0_7,
    251  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_imm_0_15,
    252  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_imm_0_31,
    253  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_imm_0_63,
    254  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_imm_1_32,
    255  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_imm_1_64,
    256  1.1.1.1.4.2  yamt 
    257  1.1.1.1.4.2  yamt   /* Indicate whether an AdvSIMD modified immediate operand is shift-zeros
    258  1.1.1.1.4.2  yamt      or shift-ones.  */
    259  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_LSL,
    260  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_MSL,
    261  1.1.1.1.4.2  yamt 
    262  1.1.1.1.4.2  yamt   /* Special qualifier helping retrieve qualifier information during the
    263  1.1.1.1.4.2  yamt      decoding time (currently not in use).  */
    264  1.1.1.1.4.2  yamt   AARCH64_OPND_QLF_RETRIEVE,
    265  1.1.1.1.4.2  yamt };
    266  1.1.1.1.4.2  yamt 
    267  1.1.1.1.4.2  yamt /* Instruction class.  */
    269  1.1.1.1.4.2  yamt 
    270  1.1.1.1.4.2  yamt enum aarch64_insn_class
    271  1.1.1.1.4.2  yamt {
    272  1.1.1.1.4.2  yamt   addsub_carry,
    273  1.1.1.1.4.2  yamt   addsub_ext,
    274  1.1.1.1.4.2  yamt   addsub_imm,
    275  1.1.1.1.4.2  yamt   addsub_shift,
    276  1.1.1.1.4.2  yamt   asimdall,
    277  1.1.1.1.4.2  yamt   asimddiff,
    278  1.1.1.1.4.2  yamt   asimdelem,
    279  1.1.1.1.4.2  yamt   asimdext,
    280  1.1.1.1.4.2  yamt   asimdimm,
    281  1.1.1.1.4.2  yamt   asimdins,
    282  1.1.1.1.4.2  yamt   asimdmisc,
    283  1.1.1.1.4.2  yamt   asimdperm,
    284  1.1.1.1.4.2  yamt   asimdsame,
    285  1.1.1.1.4.2  yamt   asimdshf,
    286  1.1.1.1.4.2  yamt   asimdtbl,
    287  1.1.1.1.4.2  yamt   asisddiff,
    288  1.1.1.1.4.2  yamt   asisdelem,
    289  1.1.1.1.4.2  yamt   asisdlse,
    290  1.1.1.1.4.2  yamt   asisdlsep,
    291  1.1.1.1.4.2  yamt   asisdlso,
    292  1.1.1.1.4.2  yamt   asisdlsop,
    293  1.1.1.1.4.2  yamt   asisdmisc,
    294  1.1.1.1.4.2  yamt   asisdone,
    295  1.1.1.1.4.2  yamt   asisdpair,
    296  1.1.1.1.4.2  yamt   asisdsame,
    297  1.1.1.1.4.2  yamt   asisdshf,
    298  1.1.1.1.4.2  yamt   bitfield,
    299  1.1.1.1.4.2  yamt   branch_imm,
    300  1.1.1.1.4.2  yamt   branch_reg,
    301  1.1.1.1.4.2  yamt   compbranch,
    302  1.1.1.1.4.2  yamt   condbranch,
    303  1.1.1.1.4.2  yamt   condcmp_imm,
    304  1.1.1.1.4.2  yamt   condcmp_reg,
    305  1.1.1.1.4.2  yamt   condsel,
    306  1.1.1.1.4.2  yamt   cryptoaes,
    307  1.1.1.1.4.2  yamt   cryptosha2,
    308  1.1.1.1.4.2  yamt   cryptosha3,
    309  1.1.1.1.4.2  yamt   dp_1src,
    310  1.1.1.1.4.2  yamt   dp_2src,
    311  1.1.1.1.4.2  yamt   dp_3src,
    312  1.1.1.1.4.2  yamt   exception,
    313  1.1.1.1.4.2  yamt   extract,
    314  1.1.1.1.4.2  yamt   float2fix,
    315  1.1.1.1.4.2  yamt   float2int,
    316  1.1.1.1.4.2  yamt   floatccmp,
    317  1.1.1.1.4.2  yamt   floatcmp,
    318  1.1.1.1.4.2  yamt   floatdp1,
    319  1.1.1.1.4.2  yamt   floatdp2,
    320  1.1.1.1.4.2  yamt   floatdp3,
    321  1.1.1.1.4.2  yamt   floatimm,
    322  1.1.1.1.4.2  yamt   floatsel,
    323  1.1.1.1.4.2  yamt   ldst_immpost,
    324  1.1.1.1.4.2  yamt   ldst_immpre,
    325  1.1.1.1.4.2  yamt   ldst_imm9,	/* immpost or immpre */
    326  1.1.1.1.4.2  yamt   ldst_pos,
    327  1.1.1.1.4.2  yamt   ldst_regoff,
    328  1.1.1.1.4.2  yamt   ldst_unpriv,
    329  1.1.1.1.4.2  yamt   ldst_unscaled,
    330  1.1.1.1.4.2  yamt   ldstexcl,
    331  1.1.1.1.4.2  yamt   ldstnapair_offs,
    332  1.1.1.1.4.2  yamt   ldstpair_off,
    333  1.1.1.1.4.2  yamt   ldstpair_indexed,
    334  1.1.1.1.4.2  yamt   loadlit,
    335  1.1.1.1.4.2  yamt   log_imm,
    336  1.1.1.1.4.2  yamt   log_shift,
    337  1.1.1.1.4.2  yamt   movewide,
    338  1.1.1.1.4.2  yamt   pcreladdr,
    339  1.1.1.1.4.2  yamt   ic_system,
    340  1.1.1.1.4.2  yamt   testbranch,
    341  1.1.1.1.4.2  yamt };
    342  1.1.1.1.4.2  yamt 
    343  1.1.1.1.4.2  yamt /* Opcode enumerators.  */
    344  1.1.1.1.4.2  yamt 
    345  1.1.1.1.4.2  yamt enum aarch64_op
    346  1.1.1.1.4.2  yamt {
    347  1.1.1.1.4.2  yamt   OP_NIL,
    348  1.1.1.1.4.2  yamt   OP_STRB_POS,
    349  1.1.1.1.4.2  yamt   OP_LDRB_POS,
    350  1.1.1.1.4.2  yamt   OP_LDRSB_POS,
    351  1.1.1.1.4.2  yamt   OP_STRH_POS,
    352  1.1.1.1.4.2  yamt   OP_LDRH_POS,
    353  1.1.1.1.4.2  yamt   OP_LDRSH_POS,
    354  1.1.1.1.4.2  yamt   OP_STR_POS,
    355  1.1.1.1.4.2  yamt   OP_LDR_POS,
    356  1.1.1.1.4.2  yamt   OP_STRF_POS,
    357  1.1.1.1.4.2  yamt   OP_LDRF_POS,
    358  1.1.1.1.4.2  yamt   OP_LDRSW_POS,
    359  1.1.1.1.4.2  yamt   OP_PRFM_POS,
    360  1.1.1.1.4.2  yamt 
    361  1.1.1.1.4.2  yamt   OP_STURB,
    362  1.1.1.1.4.2  yamt   OP_LDURB,
    363  1.1.1.1.4.2  yamt   OP_LDURSB,
    364  1.1.1.1.4.2  yamt   OP_STURH,
    365  1.1.1.1.4.2  yamt   OP_LDURH,
    366  1.1.1.1.4.2  yamt   OP_LDURSH,
    367  1.1.1.1.4.2  yamt   OP_STUR,
    368  1.1.1.1.4.2  yamt   OP_LDUR,
    369  1.1.1.1.4.2  yamt   OP_STURV,
    370  1.1.1.1.4.2  yamt   OP_LDURV,
    371  1.1.1.1.4.2  yamt   OP_LDURSW,
    372  1.1.1.1.4.2  yamt   OP_PRFUM,
    373  1.1.1.1.4.2  yamt 
    374  1.1.1.1.4.2  yamt   OP_LDR_LIT,
    375  1.1.1.1.4.2  yamt   OP_LDRV_LIT,
    376  1.1.1.1.4.2  yamt   OP_LDRSW_LIT,
    377  1.1.1.1.4.2  yamt   OP_PRFM_LIT,
    378  1.1.1.1.4.2  yamt 
    379  1.1.1.1.4.2  yamt   OP_ADD,
    380  1.1.1.1.4.2  yamt   OP_B,
    381  1.1.1.1.4.2  yamt   OP_BL,
    382  1.1.1.1.4.2  yamt 
    383  1.1.1.1.4.2  yamt   OP_MOVN,
    384  1.1.1.1.4.2  yamt   OP_MOVZ,
    385  1.1.1.1.4.2  yamt   OP_MOVK,
    386  1.1.1.1.4.2  yamt 
    387  1.1.1.1.4.2  yamt   OP_MOV_IMM_LOG,	/* MOV alias for moving bitmask immediate.  */
    388  1.1.1.1.4.2  yamt   OP_MOV_IMM_WIDE,	/* MOV alias for moving wide immediate.  */
    389  1.1.1.1.4.2  yamt   OP_MOV_IMM_WIDEN,	/* MOV alias for moving wide immediate (negated).  */
    390  1.1.1.1.4.2  yamt 
    391  1.1.1.1.4.2  yamt   OP_MOV_V,		/* MOV alias for moving vector register.  */
    392  1.1.1.1.4.2  yamt 
    393  1.1.1.1.4.2  yamt   OP_ASR_IMM,
    394  1.1.1.1.4.2  yamt   OP_LSR_IMM,
    395  1.1.1.1.4.2  yamt   OP_LSL_IMM,
    396  1.1.1.1.4.2  yamt 
    397  1.1.1.1.4.2  yamt   OP_BIC,
    398  1.1.1.1.4.2  yamt 
    399  1.1.1.1.4.2  yamt   OP_UBFX,
    400  1.1.1.1.4.2  yamt   OP_BFXIL,
    401  1.1.1.1.4.2  yamt   OP_SBFX,
    402  1.1.1.1.4.2  yamt   OP_SBFIZ,
    403  1.1.1.1.4.2  yamt   OP_BFI,
    404  1.1.1.1.4.2  yamt   OP_UBFIZ,
    405  1.1.1.1.4.2  yamt   OP_UXTB,
    406  1.1.1.1.4.2  yamt   OP_UXTH,
    407  1.1.1.1.4.2  yamt   OP_UXTW,
    408  1.1.1.1.4.2  yamt 
    409  1.1.1.1.4.2  yamt   OP_V_MOVI_B,
    410  1.1.1.1.4.2  yamt 
    411  1.1.1.1.4.2  yamt   OP_CINC,
    412  1.1.1.1.4.2  yamt   OP_CINV,
    413  1.1.1.1.4.2  yamt   OP_CNEG,
    414  1.1.1.1.4.2  yamt   OP_CSET,
    415  1.1.1.1.4.2  yamt   OP_CSETM,
    416  1.1.1.1.4.2  yamt 
    417  1.1.1.1.4.2  yamt   OP_FCVT,
    418  1.1.1.1.4.2  yamt   OP_FCVTN,
    419  1.1.1.1.4.2  yamt   OP_FCVTN2,
    420  1.1.1.1.4.2  yamt   OP_FCVTL,
    421  1.1.1.1.4.2  yamt   OP_FCVTL2,
    422  1.1.1.1.4.2  yamt   OP_FCVTXN_S,		/* Scalar version.  */
    423  1.1.1.1.4.2  yamt 
    424  1.1.1.1.4.2  yamt   OP_ROR_IMM,
    425  1.1.1.1.4.2  yamt 
    426  1.1.1.1.4.2  yamt   OP_SXTL,
    427  1.1.1.1.4.2  yamt   OP_SXTL2,
    428  1.1.1.1.4.2  yamt   OP_UXTL,
    429  1.1.1.1.4.2  yamt   OP_UXTL2,
    430  1.1.1.1.4.2  yamt 
    431  1.1.1.1.4.2  yamt   OP_TOTAL_NUM,		/* Pseudo.  */
    432  1.1.1.1.4.2  yamt };
    433  1.1.1.1.4.2  yamt 
    434  1.1.1.1.4.2  yamt /* Maximum number of operands an instruction can have.  */
    435  1.1.1.1.4.2  yamt #define AARCH64_MAX_OPND_NUM 6
    436  1.1.1.1.4.2  yamt /* Maximum number of qualifier sequences an instruction can have.  */
    437  1.1.1.1.4.2  yamt #define AARCH64_MAX_QLF_SEQ_NUM 10
    438  1.1.1.1.4.2  yamt /* Operand qualifier typedef; optimized for the size.  */
    439  1.1.1.1.4.2  yamt typedef unsigned char aarch64_opnd_qualifier_t;
    440  1.1.1.1.4.2  yamt /* Operand qualifier sequence typedef.  */
    441  1.1.1.1.4.2  yamt typedef aarch64_opnd_qualifier_t	\
    442  1.1.1.1.4.2  yamt 	  aarch64_opnd_qualifier_seq_t [AARCH64_MAX_OPND_NUM];
    443  1.1.1.1.4.2  yamt 
    444  1.1.1.1.4.2  yamt /* FIXME: improve the efficiency.  */
    445  1.1.1.1.4.2  yamt static inline bfd_boolean
    446  1.1.1.1.4.2  yamt empty_qualifier_sequence_p (const aarch64_opnd_qualifier_t *qualifiers)
    447  1.1.1.1.4.2  yamt {
    448  1.1.1.1.4.2  yamt   int i;
    449  1.1.1.1.4.2  yamt   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
    450  1.1.1.1.4.2  yamt     if (qualifiers[i] != AARCH64_OPND_QLF_NIL)
    451  1.1.1.1.4.2  yamt       return FALSE;
    452  1.1.1.1.4.2  yamt   return TRUE;
    453  1.1.1.1.4.2  yamt }
    454  1.1.1.1.4.2  yamt 
    455  1.1.1.1.4.2  yamt /* This structure holds information for a particular opcode.  */
    456  1.1.1.1.4.2  yamt 
    457  1.1.1.1.4.2  yamt struct aarch64_opcode
    458  1.1.1.1.4.2  yamt {
    459  1.1.1.1.4.2  yamt   /* The name of the mnemonic.  */
    460  1.1.1.1.4.2  yamt   const char *name;
    461  1.1.1.1.4.2  yamt 
    462  1.1.1.1.4.2  yamt   /* The opcode itself.  Those bits which will be filled in with
    463  1.1.1.1.4.2  yamt      operands are zeroes.  */
    464  1.1.1.1.4.2  yamt   aarch64_insn opcode;
    465  1.1.1.1.4.2  yamt 
    466  1.1.1.1.4.2  yamt   /* The opcode mask.  This is used by the disassembler.  This is a
    467  1.1.1.1.4.2  yamt      mask containing ones indicating those bits which must match the
    468  1.1.1.1.4.2  yamt      opcode field, and zeroes indicating those bits which need not
    469  1.1.1.1.4.2  yamt      match (and are presumably filled in by operands).  */
    470  1.1.1.1.4.2  yamt   aarch64_insn mask;
    471  1.1.1.1.4.2  yamt 
    472  1.1.1.1.4.2  yamt   /* Instruction class.  */
    473  1.1.1.1.4.2  yamt   enum aarch64_insn_class iclass;
    474  1.1.1.1.4.2  yamt 
    475  1.1.1.1.4.2  yamt   /* Enumerator identifier.  */
    476  1.1.1.1.4.2  yamt   enum aarch64_op op;
    477  1.1.1.1.4.2  yamt 
    478  1.1.1.1.4.2  yamt   /* Which architecture variant provides this instruction.  */
    479  1.1.1.1.4.2  yamt   const aarch64_feature_set *avariant;
    480  1.1.1.1.4.2  yamt 
    481  1.1.1.1.4.2  yamt   /* An array of operand codes.  Each code is an index into the
    482  1.1.1.1.4.2  yamt      operand table.  They appear in the order which the operands must
    483  1.1.1.1.4.2  yamt      appear in assembly code, and are terminated by a zero.  */
    484  1.1.1.1.4.2  yamt   enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM];
    485  1.1.1.1.4.2  yamt 
    486  1.1.1.1.4.2  yamt   /* A list of operand qualifier code sequence.  Each operand qualifier
    487  1.1.1.1.4.2  yamt      code qualifies the corresponding operand code.  Each operand
    488  1.1.1.1.4.2  yamt      qualifier sequence specifies a valid opcode variant and related
    489  1.1.1.1.4.2  yamt      constraint on operands.  */
    490  1.1.1.1.4.2  yamt   aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM];
    491  1.1.1.1.4.2  yamt 
    492  1.1.1.1.4.2  yamt   /* Flags providing information about this instruction */
    493  1.1.1.1.4.2  yamt   uint32_t flags;
    494  1.1.1.1.4.2  yamt };
    495  1.1.1.1.4.2  yamt 
    496  1.1.1.1.4.2  yamt typedef struct aarch64_opcode aarch64_opcode;
    497  1.1.1.1.4.2  yamt 
    498  1.1.1.1.4.2  yamt /* Table describing all the AArch64 opcodes.  */
    499  1.1.1.1.4.2  yamt extern aarch64_opcode aarch64_opcode_table[];
    500  1.1.1.1.4.2  yamt 
    501  1.1.1.1.4.2  yamt /* Opcode flags.  */
    502  1.1.1.1.4.2  yamt #define F_ALIAS (1 << 0)
    503  1.1.1.1.4.2  yamt #define F_HAS_ALIAS (1 << 1)
    504  1.1.1.1.4.2  yamt /* Disassembly preference priority 1-3 (the larger the higher).  If nothing
    505  1.1.1.1.4.2  yamt    is specified, it is the priority 0 by default, i.e. the lowest priority.  */
    506  1.1.1.1.4.2  yamt #define F_P1 (1 << 2)
    507  1.1.1.1.4.2  yamt #define F_P2 (2 << 2)
    508  1.1.1.1.4.2  yamt #define F_P3 (3 << 2)
    509  1.1.1.1.4.2  yamt /* Flag an instruction that is truly conditional executed, e.g. b.cond.  */
    510  1.1.1.1.4.2  yamt #define F_COND (1 << 4)
    511  1.1.1.1.4.2  yamt /* Instruction has the field of 'sf'.  */
    512  1.1.1.1.4.2  yamt #define F_SF (1 << 5)
    513  1.1.1.1.4.2  yamt /* Instruction has the field of 'size:Q'.  */
    514  1.1.1.1.4.2  yamt #define F_SIZEQ (1 << 6)
    515  1.1.1.1.4.2  yamt /* Floating-point instruction has the field of 'type'.  */
    516  1.1.1.1.4.2  yamt #define F_FPTYPE (1 << 7)
    517  1.1.1.1.4.2  yamt /* AdvSIMD scalar instruction has the field of 'size'.  */
    518  1.1.1.1.4.2  yamt #define F_SSIZE (1 << 8)
    519  1.1.1.1.4.2  yamt /* AdvSIMD vector register arrangement specifier encoded in "imm5<3:0>:Q".  */
    520  1.1.1.1.4.2  yamt #define F_T (1 << 9)
    521  1.1.1.1.4.2  yamt /* Size of GPR operand in AdvSIMD instructions encoded in Q.  */
    522  1.1.1.1.4.2  yamt #define F_GPRSIZE_IN_Q (1 << 10)
    523  1.1.1.1.4.2  yamt /* Size of Rt load signed instruction encoded in opc[0], i.e. bit 22.  */
    524  1.1.1.1.4.2  yamt #define F_LDS_SIZE (1 << 11)
    525  1.1.1.1.4.2  yamt /* Optional operand; assume maximum of 1 operand can be optional.  */
    526  1.1.1.1.4.2  yamt #define F_OPD0_OPT (1 << 12)
    527  1.1.1.1.4.2  yamt #define F_OPD1_OPT (2 << 12)
    528  1.1.1.1.4.2  yamt #define F_OPD2_OPT (3 << 12)
    529  1.1.1.1.4.2  yamt #define F_OPD3_OPT (4 << 12)
    530  1.1.1.1.4.2  yamt #define F_OPD4_OPT (5 << 12)
    531  1.1.1.1.4.2  yamt /* Default value for the optional operand when omitted from the assembly.  */
    532  1.1.1.1.4.2  yamt #define F_DEFAULT(X) (((X) & 0x1f) << 15)
    533  1.1.1.1.4.2  yamt /* Instruction that is an alias of another instruction needs to be
    534  1.1.1.1.4.2  yamt    encoded/decoded by converting it to/from the real form, followed by
    535  1.1.1.1.4.2  yamt    the encoding/decoding according to the rules of the real opcode.
    536  1.1.1.1.4.2  yamt    This compares to the direct coding using the alias's information.
    537  1.1.1.1.4.2  yamt    N.B. this flag requires F_ALIAS to be used together.  */
    538  1.1.1.1.4.2  yamt #define F_CONV (1 << 20)
    539  1.1.1.1.4.2  yamt /* Use together with F_ALIAS to indicate an alias opcode is a programmer
    540  1.1.1.1.4.2  yamt    friendly pseudo instruction available only in the assembly code (thus will
    541  1.1.1.1.4.2  yamt    not show up in the disassembly).  */
    542  1.1.1.1.4.2  yamt #define F_PSEUDO (1 << 21)
    543  1.1.1.1.4.2  yamt /* Instruction has miscellaneous encoding/decoding rules.  */
    544  1.1.1.1.4.2  yamt #define F_MISC (1 << 22)
    545  1.1.1.1.4.2  yamt /* Instruction has the field of 'N'; used in conjunction with F_SF.  */
    546  1.1.1.1.4.2  yamt #define F_N (1 << 23)
    547  1.1.1.1.4.2  yamt /* Opcode dependent field.  */
    548  1.1.1.1.4.2  yamt #define F_OD(X) (((X) & 0x7) << 24)
    549  1.1.1.1.4.2  yamt /* Next bit is 27.  */
    550  1.1.1.1.4.2  yamt 
    551  1.1.1.1.4.2  yamt static inline bfd_boolean
    552  1.1.1.1.4.2  yamt alias_opcode_p (const aarch64_opcode *opcode)
    553  1.1.1.1.4.2  yamt {
    554  1.1.1.1.4.2  yamt   return (opcode->flags & F_ALIAS) ? TRUE : FALSE;
    555  1.1.1.1.4.2  yamt }
    556  1.1.1.1.4.2  yamt 
    557  1.1.1.1.4.2  yamt static inline bfd_boolean
    558  1.1.1.1.4.2  yamt opcode_has_alias (const aarch64_opcode *opcode)
    559  1.1.1.1.4.2  yamt {
    560  1.1.1.1.4.2  yamt   return (opcode->flags & F_HAS_ALIAS) ? TRUE : FALSE;
    561  1.1.1.1.4.2  yamt }
    562  1.1.1.1.4.2  yamt 
    563  1.1.1.1.4.2  yamt /* Priority for disassembling preference.  */
    564  1.1.1.1.4.2  yamt static inline int
    565  1.1.1.1.4.2  yamt opcode_priority (const aarch64_opcode *opcode)
    566  1.1.1.1.4.2  yamt {
    567  1.1.1.1.4.2  yamt   return (opcode->flags >> 2) & 0x3;
    568  1.1.1.1.4.2  yamt }
    569  1.1.1.1.4.2  yamt 
    570  1.1.1.1.4.2  yamt static inline bfd_boolean
    571  1.1.1.1.4.2  yamt pseudo_opcode_p (const aarch64_opcode *opcode)
    572  1.1.1.1.4.2  yamt {
    573  1.1.1.1.4.2  yamt   return (opcode->flags & F_PSEUDO) != 0lu ? TRUE : FALSE;
    574  1.1.1.1.4.2  yamt }
    575  1.1.1.1.4.2  yamt 
    576  1.1.1.1.4.2  yamt static inline bfd_boolean
    577  1.1.1.1.4.2  yamt optional_operand_p (const aarch64_opcode *opcode, unsigned int idx)
    578  1.1.1.1.4.2  yamt {
    579  1.1.1.1.4.2  yamt   return (((opcode->flags >> 12) & 0x7) == idx + 1)
    580  1.1.1.1.4.2  yamt     ? TRUE : FALSE;
    581  1.1.1.1.4.2  yamt }
    582  1.1.1.1.4.2  yamt 
    583  1.1.1.1.4.2  yamt static inline aarch64_insn
    584  1.1.1.1.4.2  yamt get_optional_operand_default_value (const aarch64_opcode *opcode)
    585  1.1.1.1.4.2  yamt {
    586  1.1.1.1.4.2  yamt   return (opcode->flags >> 15) & 0x1f;
    587  1.1.1.1.4.2  yamt }
    588  1.1.1.1.4.2  yamt 
    589  1.1.1.1.4.2  yamt static inline unsigned int
    590  1.1.1.1.4.2  yamt get_opcode_dependent_value (const aarch64_opcode *opcode)
    591  1.1.1.1.4.2  yamt {
    592  1.1.1.1.4.2  yamt   return (opcode->flags >> 24) & 0x7;
    593  1.1.1.1.4.2  yamt }
    594  1.1.1.1.4.2  yamt 
    595  1.1.1.1.4.2  yamt static inline bfd_boolean
    596  1.1.1.1.4.2  yamt opcode_has_special_coder (const aarch64_opcode *opcode)
    597  1.1.1.1.4.2  yamt {
    598  1.1.1.1.4.2  yamt   return (opcode->flags & (F_SF | F_SIZEQ | F_FPTYPE | F_SSIZE | F_T
    599  1.1.1.1.4.2  yamt 	  | F_GPRSIZE_IN_Q | F_LDS_SIZE | F_MISC | F_N | F_COND)) ? TRUE
    600  1.1.1.1.4.2  yamt     : FALSE;
    601  1.1.1.1.4.2  yamt }
    602  1.1.1.1.4.2  yamt 
    603  1.1.1.1.4.2  yamt struct aarch64_name_value_pair
    605  1.1.1.1.4.2  yamt {
    606  1.1.1.1.4.2  yamt   const char	*name;
    607  1.1.1.1.4.2  yamt   aarch64_insn	value;
    608  1.1.1.1.4.2  yamt };
    609  1.1.1.1.4.2  yamt 
    610  1.1.1.1.4.2  yamt extern const struct aarch64_name_value_pair aarch64_operand_modifiers [];
    611  1.1.1.1.4.2  yamt extern const struct aarch64_name_value_pair aarch64_sys_regs [];
    612  1.1.1.1.4.2  yamt extern const struct aarch64_name_value_pair aarch64_pstatefields [];
    613  1.1.1.1.4.2  yamt extern const struct aarch64_name_value_pair aarch64_barrier_options [16];
    614  1.1.1.1.4.2  yamt extern const struct aarch64_name_value_pair aarch64_prfops [32];
    615  1.1.1.1.4.2  yamt 
    616  1.1.1.1.4.2  yamt typedef struct
    617  1.1.1.1.4.2  yamt {
    618  1.1.1.1.4.2  yamt   const char *template;
    619  1.1.1.1.4.2  yamt   uint32_t value;
    620  1.1.1.1.4.2  yamt   int has_xt;
    621  1.1.1.1.4.2  yamt } aarch64_sys_ins_reg;
    622  1.1.1.1.4.2  yamt 
    623  1.1.1.1.4.2  yamt extern const aarch64_sys_ins_reg aarch64_sys_regs_ic [];
    624  1.1.1.1.4.2  yamt extern const aarch64_sys_ins_reg aarch64_sys_regs_dc [];
    625  1.1.1.1.4.2  yamt extern const aarch64_sys_ins_reg aarch64_sys_regs_at [];
    626  1.1.1.1.4.2  yamt extern const aarch64_sys_ins_reg aarch64_sys_regs_tlbi [];
    627  1.1.1.1.4.2  yamt 
    628  1.1.1.1.4.2  yamt /* Shift/extending operator kinds.
    629  1.1.1.1.4.2  yamt    N.B. order is important; keep aarch64_operand_modifiers synced.  */
    630  1.1.1.1.4.2  yamt enum aarch64_modifier_kind
    631  1.1.1.1.4.2  yamt {
    632  1.1.1.1.4.2  yamt   AARCH64_MOD_NONE,
    633  1.1.1.1.4.2  yamt   AARCH64_MOD_MSL,
    634  1.1.1.1.4.2  yamt   AARCH64_MOD_ROR,
    635  1.1.1.1.4.2  yamt   AARCH64_MOD_ASR,
    636  1.1.1.1.4.2  yamt   AARCH64_MOD_LSR,
    637  1.1.1.1.4.2  yamt   AARCH64_MOD_LSL,
    638  1.1.1.1.4.2  yamt   AARCH64_MOD_UXTB,
    639  1.1.1.1.4.2  yamt   AARCH64_MOD_UXTH,
    640  1.1.1.1.4.2  yamt   AARCH64_MOD_UXTW,
    641  1.1.1.1.4.2  yamt   AARCH64_MOD_UXTX,
    642  1.1.1.1.4.2  yamt   AARCH64_MOD_SXTB,
    643  1.1.1.1.4.2  yamt   AARCH64_MOD_SXTH,
    644  1.1.1.1.4.2  yamt   AARCH64_MOD_SXTW,
    645  1.1.1.1.4.2  yamt   AARCH64_MOD_SXTX,
    646  1.1.1.1.4.2  yamt };
    647  1.1.1.1.4.2  yamt 
    648  1.1.1.1.4.2  yamt bfd_boolean
    649  1.1.1.1.4.2  yamt aarch64_extend_operator_p (enum aarch64_modifier_kind);
    650  1.1.1.1.4.2  yamt 
    651  1.1.1.1.4.2  yamt enum aarch64_modifier_kind
    652  1.1.1.1.4.2  yamt aarch64_get_operand_modifier (const struct aarch64_name_value_pair *);
    653  1.1.1.1.4.2  yamt /* Condition.  */
    654  1.1.1.1.4.2  yamt 
    655  1.1.1.1.4.2  yamt typedef struct
    656  1.1.1.1.4.2  yamt {
    657  1.1.1.1.4.2  yamt   /* A list of names with the first one as the disassembly preference;
    658  1.1.1.1.4.2  yamt      terminated by NULL if fewer than 3.  */
    659  1.1.1.1.4.2  yamt   const char *names[3];
    660  1.1.1.1.4.2  yamt   aarch64_insn value;
    661  1.1.1.1.4.2  yamt } aarch64_cond;
    662  1.1.1.1.4.2  yamt 
    663  1.1.1.1.4.2  yamt extern const aarch64_cond aarch64_conds[16];
    664  1.1.1.1.4.2  yamt 
    665  1.1.1.1.4.2  yamt const aarch64_cond* get_cond_from_value (aarch64_insn value);
    666  1.1.1.1.4.2  yamt const aarch64_cond* get_inverted_cond (const aarch64_cond *cond);
    667  1.1.1.1.4.2  yamt 
    668  1.1.1.1.4.2  yamt /* Structure representing an operand.  */
    670  1.1.1.1.4.2  yamt 
    671  1.1.1.1.4.2  yamt struct aarch64_opnd_info
    672  1.1.1.1.4.2  yamt {
    673  1.1.1.1.4.2  yamt   enum aarch64_opnd type;
    674  1.1.1.1.4.2  yamt   aarch64_opnd_qualifier_t qualifier;
    675  1.1.1.1.4.2  yamt   int idx;
    676  1.1.1.1.4.2  yamt 
    677  1.1.1.1.4.2  yamt   union
    678  1.1.1.1.4.2  yamt     {
    679  1.1.1.1.4.2  yamt       struct
    680  1.1.1.1.4.2  yamt 	{
    681  1.1.1.1.4.2  yamt 	  unsigned regno;
    682  1.1.1.1.4.2  yamt 	} reg;
    683  1.1.1.1.4.2  yamt       struct
    684  1.1.1.1.4.2  yamt 	{
    685  1.1.1.1.4.2  yamt 	  unsigned regno : 5;
    686  1.1.1.1.4.2  yamt 	  unsigned index : 4;
    687  1.1.1.1.4.2  yamt 	} reglane;
    688  1.1.1.1.4.2  yamt       /* e.g. LVn.  */
    689  1.1.1.1.4.2  yamt       struct
    690  1.1.1.1.4.2  yamt 	{
    691  1.1.1.1.4.2  yamt 	  unsigned first_regno : 5;
    692  1.1.1.1.4.2  yamt 	  unsigned num_regs : 3;
    693  1.1.1.1.4.2  yamt 	  /* 1 if it is a list of reg element.  */
    694  1.1.1.1.4.2  yamt 	  unsigned has_index : 1;
    695  1.1.1.1.4.2  yamt 	  /* Lane index; valid only when has_index is 1.  */
    696  1.1.1.1.4.2  yamt 	  unsigned index : 4;
    697  1.1.1.1.4.2  yamt 	} reglist;
    698  1.1.1.1.4.2  yamt       /* e.g. immediate or pc relative address offset. */
    699  1.1.1.1.4.2  yamt       struct
    700  1.1.1.1.4.2  yamt 	{
    701  1.1.1.1.4.2  yamt 	  int64_t value;
    702  1.1.1.1.4.2  yamt 	  unsigned is_fp : 1;
    703  1.1.1.1.4.2  yamt 	} imm;
    704  1.1.1.1.4.2  yamt       /* e.g. address in STR (register offset).  */
    705  1.1.1.1.4.2  yamt       struct
    706  1.1.1.1.4.2  yamt 	{
    707  1.1.1.1.4.2  yamt 	  unsigned base_regno;
    708  1.1.1.1.4.2  yamt 	  struct
    709  1.1.1.1.4.2  yamt 	    {
    710  1.1.1.1.4.2  yamt 	      union
    711  1.1.1.1.4.2  yamt 		{
    712  1.1.1.1.4.2  yamt 		  int imm;
    713  1.1.1.1.4.2  yamt 		  unsigned regno;
    714  1.1.1.1.4.2  yamt 		};
    715  1.1.1.1.4.2  yamt 	      unsigned is_reg;
    716  1.1.1.1.4.2  yamt 	    } offset;
    717  1.1.1.1.4.2  yamt 	  unsigned pcrel : 1;		/* PC-relative.  */
    718  1.1.1.1.4.2  yamt 	  unsigned writeback : 1;
    719  1.1.1.1.4.2  yamt 	  unsigned preind : 1;		/* Pre-indexed.  */
    720  1.1.1.1.4.2  yamt 	  unsigned postind : 1;		/* Post-indexed.  */
    721  1.1.1.1.4.2  yamt 	} addr;
    722  1.1.1.1.4.2  yamt       const aarch64_cond *cond;
    723  1.1.1.1.4.2  yamt       /* The encoding of the system register.  */
    724  1.1.1.1.4.2  yamt       aarch64_insn sysreg;
    725  1.1.1.1.4.2  yamt       /* The encoding of the PSTATE field.  */
    726  1.1.1.1.4.2  yamt       aarch64_insn pstatefield;
    727  1.1.1.1.4.2  yamt       const aarch64_sys_ins_reg *sysins_op;
    728  1.1.1.1.4.2  yamt       const struct aarch64_name_value_pair *barrier;
    729  1.1.1.1.4.2  yamt       const struct aarch64_name_value_pair *prfop;
    730  1.1.1.1.4.2  yamt     };
    731  1.1.1.1.4.2  yamt 
    732  1.1.1.1.4.2  yamt   /* Operand shifter; in use when the operand is a register offset address,
    733  1.1.1.1.4.2  yamt      add/sub extended reg, etc. e.g. <R><m>{, <extend> {#<amount>}}.  */
    734  1.1.1.1.4.2  yamt   struct
    735  1.1.1.1.4.2  yamt     {
    736  1.1.1.1.4.2  yamt       enum aarch64_modifier_kind kind;
    737  1.1.1.1.4.2  yamt       int amount;
    738  1.1.1.1.4.2  yamt       unsigned operator_present: 1;	/* Only valid during encoding.  */
    739  1.1.1.1.4.2  yamt       /* Value of the 'S' field in ld/st reg offset; used only in decoding.  */
    740  1.1.1.1.4.2  yamt       unsigned amount_present: 1;
    741  1.1.1.1.4.2  yamt     } shifter;
    742  1.1.1.1.4.2  yamt 
    743  1.1.1.1.4.2  yamt   unsigned skip:1;	/* Operand is not completed if there is a fixup needed
    744  1.1.1.1.4.2  yamt 			   to be done on it.  In some (but not all) of these
    745  1.1.1.1.4.2  yamt 			   cases, we need to tell libopcodes to skip the
    746  1.1.1.1.4.2  yamt 			   constraint checking and the encoding for this
    747  1.1.1.1.4.2  yamt 			   operand, so that the libopcodes can pick up the
    748  1.1.1.1.4.2  yamt 			   right opcode before the operand is fixed-up.  This
    749  1.1.1.1.4.2  yamt 			   flag should only be used during the
    750  1.1.1.1.4.2  yamt 			   assembling/encoding.  */
    751  1.1.1.1.4.2  yamt   unsigned present:1;	/* Whether this operand is present in the assembly
    752  1.1.1.1.4.2  yamt 			   line; not used during the disassembly.  */
    753  1.1.1.1.4.2  yamt };
    754  1.1.1.1.4.2  yamt 
    755  1.1.1.1.4.2  yamt typedef struct aarch64_opnd_info aarch64_opnd_info;
    756  1.1.1.1.4.2  yamt 
    757  1.1.1.1.4.2  yamt /* Structure representing an instruction.
    758  1.1.1.1.4.2  yamt 
    759  1.1.1.1.4.2  yamt    It is used during both the assembling and disassembling.  The assembler
    760  1.1.1.1.4.2  yamt    fills an aarch64_inst after a successful parsing and then passes it to the
    761  1.1.1.1.4.2  yamt    encoding routine to do the encoding.  During the disassembling, the
    762  1.1.1.1.4.2  yamt    disassembler calls the decoding routine to decode a binary instruction; on a
    763  1.1.1.1.4.2  yamt    successful return, such a structure will be filled with information of the
    764  1.1.1.1.4.2  yamt    instruction; then the disassembler uses the information to print out the
    765  1.1.1.1.4.2  yamt    instruction.  */
    766  1.1.1.1.4.2  yamt 
    767  1.1.1.1.4.2  yamt struct aarch64_inst
    768  1.1.1.1.4.2  yamt {
    769  1.1.1.1.4.2  yamt   /* The value of the binary instruction.  */
    770  1.1.1.1.4.2  yamt   aarch64_insn value;
    771  1.1.1.1.4.2  yamt 
    772  1.1.1.1.4.2  yamt   /* Corresponding opcode entry.  */
    773  1.1.1.1.4.2  yamt   const aarch64_opcode *opcode;
    774  1.1.1.1.4.2  yamt 
    775  1.1.1.1.4.2  yamt   /* Condition for a truly conditional-executed instrutions, e.g. b.cond.  */
    776  1.1.1.1.4.2  yamt   const aarch64_cond *cond;
    777  1.1.1.1.4.2  yamt 
    778  1.1.1.1.4.2  yamt   /* Operands information.  */
    779  1.1.1.1.4.2  yamt   aarch64_opnd_info operands[AARCH64_MAX_OPND_NUM];
    780  1.1.1.1.4.2  yamt };
    781  1.1.1.1.4.2  yamt 
    782  1.1.1.1.4.2  yamt typedef struct aarch64_inst aarch64_inst;
    783  1.1.1.1.4.2  yamt 
    784  1.1.1.1.4.2  yamt /* Diagnosis related declaration and interface.  */
    786  1.1.1.1.4.2  yamt 
    787  1.1.1.1.4.2  yamt /* Operand error kind enumerators.
    788  1.1.1.1.4.2  yamt 
    789  1.1.1.1.4.2  yamt    AARCH64_OPDE_RECOVERABLE
    790  1.1.1.1.4.2  yamt      Less severe error found during the parsing, very possibly because that
    791  1.1.1.1.4.2  yamt      GAS has picked up a wrong instruction template for the parsing.
    792  1.1.1.1.4.2  yamt 
    793  1.1.1.1.4.2  yamt    AARCH64_OPDE_SYNTAX_ERROR
    794  1.1.1.1.4.2  yamt      General syntax error; it can be either a user error, or simply because
    795  1.1.1.1.4.2  yamt      that GAS is trying a wrong instruction template.
    796  1.1.1.1.4.2  yamt 
    797  1.1.1.1.4.2  yamt    AARCH64_OPDE_FATAL_SYNTAX_ERROR
    798  1.1.1.1.4.2  yamt      Definitely a user syntax error.
    799  1.1.1.1.4.2  yamt 
    800  1.1.1.1.4.2  yamt    AARCH64_OPDE_INVALID_VARIANT
    801  1.1.1.1.4.2  yamt      No syntax error, but the operands are not a valid combination, e.g.
    802  1.1.1.1.4.2  yamt      FMOV D0,S0
    803  1.1.1.1.4.2  yamt 
    804  1.1.1.1.4.2  yamt    AARCH64_OPDE_OUT_OF_RANGE
    805  1.1.1.1.4.2  yamt      Error about some immediate value out of a valid range.
    806  1.1.1.1.4.2  yamt 
    807  1.1.1.1.4.2  yamt    AARCH64_OPDE_UNALIGNED
    808  1.1.1.1.4.2  yamt      Error about some immediate value not properly aligned (i.e. not being a
    809  1.1.1.1.4.2  yamt      multiple times of a certain value).
    810  1.1.1.1.4.2  yamt 
    811  1.1.1.1.4.2  yamt    AARCH64_OPDE_REG_LIST
    812  1.1.1.1.4.2  yamt      Error about the register list operand having unexpected number of
    813  1.1.1.1.4.2  yamt      registers.
    814  1.1.1.1.4.2  yamt 
    815  1.1.1.1.4.2  yamt    AARCH64_OPDE_OTHER_ERROR
    816  1.1.1.1.4.2  yamt      Error of the highest severity and used for any severe issue that does not
    817  1.1.1.1.4.2  yamt      fall into any of the above categories.
    818  1.1.1.1.4.2  yamt 
    819  1.1.1.1.4.2  yamt    The enumerators are only interesting to GAS.  They are declared here (in
    820  1.1.1.1.4.2  yamt    libopcodes) because that some errors are detected (and then notified to GAS)
    821  1.1.1.1.4.2  yamt    by libopcodes (rather than by GAS solely).
    822  1.1.1.1.4.2  yamt 
    823  1.1.1.1.4.2  yamt    The first three errors are only deteced by GAS while the
    824  1.1.1.1.4.2  yamt    AARCH64_OPDE_INVALID_VARIANT error can only be spotted by libopcodes as
    825  1.1.1.1.4.2  yamt    only libopcodes has the information about the valid variants of each
    826  1.1.1.1.4.2  yamt    instruction.
    827  1.1.1.1.4.2  yamt 
    828  1.1.1.1.4.2  yamt    The enumerators have an increasing severity.  This is helpful when there are
    829  1.1.1.1.4.2  yamt    multiple instruction templates available for a given mnemonic name (e.g.
    830  1.1.1.1.4.2  yamt    FMOV); this mechanism will help choose the most suitable template from which
    831  1.1.1.1.4.2  yamt    the generated diagnostics can most closely describe the issues, if any.  */
    832  1.1.1.1.4.2  yamt 
    833  1.1.1.1.4.2  yamt enum aarch64_operand_error_kind
    834  1.1.1.1.4.2  yamt {
    835  1.1.1.1.4.2  yamt   AARCH64_OPDE_NIL,
    836  1.1.1.1.4.2  yamt   AARCH64_OPDE_RECOVERABLE,
    837  1.1.1.1.4.2  yamt   AARCH64_OPDE_SYNTAX_ERROR,
    838  1.1.1.1.4.2  yamt   AARCH64_OPDE_FATAL_SYNTAX_ERROR,
    839  1.1.1.1.4.2  yamt   AARCH64_OPDE_INVALID_VARIANT,
    840  1.1.1.1.4.2  yamt   AARCH64_OPDE_OUT_OF_RANGE,
    841  1.1.1.1.4.2  yamt   AARCH64_OPDE_UNALIGNED,
    842  1.1.1.1.4.2  yamt   AARCH64_OPDE_REG_LIST,
    843  1.1.1.1.4.2  yamt   AARCH64_OPDE_OTHER_ERROR
    844  1.1.1.1.4.2  yamt };
    845  1.1.1.1.4.2  yamt 
    846  1.1.1.1.4.2  yamt /* N.B. GAS assumes that this structure work well with shallow copy.  */
    847  1.1.1.1.4.2  yamt struct aarch64_operand_error
    848  1.1.1.1.4.2  yamt {
    849  1.1.1.1.4.2  yamt   enum aarch64_operand_error_kind kind;
    850  1.1.1.1.4.2  yamt   int index;
    851  1.1.1.1.4.2  yamt   const char *error;
    852  1.1.1.1.4.2  yamt   int data[3];	/* Some data for extra information.  */
    853  1.1.1.1.4.2  yamt };
    854  1.1.1.1.4.2  yamt 
    855  1.1.1.1.4.2  yamt typedef struct aarch64_operand_error aarch64_operand_error;
    856  1.1.1.1.4.2  yamt 
    857  1.1.1.1.4.2  yamt /* Encoding entrypoint.  */
    858  1.1.1.1.4.2  yamt 
    859  1.1.1.1.4.2  yamt int aarch64_opcode_encode (const aarch64_opcode *, const aarch64_inst *,
    860  1.1.1.1.4.2  yamt 			   aarch64_insn *, aarch64_opnd_qualifier_t *,
    861  1.1.1.1.4.2  yamt 			   aarch64_operand_error *);
    862  1.1.1.1.4.2  yamt 
    863  1.1.1.1.4.2  yamt const aarch64_opcode* aarch64_replace_opcode (struct aarch64_inst *,
    864  1.1.1.1.4.2  yamt 					      const aarch64_opcode *);
    865  1.1.1.1.4.2  yamt 
    866  1.1.1.1.4.2  yamt /* Given the opcode enumerator OP, return the pointer to the corresponding
    867  1.1.1.1.4.2  yamt    opcode entry.  */
    868  1.1.1.1.4.2  yamt 
    869  1.1.1.1.4.2  yamt const aarch64_opcode* aarch64_get_opcode (enum aarch64_op);
    870  1.1.1.1.4.2  yamt 
    871  1.1.1.1.4.2  yamt /* Generate the string representation of an operand.  */
    872  1.1.1.1.4.2  yamt void aarch64_print_operand (char *, size_t, bfd_vma, const aarch64_opcode *,
    873  1.1.1.1.4.2  yamt 			    const aarch64_opnd_info *, int, int *, bfd_vma *);
    874  1.1.1.1.4.2  yamt 
    875  1.1.1.1.4.2  yamt /* Miscellaneous interface.  */
    876  1.1.1.1.4.2  yamt 
    877  1.1.1.1.4.2  yamt int aarch64_operand_index (const enum aarch64_opnd *, enum aarch64_opnd);
    878  1.1.1.1.4.2  yamt 
    879  1.1.1.1.4.2  yamt aarch64_opnd_qualifier_t
    880  1.1.1.1.4.2  yamt aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *, int,
    881  1.1.1.1.4.2  yamt 				const aarch64_opnd_qualifier_t, int);
    882  1.1.1.1.4.2  yamt 
    883  1.1.1.1.4.2  yamt int aarch64_num_of_operands (const aarch64_opcode *);
    884  1.1.1.1.4.2  yamt 
    885  1.1.1.1.4.2  yamt int aarch64_stack_pointer_p (const aarch64_opnd_info *);
    886  1.1.1.1.4.2  yamt int aarch64_zero_register_p (const aarch64_opnd_info *);
    887  1.1.1.1.4.2  yamt 
    888  1.1.1.1.4.2  yamt /* Given an operand qualifier, return the expected data element size
    889  1.1.1.1.4.2  yamt    of a qualified operand.  */
    890  1.1.1.1.4.2  yamt unsigned char aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t);
    891  1.1.1.1.4.2  yamt enum aarch64_operand_class aarch64_get_operand_class (enum aarch64_opnd);
    892  1.1.1.1.4.2  yamt const char* aarch64_get_operand_name (enum aarch64_opnd);
    893  1.1.1.1.4.2  yamt const char* aarch64_get_operand_desc (enum aarch64_opnd);
    894  1.1.1.1.4.2  yamt 
    895  1.1.1.1.4.2  yamt #ifdef DEBUG_AARCH64
    896  1.1.1.1.4.2  yamt extern int debug_dump;
    897  1.1.1.1.4.2  yamt void aarch64_verbose (const char *str, ...)
    898  1.1.1.1.4.2  yamt      __attribute__ ((format (printf, 1, 2)));
    899  1.1.1.1.4.2  yamt #define DEBUG_TRACE(M, ...) {					\
    900  1.1.1.1.4.2  yamt   if (debug_dump)						\
    901  1.1.1.1.4.2  yamt     aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__);	\
    902  1.1.1.1.4.2  yamt }
    903  1.1.1.1.4.2  yamt #define DEBUG_TRACE_IF(C, M, ...) {				\
    904  1.1.1.1.4.2  yamt   if (debug_dump && (C))					\
    905  1.1.1.1.4.2  yamt     aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__);	\
    906  1.1.1.1.4.2  yamt }
    907  1.1.1.1.4.2  yamt #else  /* !DEBUG_AARCH64 */
    908  1.1.1.1.4.2  yamt #define DEBUG_TRACE(M, ...) ;
    909                    #define DEBUG_TRACE_IF(C, M, ...) ;
    910                    #endif /* DEBUG_AARCH64 */
    911                    
    912                    #endif /* OPCODE_AARCH64_H */
    913