Blame include/opcode/aarch64.h

Packit bbfece
/* AArch64 assembler/disassembler support.
Packit bbfece
Packit bbfece
   Copyright (C) 2009-2018 Free Software Foundation, Inc.
Packit bbfece
   Contributed by ARM Ltd.
Packit bbfece
Packit bbfece
   This file is part of GNU Binutils.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the license, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; see the file COPYING3. If not,
Packit bbfece
   see <http://www.gnu.org/licenses/>.  */
Packit bbfece
Packit bbfece
#ifndef OPCODE_AARCH64_H
Packit bbfece
#define OPCODE_AARCH64_H
Packit bbfece
Packit bbfece
#include "bfd.h"
Packit bbfece
#include "bfd_stdint.h"
Packit bbfece
#include <assert.h>
Packit bbfece
#include <stdlib.h>
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
extern "C" {
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* The offset for pc-relative addressing is currently defined to be 0.  */
Packit bbfece
#define AARCH64_PCREL_OFFSET		0
Packit bbfece
Packit bbfece
typedef uint32_t aarch64_insn;
Packit bbfece
Packit bbfece
/* The following bitmasks control CPU features.  */
Packit bbfece
#define AARCH64_FEATURE_SHA2	0x200000000ULL  /* SHA2 instructions.  */
Packit bbfece
#define AARCH64_FEATURE_AES	0x800000000ULL  /* AES instructions.  */
Packit bbfece
#define AARCH64_FEATURE_V8_4	0x000000800ULL  /* ARMv8.4 processors.  */
Packit bbfece
#define AARCH64_FEATURE_SM4	0x100000000ULL  /* SM3 & SM4 instructions.  */
Packit bbfece
#define AARCH64_FEATURE_SHA3	0x400000000ULL  /* SHA3 instructions.  */
Packit bbfece
#define AARCH64_FEATURE_V8	0x00000001	/* All processors.  */
Packit bbfece
#define AARCH64_FEATURE_V8_2	0x00000020      /* ARMv8.2 processors.  */
Packit bbfece
#define AARCH64_FEATURE_V8_3	0x00000040      /* ARMv8.3 processors.  */
Packit bbfece
#define AARCH64_FEATURE_CRYPTO	0x00010000	/* Crypto instructions.  */
Packit bbfece
#define AARCH64_FEATURE_FP	0x00020000	/* FP instructions.  */
Packit bbfece
#define AARCH64_FEATURE_SIMD	0x00040000	/* SIMD instructions.  */
Packit bbfece
#define AARCH64_FEATURE_CRC	0x00080000	/* CRC instructions.  */
Packit bbfece
#define AARCH64_FEATURE_LSE	0x00100000	/* LSE instructions.  */
Packit bbfece
#define AARCH64_FEATURE_PAN	0x00200000	/* PAN instructions.  */
Packit bbfece
#define AARCH64_FEATURE_LOR	0x00400000	/* LOR instructions.  */
Packit bbfece
#define AARCH64_FEATURE_RDMA	0x00800000	/* v8.1 SIMD instructions.  */
Packit bbfece
#define AARCH64_FEATURE_V8_1	0x01000000	/* v8.1 features.  */
Packit bbfece
#define AARCH64_FEATURE_F16	0x02000000	/* v8.2 FP16 instructions.  */
Packit bbfece
#define AARCH64_FEATURE_RAS	0x04000000	/* RAS Extensions.  */
Packit bbfece
#define AARCH64_FEATURE_PROFILE	0x08000000	/* Statistical Profiling.  */
Packit bbfece
#define AARCH64_FEATURE_SVE	0x10000000	/* SVE instructions.  */
Packit bbfece
#define AARCH64_FEATURE_RCPC	0x20000000	/* RCPC instructions.  */
Packit bbfece
#define AARCH64_FEATURE_COMPNUM	0x40000000	/* Complex # instructions.  */
Packit bbfece
#define AARCH64_FEATURE_DOTPROD 0x080000000     /* Dot Product instructions.  */
Packit bbfece
#define AARCH64_FEATURE_F16_FML	0x1000000000ULL	/* v8.2 FP16FML ins.  */
Packit bbfece
Packit bbfece
/* Architectures are the sum of the base and extensions.  */
Packit bbfece
#define AARCH64_ARCH_V8		AARCH64_FEATURE (AARCH64_FEATURE_V8, \
Packit bbfece
						 AARCH64_FEATURE_FP  \
Packit bbfece
						 | AARCH64_FEATURE_SIMD)
Packit bbfece
#define AARCH64_ARCH_V8_1	AARCH64_FEATURE (AARCH64_ARCH_V8, \
Packit bbfece
						 AARCH64_FEATURE_CRC	\
Packit bbfece
						 | AARCH64_FEATURE_V8_1 \
Packit bbfece
						 | AARCH64_FEATURE_LSE	\
Packit bbfece
						 | AARCH64_FEATURE_PAN	\
Packit bbfece
						 | AARCH64_FEATURE_LOR	\
Packit bbfece
						 | AARCH64_FEATURE_RDMA)
Packit bbfece
#define AARCH64_ARCH_V8_2	AARCH64_FEATURE (AARCH64_ARCH_V8_1,	\
Packit bbfece
						 AARCH64_FEATURE_V8_2	\
Packit bbfece
						 | AARCH64_FEATURE_RAS)
Packit bbfece
#define AARCH64_ARCH_V8_3	AARCH64_FEATURE (AARCH64_ARCH_V8_2,	\
Packit bbfece
						 AARCH64_FEATURE_V8_3	\
Packit bbfece
						 | AARCH64_FEATURE_RCPC	\
Packit bbfece
						 | AARCH64_FEATURE_COMPNUM)
Packit bbfece
#define AARCH64_ARCH_V8_4	AARCH64_FEATURE (AARCH64_ARCH_V8_3,	\
Packit bbfece
						 AARCH64_FEATURE_V8_4   \
Packit bbfece
						 | AARCH64_FEATURE_DOTPROD \
Packit bbfece
						 | AARCH64_FEATURE_F16_FML)
Packit bbfece
Packit bbfece
#define AARCH64_ARCH_NONE	AARCH64_FEATURE (0, 0)
Packit bbfece
#define AARCH64_ANY		AARCH64_FEATURE (-1, 0)	/* Any basic core.  */
Packit bbfece
Packit bbfece
/* CPU-specific features.  */
Packit bbfece
typedef unsigned long long aarch64_feature_set;
Packit bbfece
Packit bbfece
#define AARCH64_CPU_HAS_ALL_FEATURES(CPU,FEAT)	\
Packit bbfece
  ((~(CPU) & (FEAT)) == 0)
Packit bbfece
Packit bbfece
#define AARCH64_CPU_HAS_ANY_FEATURES(CPU,FEAT)	\
Packit bbfece
  (((CPU) & (FEAT)) != 0)
Packit bbfece
Packit bbfece
#define AARCH64_CPU_HAS_FEATURE(CPU,FEAT)	\
Packit bbfece
  AARCH64_CPU_HAS_ALL_FEATURES (CPU,FEAT)
Packit bbfece
Packit bbfece
#define AARCH64_MERGE_FEATURE_SETS(TARG,F1,F2)	\
Packit bbfece
  do						\
Packit bbfece
    {						\
Packit bbfece
      (TARG) = (F1) | (F2);			\
Packit bbfece
    }						\
Packit bbfece
  while (0)
Packit bbfece
Packit bbfece
#define AARCH64_CLEAR_FEATURE(TARG,F1,F2)	\
Packit bbfece
  do						\
Packit bbfece
    { 						\
Packit bbfece
      (TARG) = (F1) &~ (F2);			\
Packit bbfece
    }						\
Packit bbfece
  while (0)
