943 lines · 28.1 KB · C
RawDownload
/* AArch64 assembler/disassembler support.    Copyright 2009, 2010, 2011, 2012, 2013  Free Software Foundation, Inc.   Contributed by ARM Ltd.    This file is part of GNU Binutils.    This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 3 of the license, or   (at your option) any later version.    This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.    You should have received a copy of the GNU General Public License   along with this program; see the file COPYING3. If not,   see <http://www.gnu.org/licenses/>.  */ #ifndef OPCODE_AARCH64_H#define OPCODE_AARCH64_H #include "bfd.h"#include "bfd_stdint.h"#include <assert.h>#include <stdlib.h> /* The offset for pc-relative addressing is currently defined to be 0.  */#define AARCH64_PCREL_OFFSET		0 typedef uint32_t aarch64_insn; /* The following bitmasks control CPU features.  */#define AARCH64_FEATURE_V8	0x00000001	/* All processors.  */#define AARCH64_FEATURE_CRYPTO	0x00010000	/* Crypto instructions.  */#define AARCH64_FEATURE_FP	0x00020000	/* FP instructions.  */#define AARCH64_FEATURE_SIMD	0x00040000	/* SIMD instructions.  */#define AARCH64_FEATURE_CRC	0x00080000	/* CRC instructions.  */ /* Architectures are the sum of the base and extensions.  */#define AARCH64_ARCH_V8		AARCH64_FEATURE (AARCH64_FEATURE_V8, \						 AARCH64_FEATURE_FP  \						 | AARCH64_FEATURE_SIMD)#define AARCH64_ARCH_NONE	AARCH64_FEATURE (0, 0)#define AARCH64_ANY		AARCH64_FEATURE (-1, 0)	/* Any basic core.  */ /* CPU-specific features.  */typedef unsigned long aarch64_feature_set; #define AARCH64_CPU_HAS_FEATURE(CPU,FEAT)	\  (((CPU) & (FEAT)) != 0) #define AARCH64_MERGE_FEATURE_SETS(TARG,F1,F2)	\  do						\    {						\      (TARG) = (F1) | (F2);			\    }						\  while (0) #define AARCH64_CLEAR_FEATURE(TARG,F1,F2)	\  do						\    { 						\      (TARG) = (F1) &~ (F2);			\    }						\  while (0) #define AARCH64_FEATURE(core,coproc) ((core) | (coproc)) #define AARCH64_OPCODE_HAS_FEATURE(OPC,FEAT)	\  (((OPC) & (FEAT)) != 0) enum aarch64_operand_class{  AARCH64_OPND_CLASS_NIL,  AARCH64_OPND_CLASS_INT_REG,  AARCH64_OPND_CLASS_MODIFIED_REG,  AARCH64_OPND_CLASS_FP_REG,  AARCH64_OPND_CLASS_SIMD_REG,  AARCH64_OPND_CLASS_SIMD_ELEMENT,  AARCH64_OPND_CLASS_SISD_REG,  AARCH64_OPND_CLASS_SIMD_REGLIST,  AARCH64_OPND_CLASS_CP_REG,  AARCH64_OPND_CLASS_ADDRESS,  AARCH64_OPND_CLASS_IMMEDIATE,  AARCH64_OPND_CLASS_SYSTEM,  AARCH64_OPND_CLASS_COND,}; /* Operand code that helps both parsing and coding.   Keep AARCH64_OPERANDS synced.  */ enum aarch64_opnd{  AARCH64_OPND_NIL,	/* no operand---MUST BE FIRST!*/   AARCH64_OPND_Rd,	/* Integer register as destination.  */  AARCH64_OPND_Rn,	/* Integer register as source.  */  AARCH64_OPND_Rm,	/* Integer register as source.  */  AARCH64_OPND_Rt,	/* Integer register used in ld/st instructions.  */  AARCH64_OPND_Rt2,	/* Integer register used in ld/st pair instructions.  */  AARCH64_OPND_Rs,	/* Integer register used in ld/st exclusive.  */  AARCH64_OPND_Ra,	/* Integer register used in ddp_3src instructions.  */  AARCH64_OPND_Rt_SYS,	/* Integer register used in system instructions.  */   AARCH64_OPND_Rd_SP,	/* Integer Rd or SP.  */  AARCH64_OPND_Rn_SP,	/* Integer Rn or SP.  */  AARCH64_OPND_Rm_EXT,	/* Integer Rm extended.  */  AARCH64_OPND_Rm_SFT,	/* Integer Rm shifted.  */   AARCH64_OPND_Fd,	/* Floating-point Fd.  */  AARCH64_OPND_Fn,	/* Floating-point Fn.  */  AARCH64_OPND_Fm,	/* Floating-point Fm.  */  AARCH64_OPND_Fa,	/* Floating-point Fa.  */  AARCH64_OPND_Ft,	/* Floating-point Ft.  */  AARCH64_OPND_Ft2,	/* Floating-point Ft2.  */   AARCH64_OPND_Sd,	/* AdvSIMD Scalar Sd.  */  AARCH64_OPND_Sn,	/* AdvSIMD Scalar Sn.  */  AARCH64_OPND_Sm,	/* AdvSIMD Scalar Sm.  */   AARCH64_OPND_Vd,	/* AdvSIMD Vector Vd.  */  AARCH64_OPND_Vn,	/* AdvSIMD Vector Vn.  */  AARCH64_OPND_Vm,	/* AdvSIMD Vector Vm.  */  AARCH64_OPND_VdD1,	/* AdvSIMD <Vd>.D[1]; for FMOV only.  */  AARCH64_OPND_VnD1,	/* AdvSIMD <Vn>.D[1]; for FMOV only.  */  AARCH64_OPND_Ed,	/* AdvSIMD Vector Element Vd.  */  AARCH64_OPND_En,	/* AdvSIMD Vector Element Vn.  */  AARCH64_OPND_Em,	/* AdvSIMD Vector Element Vm.  */  AARCH64_OPND_LVn,	/* AdvSIMD Vector register list used in e.g. TBL.  */  AARCH64_OPND_LVt,	/* AdvSIMD Vector register list used in ld/st.  */  AARCH64_OPND_LVt_AL,	/* AdvSIMD Vector register list for loading single			   structure to all lanes.  */  AARCH64_OPND_LEt,	/* AdvSIMD Vector Element list.  */   AARCH64_OPND_Cn,	/* Co-processor register in CRn field.  */  AARCH64_OPND_Cm,	/* Co-processor register in CRm field.  */   AARCH64_OPND_IDX,	/* AdvSIMD EXT index operand.  */  AARCH64_OPND_IMM_VLSL,/* Immediate for shifting vector registers left.  */  AARCH64_OPND_IMM_VLSR,/* Immediate for shifting vector registers right.  */  AARCH64_OPND_SIMD_IMM,/* AdvSIMD modified immediate without shift.  */  AARCH64_OPND_SIMD_IMM_SFT,	/* AdvSIMD modified immediate with shift.  */  AARCH64_OPND_SIMD_FPIMM,/* AdvSIMD 8-bit fp immediate.  */  AARCH64_OPND_SHLL_IMM,/* Immediate shift for AdvSIMD SHLL instruction			   (no encoding).  */  AARCH64_OPND_IMM0,	/* Immediate for #0.  */  AARCH64_OPND_FPIMM0,	/* Immediate for #0.0.  */  AARCH64_OPND_FPIMM,	/* Floating-point Immediate.  */  AARCH64_OPND_IMMR,	/* Immediate #<immr> in e.g. BFM.  */  AARCH64_OPND_IMMS,	/* Immediate #<imms> in e.g. BFM.  */  AARCH64_OPND_WIDTH,	/* Immediate #<width> in e.g. BFI.  */  AARCH64_OPND_IMM,	/* Immediate.  */  AARCH64_OPND_UIMM3_OP1,/* Unsigned 3-bit immediate in the op1 field.  */  AARCH64_OPND_UIMM3_OP2,/* Unsigned 3-bit immediate in the op2 field.  */  AARCH64_OPND_UIMM4,	/* Unsigned 4-bit immediate in the CRm field.  */  AARCH64_OPND_UIMM7,	/* Unsigned 7-bit immediate in the CRm:op2 fields.  */  AARCH64_OPND_BIT_NUM,	/* Immediate.  */  AARCH64_OPND_EXCEPTION,/* imm16 operand in exception instructions.  */  AARCH64_OPND_CCMP_IMM,/* Immediate in conditional compare instructions.  */  AARCH64_OPND_NZCV,	/* Flag bit specifier giving an alternative value for			   each condition flag.  */   AARCH64_OPND_LIMM,	/* Logical Immediate.  */  AARCH64_OPND_AIMM,	/* Arithmetic immediate.  */  AARCH64_OPND_HALF,	/* #<imm16>{, LSL #<shift>} operand in move wide.  */  AARCH64_OPND_FBITS,	/* FP #<fbits> operand in e.g. SCVTF */  AARCH64_OPND_IMM_MOV,	/* Immediate operand for the MOV alias.  */   AARCH64_OPND_COND,	/* Standard condition as the last operand.  */  AARCH64_OPND_COND1,	/* Same as the above, but excluding AL and NV.  */   AARCH64_OPND_ADDR_ADRP,	/* Memory address for ADRP */  AARCH64_OPND_ADDR_PCREL14,	/* 14-bit PC-relative address for e.g. TBZ.  */  AARCH64_OPND_ADDR_PCREL19,	/* 19-bit PC-relative address for e.g. LDR.  */  AARCH64_OPND_ADDR_PCREL21,	/* 21-bit PC-relative address for e.g. ADR.  */  AARCH64_OPND_ADDR_PCREL26,	/* 26-bit PC-relative address for e.g. BL.  */   AARCH64_OPND_ADDR_SIMPLE,	/* Address of ld/st exclusive.  */  AARCH64_OPND_ADDR_REGOFF,	/* Address of register offset.  */  AARCH64_OPND_ADDR_SIMM7,	/* Address of signed 7-bit immediate.  */  AARCH64_OPND_ADDR_SIMM9,	/* Address of signed 9-bit immediate.  */  AARCH64_OPND_ADDR_SIMM9_2,	/* Same as the above, but the immediate is				   negative or unaligned and there is				   no writeback allowed.  This operand code				   is only used to support the programmer-				   friendly feature of using LDR/STR as the				   the mnemonic name for LDUR/STUR instructions				   wherever there is no ambiguity.  */  AARCH64_OPND_ADDR_UIMM12,	/* Address of unsigned 12-bit immediate.  */  AARCH64_OPND_SIMD_ADDR_SIMPLE,/* Address of ld/st multiple structures.  */  AARCH64_OPND_SIMD_ADDR_POST,	/* Address of ld/st multiple post-indexed.  */   AARCH64_OPND_SYSREG,		/* System register operand.  */  AARCH64_OPND_PSTATEFIELD,	/* PSTATE field name operand.  */  AARCH64_OPND_SYSREG_AT,	/* System register <at_op> operand.  */  AARCH64_OPND_SYSREG_DC,	/* System register <dc_op> operand.  */  AARCH64_OPND_SYSREG_IC,	/* System register <ic_op> operand.  */  AARCH64_OPND_SYSREG_TLBI,	/* System register <tlbi_op> operand.  */  AARCH64_OPND_BARRIER,		/* Barrier operand.  */  AARCH64_OPND_BARRIER_ISB,	/* Barrier operand for ISB.  */  AARCH64_OPND_PRFOP,		/* Prefetch operation.  */}; /* Qualifier constrains an operand.  It either specifies a variant of an   operand type or limits values available to an operand type.    N.B. Order is important; keep aarch64_opnd_qualifiers synced.  */ enum aarch64_opnd_qualifier{  /* Indicating no further qualification on an operand.  */  AARCH64_OPND_QLF_NIL,   /* Qualifying an operand which is a general purpose (integer) register;     indicating the operand data size or a specific register.  */  AARCH64_OPND_QLF_W,	/* Wn, WZR or WSP.  */  AARCH64_OPND_QLF_X,	/* Xn, XZR or XSP.  */  AARCH64_OPND_QLF_WSP,	/* WSP.  */  AARCH64_OPND_QLF_SP,	/* SP.  */   /* Qualifying an operand which is a floating-point register, a SIMD     vector element or a SIMD vector element list; indicating operand data     size or the size of each SIMD vector element in the case of a SIMD     vector element list.     These qualifiers are also used to qualify an address operand to     indicate the size of data element a load/store instruction is     accessing.     They are also used for the immediate shift operand in e.g. SSHR.  Such     a use is only for the ease of operand encoding/decoding and qualifier     sequence matching; such a use should not be applied widely; use the value     constraint qualifiers for immediate operands wherever possible.  */  AARCH64_OPND_QLF_S_B,  AARCH64_OPND_QLF_S_H,  AARCH64_OPND_QLF_S_S,  AARCH64_OPND_QLF_S_D,  AARCH64_OPND_QLF_S_Q,   /* Qualifying an operand which is a SIMD vector register or a SIMD vector     register list; indicating register shape.     They are also used for the immediate shift operand in e.g. SSHR.  Such     a use is only for the ease of operand encoding/decoding and qualifier     sequence matching; such a use should not be applied widely; use the value     constraint qualifiers for immediate operands wherever possible.  */  AARCH64_OPND_QLF_V_8B,  AARCH64_OPND_QLF_V_16B,  AARCH64_OPND_QLF_V_4H,  AARCH64_OPND_QLF_V_8H,  AARCH64_OPND_QLF_V_2S,  AARCH64_OPND_QLF_V_4S,  AARCH64_OPND_QLF_V_1D,  AARCH64_OPND_QLF_V_2D,  AARCH64_OPND_QLF_V_1Q,   /* Constraint on value.  */  AARCH64_OPND_QLF_imm_0_7,  AARCH64_OPND_QLF_imm_0_15,  AARCH64_OPND_QLF_imm_0_31,  AARCH64_OPND_QLF_imm_0_63,  AARCH64_OPND_QLF_imm_1_32,  AARCH64_OPND_QLF_imm_1_64,   /* Indicate whether an AdvSIMD modified immediate operand is shift-zeros     or shift-ones.  */  AARCH64_OPND_QLF_LSL,  AARCH64_OPND_QLF_MSL,   /* Special qualifier helping retrieve qualifier information during the     decoding time (currently not in use).  */  AARCH64_OPND_QLF_RETRIEVE,};/* Instruction class.  */ enum aarch64_insn_class{  addsub_carry,  addsub_ext,  addsub_imm,  addsub_shift,  asimdall,  asimddiff,  asimdelem,  asimdext,  asimdimm,  asimdins,  asimdmisc,  asimdperm,  asimdsame,  asimdshf,  asimdtbl,  asisddiff,  asisdelem,  asisdlse,  asisdlsep,  asisdlso,  asisdlsop,  asisdmisc,  asisdone,  asisdpair,  asisdsame,  asisdshf,  bitfield,  branch_imm,  branch_reg,  compbranch,  condbranch,  condcmp_imm,  condcmp_reg,  condsel,  cryptoaes,  cryptosha2,  cryptosha3,  dp_1src,  dp_2src,  dp_3src,  exception,  extract,  float2fix,  float2int,  floatccmp,  floatcmp,  floatdp1,  floatdp2,  floatdp3,  floatimm,  floatsel,  ldst_immpost,  ldst_immpre,  ldst_imm9,	/* immpost or immpre */  ldst_pos,  ldst_regoff,  ldst_unpriv,  ldst_unscaled,  ldstexcl,  ldstnapair_offs,  ldstpair_off,  ldstpair_indexed,  loadlit,  log_imm,  log_shift,  movewide,  pcreladdr,  ic_system,  testbranch,}; /* Opcode enumerators.  */ enum aarch64_op{  OP_NIL,  OP_STRB_POS,  OP_LDRB_POS,  OP_LDRSB_POS,  OP_STRH_POS,  OP_LDRH_POS,  OP_LDRSH_POS,  OP_STR_POS,  OP_LDR_POS,  OP_STRF_POS,  OP_LDRF_POS,  OP_LDRSW_POS,  OP_PRFM_POS,   OP_STURB,  OP_LDURB,  OP_LDURSB,  OP_STURH,  OP_LDURH,  OP_LDURSH,  OP_STUR,  OP_LDUR,  OP_STURV,  OP_LDURV,  OP_LDURSW,  OP_PRFUM,   OP_LDR_LIT,  OP_LDRV_LIT,  OP_LDRSW_LIT,  OP_PRFM_LIT,   OP_ADD,  OP_B,  OP_BL,   OP_MOVN,  OP_MOVZ,  OP_MOVK,   OP_MOV_IMM_LOG,	/* MOV alias for moving bitmask immediate.  */  OP_MOV_IMM_WIDE,	/* MOV alias for moving wide immediate.  */  OP_MOV_IMM_WIDEN,	/* MOV alias for moving wide immediate (negated).  */   OP_MOV_V,		/* MOV alias for moving vector register.  */   OP_ASR_IMM,  OP_LSR_IMM,  OP_LSL_IMM,   OP_BIC,   OP_UBFX,  OP_BFXIL,  OP_SBFX,  OP_SBFIZ,  OP_BFI,  OP_UBFIZ,  OP_UXTB,  OP_UXTH,  OP_UXTW,   OP_CINC,  OP_CINV,  OP_CNEG,  OP_CSET,  OP_CSETM,   OP_FCVT,  OP_FCVTN,  OP_FCVTN2,  OP_FCVTL,  OP_FCVTL2,  OP_FCVTXN_S,		/* Scalar version.  */   OP_ROR_IMM,   OP_SXTL,  OP_SXTL2,  OP_UXTL,  OP_UXTL2,   OP_TOTAL_NUM,		/* Pseudo.  */}; /* Maximum number of operands an instruction can have.  */#define AARCH64_MAX_OPND_NUM 6/* Maximum number of qualifier sequences an instruction can have.  */#define AARCH64_MAX_QLF_SEQ_NUM 10/* Operand qualifier typedef; optimized for the size.  */typedef unsigned char aarch64_opnd_qualifier_t;/* Operand qualifier sequence typedef.  */typedef aarch64_opnd_qualifier_t	\	  aarch64_opnd_qualifier_seq_t [AARCH64_MAX_OPND_NUM]; /* FIXME: improve the efficiency.  */static inline bfd_booleanempty_qualifier_sequence_p (const aarch64_opnd_qualifier_t *qualifiers){  int i;  for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)    if (qualifiers[i] != AARCH64_OPND_QLF_NIL)      return FALSE;  return TRUE;} /* This structure holds information for a particular opcode.  */ struct aarch64_opcode{  /* The name of the mnemonic.  */  const char *name;   /* The opcode itself.  Those bits which will be filled in with     operands are zeroes.  */  aarch64_insn opcode;   /* The opcode mask.  This is used by the disassembler.  This is a     mask containing ones indicating those bits which must match the     opcode field, and zeroes indicating those bits which need not     match (and are presumably filled in by operands).  */  aarch64_insn mask;   /* Instruction class.  */  enum aarch64_insn_class iclass;   /* Enumerator identifier.  */  enum aarch64_op op;   /* Which architecture variant provides this instruction.  */  const aarch64_feature_set *avariant;   /* An array of operand codes.  Each code is an index into the     operand table.  They appear in the order which the operands must     appear in assembly code, and are terminated by a zero.  */  enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM];   /* A list of operand qualifier code sequence.  Each operand qualifier     code qualifies the corresponding operand code.  Each operand     qualifier sequence specifies a valid opcode variant and related     constraint on operands.  */  aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM];   /* Flags providing information about this instruction */  uint32_t flags;}; typedef struct aarch64_opcode aarch64_opcode;

Lines 1–500 of 943.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t