Packit bbfece
Packit bbfece
#define AARCH64_FEATURE(core,coproc) ((core) | (coproc))
Packit bbfece
Packit bbfece
enum aarch64_operand_class
Packit bbfece
{
Packit bbfece
  AARCH64_OPND_CLASS_NIL,
Packit bbfece
  AARCH64_OPND_CLASS_INT_REG,
Packit bbfece
  AARCH64_OPND_CLASS_MODIFIED_REG,
Packit bbfece
  AARCH64_OPND_CLASS_FP_REG,
Packit bbfece
  AARCH64_OPND_CLASS_SIMD_REG,
Packit bbfece
  AARCH64_OPND_CLASS_SIMD_ELEMENT,
Packit bbfece
  AARCH64_OPND_CLASS_SISD_REG,
Packit bbfece
  AARCH64_OPND_CLASS_SIMD_REGLIST,
Packit bbfece
  AARCH64_OPND_CLASS_SVE_REG,
Packit bbfece
  AARCH64_OPND_CLASS_PRED_REG,
Packit bbfece
  AARCH64_OPND_CLASS_ADDRESS,
Packit bbfece
  AARCH64_OPND_CLASS_IMMEDIATE,
Packit bbfece
  AARCH64_OPND_CLASS_SYSTEM,
Packit bbfece
  AARCH64_OPND_CLASS_COND,
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Operand code that helps both parsing and coding.
Packit bbfece
   Keep AARCH64_OPERANDS synced.  */
Packit bbfece
Packit bbfece
enum aarch64_opnd
Packit bbfece
{
Packit bbfece
  AARCH64_OPND_NIL,	/* no operand---MUST BE FIRST!*/
Packit bbfece
Packit bbfece
  AARCH64_OPND_Rd,	/* Integer register as destination.  */
Packit bbfece
  AARCH64_OPND_Rn,	/* Integer register as source.  */
Packit bbfece
  AARCH64_OPND_Rm,	/* Integer register as source.  */
Packit bbfece
  AARCH64_OPND_Rt,	/* Integer register used in ld/st instructions.  */
Packit bbfece
  AARCH64_OPND_Rt2,	/* Integer register used in ld/st pair instructions.  */
Packit bbfece
  AARCH64_OPND_Rs,	/* Integer register used in ld/st exclusive.  */
Packit bbfece
  AARCH64_OPND_Ra,	/* Integer register used in ddp_3src instructions.  */
Packit bbfece
  AARCH64_OPND_Rt_SYS,	/* Integer register used in system instructions.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_Rd_SP,	/* Integer Rd or SP.  */
Packit bbfece
  AARCH64_OPND_Rn_SP,	/* Integer Rn or SP.  */
Packit bbfece
  AARCH64_OPND_Rm_SP,	/* Integer Rm or SP.  */
Packit bbfece
  AARCH64_OPND_PAIRREG,	/* Paired register operand.  */
Packit bbfece
  AARCH64_OPND_Rm_EXT,	/* Integer Rm extended.  */
Packit bbfece
  AARCH64_OPND_Rm_SFT,	/* Integer Rm shifted.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_Fd,	/* Floating-point Fd.  */
Packit bbfece
  AARCH64_OPND_Fn,	/* Floating-point Fn.  */
Packit bbfece
  AARCH64_OPND_Fm,	/* Floating-point Fm.  */
Packit bbfece
  AARCH64_OPND_Fa,	/* Floating-point Fa.  */
Packit bbfece
  AARCH64_OPND_Ft,	/* Floating-point Ft.  */
Packit bbfece
  AARCH64_OPND_Ft2,	/* Floating-point Ft2.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_Sd,	/* AdvSIMD Scalar Sd.  */
Packit bbfece
  AARCH64_OPND_Sn,	/* AdvSIMD Scalar Sn.  */
Packit bbfece
  AARCH64_OPND_Sm,	/* AdvSIMD Scalar Sm.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_Va,	/* AdvSIMD Vector Va.  */
Packit bbfece
  AARCH64_OPND_Vd,	/* AdvSIMD Vector Vd.  */
Packit bbfece
  AARCH64_OPND_Vn,	/* AdvSIMD Vector Vn.  */
Packit bbfece
  AARCH64_OPND_Vm,	/* AdvSIMD Vector Vm.  */
Packit bbfece
  AARCH64_OPND_VdD1,	/* AdvSIMD <Vd>.D[1]; for FMOV only.  */
Packit bbfece
  AARCH64_OPND_VnD1,	/* AdvSIMD <Vn>.D[1]; for FMOV only.  */
Packit bbfece
  AARCH64_OPND_Ed,	/* AdvSIMD Vector Element Vd.  */
Packit bbfece
  AARCH64_OPND_En,	/* AdvSIMD Vector Element Vn.  */
Packit bbfece
  AARCH64_OPND_Em,	/* AdvSIMD Vector Element Vm.  */
Packit bbfece
  AARCH64_OPND_LVn,	/* AdvSIMD Vector register list used in e.g. TBL.  */
Packit bbfece
  AARCH64_OPND_LVt,	/* AdvSIMD Vector register list used in ld/st.  */
Packit bbfece
  AARCH64_OPND_LVt_AL,	/* AdvSIMD Vector register list for loading single
Packit bbfece
			   structure to all lanes.  */
Packit bbfece
  AARCH64_OPND_LEt,	/* AdvSIMD Vector Element list.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_CRn,	/* Co-processor register in CRn field.  */
Packit bbfece
  AARCH64_OPND_CRm,	/* Co-processor register in CRm field.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_IDX,	/* AdvSIMD EXT index operand.  */
Packit bbfece
  AARCH64_OPND_MASK,	/* AdvSIMD EXT index operand.  */
Packit bbfece
  AARCH64_OPND_IMM_VLSL,/* Immediate for shifting vector registers left.  */
Packit bbfece
  AARCH64_OPND_IMM_VLSR,/* Immediate for shifting vector registers right.  */
Packit bbfece
  AARCH64_OPND_SIMD_IMM,/* AdvSIMD modified immediate without shift.  */
Packit bbfece
  AARCH64_OPND_SIMD_IMM_SFT,	/* AdvSIMD modified immediate with shift.  */
Packit bbfece
  AARCH64_OPND_SIMD_FPIMM,/* AdvSIMD 8-bit fp immediate.  */
Packit bbfece
  AARCH64_OPND_SHLL_IMM,/* Immediate shift for AdvSIMD SHLL instruction
Packit bbfece
			   (no encoding).  */
Packit bbfece
  AARCH64_OPND_IMM0,	/* Immediate for #0.  */
Packit bbfece
  AARCH64_OPND_FPIMM0,	/* Immediate for #0.0.  */
Packit bbfece
  AARCH64_OPND_FPIMM,	/* Floating-point Immediate.  */
Packit bbfece
  AARCH64_OPND_IMMR,	/* Immediate #<immr> in e.g. BFM.  */
Packit bbfece
  AARCH64_OPND_IMMS,	/* Immediate #<imms> in e.g. BFM.  */
Packit bbfece
  AARCH64_OPND_WIDTH,	/* Immediate #<width> in e.g. BFI.  */
Packit bbfece
  AARCH64_OPND_IMM,	/* Immediate.  */
Packit bbfece
  AARCH64_OPND_IMM_2,	/* Immediate.  */
Packit bbfece
  AARCH64_OPND_UIMM3_OP1,/* Unsigned 3-bit immediate in the op1 field.  */
Packit bbfece
  AARCH64_OPND_UIMM3_OP2,/* Unsigned 3-bit immediate in the op2 field.  */
Packit bbfece
  AARCH64_OPND_UIMM4,	/* Unsigned 4-bit immediate in the CRm field.  */
Packit bbfece
  AARCH64_OPND_UIMM7,	/* Unsigned 7-bit immediate in the CRm:op2 fields.  */
Packit bbfece
  AARCH64_OPND_BIT_NUM,	/* Immediate.  */
Packit bbfece
  AARCH64_OPND_EXCEPTION,/* imm16 operand in exception instructions.  */
Packit bbfece
  AARCH64_OPND_CCMP_IMM,/* Immediate in conditional compare instructions.  */
Packit bbfece
  AARCH64_OPND_SIMM5,	/* 5-bit signed immediate in the imm5 field.  */
Packit bbfece
  AARCH64_OPND_NZCV,	/* Flag bit specifier giving an alternative value for
Packit bbfece
			   each condition flag.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_LIMM,	/* Logical Immediate.  */
Packit bbfece
  AARCH64_OPND_AIMM,	/* Arithmetic immediate.  */
Packit bbfece
  AARCH64_OPND_HALF,	/* #<imm16>{, LSL #<shift>} operand in move wide.  */
Packit bbfece
  AARCH64_OPND_FBITS,	/* FP #<fbits> operand in e.g. SCVTF */
Packit bbfece
  AARCH64_OPND_IMM_MOV,	/* Immediate operand for the MOV alias.  */
Packit bbfece
  AARCH64_OPND_IMM_ROT1,	/* Immediate rotate operand for FCMLA.  */
Packit bbfece
  AARCH64_OPND_IMM_ROT2,	/* Immediate rotate operand for indexed FCMLA.  */
Packit bbfece
  AARCH64_OPND_IMM_ROT3,	/* Immediate rotate operand for FCADD.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_COND,	/* Standard condition as the last operand.  */
Packit bbfece
  AARCH64_OPND_COND1,	/* Same as the above, but excluding AL and NV.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_ADDR_ADRP,	/* Memory address for ADRP */
Packit bbfece
  AARCH64_OPND_ADDR_PCREL14,	/* 14-bit PC-relative address for e.g. TBZ.  */
Packit bbfece
  AARCH64_OPND_ADDR_PCREL19,	/* 19-bit PC-relative address for e.g. LDR.  */
Packit bbfece
  AARCH64_OPND_ADDR_PCREL21,	/* 21-bit PC-relative address for e.g. ADR.  */
Packit bbfece
  AARCH64_OPND_ADDR_PCREL26,	/* 26-bit PC-relative address for e.g. BL.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_ADDR_SIMPLE,	/* Address of ld/st exclusive.  */
Packit bbfece
  AARCH64_OPND_ADDR_REGOFF,	/* Address of register offset.  */
Packit bbfece
  AARCH64_OPND_ADDR_SIMM7,	/* Address of signed 7-bit immediate.  */
Packit bbfece
  AARCH64_OPND_ADDR_SIMM9,	/* Address of signed 9-bit immediate.  */
Packit bbfece
  AARCH64_OPND_ADDR_SIMM9_2,	/* Same as the above, but the immediate is
Packit bbfece
				   negative or unaligned and there is
Packit bbfece
				   no writeback allowed.  This operand code
Packit bbfece
				   is only used to support the programmer-
Packit bbfece
				   friendly feature of using LDR/STR as the
Packit bbfece
				   the mnemonic name for LDUR/STUR instructions
Packit bbfece
				   wherever there is no ambiguity.  */
Packit bbfece
  AARCH64_OPND_ADDR_SIMM10,	/* Address of signed 10-bit immediate.  */
Packit bbfece
  AARCH64_OPND_ADDR_UIMM12,	/* Address of unsigned 12-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SIMD_ADDR_SIMPLE,/* Address of ld/st multiple structures.  */
Packit bbfece
  AARCH64_OPND_ADDR_OFFSET,     /* Address with an optional 9-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SIMD_ADDR_POST,	/* Address of ld/st multiple post-indexed.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_SYSREG,		/* System register operand.  */
Packit bbfece
  AARCH64_OPND_PSTATEFIELD,	/* PSTATE field name operand.  */
Packit bbfece
  AARCH64_OPND_SYSREG_AT,	/* System register <at_op> operand.  */
Packit bbfece
  AARCH64_OPND_SYSREG_DC,	/* System register <dc_op> operand.  */
Packit bbfece
  AARCH64_OPND_SYSREG_IC,	/* System register <ic_op> operand.  */
Packit bbfece
  AARCH64_OPND_SYSREG_TLBI,	/* System register <tlbi_op> operand.  */
Packit bbfece
  AARCH64_OPND_BARRIER,		/* Barrier operand.  */
Packit bbfece
  AARCH64_OPND_BARRIER_ISB,	/* Barrier operand for ISB.  */
Packit bbfece
  AARCH64_OPND_PRFOP,		/* Prefetch operation.  */
Packit bbfece
  AARCH64_OPND_BARRIER_PSB,	/* Barrier operand for PSB.  */
Packit bbfece
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_S4x16,   /* SVE [<Xn|SP>, #<simm4>*16].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_S4xVL,   /* SVE [<Xn|SP>, #<simm4>, MUL VL].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_S4x2xVL, /* SVE [<Xn|SP>, #<simm4>*2, MUL VL].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_S4x3xVL, /* SVE [<Xn|SP>, #<simm4>*3, MUL VL].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_S4x4xVL, /* SVE [<Xn|SP>, #<simm4>*4, MUL VL].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_S6xVL,   /* SVE [<Xn|SP>, #<simm6>, MUL VL].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_S9xVL,   /* SVE [<Xn|SP>, #<simm9>, MUL VL].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_U6,	    /* SVE [<Xn|SP>, #<uimm6>].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_U6x2,    /* SVE [<Xn|SP>, #<uimm6>*2].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_U6x4,    /* SVE [<Xn|SP>, #<uimm6>*4].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RI_U6x8,    /* SVE [<Xn|SP>, #<uimm6>*8].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RR,	    /* SVE [<Xn|SP>, <Xm|XZR>].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RR_LSL1,    /* SVE [<Xn|SP>, <Xm|XZR>, LSL #1].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RR_LSL2,    /* SVE [<Xn|SP>, <Xm|XZR>, LSL #2].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RR_LSL3,    /* SVE [<Xn|SP>, <Xm|XZR>, LSL #3].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RX,	    /* SVE [<Xn|SP>, <Xm>].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RX_LSL1,    /* SVE [<Xn|SP>, <Xm>, LSL #1].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RX_LSL2,    /* SVE [<Xn|SP>, <Xm>, LSL #2].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RX_LSL3,    /* SVE [<Xn|SP>, <Xm>, LSL #3].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ,	    /* SVE [<Xn|SP>, Zm.D].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_LSL1,    /* SVE [<Xn|SP>, Zm.D, LSL #1].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_LSL2,    /* SVE [<Xn|SP>, Zm.D, LSL #2].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_LSL3,    /* SVE [<Xn|SP>, Zm.D, LSL #3].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW_14,  /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW].
Packit bbfece
				       Bit 14 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW_22,  /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW].
Packit bbfece
				       Bit 22 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW1_14, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #1].
Packit bbfece
				       Bit 14 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW1_22, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #1].
Packit bbfece
				       Bit 22 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW2_14, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #2].
Packit bbfece
				       Bit 14 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW2_22, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #2].
Packit bbfece
				       Bit 22 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW3_14, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #3].
Packit bbfece
				       Bit 14 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_RZ_XTW3_22, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #3].
Packit bbfece
				       Bit 22 controls S/U choice.  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_ZI_U5,	    /* SVE [Zn.<T>, #<uimm5>].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_ZI_U5x2,    /* SVE [Zn.<T>, #<uimm5>*2].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_ZI_U5x4,    /* SVE [Zn.<T>, #<uimm5>*4].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_ZI_U5x8,    /* SVE [Zn.<T>, #<uimm5>*8].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_ZZ_LSL,     /* SVE [Zn.<T>, Zm,<T>, LSL #<msz>].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_ZZ_SXTW,    /* SVE [Zn.<T>, Zm,<T>, SXTW #<msz>].  */
Packit bbfece
  AARCH64_OPND_SVE_ADDR_ZZ_UXTW,    /* SVE [Zn.<T>, Zm,<T>, UXTW #<msz>].  */
Packit bbfece
  AARCH64_OPND_SVE_AIMM,	/* SVE unsigned arithmetic immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_ASIMM,	/* SVE signed arithmetic immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_FPIMM8,	/* SVE 8-bit floating-point immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_I1_HALF_ONE,	/* SVE choice between 0.5 and 1.0.  */
Packit bbfece
  AARCH64_OPND_SVE_I1_HALF_TWO,	/* SVE choice between 0.5 and 2.0.  */
Packit bbfece
  AARCH64_OPND_SVE_I1_ZERO_ONE,	/* SVE choice between 0.0 and 1.0.  */
Packit bbfece
  AARCH64_OPND_SVE_IMM_ROT1,	/* SVE 1-bit rotate operand (90 or 270).  */
Packit bbfece
  AARCH64_OPND_SVE_IMM_ROT2,	/* SVE 2-bit rotate operand (N*90).  */
Packit bbfece
  AARCH64_OPND_SVE_INV_LIMM,	/* SVE inverted logical immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_LIMM,	/* SVE logical immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_LIMM_MOV,	/* SVE logical immediate for MOV.  */
Packit bbfece
  AARCH64_OPND_SVE_PATTERN,	/* SVE vector pattern enumeration.  */
Packit bbfece
  AARCH64_OPND_SVE_PATTERN_SCALED, /* Likewise, with additional MUL factor.  */
Packit bbfece
  AARCH64_OPND_SVE_PRFOP,	/* SVE prefetch operation.  */
Packit bbfece
  AARCH64_OPND_SVE_Pd,		/* SVE p0-p15 in Pd.  */
Packit bbfece
  AARCH64_OPND_SVE_Pg3,		/* SVE p0-p7 in Pg.  */
Packit bbfece
  AARCH64_OPND_SVE_Pg4_5,	/* SVE p0-p15 in Pg, bits [8,5].  */
Packit bbfece
  AARCH64_OPND_SVE_Pg4_10,	/* SVE p0-p15 in Pg, bits [13,10].  */
Packit bbfece
  AARCH64_OPND_SVE_Pg4_16,	/* SVE p0-p15 in Pg, bits [19,16].  */
Packit bbfece
  AARCH64_OPND_SVE_Pm,		/* SVE p0-p15 in Pm.  */
Packit bbfece
  AARCH64_OPND_SVE_Pn,		/* SVE p0-p15 in Pn.  */
Packit bbfece
  AARCH64_OPND_SVE_Pt,		/* SVE p0-p15 in Pt.  */
Packit bbfece
  AARCH64_OPND_SVE_Rm,		/* Integer Rm or ZR, alt. SVE position.  */
Packit bbfece
  AARCH64_OPND_SVE_Rn_SP,	/* Integer Rn or SP, alt. SVE position.  */
Packit bbfece
  AARCH64_OPND_SVE_SHLIMM_PRED,	  /* SVE shift left amount (predicated).  */
Packit bbfece
  AARCH64_OPND_SVE_SHLIMM_UNPRED, /* SVE shift left amount (unpredicated).  */
Packit bbfece
  AARCH64_OPND_SVE_SHRIMM_PRED,	  /* SVE shift right amount (predicated).  */
Packit bbfece
  AARCH64_OPND_SVE_SHRIMM_UNPRED, /* SVE shift right amount (unpredicated).  */
Packit bbfece
  AARCH64_OPND_SVE_SIMM5,	/* SVE signed 5-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_SIMM5B,	/* SVE secondary signed 5-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_SIMM6,	/* SVE signed 6-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_SIMM8,	/* SVE signed 8-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_UIMM3,	/* SVE unsigned 3-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_UIMM7,	/* SVE unsigned 7-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_UIMM8,	/* SVE unsigned 8-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_UIMM8_53,	/* SVE split unsigned 8-bit immediate.  */
Packit bbfece
  AARCH64_OPND_SVE_VZn,		/* Scalar SIMD&FP register in Zn field.  */
Packit bbfece
  AARCH64_OPND_SVE_Vd,		/* Scalar SIMD&FP register in Vd.  */
Packit bbfece
  AARCH64_OPND_SVE_Vm,		/* Scalar SIMD&FP register in Vm.  */
Packit bbfece
  AARCH64_OPND_SVE_Vn,		/* Scalar SIMD&FP register in Vn.  */
Packit bbfece
  AARCH64_OPND_SVE_Za_5,	/* SVE vector register in Za, bits [9,5].  */
Packit bbfece
  AARCH64_OPND_SVE_Za_16,	/* SVE vector register in Za, bits [20,16].  */
Packit bbfece
  AARCH64_OPND_SVE_Zd,		/* SVE vector register in Zd.  */
Packit bbfece
  AARCH64_OPND_SVE_Zm_5,	/* SVE vector register in Zm, bits [9,5].  */
Packit bbfece
  AARCH64_OPND_SVE_Zm_16,	/* SVE vector register in Zm, bits [20,16].  */
Packit bbfece
  AARCH64_OPND_SVE_Zm3_INDEX,	/* z0-z7[0-3] in Zm, bits [20,16].  */
Packit bbfece
  AARCH64_OPND_SVE_Zm3_22_INDEX, /* z0-z7[0-7] in Zm3_INDEX plus bit 22.  */
Packit bbfece
  AARCH64_OPND_SVE_Zm4_INDEX,	/* z0-z15[0-1] in Zm, bits [20,16].  */
Packit bbfece
  AARCH64_OPND_SVE_Zn,		/* SVE vector register in Zn.  */
Packit bbfece
  AARCH64_OPND_SVE_Zn_INDEX,	/* Indexed SVE vector register, for DUP.  */
Packit bbfece
  AARCH64_OPND_SVE_ZnxN,	/* SVE vector register list in Zn.  */
Packit bbfece
  AARCH64_OPND_SVE_Zt,		/* SVE vector register in Zt.  */
Packit bbfece
  AARCH64_OPND_SVE_ZtxN,	/* SVE vector register list in Zt.  */
Packit bbfece
  AARCH64_OPND_SM3_IMM2,	/* SM3 encodes lane in bits [13, 14].  */
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Qualifier constrains an operand.  It either specifies a variant of an
Packit bbfece
   operand type or limits values available to an operand type.
Packit bbfece
Packit bbfece
   N.B. Order is important; keep aarch64_opnd_qualifiers synced.  */
Packit bbfece
Packit bbfece
enum aarch64_opnd_qualifier
Packit bbfece
{
Packit bbfece
  /* Indicating no further qualification on an operand.  */
Packit bbfece
  AARCH64_OPND_QLF_NIL,
Packit bbfece
Packit bbfece
  /* Qualifying an operand which is a general purpose (integer) register;
Packit bbfece
     indicating the operand data size or a specific register.  */
Packit bbfece
  AARCH64_OPND_QLF_W,	/* Wn, WZR or WSP.  */
Packit bbfece
  AARCH64_OPND_QLF_X,	/* Xn, XZR or XSP.  */
Packit bbfece
  AARCH64_OPND_QLF_WSP,	/* WSP.  */
Packit bbfece
  AARCH64_OPND_QLF_SP,	/* SP.  */
Packit bbfece
Packit bbfece
  /* Qualifying an operand which is a floating-point register, a SIMD
Packit bbfece
     vector element or a SIMD vector element list; indicating operand data
Packit bbfece
     size or the size of each SIMD vector element in the case of a SIMD
Packit bbfece
     vector element list.
Packit bbfece
     These qualifiers are also used to qualify an address operand to
Packit bbfece
     indicate the size of data element a load/store instruction is
Packit bbfece
     accessing.
Packit bbfece
     They are also used for the immediate shift operand in e.g. SSHR.  Such
Packit bbfece
     a use is only for the ease of operand encoding/decoding and qualifier
Packit bbfece
     sequence matching; such a use should not be applied widely; use the value
Packit bbfece
     constraint qualifiers for immediate operands wherever possible.  */
Packit bbfece
  AARCH64_OPND_QLF_S_B,
Packit bbfece
  AARCH64_OPND_QLF_S_H,
Packit bbfece
  AARCH64_OPND_QLF_S_S,
Packit bbfece
  AARCH64_OPND_QLF_S_D,
Packit bbfece
  AARCH64_OPND_QLF_S_Q,
Packit bbfece
  /* This type qualifier has a special meaning in that it means that 4 x 1 byte
Packit bbfece
     are selected by the instruction.  Other than that it has no difference
Packit bbfece
     with AARCH64_OPND_QLF_S_B in encoding.  It is here purely for syntactical
Packit bbfece
     reasons and is an exception from normal AArch64 disassembly scheme.  */
Packit bbfece
  AARCH64_OPND_QLF_S_4B,
Packit bbfece
Packit bbfece
  /* Qualifying an operand which is a SIMD vector register or a SIMD vector
Packit bbfece
     register list; indicating register shape.
Packit bbfece
     They are also used for the immediate shift operand in e.g. SSHR.  Such
Packit bbfece
     a use is only for the ease of operand encoding/decoding and qualifier
Packit bbfece
     sequence matching; such a use should not be applied widely; use the value
Packit bbfece
     constraint qualifiers for immediate operands wherever possible.  */
Packit bbfece
  AARCH64_OPND_QLF_V_4B,
Packit bbfece
  AARCH64_OPND_QLF_V_8B,
Packit bbfece
  AARCH64_OPND_QLF_V_16B,
Packit bbfece
  AARCH64_OPND_QLF_V_2H,
Packit bbfece
  AARCH64_OPND_QLF_V_4H,
Packit bbfece
  AARCH64_OPND_QLF_V_8H,
Packit bbfece
  AARCH64_OPND_QLF_V_2S,
Packit bbfece
  AARCH64_OPND_QLF_V_4S,
Packit bbfece
  AARCH64_OPND_QLF_V_1D,
Packit bbfece
  AARCH64_OPND_QLF_V_2D,
Packit bbfece
  AARCH64_OPND_QLF_V_1Q,
Packit bbfece
Packit bbfece
  AARCH64_OPND_QLF_P_Z,
Packit bbfece
  AARCH64_OPND_QLF_P_M,
Packit bbfece
Packit bbfece
  /* Constraint on value.  */
Packit bbfece
  AARCH64_OPND_QLF_CR,		/* CRn, CRm. */
Packit bbfece
  AARCH64_OPND_QLF_imm_0_7,
Packit bbfece
  AARCH64_OPND_QLF_imm_0_15,
Packit bbfece
  AARCH64_OPND_QLF_imm_0_31,
Packit bbfece
  AARCH64_OPND_QLF_imm_0_63,
Packit bbfece
  AARCH64_OPND_QLF_imm_1_32,
Packit bbfece
  AARCH64_OPND_QLF_imm_1_64,
Packit bbfece
Packit bbfece
  /* Indicate whether an AdvSIMD modified immediate operand is shift-zeros
Packit bbfece
     or shift-ones.  */
Packit bbfece
  AARCH64_OPND_QLF_LSL,
Packit bbfece
  AARCH64_OPND_QLF_MSL,
Packit bbfece
Packit bbfece
  /* Special qualifier helping retrieve qualifier information during the
Packit bbfece
     decoding time (currently not in use).  */
Packit bbfece
  AARCH64_OPND_QLF_RETRIEVE,
Packit bbfece
};
Packit bbfece

Packit bbfece
/* Instruction class.  */
Packit bbfece
Packit bbfece
enum aarch64_insn_class
Packit bbfece
{
Packit bbfece
  addsub_carry,
Packit bbfece
  addsub_ext,
Packit bbfece
  addsub_imm,
Packit bbfece
  addsub_shift,
Packit bbfece
  asimdall,
Packit bbfece
  asimddiff,
Packit bbfece
  asimdelem,
Packit bbfece
  asimdext,
Packit bbfece
  asimdimm,
Packit bbfece
  asimdins,
Packit bbfece
  asimdmisc,
Packit bbfece
  asimdperm,
Packit bbfece
  asimdsame,
Packit bbfece
  asimdshf,
Packit bbfece
  asimdtbl,
Packit bbfece
  asisddiff,
Packit bbfece
  asisdelem,
Packit bbfece
  asisdlse,
Packit bbfece
  asisdlsep,
Packit bbfece
  asisdlso,
Packit bbfece
  asisdlsop,
Packit bbfece
  asisdmisc,
Packit bbfece
  asisdone,
Packit bbfece
  asisdpair,
Packit bbfece
  asisdsame,
Packit bbfece
  asisdshf,
Packit bbfece
  bitfield,
Packit bbfece
  branch_imm,
Packit bbfece
  branch_reg,
Packit bbfece
  compbranch,
Packit bbfece
  condbranch,
Packit bbfece
  condcmp_imm,
Packit bbfece
  condcmp_reg,
Packit bbfece
  condsel,
Packit bbfece
  cryptoaes,
Packit bbfece
  cryptosha2,
Packit bbfece
  cryptosha3,
Packit bbfece
  dp_1src,
Packit bbfece
  dp_2src,
Packit bbfece
  dp_3src,
Packit bbfece
  exception,
Packit bbfece
  extract,
Packit bbfece
  float2fix,
Packit bbfece
  float2int,
Packit bbfece
  floatccmp,
Packit bbfece
  floatcmp,
Packit bbfece
  floatdp1,
Packit bbfece
  floatdp2,
Packit bbfece
  floatdp3,
Packit bbfece
  floatimm,
Packit bbfece
  floatsel,
Packit bbfece
  ldst_immpost,
Packit bbfece
  ldst_immpre,
Packit bbfece
  ldst_imm9,	/* immpost or immpre */
Packit bbfece
  ldst_imm10,	/* LDRAA/LDRAB */
Packit bbfece
  ldst_pos,
Packit bbfece
  ldst_regoff,
Packit bbfece
  ldst_unpriv,
Packit bbfece
  ldst_unscaled,
Packit bbfece
  ldstexcl,
Packit bbfece
  ldstnapair_offs,
Packit bbfece
  ldstpair_off,
Packit bbfece
  ldstpair_indexed,
Packit bbfece
  loadlit,
Packit bbfece
  log_imm,
Packit bbfece
  log_shift,
Packit bbfece
  lse_atomic,
Packit bbfece
  movewide,
Packit bbfece
  pcreladdr,
Packit bbfece
  ic_system,
Packit bbfece
  sve_cpy,
Packit bbfece
  sve_index,
Packit bbfece
  sve_limm,
Packit bbfece
  sve_misc,
Packit bbfece
  sve_movprfx,
Packit bbfece
  sve_pred_zm,
Packit bbfece
  sve_shift_pred,
Packit bbfece
  sve_shift_unpred,
Packit bbfece
  sve_size_bhs,
Packit bbfece
  sve_size_bhsd,
Packit bbfece
  sve_size_hsd,
Packit bbfece
  sve_size_sd,
Packit bbfece
  testbranch,
Packit bbfece
  cryptosm3,
Packit bbfece
  cryptosm4,
Packit bbfece
  dotproduct,
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Opcode enumerators.  */
Packit bbfece
Packit bbfece
enum aarch64_op
Packit bbfece
{
Packit bbfece
  OP_NIL,
Packit bbfece
  OP_STRB_POS,
Packit bbfece
  OP_LDRB_POS,
Packit bbfece
  OP_LDRSB_POS,
Packit bbfece
  OP_STRH_POS,
Packit bbfece
  OP_LDRH_POS,
Packit bbfece
  OP_LDRSH_POS,
Packit bbfece
  OP_STR_POS,
Packit bbfece
  OP_LDR_POS,
Packit bbfece
  OP_STRF_POS,
Packit bbfece
  OP_LDRF_POS,
Packit bbfece
  OP_LDRSW_POS,
Packit bbfece
  OP_PRFM_POS,
Packit bbfece
Packit bbfece
  OP_STURB,
Packit bbfece
  OP_LDURB,
Packit bbfece
  OP_LDURSB,
Packit bbfece
  OP_STURH,
Packit bbfece
  OP_LDURH,
Packit bbfece
  OP_LDURSH,
Packit bbfece
  OP_STUR,
Packit bbfece
  OP_LDUR,
Packit bbfece
  OP_STURV,
Packit bbfece
  OP_LDURV,
Packit bbfece
  OP_LDURSW,
Packit bbfece
  OP_PRFUM,
Packit bbfece
Packit bbfece
  OP_LDR_LIT,
Packit bbfece
  OP_LDRV_LIT,
Packit bbfece
  OP_LDRSW_LIT,
Packit bbfece
  OP_PRFM_LIT,
Packit bbfece
Packit bbfece
  OP_ADD,
Packit bbfece
  OP_B,
Packit bbfece
  OP_BL,
Packit bbfece
Packit bbfece
  OP_MOVN,
Packit bbfece
  OP_MOVZ,
Packit bbfece
  OP_MOVK,
Packit bbfece
Packit bbfece
  OP_MOV_IMM_LOG,	/* MOV alias for moving bitmask immediate.  */
Packit bbfece
  OP_MOV_IMM_WIDE,	/* MOV alias for moving wide immediate.  */
Packit bbfece
  OP_MOV_IMM_WIDEN,	/* MOV alias for moving wide immediate (negated).  */
Packit bbfece
Packit bbfece
  OP_MOV_V,		/* MOV alias for moving vector register.  */
Packit bbfece
Packit bbfece
  OP_ASR_IMM,
Packit bbfece
  OP_LSR_IMM,
Packit bbfece
  OP_LSL_IMM,
Packit bbfece
Packit bbfece
  OP_BIC,
Packit bbfece
Packit bbfece
  OP_UBFX,
Packit bbfece
  OP_BFXIL,
Packit bbfece
  OP_SBFX,
Packit bbfece
  OP_SBFIZ,
Packit bbfece
  OP_BFI,
Packit bbfece
  OP_BFC,		/* ARMv8.2.  */
Packit bbfece
  OP_UBFIZ,
Packit bbfece
  OP_UXTB,
Packit bbfece
  OP_UXTH,
Packit bbfece
  OP_UXTW,
Packit bbfece
Packit bbfece
  OP_CINC,
Packit bbfece
  OP_CINV,
Packit bbfece
  OP_CNEG,
Packit bbfece
  OP_CSET,
Packit bbfece
  OP_CSETM,
Packit bbfece
Packit bbfece
  OP_FCVT,
Packit bbfece
  OP_FCVTN,
Packit bbfece
  OP_FCVTN2,
Packit bbfece
  OP_FCVTL,
Packit bbfece
  OP_FCVTL2,
Packit bbfece
  OP_FCVTXN_S,		/* Scalar version.  */
Packit bbfece
Packit bbfece
  OP_ROR_IMM,
Packit bbfece
Packit bbfece
  OP_SXTL,
Packit bbfece
  OP_SXTL2,
Packit bbfece
  OP_UXTL,
Packit bbfece
  OP_UXTL2,
Packit bbfece
Packit bbfece
  OP_MOV_P_P,
Packit bbfece
  OP_MOV_Z_P_Z,
Packit bbfece
  OP_MOV_Z_V,
Packit bbfece
  OP_MOV_Z_Z,
Packit bbfece
  OP_MOV_Z_Zi,
Packit bbfece
  OP_MOVM_P_P_P,
Packit bbfece
  OP_MOVS_P_P,
Packit bbfece
  OP_MOVZS_P_P_P,
Packit bbfece
  OP_MOVZ_P_P_P,
Packit bbfece
  OP_NOTS_P_P_P_Z,
Packit bbfece
  OP_NOT_P_P_P_Z,
Packit bbfece
Packit bbfece
  OP_FCMLA_ELEM,	/* ARMv8.3, indexed element version.  */
Packit bbfece
Packit bbfece
  OP_TOTAL_NUM,		/* Pseudo.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Maximum number of operands an instruction can have.  */
Packit bbfece
#define AARCH64_MAX_OPND_NUM 6
Packit bbfece
/* Maximum number of qualifier sequences an instruction can have.  */
Packit bbfece
#define AARCH64_MAX_QLF_SEQ_NUM 10
Packit bbfece
/* Operand qualifier typedef; optimized for the size.  */
Packit bbfece
typedef unsigned char aarch64_opnd_qualifier_t;
Packit bbfece
/* Operand qualifier sequence typedef.  */
Packit bbfece
typedef aarch64_opnd_qualifier_t	\
Packit bbfece
	  aarch64_opnd_qualifier_seq_t [AARCH64_MAX_OPND_NUM];
Packit bbfece
Packit bbfece
/* FIXME: improve the efficiency.  */
Packit bbfece
static inline bfd_boolean
Packit bbfece
empty_qualifier_sequence_p (const aarch64_opnd_qualifier_t *qualifiers)
Packit bbfece
{
Packit bbfece
  int i;
Packit bbfece
  for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
Packit bbfece
    if (qualifiers[i] != AARCH64_OPND_QLF_NIL)
Packit bbfece
      return FALSE;
Packit bbfece
  return TRUE;
Packit bbfece
}
Packit bbfece
Packit bbfece
/* This structure holds information for a particular opcode.  */
Packit bbfece
Packit bbfece
struct aarch64_opcode
Packit bbfece
{
Packit bbfece
  /* The name of the mnemonic.  */
Packit bbfece
  const char *name;
Packit bbfece
Packit bbfece
  /* The opcode itself.  Those bits which will be filled in with
Packit bbfece
     operands are zeroes.  */
Packit bbfece
  aarch64_insn opcode;
Packit bbfece
Packit bbfece
  /* The opcode mask.  This is used by the disassembler.  This is a
Packit bbfece
     mask containing ones indicating those bits which must match the
Packit bbfece
     opcode field, and zeroes indicating those bits which need not
Packit bbfece
     match (and are presumably filled in by operands).  */
Packit bbfece
  aarch64_insn mask;
Packit bbfece
Packit bbfece
  /* Instruction class.  */
Packit bbfece
  enum aarch64_insn_class iclass;
Packit bbfece
Packit bbfece
  /* Enumerator identifier.  */
Packit bbfece
  enum aarch64_op op;
Packit bbfece
Packit bbfece
  /* Which architecture variant provides this instruction.  */
Packit bbfece
  const aarch64_feature_set *avariant;
Packit bbfece
Packit bbfece
  /* An array of operand codes.  Each code is an index into the
Packit bbfece
     operand table.  They appear in the order which the operands must
Packit bbfece
     appear in assembly code, and are terminated by a zero.  */
Packit bbfece
  enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM];
Packit bbfece
Packit bbfece
  /* A list of operand qualifier code sequence.  Each operand qualifier
Packit bbfece
     code qualifies the corresponding operand code.  Each operand
Packit bbfece
     qualifier sequence specifies a valid opcode variant and related
Packit bbfece
     constraint on operands.  */
Packit bbfece
  aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM];
Packit bbfece
Packit bbfece
  /* Flags providing information about this instruction */
Packit bbfece
  uint32_t flags;
Packit bbfece
Packit bbfece
  /* If nonzero, this operand and operand 0 are both registers and
Packit bbfece
     are required to have the same register number.  */
Packit bbfece
  unsigned char tied_operand;
Packit bbfece
Packit bbfece
  /* If non-NULL, a function to verify that a given instruction is valid.  */
Packit bbfece
  bfd_boolean (* verifier) (const struct aarch64_opcode *, const aarch64_insn);
Packit bbfece
};
Packit bbfece
Packit bbfece
typedef struct aarch64_opcode aarch64_opcode;
Packit bbfece
Packit bbfece
/* Table describing all the AArch64 opcodes.  */
Packit bbfece
extern aarch64_opcode aarch64_opcode_table[];
Packit bbfece
Packit bbfece
/* Opcode flags.  */
Packit bbfece
#define F_ALIAS (1 << 0)
Packit bbfece
#define F_HAS_ALIAS (1 << 1)
Packit bbfece
/* Disassembly preference priority 1-3 (the larger the higher).  If nothing
Packit bbfece
   is specified, it is the priority 0 by default, i.e. the lowest priority.  */
Packit bbfece
#define F_P1 (1 << 2)
Packit bbfece
#define F_P2 (2 << 2)
Packit bbfece
#define F_P3 (3 << 2)
Packit bbfece
/* Flag an instruction that is truly conditional executed, e.g. b.cond.  */
Packit bbfece
#define F_COND (1 << 4)
Packit bbfece
/* Instruction has the field of 'sf'.  */
Packit bbfece
#define F_SF (1 << 5)
Packit bbfece
/* Instruction has the field of 'size:Q'.  */
Packit bbfece
#define F_SIZEQ (1 << 6)
Packit bbfece
/* Floating-point instruction has the field of 'type'.  */
Packit bbfece
#define F_FPTYPE (1 << 7)
Packit bbfece
/* AdvSIMD scalar instruction has the field of 'size'.  */
Packit bbfece
#define F_SSIZE (1 << 8)
Packit bbfece
/* AdvSIMD vector register arrangement specifier encoded in "imm5<3:0>:Q".  */
Packit bbfece
#define F_T (1 << 9)
Packit bbfece
/* Size of GPR operand in AdvSIMD instructions encoded in Q.  */
Packit bbfece
#define F_GPRSIZE_IN_Q (1 << 10)
Packit bbfece
/* Size of Rt load signed instruction encoded in opc[0], i.e. bit 22.  */
Packit bbfece
#define F_LDS_SIZE (1 << 11)
Packit bbfece
/* Optional operand; assume maximum of 1 operand can be optional.  */
Packit bbfece
#define F_OPD0_OPT (1 << 12)
Packit bbfece
#define F_OPD1_OPT (2 << 12)
Packit bbfece
#define F_OPD2_OPT (3 << 12)
Packit bbfece
#define F_OPD3_OPT (4 << 12)
Packit bbfece
#define F_OPD4_OPT (5 << 12)
Packit bbfece
/* Default value for the optional operand when omitted from the assembly.  */
Packit bbfece
#define F_DEFAULT(X) (((X) & 0x1f) << 15)
Packit bbfece
/* Instruction that is an alias of another instruction needs to be
Packit bbfece
   encoded/decoded by converting it to/from the real form, followed by
Packit bbfece
   the encoding/decoding according to the rules of the real opcode.
Packit bbfece
   This compares to the direct coding using the alias's information.
Packit bbfece
   N.B. this flag requires F_ALIAS to be used together.  */
Packit bbfece
#define F_CONV (1 << 20)
Packit bbfece
/* Use together with F_ALIAS to indicate an alias opcode is a programmer
Packit bbfece
   friendly pseudo instruction available only in the assembly code (thus will
Packit bbfece
   not show up in the disassembly).  */
Packit bbfece
#define F_PSEUDO (1 << 21)
Packit bbfece
/* Instruction has miscellaneous encoding/decoding rules.  */
Packit bbfece
#define F_MISC (1 << 22)
Packit bbfece
/* Instruction has the field of 'N'; used in conjunction with F_SF.  */
Packit bbfece
#define F_N (1 << 23)
Packit bbfece
/* Opcode dependent field.  */
Packit bbfece
#define F_OD(X) (((X) & 0x7) << 24)
Packit bbfece
/* Instruction has the field of 'sz'.  */
Packit bbfece
#define F_LSE_SZ (1 << 27)
Packit bbfece
/* Require an exact qualifier match, even for NIL qualifiers.  */
Packit bbfece
#define F_STRICT (1ULL << 28)
Packit bbfece
/* Next bit is 29.  */
Packit bbfece
Packit bbfece
static inline bfd_boolean
Packit bbfece
alias_opcode_p (const aarch64_opcode *opcode)
Packit bbfece
{
Packit bbfece
  return (opcode->flags & F_ALIAS) ? TRUE : FALSE;
Packit bbfece
}
Packit bbfece
Packit bbfece
static inline bfd_boolean
Packit bbfece
opcode_has_alias (const aarch64_opcode *opcode)
Packit bbfece
{
Packit bbfece
  return (opcode->flags & F_HAS_ALIAS) ? TRUE : FALSE;
Packit bbfece
}
Packit bbfece
Packit bbfece
/* Priority for disassembling preference.  */
Packit bbfece
static inline int
Packit bbfece
opcode_priority (const aarch64_opcode *opcode)
Packit bbfece
{
Packit bbfece
  return (opcode->flags >> 2) & 0x3;
Packit bbfece
}
Packit bbfece
Packit bbfece
static inline bfd_boolean
Packit bbfece
pseudo_opcode_p (const aarch64_opcode *opcode)
Packit bbfece
{
Packit bbfece
  return (opcode->flags & F_PSEUDO) != 0lu ? TRUE : FALSE;
Packit bbfece
}
Packit bbfece
Packit bbfece
static inline bfd_boolean
Packit bbfece
optional_operand_p (const aarch64_opcode *opcode, unsigned int idx)
Packit bbfece
{
Packit bbfece
  return (((opcode->flags >> 12) & 0x7) == idx + 1)
Packit bbfece
    ? TRUE : FALSE;
Packit bbfece
}
Packit bbfece
Packit bbfece
static inline aarch64_insn
Packit bbfece
get_optional_operand_default_value (const aarch64_opcode *opcode)
Packit bbfece
{
Packit bbfece
  return (opcode->flags >> 15) & 0x1f;
Packit bbfece
}
Packit bbfece
Packit bbfece
static inline unsigned int
Packit bbfece
get_opcode_dependent_value (const aarch64_opcode *opcode)
Packit bbfece
{
Packit bbfece
  return (opcode->flags >> 24) & 0x7;
Packit bbfece
}
Packit bbfece
Packit bbfece
static inline bfd_boolean
Packit bbfece
opcode_has_special_coder (const aarch64_opcode *opcode)
Packit bbfece
{
Packit bbfece
  return (opcode->flags & (F_SF | F_LSE_SZ | F_SIZEQ | F_FPTYPE | F_SSIZE | F_T
Packit bbfece
	  | F_GPRSIZE_IN_Q | F_LDS_SIZE | F_MISC | F_N | F_COND)) ? TRUE
Packit bbfece
    : FALSE;
Packit bbfece
}
Packit bbfece

Packit bbfece
struct aarch64_name_value_pair
Packit bbfece
{
Packit bbfece
  const char *  name;
Packit bbfece
  aarch64_insn	value;
Packit bbfece
};
Packit bbfece
Packit bbfece
extern const struct aarch64_name_value_pair aarch64_operand_modifiers [];
Packit bbfece
extern const struct aarch64_name_value_pair aarch64_barrier_options [16];
Packit bbfece
extern const struct aarch64_name_value_pair aarch64_prfops [32];
Packit bbfece
extern const struct aarch64_name_value_pair aarch64_hint_options [];
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  const char *  name;
Packit bbfece
  aarch64_insn	value;
Packit bbfece
  uint32_t	flags;
Packit bbfece
} aarch64_sys_reg;
Packit bbfece
Packit bbfece
extern const aarch64_sys_reg aarch64_sys_regs [];
Packit bbfece
extern const aarch64_sys_reg aarch64_pstatefields [];
Packit bbfece
extern bfd_boolean aarch64_sys_reg_deprecated_p (const aarch64_sys_reg *);
Packit bbfece
extern bfd_boolean aarch64_sys_reg_supported_p (const aarch64_feature_set,
Packit bbfece
						const aarch64_sys_reg *);
Packit bbfece
extern bfd_boolean aarch64_pstatefield_supported_p (const aarch64_feature_set,
Packit bbfece
						    const aarch64_sys_reg *);
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  const char *name;
Packit bbfece
  uint32_t value;
Packit bbfece
  uint32_t flags ;
Packit bbfece
} aarch64_sys_ins_reg;
Packit bbfece
Packit bbfece
extern bfd_boolean aarch64_sys_ins_reg_has_xt (const aarch64_sys_ins_reg *);
Packit bbfece
extern bfd_boolean
Packit bbfece
aarch64_sys_ins_reg_supported_p (const aarch64_feature_set,
Packit bbfece
				 const aarch64_sys_ins_reg *);
Packit bbfece
Packit bbfece
extern const aarch64_sys_ins_reg aarch64_sys_regs_ic [];
Packit bbfece
extern const aarch64_sys_ins_reg aarch64_sys_regs_dc [];
Packit bbfece
extern const aarch64_sys_ins_reg aarch64_sys_regs_at [];
Packit bbfece
extern const aarch64_sys_ins_reg aarch64_sys_regs_tlbi [];
Packit bbfece
Packit bbfece
/* Shift/extending operator kinds.
Packit bbfece
   N.B. order is important; keep aarch64_operand_modifiers synced.  */
Packit bbfece
enum aarch64_modifier_kind
Packit bbfece
{
Packit bbfece
  AARCH64_MOD_NONE,
Packit bbfece
  AARCH64_MOD_MSL,
Packit bbfece
  AARCH64_MOD_ROR,
Packit bbfece
  AARCH64_MOD_ASR,
Packit bbfece
  AARCH64_MOD_LSR,
Packit bbfece
  AARCH64_MOD_LSL,
Packit bbfece
  AARCH64_MOD_UXTB,
Packit bbfece
  AARCH64_MOD_UXTH,
Packit bbfece
  AARCH64_MOD_UXTW,
Packit bbfece
  AARCH64_MOD_UXTX,
Packit bbfece
  AARCH64_MOD_SXTB,
Packit bbfece
  AARCH64_MOD_SXTH,
Packit bbfece
  AARCH64_MOD_SXTW,
Packit bbfece
  AARCH64_MOD_SXTX,
Packit bbfece
  AARCH64_MOD_MUL,
Packit bbfece
  AARCH64_MOD_MUL_VL,
Packit bbfece
};
Packit bbfece
Packit bbfece
bfd_boolean
Packit bbfece
aarch64_extend_operator_p (enum aarch64_modifier_kind);
Packit bbfece
Packit bbfece
enum aarch64_modifier_kind
Packit bbfece
aarch64_get_operand_modifier (const struct aarch64_name_value_pair *);
Packit bbfece
/* Condition.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  /* A list of names with the first one as the disassembly preference;
Packit bbfece
     terminated by NULL if fewer than 3.  */
Packit bbfece
  const char *names[4];
Packit bbfece
  aarch64_insn value;
Packit bbfece
} aarch64_cond;
Packit bbfece
Packit bbfece
extern const aarch64_cond aarch64_conds[16];
Packit bbfece
Packit bbfece
const aarch64_cond* get_cond_from_value (aarch64_insn value);
Packit bbfece
const aarch64_cond* get_inverted_cond (const aarch64_cond *cond);
Packit bbfece

Packit bbfece
/* Structure representing an operand.  */
Packit bbfece
Packit bbfece
struct aarch64_opnd_info
Packit bbfece
{
Packit bbfece
  enum aarch64_opnd type;
Packit bbfece
  aarch64_opnd_qualifier_t qualifier;
Packit bbfece
  int idx;
Packit bbfece
Packit bbfece
  union
Packit bbfece
    {
Packit bbfece
      struct
Packit bbfece
	{
Packit bbfece
	  unsigned regno;
Packit bbfece
	} reg;
Packit bbfece
      struct
Packit bbfece
	{
Packit bbfece
	  unsigned int regno;
Packit bbfece
	  int64_t index;
Packit bbfece
	} reglane;
Packit bbfece
      /* e.g. LVn.  */
Packit bbfece
      struct
Packit bbfece
	{
Packit bbfece
	  unsigned first_regno : 5;
Packit bbfece
	  unsigned num_regs : 3;
Packit bbfece
	  /* 1 if it is a list of reg element.  */
Packit bbfece
	  unsigned has_index : 1;
Packit bbfece
	  /* Lane index; valid only when has_index is 1.  */
Packit bbfece
	  int64_t index;
Packit bbfece
	} reglist;
Packit bbfece
      /* e.g. immediate or pc relative address offset.  */
Packit bbfece
      struct
Packit bbfece
	{
Packit bbfece
	  int64_t value;
Packit bbfece
	  unsigned is_fp : 1;
Packit bbfece
	} imm;
Packit bbfece
      /* e.g. address in STR (register offset).  */
Packit bbfece
      struct
Packit bbfece
	{
Packit bbfece
	  unsigned base_regno;
Packit bbfece
	  struct
Packit bbfece
	    {
Packit bbfece
	      union
Packit bbfece
		{
Packit bbfece
		  int imm;
Packit bbfece
		  unsigned regno;
Packit bbfece
		};
Packit bbfece
	      unsigned is_reg;
Packit bbfece
	    } offset;
Packit bbfece
	  unsigned pcrel : 1;		/* PC-relative.  */
Packit bbfece
	  unsigned writeback : 1;
Packit bbfece
	  unsigned preind : 1;		/* Pre-indexed.  */
Packit bbfece
	  unsigned postind : 1;		/* Post-indexed.  */
Packit bbfece
	} addr;
Packit bbfece
      const aarch64_cond *cond;
Packit bbfece
      /* The encoding of the system register.  */
Packit bbfece
      aarch64_insn sysreg;
Packit bbfece
      /* The encoding of the PSTATE field.  */
Packit bbfece
      aarch64_insn pstatefield;
Packit bbfece
      const aarch64_sys_ins_reg *sysins_op;
Packit bbfece
      const struct aarch64_name_value_pair *barrier;
Packit bbfece
      const struct aarch64_name_value_pair *hint_option;
Packit bbfece
      const struct aarch64_name_value_pair *prfop;
Packit bbfece
    };
Packit bbfece
Packit bbfece
  /* Operand shifter; in use when the operand is a register offset address,
Packit bbfece
     add/sub extended reg, etc. e.g. <R><m>{, <extend> {#<amount>}}.  */
Packit bbfece
  struct
Packit bbfece
    {
Packit bbfece
      enum aarch64_modifier_kind kind;
Packit bbfece
      unsigned operator_present: 1;	/* Only valid during encoding.  */
Packit bbfece
      /* Value of the 'S' field in ld/st reg offset; used only in decoding.  */
Packit bbfece
      unsigned amount_present: 1;
Packit bbfece
      int64_t amount;
Packit bbfece
    } shifter;
Packit bbfece
Packit bbfece
  unsigned skip:1;	/* Operand is not completed if there is a fixup needed
Packit bbfece
			   to be done on it.  In some (but not all) of these
Packit bbfece
			   cases, we need to tell libopcodes to skip the
Packit bbfece
			   constraint checking and the encoding for this
Packit bbfece
			   operand, so that the libopcodes can pick up the
Packit bbfece
			   right opcode before the operand is fixed-up.  This
Packit bbfece
			   flag should only be used during the
Packit bbfece
			   assembling/encoding.  */
Packit bbfece
  unsigned present:1;	/* Whether this operand is present in the assembly
Packit bbfece
			   line; not used during the disassembly.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
typedef struct aarch64_opnd_info aarch64_opnd_info;
Packit bbfece
Packit bbfece
/* Structure representing an instruction.
Packit bbfece
Packit bbfece
   It is used during both the assembling and disassembling.  The assembler
Packit bbfece
   fills an aarch64_inst after a successful parsing and then passes it to the
Packit bbfece
   encoding routine to do the encoding.  During the disassembling, the
Packit bbfece
   disassembler calls the decoding routine to decode a binary instruction; on a
Packit bbfece
   successful return, such a structure will be filled with information of the
Packit bbfece
   instruction; then the disassembler uses the information to print out the
Packit bbfece
   instruction.  */
Packit bbfece
Packit bbfece
struct aarch64_inst
Packit bbfece
{
Packit bbfece
  /* The value of the binary instruction.  */
Packit bbfece
  aarch64_insn value;
Packit bbfece
Packit bbfece
  /* Corresponding opcode entry.  */
Packit bbfece
  const aarch64_opcode *opcode;
Packit bbfece
Packit bbfece
  /* Condition for a truly conditional-executed instrutions, e.g. b.cond.  */
Packit bbfece
  const aarch64_cond *cond;
Packit bbfece
Packit bbfece
  /* Operands information.  */
Packit bbfece
  aarch64_opnd_info operands[AARCH64_MAX_OPND_NUM];
Packit bbfece
};
Packit bbfece
Packit bbfece
typedef struct aarch64_inst aarch64_inst;
Packit bbfece

Packit bbfece
/* Diagnosis related declaration and interface.  */
Packit bbfece
Packit bbfece
/* Operand error kind enumerators.
Packit bbfece
Packit bbfece
   AARCH64_OPDE_RECOVERABLE
Packit bbfece
     Less severe error found during the parsing, very possibly because that
Packit bbfece
     GAS has picked up a wrong instruction template for the parsing.
Packit bbfece
Packit bbfece
   AARCH64_OPDE_SYNTAX_ERROR
Packit bbfece
     General syntax error; it can be either a user error, or simply because
Packit bbfece
     that GAS is trying a wrong instruction template.
Packit bbfece
Packit bbfece
   AARCH64_OPDE_FATAL_SYNTAX_ERROR
Packit bbfece
     Definitely a user syntax error.
Packit bbfece
Packit bbfece
   AARCH64_OPDE_INVALID_VARIANT
Packit bbfece
     No syntax error, but the operands are not a valid combination, e.g.
Packit bbfece
     FMOV D0,S0
Packit bbfece
Packit bbfece
   AARCH64_OPDE_UNTIED_OPERAND
Packit bbfece
     The asm failed to use the same register for a destination operand
Packit bbfece
     and a tied source operand.
Packit bbfece
Packit bbfece
   AARCH64_OPDE_OUT_OF_RANGE
Packit bbfece
     Error about some immediate value out of a valid range.
Packit bbfece
Packit bbfece
   AARCH64_OPDE_UNALIGNED
Packit bbfece
     Error about some immediate value not properly aligned (i.e. not being a
Packit bbfece
     multiple times of a certain value).
Packit bbfece
Packit bbfece
   AARCH64_OPDE_REG_LIST
Packit bbfece
     Error about the register list operand having unexpected number of
Packit bbfece
     registers.
Packit bbfece
Packit bbfece
   AARCH64_OPDE_OTHER_ERROR
Packit bbfece
     Error of the highest severity and used for any severe issue that does not
Packit bbfece
     fall into any of the above categories.
Packit bbfece
Packit bbfece
   The enumerators are only interesting to GAS.  They are declared here (in
Packit bbfece
   libopcodes) because that some errors are detected (and then notified to GAS)
Packit bbfece
   by libopcodes (rather than by GAS solely).
Packit bbfece
Packit bbfece
   The first three errors are only deteced by GAS while the
Packit bbfece
   AARCH64_OPDE_INVALID_VARIANT error can only be spotted by libopcodes as
Packit bbfece
   only libopcodes has the information about the valid variants of each
Packit bbfece
   instruction.
Packit bbfece
Packit bbfece
   The enumerators have an increasing severity.  This is helpful when there are
Packit bbfece
   multiple instruction templates available for a given mnemonic name (e.g.
Packit bbfece
   FMOV); this mechanism will help choose the most suitable template from which
Packit bbfece
   the generated diagnostics can most closely describe the issues, if any.  */
Packit bbfece
Packit bbfece
enum aarch64_operand_error_kind
Packit bbfece
{
Packit bbfece
  AARCH64_OPDE_NIL,
Packit bbfece
  AARCH64_OPDE_RECOVERABLE,
Packit bbfece
  AARCH64_OPDE_SYNTAX_ERROR,
Packit bbfece
  AARCH64_OPDE_FATAL_SYNTAX_ERROR,
Packit bbfece
  AARCH64_OPDE_INVALID_VARIANT,
Packit bbfece
  AARCH64_OPDE_UNTIED_OPERAND,
Packit bbfece
  AARCH64_OPDE_OUT_OF_RANGE,
Packit bbfece
  AARCH64_OPDE_UNALIGNED,
Packit bbfece
  AARCH64_OPDE_REG_LIST,
Packit bbfece
  AARCH64_OPDE_OTHER_ERROR
Packit bbfece
};
Packit bbfece
Packit bbfece
/* N.B. GAS assumes that this structure work well with shallow copy.  */
Packit bbfece
struct aarch64_operand_error
Packit bbfece
{
Packit bbfece
  enum aarch64_operand_error_kind kind;
Packit bbfece
  int index;
Packit bbfece
  const char *error;
Packit bbfece
  int data[3];	/* Some data for extra information.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
typedef struct aarch64_operand_error aarch64_operand_error;
Packit bbfece
Packit bbfece
/* Encoding entrypoint.  */
Packit bbfece
Packit bbfece
extern int
Packit bbfece
aarch64_opcode_encode (const aarch64_opcode *, const aarch64_inst *,
Packit bbfece
		       aarch64_insn *, aarch64_opnd_qualifier_t *,
Packit bbfece
		       aarch64_operand_error *);
Packit bbfece
Packit bbfece
extern const aarch64_opcode *
Packit bbfece
aarch64_replace_opcode (struct aarch64_inst *,
Packit bbfece
			const aarch64_opcode *);
Packit bbfece
Packit bbfece
/* Given the opcode enumerator OP, return the pointer to the corresponding
Packit bbfece
   opcode entry.  */
Packit bbfece
Packit bbfece
extern const aarch64_opcode *
Packit bbfece
aarch64_get_opcode (enum aarch64_op);
Packit bbfece
Packit bbfece
/* Generate the string representation of an operand.  */
Packit bbfece
extern void
Packit bbfece
aarch64_print_operand (char *, size_t, bfd_vma, const aarch64_opcode *,
Packit bbfece
		       const aarch64_opnd_info *, int, int *, bfd_vma *);
Packit bbfece
Packit bbfece
/* Miscellaneous interface.  */
Packit bbfece
Packit bbfece
extern int
Packit bbfece
aarch64_operand_index (const enum aarch64_opnd *, enum aarch64_opnd);
Packit bbfece
Packit bbfece
extern aarch64_opnd_qualifier_t
Packit bbfece
aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *, int,
Packit bbfece
				const aarch64_opnd_qualifier_t, int);
Packit bbfece
Packit bbfece
extern int
Packit bbfece
aarch64_num_of_operands (const aarch64_opcode *);
Packit bbfece
Packit bbfece
extern int
Packit bbfece
aarch64_stack_pointer_p (const aarch64_opnd_info *);
Packit bbfece
Packit bbfece
extern int
Packit bbfece
aarch64_zero_register_p (const aarch64_opnd_info *);
Packit bbfece
Packit bbfece
extern int
Packit bbfece
aarch64_decode_insn (aarch64_insn, aarch64_inst *, bfd_boolean);
Packit bbfece
Packit bbfece
/* Given an operand qualifier, return the expected data element size
Packit bbfece
   of a qualified operand.  */
Packit bbfece
extern unsigned char
Packit bbfece
aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t);
Packit bbfece
Packit bbfece
extern enum aarch64_operand_class
Packit bbfece
aarch64_get_operand_class (enum aarch64_opnd);
Packit bbfece
Packit bbfece
extern const char *
Packit bbfece
aarch64_get_operand_name (enum aarch64_opnd);
Packit bbfece
Packit bbfece
extern const char *
Packit bbfece
aarch64_get_operand_desc (enum aarch64_opnd);
Packit bbfece
Packit bbfece
extern bfd_boolean
Packit bbfece
aarch64_sve_dupm_mov_immediate_p (uint64_t, int);
Packit bbfece
Packit bbfece
#ifdef DEBUG_AARCH64
Packit bbfece
extern int debug_dump;
Packit bbfece
Packit bbfece
extern void
Packit bbfece
aarch64_verbose (const char *, ...) __attribute__ ((format (printf, 1, 2)));
Packit bbfece
Packit bbfece
#define DEBUG_TRACE(M, ...)					\
Packit bbfece
  {								\
Packit bbfece
    if (debug_dump)						\
Packit bbfece
      aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__);	\
Packit bbfece
  }
Packit bbfece
Packit bbfece
#define DEBUG_TRACE_IF(C, M, ...)				\
Packit bbfece
  {								\
Packit bbfece
    if (debug_dump && (C))					\
Packit bbfece
      aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__);	\
Packit bbfece
  }
Packit bbfece
#else  /* !DEBUG_AARCH64 */
Packit bbfece
#define DEBUG_TRACE(M, ...) ;
Packit bbfece
#define DEBUG_TRACE_IF(C, M, ...) ;
Packit bbfece
#endif /* DEBUG_AARCH64 */
Packit bbfece
Packit bbfece
extern const char *const aarch64_sve_pattern_array[32];
Packit bbfece
extern const char *const aarch64_sve_prfop_array[16];
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
}
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#endif /* OPCODE_AARCH64_H */