2012-08-13 22:52:54 +08:00
|
|
|
|
/* AArch64 assembler/disassembler support.
|
|
|
|
|
|
2018-01-03 13:17:27 +08:00
|
|
|
|
Copyright (C) 2009-2018 Free Software Foundation, Inc.
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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>
|
|
|
|
|
|
2015-10-07 19:35:46 +08:00
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
/* 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. */
|
Split the AArch64 Crypto instructions for AES and SHA1+2 into their own options (+aes and +sha2).
The new options are:
+aes: Enables the AES instructions of Armv8-a,
enabled by default with +crypto.
+sha2: Enables the SHA1 and SHA2 instructions of Armv8-a,
enabled by default with +crypto.
These options have been turned on by default when +crypto
is used, as such no breakage is expected.
The reason for the split is because with the introduction of Armv8.4-a
the implementation of AES has explicitly been made independent of the
implementation of the other crypto extensions. Backporting the split does
not break any of the previous requirements and so is safe to do.
gas * config/tc-aarch64.c
(aarch64_features): Include AES and SHA2 in CRYPTO.
Add SHA2 and AES.
include * opcode/aarch64.h:
(AARCH64_FEATURE_SHA2, AARCH64_FEATURE_AES): New.
opcodes * aarch64-tbl.h (aarch64_feature_crypto): Add AES and SHA2.
(aarch64_feature_sha2, aarch64_feature_aes): New.
(SHA2, AES): New.
(AES_INSN, SHA2_INSN): New.
(pmull, pmull2, aese, aesd, aesmc, aesimc): Change to AES_INS.
(sha1h, sha1su1, sha256su0, sha1c, sha1p,
sha1m, sha1su0, sha256h, sha256h2, sha256su1):
Change to SHA2_INS.
2017-11-08 22:30:53 +08:00
|
|
|
|
#define AARCH64_FEATURE_SHA2 0x200000000ULL /* SHA2 instructions. */
|
|
|
|
|
#define AARCH64_FEATURE_AES 0x800000000ULL /* AES instructions. */
|
Split the ARM Crypto ISA extensions for AES and SHA1+2 into their own options (+aes and +sha2). The reason for the split is because with the introduction of Armv8.4-a the implementation of AES has explicitly been made independent of the implementation of the other crypto extensions.
gas * config/tc-aarch64.c (aarch64_arch_option_table): Add armv8.4-a.
(aarch64_features): Added SM4 and SHA3.
include * opcode/aarch64.h:
(AARCH64_FEATURE_V8_4, AARCH64_FEATURE_SM4): New.
(AARCH64_ARCH_V8_4, AARCH64_FEATURE_SHA3): New.
opcodes * aarch64-tbl.h
(aarch64_feature_v8_4, aarch64_feature_crypto_v8_2): New.
(aarch64_feature_sm4, aarch64_feature_sha3): New.
(aarch64_feature_fp_16_v8_2): New.
(ARMV8_4, SHA3, SM4, CRYPTO_V8_2, FP_F16_V8_2): New.
(V8_4_INSN, CRYPTO_V8_2_INSN): New.
(SHA3_INSN, SM4_INSN, FP16_V8_2_INSN): New.
2017-11-09 19:21:31 +08:00
|
|
|
|
#define AARCH64_FEATURE_V8_4 0x000000800ULL /* ARMv8.4 processors. */
|
|
|
|
|
#define AARCH64_FEATURE_SM4 0x100000000ULL /* SM3 & SM4 instructions. */
|
|
|
|
|
#define AARCH64_FEATURE_SHA3 0x400000000ULL /* SHA3 instructions. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
#define AARCH64_FEATURE_V8 0x00000001 /* All processors. */
|
2015-11-19 17:12:49 +08:00
|
|
|
|
#define AARCH64_FEATURE_V8_2 0x00000020 /* ARMv8.2 processors. */
|
2016-11-11 18:20:30 +08:00
|
|
|
|
#define AARCH64_FEATURE_V8_3 0x00000040 /* ARMv8.3 processors. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
#define AARCH64_FEATURE_CRYPTO 0x00010000 /* Crypto instructions. */
|
|
|
|
|
#define AARCH64_FEATURE_FP 0x00020000 /* FP instructions. */
|
|
|
|
|
#define AARCH64_FEATURE_SIMD 0x00040000 /* SIMD instructions. */
|
2013-03-01 03:18:40 +08:00
|
|
|
|
#define AARCH64_FEATURE_CRC 0x00080000 /* CRC instructions. */
|
2014-09-03 21:40:41 +08:00
|
|
|
|
#define AARCH64_FEATURE_LSE 0x00100000 /* LSE instructions. */
|
2015-06-01 23:00:28 +08:00
|
|
|
|
#define AARCH64_FEATURE_PAN 0x00200000 /* PAN instructions. */
|
2015-06-02 18:29:15 +08:00
|
|
|
|
#define AARCH64_FEATURE_LOR 0x00400000 /* LOR instructions. */
|
2015-06-02 19:20:00 +08:00
|
|
|
|
#define AARCH64_FEATURE_RDMA 0x00800000 /* v8.1 SIMD instructions. */
|
[AArch64] Add support for ARMv8.1 Virtulization Host Extensions.
The ARMv8.1 architecture includes the Virtualization Host Extensions
which add a number of system registers. This patch adds support for
these system registers, making them available when -march=armv8.1-a is
selected.
include/opcode/
2015-11-20 Matthew Wahab <matthew.wahab@arm.com>
* aarch64.h (AARCH64_FEATURE_V8_1): New.
(AARCH64_ARCH_v8_1): Add AARCH64_FEATURE_V8_1.
opcodes/
2015-11-20 Matthew Wahab <matthew.wahab@arm.com>
* aarch64-opc.c (aarch64_sys_regs): Add spsr_el12, elr_el12,
sctlr_el12, cpacr_el12, ttbr1_el2, ttbr0_el12, ttbr1_el12,
tcr_el12, afsr0_el12, afsr1_el12, esr_el12, far_el12, mair_el12,
amair_el12, vbar_el12, contextidr_el2, contextidr_el12,
cntkctl_el12, cntp_tval_el02, cntp_ctl_el02, cntp_cval_el02,
cntv_tval_el02, cntv_ctl_el02, cntv_cval_el02, cnthv_tval_el2,
cnthv_ctl_el2, cnthv_cval_el2.
(aarch64_sys_reg_supported_p): Update for the new system
registers.
gas/testsuite/
2015-11-20 Matthew Wahab <matthew.wahab@arm.com>
* gas/aarch64/virthostext-directive.d: New.
* gas/aarch64/virthostext.d: New.
* gas/aarch64/virthostext.s: New.
Change-Id: Iecb370591b1b6e9e00d81c8ccd9ae3b0f71794a2
2015-11-21 00:09:34 +08:00
|
|
|
|
#define AARCH64_FEATURE_V8_1 0x01000000 /* v8.1 features. */
|
2015-12-10 21:58:21 +08:00
|
|
|
|
#define AARCH64_FEATURE_F16 0x02000000 /* v8.2 FP16 instructions. */
|
2015-12-10 22:05:01 +08:00
|
|
|
|
#define AARCH64_FEATURE_RAS 0x04000000 /* RAS Extensions. */
|
2015-12-11 17:30:26 +08:00
|
|
|
|
#define AARCH64_FEATURE_PROFILE 0x08000000 /* Statistical Profiling. */
|
[AArch64][SVE 31/32] Add SVE instructions
This patch adds the SVE instruction definitions and associated OP_*
enum values.
include/
* opcode/aarch64.h (AARCH64_FEATURE_SVE): New macro.
(OP_MOV_P_P, OP_MOV_Z_P_Z, OP_MOV_Z_V, OP_MOV_Z_Z, OP_MOV_Z_Zi)
(OP_MOVM_P_P_P, OP_MOVS_P_P, OP_MOVZS_P_P_P, OP_MOVZ_P_P_P)
(OP_NOTS_P_P_P_Z, OP_NOT_P_P_P_Z): New aarch64_ops.
opcodes/
* aarch64-tbl.h (OP_SVE_B, OP_SVE_BB, OP_SVE_BBBU, OP_SVE_BMB)
(OP_SVE_BPB, OP_SVE_BUB, OP_SVE_BUBB, OP_SVE_BUU, OP_SVE_BZ)
(OP_SVE_BZB, OP_SVE_BZBB, OP_SVE_BZU, OP_SVE_DD, OP_SVE_DDD)
(OP_SVE_DMD, OP_SVE_DMH, OP_SVE_DMS, OP_SVE_DU, OP_SVE_DUD, OP_SVE_DUU)
(OP_SVE_DUV_BHS, OP_SVE_DUV_BHSD, OP_SVE_DZD, OP_SVE_DZU, OP_SVE_HB)
(OP_SVE_HMD, OP_SVE_HMS, OP_SVE_HU, OP_SVE_HUU, OP_SVE_HZU, OP_SVE_RR)
(OP_SVE_RURV_BHSD, OP_SVE_RUV_BHSD, OP_SVE_SMD, OP_SVE_SMH, OP_SVE_SMS)
(OP_SVE_SU, OP_SVE_SUS, OP_SVE_SUU, OP_SVE_SZS, OP_SVE_SZU, OP_SVE_UB)
(OP_SVE_UUD, OP_SVE_UUS, OP_SVE_VMR_BHSD, OP_SVE_VMU_SD)
(OP_SVE_VMVD_BHS, OP_SVE_VMVU_BHSD, OP_SVE_VMVU_SD, OP_SVE_VMVV_BHSD)
(OP_SVE_VMVV_SD, OP_SVE_VMV_BHSD, OP_SVE_VMV_HSD, OP_SVE_VMV_SD)
(OP_SVE_VM_SD, OP_SVE_VPU_BHSD, OP_SVE_VPV_BHSD, OP_SVE_VRR_BHSD)
(OP_SVE_VRU_BHSD, OP_SVE_VR_BHSD, OP_SVE_VUR_BHSD, OP_SVE_VUU_BHSD)
(OP_SVE_VUVV_BHSD, OP_SVE_VUVV_SD, OP_SVE_VUV_BHSD, OP_SVE_VUV_SD)
(OP_SVE_VU_BHSD, OP_SVE_VU_HSD, OP_SVE_VU_SD, OP_SVE_VVD_BHS)
(OP_SVE_VVU_BHSD, OP_SVE_VVVU_SD, OP_SVE_VVV_BHSD, OP_SVE_VVV_SD)
(OP_SVE_VV_BHSD, OP_SVE_VV_HSD_BHS, OP_SVE_VV_SD, OP_SVE_VWW_BHSD)
(OP_SVE_VXX_BHSD, OP_SVE_VZVD_BHS, OP_SVE_VZVU_BHSD, OP_SVE_VZVV_BHSD)
(OP_SVE_VZVV_SD, OP_SVE_VZV_SD, OP_SVE_V_SD, OP_SVE_WU, OP_SVE_WV_BHSD)
(OP_SVE_XU, OP_SVE_XUV_BHSD, OP_SVE_XVW_BHSD, OP_SVE_XV_BHSD)
(OP_SVE_XWU, OP_SVE_XXU): New macros.
(aarch64_feature_sve): New variable.
(SVE): New macro.
(_SVE_INSN): Likewise.
(aarch64_opcode_table): Add SVE instructions.
* aarch64-opc.h (extract_fields): Declare.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.c (do_misc_encoding): Handle the new SVE aarch64_ops.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.c (extract_fields): Make global.
(do_misc_decoding): Handle the new SVE aarch64_ops.
* aarch64-dis-2.c: Regenerate.
gas/
* doc/c-aarch64.texi: Document the "sve" feature.
* config/tc-aarch64.c (REG_TYPE_R_Z_BHSDQ_VZP): New register type.
(get_reg_expected_msg): Handle it.
(parse_operands): When parsing operands of an SVE instruction,
disallow immediates that match REG_TYPE_R_Z_BHSDQ_VZP.
(aarch64_features): Add an entry for SVE.
2016-09-21 23:58:48 +08:00
|
|
|
|
#define AARCH64_FEATURE_SVE 0x10000000 /* SVE instructions. */
|
2017-01-04 20:27:10 +08:00
|
|
|
|
#define AARCH64_FEATURE_RCPC 0x20000000 /* RCPC instructions. */
|
2017-02-25 02:27:26 +08:00
|
|
|
|
#define AARCH64_FEATURE_COMPNUM 0x40000000 /* Complex # instructions. */
|
2017-06-28 18:09:01 +08:00
|
|
|
|
#define AARCH64_FEATURE_DOTPROD 0x080000000 /* Dot Product instructions. */
|
2017-11-17 00:19:37 +08:00
|
|
|
|
#define AARCH64_FEATURE_F16_FML 0x1000000000ULL /* v8.2 FP16FML ins. */
|
2018-09-26 17:38:59 +08:00
|
|
|
|
#define AARCH64_FEATURE_V8_5 0x2000000000ULL /* ARMv8.5 processors. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
/* Architectures are the sum of the base and extensions. */
|
|
|
|
|
#define AARCH64_ARCH_V8 AARCH64_FEATURE (AARCH64_FEATURE_V8, \
|
|
|
|
|
AARCH64_FEATURE_FP \
|
|
|
|
|
| AARCH64_FEATURE_SIMD)
|
2016-11-11 18:20:30 +08:00
|
|
|
|
#define AARCH64_ARCH_V8_1 AARCH64_FEATURE (AARCH64_ARCH_V8, \
|
|
|
|
|
AARCH64_FEATURE_CRC \
|
[AArch64] Add support for ARMv8.1 Virtulization Host Extensions.
The ARMv8.1 architecture includes the Virtualization Host Extensions
which add a number of system registers. This patch adds support for
these system registers, making them available when -march=armv8.1-a is
selected.
include/opcode/
2015-11-20 Matthew Wahab <matthew.wahab@arm.com>
* aarch64.h (AARCH64_FEATURE_V8_1): New.
(AARCH64_ARCH_v8_1): Add AARCH64_FEATURE_V8_1.
opcodes/
2015-11-20 Matthew Wahab <matthew.wahab@arm.com>
* aarch64-opc.c (aarch64_sys_regs): Add spsr_el12, elr_el12,
sctlr_el12, cpacr_el12, ttbr1_el2, ttbr0_el12, ttbr1_el12,
tcr_el12, afsr0_el12, afsr1_el12, esr_el12, far_el12, mair_el12,
amair_el12, vbar_el12, contextidr_el2, contextidr_el12,
cntkctl_el12, cntp_tval_el02, cntp_ctl_el02, cntp_cval_el02,
cntv_tval_el02, cntv_ctl_el02, cntv_cval_el02, cnthv_tval_el2,
cnthv_ctl_el2, cnthv_cval_el2.
(aarch64_sys_reg_supported_p): Update for the new system
registers.
gas/testsuite/
2015-11-20 Matthew Wahab <matthew.wahab@arm.com>
* gas/aarch64/virthostext-directive.d: New.
* gas/aarch64/virthostext.d: New.
* gas/aarch64/virthostext.s: New.
Change-Id: Iecb370591b1b6e9e00d81c8ccd9ae3b0f71794a2
2015-11-21 00:09:34 +08:00
|
|
|
|
| AARCH64_FEATURE_V8_1 \
|
2015-06-04 18:14:07 +08:00
|
|
|
|
| AARCH64_FEATURE_LSE \
|
|
|
|
|
| AARCH64_FEATURE_PAN \
|
|
|
|
|
| AARCH64_FEATURE_LOR \
|
|
|
|
|
| AARCH64_FEATURE_RDMA)
|
2016-11-11 18:20:30 +08:00
|
|
|
|
#define AARCH64_ARCH_V8_2 AARCH64_FEATURE (AARCH64_ARCH_V8_1, \
|
2015-11-19 17:12:49 +08:00
|
|
|
|
AARCH64_FEATURE_V8_2 \
|
2016-11-11 18:20:30 +08:00
|
|
|
|
| AARCH64_FEATURE_RAS)
|
|
|
|
|
#define AARCH64_ARCH_V8_3 AARCH64_FEATURE (AARCH64_ARCH_V8_2, \
|
2017-01-04 20:27:10 +08:00
|
|
|
|
AARCH64_FEATURE_V8_3 \
|
2017-02-25 02:27:26 +08:00
|
|
|
|
| AARCH64_FEATURE_RCPC \
|
|
|
|
|
| AARCH64_FEATURE_COMPNUM)
|
Split the ARM Crypto ISA extensions for AES and SHA1+2 into their own options (+aes and +sha2). The reason for the split is because with the introduction of Armv8.4-a the implementation of AES has explicitly been made independent of the implementation of the other crypto extensions.
gas * config/tc-aarch64.c (aarch64_arch_option_table): Add armv8.4-a.
(aarch64_features): Added SM4 and SHA3.
include * opcode/aarch64.h:
(AARCH64_FEATURE_V8_4, AARCH64_FEATURE_SM4): New.
(AARCH64_ARCH_V8_4, AARCH64_FEATURE_SHA3): New.
opcodes * aarch64-tbl.h
(aarch64_feature_v8_4, aarch64_feature_crypto_v8_2): New.
(aarch64_feature_sm4, aarch64_feature_sha3): New.
(aarch64_feature_fp_16_v8_2): New.
(ARMV8_4, SHA3, SM4, CRYPTO_V8_2, FP_F16_V8_2): New.
(V8_4_INSN, CRYPTO_V8_2_INSN): New.
(SHA3_INSN, SM4_INSN, FP16_V8_2_INSN): New.
2017-11-09 19:21:31 +08:00
|
|
|
|
#define AARCH64_ARCH_V8_4 AARCH64_FEATURE (AARCH64_ARCH_V8_3, \
|
2017-11-09 23:50:56 +08:00
|
|
|
|
AARCH64_FEATURE_V8_4 \
|
2017-11-17 00:19:37 +08:00
|
|
|
|
| AARCH64_FEATURE_DOTPROD \
|
|
|
|
|
| AARCH64_FEATURE_F16_FML)
|
2018-09-26 17:38:59 +08:00
|
|
|
|
#define AARCH64_ARCH_V8_5 AARCH64_FEATURE (AARCH64_ARCH_V8_4, \
|
|
|
|
|
AARCH64_FEATURE_V8_5)
|
|
|
|
|
|
2015-06-04 18:14:07 +08:00
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
#define AARCH64_ARCH_NONE AARCH64_FEATURE (0, 0)
|
|
|
|
|
#define AARCH64_ANY AARCH64_FEATURE (-1, 0) /* Any basic core. */
|
|
|
|
|
|
|
|
|
|
/* CPU-specific features. */
|
2017-11-09 18:28:32 +08:00
|
|
|
|
typedef unsigned long long aarch64_feature_set;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
2016-07-01 23:20:50 +08:00
|
|
|
|
#define AARCH64_CPU_HAS_ALL_FEATURES(CPU,FEAT) \
|
|
|
|
|
((~(CPU) & (FEAT)) == 0)
|
|
|
|
|
|
|
|
|
|
#define AARCH64_CPU_HAS_ANY_FEATURES(CPU,FEAT) \
|
2012-08-13 22:52:54 +08:00
|
|
|
|
(((CPU) & (FEAT)) != 0)
|
|
|
|
|
|
2016-07-01 23:20:50 +08:00
|
|
|
|
#define AARCH64_CPU_HAS_FEATURE(CPU,FEAT) \
|
|
|
|
|
AARCH64_CPU_HAS_ALL_FEATURES (CPU,FEAT)
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
#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))
|
|
|
|
|
|
|
|
|
|
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][SVE 21/32] Add Zn and Pn registers
This patch adds the Zn and Pn registers, and associated fields and
operands.
include/
* opcode/aarch64.h (AARCH64_OPND_CLASS_SVE_REG): New
aarch64_operand_class.
(AARCH64_OPND_CLASS_PRED_REG): Likewise.
(AARCH64_OPND_SVE_Pd, AARCH64_OPND_SVE_Pg3, AARCH64_OPND_SVE_Pg4_5)
(AARCH64_OPND_SVE_Pg4_10, AARCH64_OPND_SVE_Pg4_16)
(AARCH64_OPND_SVE_Pm, AARCH64_OPND_SVE_Pn, AARCH64_OPND_SVE_Pt)
(AARCH64_OPND_SVE_Za_5, AARCH64_OPND_SVE_Za_16, AARCH64_OPND_SVE_Zd)
(AARCH64_OPND_SVE_Zm_5, AARCH64_OPND_SVE_Zm_16, AARCH64_OPND_SVE_Zn)
(AARCH64_OPND_SVE_Zn_INDEX, AARCH64_OPND_SVE_ZnxN)
(AARCH64_OPND_SVE_Zt, AARCH64_OPND_SVE_ZtxN): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for new SVE operands.
* aarch64-opc.h (FLD_SVE_Pd, FLD_SVE_Pg3, FLD_SVE_Pg4_5)
(FLD_SVE_Pg4_10, FLD_SVE_Pg4_16, FLD_SVE_Pm, FLD_SVE_Pn, FLD_SVE_Pt)
(FLD_SVE_Za_5, FLD_SVE_Za_16, FLD_SVE_Zd, FLD_SVE_Zm_5, FLD_SVE_Zm_16)
(FLD_SVE_Zn, FLD_SVE_Zt, FLD_SVE_tzsh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries here.
(operand_general_constraint_met_p): Check that SVE register lists
have the correct length. Check the ranges of SVE index registers.
Check for cases where p8-p15 are used in 3-bit predicate fields.
(aarch64_print_operand): Handle the new SVE operands.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_index, ins_sve_reglist): New inserters.
* aarch64-asm.c (aarch64_ins_sve_index): New function.
(aarch64_ins_sve_reglist): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_index, ext_sve_reglist): New extractors.
* aarch64-dis.c (aarch64_ext_sve_index): New function.
(aarch64_ext_sve_reglist): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (NTA_HASVARWIDTH): New macro.
(AARCH64_REG_TYPES): Add ZN and PN.
(get_reg_expected_msg): Handle them.
(parse_vector_type_for_operand): Add a reg_type parameter.
Skip the width for Zn and Pn registers.
(parse_typed_reg): Extend vector handling to Zn and Pn. Update the
call to parse_vector_type_for_operand. Set HASVARTYPE for Zn and Pn,
expecting the width to be 0.
(parse_vector_reg_list): Restrict error about [BHSD]nn operands to
REG_TYPE_VN.
(vectype_to_qualifier): Use S_[BHSD] qualifiers for NTA_HASVARWIDTH.
(parse_operands): Handle the new Zn and Pn operands.
(REGSET16): New macro, split out from...
(REGSET31): ...here.
(reg_names): Add Zn and Pn entries.
2016-09-21 23:53:54 +08:00
|
|
|
|
AARCH64_OPND_CLASS_SVE_REG,
|
|
|
|
|
AARCH64_OPND_CLASS_PRED_REG,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
AARCH64_OPND_CLASS_ADDRESS,
|
|
|
|
|
AARCH64_OPND_CLASS_IMMEDIATE,
|
|
|
|
|
AARCH64_OPND_CLASS_SYSTEM,
|
2013-11-06 04:50:18 +08:00
|
|
|
|
AARCH64_OPND_CLASS_COND,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* 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. */
|
2016-11-11 18:39:46 +08:00
|
|
|
|
AARCH64_OPND_Rm_SP, /* Integer Rm or SP. */
|
2014-09-03 21:40:41 +08:00
|
|
|
|
AARCH64_OPND_PAIRREG, /* Paired register operand. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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. */
|
|
|
|
|
|
Adds the new Fields and Operand types for the new instructions in Armv8.4-a.
gas/
* config/tc-aarch64.c (process_omitted_operand):
Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2
and AARCH64_OPND_IMM_2.
(parse_operands): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_IMM_2, AARCH64_OPND_MASK
and AARCH64_OPND_ADDR_OFFSET.
include/
* opcode/aarch64.h:
(aarch64_opnd): Add AARCH64_OPND_Va, AARCH64_OPND_MASK,
AARCH64_OPND_IMM_2, AARCH64_OPND_ADDR_OFFSET
and AARCH64_OPND_SM3_IMM2.
(aarch64_insn_class): Add cryptosm3 and cryptosm4.
(arch64_feature_set): Make uint64_t.
opcodes/
* aarch64-asm.h (ins_addr_offset): New.
* aarch64-asm.c (aarch64_ins_reglane): Add cryptosm3.
(aarch64_ins_addr_offset): New.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_addr_offset): New.
* aarch64-dis.c (aarch64_ext_reglane): Add cryptosm3.
(aarch64_ext_addr_offset): New.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (aarch64_field_kind): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
* aarch64-opc.c (fields): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
(operand_general_constraint_met_p): Add AARCH64_OPND_ADDR_OFFSET.
(aarch64_print_operand): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_MASK, AARCH64_OPND_IMM_2 and AARCH64_OPND_ADDR_OFFSET.
* aarch64-opc-2.c (Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2): New.
* aarch64-tbl.h
(aarch64_opcode_table): Add Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2.
2017-11-09 23:22:30 +08:00
|
|
|
|
AARCH64_OPND_Va, /* AdvSIMD Vector Va. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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. */
|
Fix AArch64 encodings for by element instructions.
Some instructions in Armv8-a place a limitation on FP16 registers that can be
used as the register from which to select an element from.
e.g. fmla restricts Rm to 4 bits when using an FP16 register. This restriction
does not apply for all instructions, e.g. fcmla does not have this restriction
as it gets an extra bit from the M field.
Unfortunately, this restriction to S_H was added for all _Em operands before,
meaning for a large number of instructions you couldn't use the full register
file.
This fixes the issue by introducing a new operand _Em16 which applies this
restriction only when paired with S_H and leaves the _Em and the other
qualifiers for _Em16 unbounded (i.e. using the full 5 bit range).
Also the patch updates all instructions that should be affected by this.
opcodes/
PR binutils/23192
* aarch64-asm-2.c: Regenerate.
* aarch64-dis-2.c: Likewise.
* aarch64-opc-2.c: Likewise.
* aarch64-dis.c (aarch64_ext_reglane): Add AARCH64_OPND_Em16 constraint.
* aarch64-opc.c (operand_general_constraint_met_p,
aarch64_print_operand): Likewise.
* aarch64-tbl.h (aarch64_opcode_table): Change Em to Em16 for smlal,
smlal2, fmla, fmls, fmul, fmulx, sqrdmlah, sqrdlsh, fmlal, fmlsl,
fmlal2, fmlsl2.
(AARCH64_OPERANDS): Add Em2.
gas/
PR binutils/23192
* config/tc-aarch64.c (process_omitted_operand, parse_operands): Add
AARCH64_OPND_Em16
* testsuite/gas/aarch64/advsimd-armv8_3.s: Expand tests to cover upper
16 registers.
* testsuite/gas/aarch64/advsimd-armv8_3.d: Likewise.
* testsuite/gas/aarch64/advsimd-compnum.s: Likewise.
* testsuite/gas/aarch64/advsimd-compnum.d: Likewise.
* testsuite/gas/aarch64/sve.d: Likewise.
include/
PR binutils/23192
*opcode/aarch64.h (aarch64_opnd): Add AARCH64_OPND_Em16.
2018-06-29 19:12:27 +08:00
|
|
|
|
AARCH64_OPND_Em16, /* AdvSIMD Vector Element Vm restricted to V0 - V15 when
|
|
|
|
|
qualifier is S_H. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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. */
|
|
|
|
|
|
2016-12-13 20:37:18 +08:00
|
|
|
|
AARCH64_OPND_CRn, /* Co-processor register in CRn field. */
|
|
|
|
|
AARCH64_OPND_CRm, /* Co-processor register in CRm field. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
AARCH64_OPND_IDX, /* AdvSIMD EXT index operand. */
|
Adds the new Fields and Operand types for the new instructions in Armv8.4-a.
gas/
* config/tc-aarch64.c (process_omitted_operand):
Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2
and AARCH64_OPND_IMM_2.
(parse_operands): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_IMM_2, AARCH64_OPND_MASK
and AARCH64_OPND_ADDR_OFFSET.
include/
* opcode/aarch64.h:
(aarch64_opnd): Add AARCH64_OPND_Va, AARCH64_OPND_MASK,
AARCH64_OPND_IMM_2, AARCH64_OPND_ADDR_OFFSET
and AARCH64_OPND_SM3_IMM2.
(aarch64_insn_class): Add cryptosm3 and cryptosm4.
(arch64_feature_set): Make uint64_t.
opcodes/
* aarch64-asm.h (ins_addr_offset): New.
* aarch64-asm.c (aarch64_ins_reglane): Add cryptosm3.
(aarch64_ins_addr_offset): New.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_addr_offset): New.
* aarch64-dis.c (aarch64_ext_reglane): Add cryptosm3.
(aarch64_ext_addr_offset): New.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (aarch64_field_kind): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
* aarch64-opc.c (fields): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
(operand_general_constraint_met_p): Add AARCH64_OPND_ADDR_OFFSET.
(aarch64_print_operand): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_MASK, AARCH64_OPND_IMM_2 and AARCH64_OPND_ADDR_OFFSET.
* aarch64-opc-2.c (Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2): New.
* aarch64-tbl.h
(aarch64_opcode_table): Add Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2.
2017-11-09 23:22:30 +08:00
|
|
|
|
AARCH64_OPND_MASK, /* AdvSIMD EXT index operand. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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. */
|
Adds the new Fields and Operand types for the new instructions in Armv8.4-a.
gas/
* config/tc-aarch64.c (process_omitted_operand):
Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2
and AARCH64_OPND_IMM_2.
(parse_operands): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_IMM_2, AARCH64_OPND_MASK
and AARCH64_OPND_ADDR_OFFSET.
include/
* opcode/aarch64.h:
(aarch64_opnd): Add AARCH64_OPND_Va, AARCH64_OPND_MASK,
AARCH64_OPND_IMM_2, AARCH64_OPND_ADDR_OFFSET
and AARCH64_OPND_SM3_IMM2.
(aarch64_insn_class): Add cryptosm3 and cryptosm4.
(arch64_feature_set): Make uint64_t.
opcodes/
* aarch64-asm.h (ins_addr_offset): New.
* aarch64-asm.c (aarch64_ins_reglane): Add cryptosm3.
(aarch64_ins_addr_offset): New.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_addr_offset): New.
* aarch64-dis.c (aarch64_ext_reglane): Add cryptosm3.
(aarch64_ext_addr_offset): New.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (aarch64_field_kind): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
* aarch64-opc.c (fields): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
(operand_general_constraint_met_p): Add AARCH64_OPND_ADDR_OFFSET.
(aarch64_print_operand): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_MASK, AARCH64_OPND_IMM_2 and AARCH64_OPND_ADDR_OFFSET.
* aarch64-opc-2.c (Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2): New.
* aarch64-tbl.h
(aarch64_opcode_table): Add Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2.
2017-11-09 23:22:30 +08:00
|
|
|
|
AARCH64_OPND_IMM_2, /* Immediate. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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][SVE 27/32] Add SVE integer immediate operands
This patch adds the new SVE integer immediate operands. There are
three kinds:
- simple signed and unsigned ranges, but with new widths and positions.
- 13-bit logical immediates. These have the same form as in base AArch64,
but at a different bit position.
In the case of the "MOV Zn.<T>, #<limm>" alias of DUPM, the logical
immediate <limm> is not allowed to be a valid DUP immediate, since DUP
is preferred over DUPM for constants that both instructions can handle.
- a new 9-bit arithmetic immediate, of the form "<imm8>{, LSL #8}".
In some contexts the operand is signed and in others it's unsigned.
As an extension, we allow shifted immediates to be written as a single
integer, e.g. "#256" is equivalent to "#1, LSL #8". We also use the
shiftless form as the preferred disassembly, except for the special
case of "#0, LSL #8" (a redundant encoding of 0).
include/
* opcode/aarch64.h (AARCH64_OPND_SIMM5): New aarch64_opnd.
(AARCH64_OPND_SVE_AIMM, AARCH64_OPND_SVE_ASIMM)
(AARCH64_OPND_SVE_INV_LIMM, AARCH64_OPND_SVE_LIMM)
(AARCH64_OPND_SVE_LIMM_MOV, AARCH64_OPND_SVE_SHLIMM_PRED)
(AARCH64_OPND_SVE_SHLIMM_UNPRED, AARCH64_OPND_SVE_SHRIMM_PRED)
(AARCH64_OPND_SVE_SHRIMM_UNPRED, AARCH64_OPND_SVE_SIMM5)
(AARCH64_OPND_SVE_SIMM5B, AARCH64_OPND_SVE_SIMM6)
(AARCH64_OPND_SVE_SIMM8, AARCH64_OPND_SVE_UIMM3)
(AARCH64_OPND_SVE_UIMM7, AARCH64_OPND_SVE_UIMM8)
(AARCH64_OPND_SVE_UIMM8_53): Likewise.
(aarch64_sve_dupm_mov_immediate_p): Declare.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for the new SVE
integer immediate operands.
* aarch64-opc.h (FLD_SVE_immN, FLD_SVE_imm3, FLD_SVE_imm5)
(FLD_SVE_imm5b, FLD_SVE_imm7, FLD_SVE_imm8, FLD_SVE_imm9)
(FLD_SVE_immr, FLD_SVE_imms, FLD_SVE_tszh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries.
(operand_general_constraint_met_p): Handle the new SVE integer
immediate operands.
(aarch64_print_operand): Likewise.
(aarch64_sve_dupm_mov_immediate_p): New function.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_inv_limm, ins_sve_aimm, ins_sve_asimm)
(ins_sve_limm_mov, ins_sve_shlimm, ins_sve_shrimm): New inserters.
* aarch64-asm.c (aarch64_ins_limm_1): New function, split out from...
(aarch64_ins_limm): ...here.
(aarch64_ins_inv_limm): New function.
(aarch64_ins_sve_aimm): Likewise.
(aarch64_ins_sve_asimm): Likewise.
(aarch64_ins_sve_limm_mov): Likewise.
(aarch64_ins_sve_shlimm): Likewise.
(aarch64_ins_sve_shrimm): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_inv_limm, ext_sve_aimm, ext_sve_asimm)
(ext_sve_limm_mov, ext_sve_shlimm, ext_sve_shrimm): New extractors.
* aarch64-dis.c (decode_limm): New function, split out from...
(aarch64_ext_limm): ...here.
(aarch64_ext_inv_limm): New function.
(decode_sve_aimm): Likewise.
(aarch64_ext_sve_aimm): Likewise.
(aarch64_ext_sve_asimm): Likewise.
(aarch64_ext_sve_limm_mov): Likewise.
(aarch64_top_bit): Likewise.
(aarch64_ext_sve_shlimm): Likewise.
(aarch64_ext_sve_shrimm): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (parse_operands): Handle the new SVE integer
immediate operands.
2016-09-21 23:56:57 +08:00
|
|
|
|
AARCH64_OPND_SIMM5, /* 5-bit signed immediate in the imm5 field. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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] Add ARMv8.3 FCMLA and FCADD instructions
Add support for FCMLA and FCADD complex arithmetic SIMD instructions.
FCMLA has an indexed element variant where the index range has to be
treated specially because a complex number takes two elements and the
indexed vector size depends on the other operands.
These complex number SIMD instructions are part of ARMv8.3
https://community.arm.com/groups/processors/blog/2016/10/27/armv8-a-architecture-2016-additions
include/
2016-11-18 Szabolcs Nagy <szabolcs.nagy@arm.com>
* opcode/aarch64.h (enum aarch64_opnd): Add AARCH64_OPND_IMM_ROT1,
AARCH64_OPND_IMM_ROT2, AARCH64_OPND_IMM_ROT3.
(enum aarch64_op): Add OP_FCMLA_ELEM.
opcodes/
2016-11-18 Szabolcs Nagy <szabolcs.nagy@arm.com>
* aarch64-tbl.h (QL_V3SAMEHSD_ROT, QL_ELEMENT_ROT): Define.
(aarch64_feature_simd_v8_3, SIMD_V8_3): Define.
(aarch64_opcode_table): Add fcmla and fcadd.
(AARCH64_OPERANDS): Add IMM_ROT{1,2,3}.
* aarch64-asm.h (aarch64_ins_imm_rotate): Declare.
* aarch64-asm.c (aarch64_ins_imm_rotate): Define.
* aarch64-dis.h (aarch64_ext_imm_rotate): Declare.
* aarch64-dis.c (aarch64_ext_imm_rotate): Define.
* aarch64-opc.h (enum aarch64_field_kind): Add FLD_rotate{1,2,3}.
* aarch64-opc.c (fields): Add FLD_rotate{1,2,3}.
(operand_general_constraint_met_p): Rotate and index range check.
(aarch64_print_operand): Handle rotate operand.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis-2.c: Likewise.
* aarch64-opc-2.c: Likewise.
gas/
2016-11-18 Szabolcs Nagy <szabolcs.nagy@arm.com>
* config/tc-aarch64.c (parse_operands): Handle AARCH64_OPND_IMM_ROT*.
* testsuite/gas/aarch64/advsimd-armv8_3.d: New.
* testsuite/gas/aarch64/advsimd-armv8_3.s: New.
* testsuite/gas/aarch64/illegal-fcmla.s: New.
* testsuite/gas/aarch64/illegal-fcmla.l: New.
* testsuite/gas/aarch64/illegal-fcmla.d: New.
2016-11-18 18:02:16 +08:00
|
|
|
|
AARCH64_OPND_IMM_ROT1, /* Immediate rotate operand for FCMLA. */
|
|
|
|
|
AARCH64_OPND_IMM_ROT2, /* Immediate rotate operand for indexed FCMLA. */
|
|
|
|
|
AARCH64_OPND_IMM_ROT3, /* Immediate rotate operand for FCADD. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
AARCH64_OPND_COND, /* Standard condition as the last operand. */
|
2013-11-06 04:50:18 +08:00
|
|
|
|
AARCH64_OPND_COND1, /* Same as the above, but excluding AL and NV. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
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. */
|
2016-11-18 17:49:06 +08:00
|
|
|
|
AARCH64_OPND_ADDR_SIMM10, /* Address of signed 10-bit immediate. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
AARCH64_OPND_ADDR_UIMM12, /* Address of unsigned 12-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SIMD_ADDR_SIMPLE,/* Address of ld/st multiple structures. */
|
Adds the new Fields and Operand types for the new instructions in Armv8.4-a.
gas/
* config/tc-aarch64.c (process_omitted_operand):
Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2
and AARCH64_OPND_IMM_2.
(parse_operands): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_IMM_2, AARCH64_OPND_MASK
and AARCH64_OPND_ADDR_OFFSET.
include/
* opcode/aarch64.h:
(aarch64_opnd): Add AARCH64_OPND_Va, AARCH64_OPND_MASK,
AARCH64_OPND_IMM_2, AARCH64_OPND_ADDR_OFFSET
and AARCH64_OPND_SM3_IMM2.
(aarch64_insn_class): Add cryptosm3 and cryptosm4.
(arch64_feature_set): Make uint64_t.
opcodes/
* aarch64-asm.h (ins_addr_offset): New.
* aarch64-asm.c (aarch64_ins_reglane): Add cryptosm3.
(aarch64_ins_addr_offset): New.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_addr_offset): New.
* aarch64-dis.c (aarch64_ext_reglane): Add cryptosm3.
(aarch64_ext_addr_offset): New.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (aarch64_field_kind): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
* aarch64-opc.c (fields): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
(operand_general_constraint_met_p): Add AARCH64_OPND_ADDR_OFFSET.
(aarch64_print_operand): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_MASK, AARCH64_OPND_IMM_2 and AARCH64_OPND_ADDR_OFFSET.
* aarch64-opc-2.c (Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2): New.
* aarch64-tbl.h
(aarch64_opcode_table): Add Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2.
2017-11-09 23:22:30 +08:00
|
|
|
|
AARCH64_OPND_ADDR_OFFSET, /* Address with an optional 9-bit immediate. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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. */
|
2015-12-11 18:22:40 +08:00
|
|
|
|
AARCH64_OPND_BARRIER_PSB, /* Barrier operand for PSB. */
|
[AArch64][SVE 21/32] Add Zn and Pn registers
This patch adds the Zn and Pn registers, and associated fields and
operands.
include/
* opcode/aarch64.h (AARCH64_OPND_CLASS_SVE_REG): New
aarch64_operand_class.
(AARCH64_OPND_CLASS_PRED_REG): Likewise.
(AARCH64_OPND_SVE_Pd, AARCH64_OPND_SVE_Pg3, AARCH64_OPND_SVE_Pg4_5)
(AARCH64_OPND_SVE_Pg4_10, AARCH64_OPND_SVE_Pg4_16)
(AARCH64_OPND_SVE_Pm, AARCH64_OPND_SVE_Pn, AARCH64_OPND_SVE_Pt)
(AARCH64_OPND_SVE_Za_5, AARCH64_OPND_SVE_Za_16, AARCH64_OPND_SVE_Zd)
(AARCH64_OPND_SVE_Zm_5, AARCH64_OPND_SVE_Zm_16, AARCH64_OPND_SVE_Zn)
(AARCH64_OPND_SVE_Zn_INDEX, AARCH64_OPND_SVE_ZnxN)
(AARCH64_OPND_SVE_Zt, AARCH64_OPND_SVE_ZtxN): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for new SVE operands.
* aarch64-opc.h (FLD_SVE_Pd, FLD_SVE_Pg3, FLD_SVE_Pg4_5)
(FLD_SVE_Pg4_10, FLD_SVE_Pg4_16, FLD_SVE_Pm, FLD_SVE_Pn, FLD_SVE_Pt)
(FLD_SVE_Za_5, FLD_SVE_Za_16, FLD_SVE_Zd, FLD_SVE_Zm_5, FLD_SVE_Zm_16)
(FLD_SVE_Zn, FLD_SVE_Zt, FLD_SVE_tzsh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries here.
(operand_general_constraint_met_p): Check that SVE register lists
have the correct length. Check the ranges of SVE index registers.
Check for cases where p8-p15 are used in 3-bit predicate fields.
(aarch64_print_operand): Handle the new SVE operands.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_index, ins_sve_reglist): New inserters.
* aarch64-asm.c (aarch64_ins_sve_index): New function.
(aarch64_ins_sve_reglist): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_index, ext_sve_reglist): New extractors.
* aarch64-dis.c (aarch64_ext_sve_index): New function.
(aarch64_ext_sve_reglist): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (NTA_HASVARWIDTH): New macro.
(AARCH64_REG_TYPES): Add ZN and PN.
(get_reg_expected_msg): Handle them.
(parse_vector_type_for_operand): Add a reg_type parameter.
Skip the width for Zn and Pn registers.
(parse_typed_reg): Extend vector handling to Zn and Pn. Update the
call to parse_vector_type_for_operand. Set HASVARTYPE for Zn and Pn,
expecting the width to be 0.
(parse_vector_reg_list): Restrict error about [BHSD]nn operands to
REG_TYPE_VN.
(vectype_to_qualifier): Use S_[BHSD] qualifiers for NTA_HASVARWIDTH.
(parse_operands): Handle the new Zn and Pn operands.
(REGSET16): New macro, split out from...
(REGSET31): ...here.
(reg_names): Add Zn and Pn entries.
2016-09-21 23:53:54 +08:00
|
|
|
|
|
[AArch64] Additional SVE instructions
This patch supports some additions to the SVE architecture prior to
its public release.
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_ADDR_RI_S4x16)
(AARCH64_OPND_SVE_IMM_ROT1, AARCH64_OPND_SVE_IMM_ROT2)
(AARCH64_OPND_SVE_Zm3_INDEX, AARCH64_OPND_SVE_Zm3_22_INDEX)
(AARCH64_OPND_SVE_Zm4_INDEX): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (OP_SVE_HMH, OP_SVE_VMU_HSD, OP_SVE_VMVU_HSD)
(OP_SVE_VMVV_HSD, OP_SVE_VMVVU_HSD, OP_SVE_VM_HSD, OP_SVE_VUVV_HSD)
(OP_SVE_VUV_HSD, OP_SVE_VU_HSD, OP_SVE_VVVU_H, OP_SVE_VVVU_S)
(OP_SVE_VVVU_HSD, OP_SVE_VVV_D, OP_SVE_VVV_D_H, OP_SVE_VVV_H)
(OP_SVE_VVV_HSD, OP_SVE_VVV_S, OP_SVE_VVV_S_B, OP_SVE_VVV_SD_BH)
(OP_SVE_VV_BHSDQ, OP_SVE_VV_HSD, OP_SVE_VZVV_HSD, OP_SVE_VZV_HSD)
(OP_SVE_V_HSD): New macros.
(OP_SVE_VMU_SD, OP_SVE_VMVU_SD, OP_SVE_VM_SD, OP_SVE_VUVV_SD)
(OP_SVE_VU_SD, OP_SVE_VVVU_SD, OP_SVE_VVV_SD, OP_SVE_VZVV_SD)
(OP_SVE_VZV_SD, OP_SVE_V_SD): Delete.
(aarch64_opcode_table): Add new SVE instructions.
(aarch64_opcode_table): Use imm_rotate{1,2} instead of imm_rotate
for rotation operands. Add new SVE operands.
* aarch64-asm.h (ins_sve_addr_ri_s4): New inserter.
(ins_sve_quad_index): Likewise.
(ins_imm_rotate): Split into...
(ins_imm_rotate1, ins_imm_rotate2): ...these two inserters.
* aarch64-asm.c (aarch64_ins_imm_rotate): Split into...
(aarch64_ins_imm_rotate1, aarch64_ins_imm_rotate2): ...these two
functions.
(aarch64_ins_sve_addr_ri_s4): New function.
(aarch64_ins_sve_quad_index): Likewise.
(do_misc_encoding): Handle "MOV Zn.Q, Qm".
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_addr_ri_s4): New extractor.
(ext_sve_quad_index): Likewise.
(ext_imm_rotate): Split into...
(ext_imm_rotate1, ext_imm_rotate2): ...these two extractors.
* aarch64-dis.c (aarch64_ext_imm_rotate): Split into...
(aarch64_ext_imm_rotate1, aarch64_ext_imm_rotate2): ...these two
functions.
(aarch64_ext_sve_addr_ri_s4): New function.
(aarch64_ext_sve_quad_index): Likewise.
(aarch64_ext_sve_index): Allow quad indices.
(do_misc_decoding): Likewise.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (FLD_SVE_i3h, FLD_SVE_rot1, FLD_SVE_rot2): New
aarch64_field_kinds.
(OPD_F_OD_MASK): Widen by one bit.
(OPD_F_NO_ZR): Bump accordingly.
(get_operand_field_width): New function.
* aarch64-opc.c (fields): Add new SVE fields.
(operand_general_constraint_met_p): Handle new SVE operands.
(aarch64_print_operand): Likewise.
* aarch64-opc-2.c: Regenerate.
gas/
* doc/c-aarch64.texi: Document that sve implies fp16, simd and compnum.
* config/tc-aarch64.c (parse_vector_type_for_operand): Allow .q
to be used with SVE registers.
(parse_operands): Handle new SVE operands.
(aarch64_features): Make "sve" require F16 rather than FP. Also
require COMPNUM.
* testsuite/gas/aarch64/sve.s: Add tests for new instructions.
Include compnum tests.
* testsuite/gas/aarch64/sve.d: Update accordingly.
* testsuite/gas/aarch64/sve-invalid.s: Add tests for new instructions.
* testsuite/gas/aarch64/sve-invalid.l: Update accordingly. Also
update expected output for new FMOV and MOV alternatives.
2017-02-25 02:29:00 +08:00
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_S4x16, /* SVE [<Xn|SP>, #<simm4>*16]. */
|
[AArch64][SVE 26/32] Add SVE MUL VL addressing modes
This patch adds support for addresses of the form:
[<base>, #<offset>, MUL VL]
This involves adding a new AARCH64_MOD_MUL_VL modifier, which is
why I split it out from the other addressing modes.
For LD2, LD3 and LD4, the offset must be a multiple of the structure
size, so for LD3 the possible values are 0, 3, 6, .... The patch
therefore extends value_aligned_p to handle non-power-of-2 alignments.
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_ADDR_RI_S4xVL): New aarch64_opnd.
(AARCH64_OPND_SVE_ADDR_RI_S4x2xVL, AARCH64_OPND_SVE_ADDR_RI_S4x3xVL)
(AARCH64_OPND_SVE_ADDR_RI_S4x4xVL, AARCH64_OPND_SVE_ADDR_RI_S6xVL)
(AARCH64_OPND_SVE_ADDR_RI_S9xVL): Likewise.
(AARCH64_MOD_MUL_VL): New aarch64_modifier_kind.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for new MUL VL
operands.
* aarch64-opc.c (aarch64_operand_modifiers): Initialize
the AARCH64_MOD_MUL_VL entry.
(value_aligned_p): Cope with non-power-of-two alignments.
(operand_general_constraint_met_p): Handle the new MUL VL addresses.
(print_immediate_offset_address): Likewise.
(aarch64_print_operand): Likewise.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_addr_ri_s4xvl, ins_sve_addr_ri_s6xvl)
(ins_sve_addr_ri_s9xvl): New inserters.
* aarch64-asm.c (aarch64_ins_sve_addr_ri_s4xvl): New function.
(aarch64_ins_sve_addr_ri_s6xvl): Likewise.
(aarch64_ins_sve_addr_ri_s9xvl): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_addr_ri_s4xvl, ext_sve_addr_ri_s6xvl)
(ext_sve_addr_ri_s9xvl): New extractors.
* aarch64-dis.c (aarch64_ext_sve_addr_reg_mul_vl): New function.
(aarch64_ext_sve_addr_ri_s4xvl): Likewise.
(aarch64_ext_sve_addr_ri_s6xvl): Likewise.
(aarch64_ext_sve_addr_ri_s9xvl): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (SHIFTED_NONE, SHIFTED_MUL_VL): New
parse_shift_modes.
(parse_shift): Handle SHIFTED_MUL_VL.
(parse_address_main): Add an imm_shift_mode parameter.
(parse_address, parse_sve_address): Update accordingly.
(parse_operands): Handle MUL VL addressing modes.
2016-09-21 23:56:15 +08:00
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_S4xVL, /* SVE [<Xn|SP>, #<simm4>, MUL VL]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_S4x2xVL, /* SVE [<Xn|SP>, #<simm4>*2, MUL VL]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_S4x3xVL, /* SVE [<Xn|SP>, #<simm4>*3, MUL VL]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_S4x4xVL, /* SVE [<Xn|SP>, #<simm4>*4, MUL VL]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_S6xVL, /* SVE [<Xn|SP>, #<simm6>, MUL VL]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_S9xVL, /* SVE [<Xn|SP>, #<simm9>, MUL VL]. */
|
[AArch64][SVE 25/32] Add support for SVE addressing modes
This patch adds most of the new SVE addressing modes and associated
operands. A follow-on patch adds MUL VL, since handling it separately
makes the changes easier to read.
The patch also introduces a new "operand-dependent data" field to the
operand flags, based closely on the existing one for opcode flags.
For SVE this new field needs only 2 bits, but it could be widened
in future if necessary.
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_ADDR_RI_U6): New aarch64_opnd.
(AARCH64_OPND_SVE_ADDR_RI_U6x2, AARCH64_OPND_SVE_ADDR_RI_U6x4)
(AARCH64_OPND_SVE_ADDR_RI_U6x8, AARCH64_OPND_SVE_ADDR_RR)
(AARCH64_OPND_SVE_ADDR_RR_LSL1, AARCH64_OPND_SVE_ADDR_RR_LSL2)
(AARCH64_OPND_SVE_ADDR_RR_LSL3, AARCH64_OPND_SVE_ADDR_RX)
(AARCH64_OPND_SVE_ADDR_RX_LSL1, AARCH64_OPND_SVE_ADDR_RX_LSL2)
(AARCH64_OPND_SVE_ADDR_RX_LSL3, AARCH64_OPND_SVE_ADDR_RZ)
(AARCH64_OPND_SVE_ADDR_RZ_LSL1, AARCH64_OPND_SVE_ADDR_RZ_LSL2)
(AARCH64_OPND_SVE_ADDR_RZ_LSL3, AARCH64_OPND_SVE_ADDR_RZ_XTW_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW_22, AARCH64_OPND_SVE_ADDR_RZ_XTW1_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW1_22, AARCH64_OPND_SVE_ADDR_RZ_XTW2_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW2_22, AARCH64_OPND_SVE_ADDR_RZ_XTW3_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW3_22, AARCH64_OPND_SVE_ADDR_ZI_U5)
(AARCH64_OPND_SVE_ADDR_ZI_U5x2, AARCH64_OPND_SVE_ADDR_ZI_U5x4)
(AARCH64_OPND_SVE_ADDR_ZI_U5x8, AARCH64_OPND_SVE_ADDR_ZZ_LSL)
(AARCH64_OPND_SVE_ADDR_ZZ_SXTW, AARCH64_OPND_SVE_ADDR_ZZ_UXTW):
Likewise.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for the new SVE
address operands.
* aarch64-opc.h (FLD_SVE_imm6, FLD_SVE_msz, FLD_SVE_xs_14)
(FLD_SVE_xs_22): New aarch64_field_kinds.
(OPD_F_OD_MASK, OPD_F_OD_LSB, OPD_F_NO_ZR): New flags.
(get_operand_specific_data): New function.
* aarch64-opc.c (fields): Add entries for FLD_SVE_imm6, FLD_SVE_msz,
FLD_SVE_xs_14 and FLD_SVE_xs_22.
(operand_general_constraint_met_p): Handle the new SVE address
operands.
(sve_reg): New array.
(get_addr_sve_reg_name): New function.
(aarch64_print_operand): Handle the new SVE address operands.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_addr_ri_u6, ins_sve_addr_rr_lsl)
(ins_sve_addr_rz_xtw, ins_sve_addr_zi_u5, ins_sve_addr_zz_lsl)
(ins_sve_addr_zz_sxtw, ins_sve_addr_zz_uxtw): New inserters.
* aarch64-asm.c (aarch64_ins_sve_addr_ri_u6): New function.
(aarch64_ins_sve_addr_rr_lsl): Likewise.
(aarch64_ins_sve_addr_rz_xtw): Likewise.
(aarch64_ins_sve_addr_zi_u5): Likewise.
(aarch64_ins_sve_addr_zz): Likewise.
(aarch64_ins_sve_addr_zz_lsl): Likewise.
(aarch64_ins_sve_addr_zz_sxtw): Likewise.
(aarch64_ins_sve_addr_zz_uxtw): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_addr_ri_u6, ext_sve_addr_rr_lsl)
(ext_sve_addr_rz_xtw, ext_sve_addr_zi_u5, ext_sve_addr_zz_lsl)
(ext_sve_addr_zz_sxtw, ext_sve_addr_zz_uxtw): New extractors.
* aarch64-dis.c (aarch64_ext_sve_add_reg_imm): New function.
(aarch64_ext_sve_addr_ri_u6): Likewise.
(aarch64_ext_sve_addr_rr_lsl): Likewise.
(aarch64_ext_sve_addr_rz_xtw): Likewise.
(aarch64_ext_sve_addr_zi_u5): Likewise.
(aarch64_ext_sve_addr_zz): Likewise.
(aarch64_ext_sve_addr_zz_lsl): Likewise.
(aarch64_ext_sve_addr_zz_sxtw): Likewise.
(aarch64_ext_sve_addr_zz_uxtw): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (REG_TYPE_SVE_BASE, REG_TYPE_SVE_OFFSET): New
register types.
(get_reg_expected_msg): Handle them.
(aarch64_addr_reg_parse): New function, split out from
aarch64_reg_parse_32_64. Handle Z registers too.
(aarch64_reg_parse_32_64): Call it.
(parse_address_main): Add base_qualifier, offset_qualifier,
base_type and offset_type parameters. Handle SVE base and offset
registers.
(parse_address): Update call to parse_address_main.
(parse_sve_address): New function.
(parse_operands): Parse the new SVE address operands.
2016-09-21 23:55:49 +08:00
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_U6, /* SVE [<Xn|SP>, #<uimm6>]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_U6x2, /* SVE [<Xn|SP>, #<uimm6>*2]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_U6x4, /* SVE [<Xn|SP>, #<uimm6>*4]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RI_U6x8, /* SVE [<Xn|SP>, #<uimm6>*8]. */
|
2018-03-28 16:44:45 +08:00
|
|
|
|
AARCH64_OPND_SVE_ADDR_R, /* SVE [<Xn|SP>]. */
|
[AArch64][SVE 25/32] Add support for SVE addressing modes
This patch adds most of the new SVE addressing modes and associated
operands. A follow-on patch adds MUL VL, since handling it separately
makes the changes easier to read.
The patch also introduces a new "operand-dependent data" field to the
operand flags, based closely on the existing one for opcode flags.
For SVE this new field needs only 2 bits, but it could be widened
in future if necessary.
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_ADDR_RI_U6): New aarch64_opnd.
(AARCH64_OPND_SVE_ADDR_RI_U6x2, AARCH64_OPND_SVE_ADDR_RI_U6x4)
(AARCH64_OPND_SVE_ADDR_RI_U6x8, AARCH64_OPND_SVE_ADDR_RR)
(AARCH64_OPND_SVE_ADDR_RR_LSL1, AARCH64_OPND_SVE_ADDR_RR_LSL2)
(AARCH64_OPND_SVE_ADDR_RR_LSL3, AARCH64_OPND_SVE_ADDR_RX)
(AARCH64_OPND_SVE_ADDR_RX_LSL1, AARCH64_OPND_SVE_ADDR_RX_LSL2)
(AARCH64_OPND_SVE_ADDR_RX_LSL3, AARCH64_OPND_SVE_ADDR_RZ)
(AARCH64_OPND_SVE_ADDR_RZ_LSL1, AARCH64_OPND_SVE_ADDR_RZ_LSL2)
(AARCH64_OPND_SVE_ADDR_RZ_LSL3, AARCH64_OPND_SVE_ADDR_RZ_XTW_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW_22, AARCH64_OPND_SVE_ADDR_RZ_XTW1_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW1_22, AARCH64_OPND_SVE_ADDR_RZ_XTW2_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW2_22, AARCH64_OPND_SVE_ADDR_RZ_XTW3_14)
(AARCH64_OPND_SVE_ADDR_RZ_XTW3_22, AARCH64_OPND_SVE_ADDR_ZI_U5)
(AARCH64_OPND_SVE_ADDR_ZI_U5x2, AARCH64_OPND_SVE_ADDR_ZI_U5x4)
(AARCH64_OPND_SVE_ADDR_ZI_U5x8, AARCH64_OPND_SVE_ADDR_ZZ_LSL)
(AARCH64_OPND_SVE_ADDR_ZZ_SXTW, AARCH64_OPND_SVE_ADDR_ZZ_UXTW):
Likewise.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for the new SVE
address operands.
* aarch64-opc.h (FLD_SVE_imm6, FLD_SVE_msz, FLD_SVE_xs_14)
(FLD_SVE_xs_22): New aarch64_field_kinds.
(OPD_F_OD_MASK, OPD_F_OD_LSB, OPD_F_NO_ZR): New flags.
(get_operand_specific_data): New function.
* aarch64-opc.c (fields): Add entries for FLD_SVE_imm6, FLD_SVE_msz,
FLD_SVE_xs_14 and FLD_SVE_xs_22.
(operand_general_constraint_met_p): Handle the new SVE address
operands.
(sve_reg): New array.
(get_addr_sve_reg_name): New function.
(aarch64_print_operand): Handle the new SVE address operands.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_addr_ri_u6, ins_sve_addr_rr_lsl)
(ins_sve_addr_rz_xtw, ins_sve_addr_zi_u5, ins_sve_addr_zz_lsl)
(ins_sve_addr_zz_sxtw, ins_sve_addr_zz_uxtw): New inserters.
* aarch64-asm.c (aarch64_ins_sve_addr_ri_u6): New function.
(aarch64_ins_sve_addr_rr_lsl): Likewise.
(aarch64_ins_sve_addr_rz_xtw): Likewise.
(aarch64_ins_sve_addr_zi_u5): Likewise.
(aarch64_ins_sve_addr_zz): Likewise.
(aarch64_ins_sve_addr_zz_lsl): Likewise.
(aarch64_ins_sve_addr_zz_sxtw): Likewise.
(aarch64_ins_sve_addr_zz_uxtw): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_addr_ri_u6, ext_sve_addr_rr_lsl)
(ext_sve_addr_rz_xtw, ext_sve_addr_zi_u5, ext_sve_addr_zz_lsl)
(ext_sve_addr_zz_sxtw, ext_sve_addr_zz_uxtw): New extractors.
* aarch64-dis.c (aarch64_ext_sve_add_reg_imm): New function.
(aarch64_ext_sve_addr_ri_u6): Likewise.
(aarch64_ext_sve_addr_rr_lsl): Likewise.
(aarch64_ext_sve_addr_rz_xtw): Likewise.
(aarch64_ext_sve_addr_zi_u5): Likewise.
(aarch64_ext_sve_addr_zz): Likewise.
(aarch64_ext_sve_addr_zz_lsl): Likewise.
(aarch64_ext_sve_addr_zz_sxtw): Likewise.
(aarch64_ext_sve_addr_zz_uxtw): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (REG_TYPE_SVE_BASE, REG_TYPE_SVE_OFFSET): New
register types.
(get_reg_expected_msg): Handle them.
(aarch64_addr_reg_parse): New function, split out from
aarch64_reg_parse_32_64. Handle Z registers too.
(aarch64_reg_parse_32_64): Call it.
(parse_address_main): Add base_qualifier, offset_qualifier,
base_type and offset_type parameters. Handle SVE base and offset
registers.
(parse_address): Update call to parse_address_main.
(parse_sve_address): New function.
(parse_operands): Parse the new SVE address operands.
2016-09-21 23:55:49 +08:00
|
|
|
|
AARCH64_OPND_SVE_ADDR_RR, /* SVE [<Xn|SP>, <Xm|XZR>]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RR_LSL1, /* SVE [<Xn|SP>, <Xm|XZR>, LSL #1]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RR_LSL2, /* SVE [<Xn|SP>, <Xm|XZR>, LSL #2]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RR_LSL3, /* SVE [<Xn|SP>, <Xm|XZR>, LSL #3]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RX, /* SVE [<Xn|SP>, <Xm>]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RX_LSL1, /* SVE [<Xn|SP>, <Xm>, LSL #1]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RX_LSL2, /* SVE [<Xn|SP>, <Xm>, LSL #2]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RX_LSL3, /* SVE [<Xn|SP>, <Xm>, LSL #3]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ, /* SVE [<Xn|SP>, Zm.D]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_LSL1, /* SVE [<Xn|SP>, Zm.D, LSL #1]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_LSL2, /* SVE [<Xn|SP>, Zm.D, LSL #2]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_LSL3, /* SVE [<Xn|SP>, Zm.D, LSL #3]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW_14, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW].
|
|
|
|
|
Bit 14 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW_22, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW].
|
|
|
|
|
Bit 22 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW1_14, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #1].
|
|
|
|
|
Bit 14 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW1_22, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #1].
|
|
|
|
|
Bit 22 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW2_14, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #2].
|
|
|
|
|
Bit 14 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW2_22, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #2].
|
|
|
|
|
Bit 22 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW3_14, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #3].
|
|
|
|
|
Bit 14 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_RZ_XTW3_22, /* SVE [<Xn|SP>, Zm.<T>, (S|U)XTW #3].
|
|
|
|
|
Bit 22 controls S/U choice. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_ZI_U5, /* SVE [Zn.<T>, #<uimm5>]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_ZI_U5x2, /* SVE [Zn.<T>, #<uimm5>*2]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_ZI_U5x4, /* SVE [Zn.<T>, #<uimm5>*4]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_ZI_U5x8, /* SVE [Zn.<T>, #<uimm5>*8]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_ZZ_LSL, /* SVE [Zn.<T>, Zm,<T>, LSL #<msz>]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_ZZ_SXTW, /* SVE [Zn.<T>, Zm,<T>, SXTW #<msz>]. */
|
|
|
|
|
AARCH64_OPND_SVE_ADDR_ZZ_UXTW, /* SVE [Zn.<T>, Zm,<T>, UXTW #<msz>]. */
|
[AArch64][SVE 27/32] Add SVE integer immediate operands
This patch adds the new SVE integer immediate operands. There are
three kinds:
- simple signed and unsigned ranges, but with new widths and positions.
- 13-bit logical immediates. These have the same form as in base AArch64,
but at a different bit position.
In the case of the "MOV Zn.<T>, #<limm>" alias of DUPM, the logical
immediate <limm> is not allowed to be a valid DUP immediate, since DUP
is preferred over DUPM for constants that both instructions can handle.
- a new 9-bit arithmetic immediate, of the form "<imm8>{, LSL #8}".
In some contexts the operand is signed and in others it's unsigned.
As an extension, we allow shifted immediates to be written as a single
integer, e.g. "#256" is equivalent to "#1, LSL #8". We also use the
shiftless form as the preferred disassembly, except for the special
case of "#0, LSL #8" (a redundant encoding of 0).
include/
* opcode/aarch64.h (AARCH64_OPND_SIMM5): New aarch64_opnd.
(AARCH64_OPND_SVE_AIMM, AARCH64_OPND_SVE_ASIMM)
(AARCH64_OPND_SVE_INV_LIMM, AARCH64_OPND_SVE_LIMM)
(AARCH64_OPND_SVE_LIMM_MOV, AARCH64_OPND_SVE_SHLIMM_PRED)
(AARCH64_OPND_SVE_SHLIMM_UNPRED, AARCH64_OPND_SVE_SHRIMM_PRED)
(AARCH64_OPND_SVE_SHRIMM_UNPRED, AARCH64_OPND_SVE_SIMM5)
(AARCH64_OPND_SVE_SIMM5B, AARCH64_OPND_SVE_SIMM6)
(AARCH64_OPND_SVE_SIMM8, AARCH64_OPND_SVE_UIMM3)
(AARCH64_OPND_SVE_UIMM7, AARCH64_OPND_SVE_UIMM8)
(AARCH64_OPND_SVE_UIMM8_53): Likewise.
(aarch64_sve_dupm_mov_immediate_p): Declare.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for the new SVE
integer immediate operands.
* aarch64-opc.h (FLD_SVE_immN, FLD_SVE_imm3, FLD_SVE_imm5)
(FLD_SVE_imm5b, FLD_SVE_imm7, FLD_SVE_imm8, FLD_SVE_imm9)
(FLD_SVE_immr, FLD_SVE_imms, FLD_SVE_tszh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries.
(operand_general_constraint_met_p): Handle the new SVE integer
immediate operands.
(aarch64_print_operand): Likewise.
(aarch64_sve_dupm_mov_immediate_p): New function.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_inv_limm, ins_sve_aimm, ins_sve_asimm)
(ins_sve_limm_mov, ins_sve_shlimm, ins_sve_shrimm): New inserters.
* aarch64-asm.c (aarch64_ins_limm_1): New function, split out from...
(aarch64_ins_limm): ...here.
(aarch64_ins_inv_limm): New function.
(aarch64_ins_sve_aimm): Likewise.
(aarch64_ins_sve_asimm): Likewise.
(aarch64_ins_sve_limm_mov): Likewise.
(aarch64_ins_sve_shlimm): Likewise.
(aarch64_ins_sve_shrimm): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_inv_limm, ext_sve_aimm, ext_sve_asimm)
(ext_sve_limm_mov, ext_sve_shlimm, ext_sve_shrimm): New extractors.
* aarch64-dis.c (decode_limm): New function, split out from...
(aarch64_ext_limm): ...here.
(aarch64_ext_inv_limm): New function.
(decode_sve_aimm): Likewise.
(aarch64_ext_sve_aimm): Likewise.
(aarch64_ext_sve_asimm): Likewise.
(aarch64_ext_sve_limm_mov): Likewise.
(aarch64_top_bit): Likewise.
(aarch64_ext_sve_shlimm): Likewise.
(aarch64_ext_sve_shrimm): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (parse_operands): Handle the new SVE integer
immediate operands.
2016-09-21 23:56:57 +08:00
|
|
|
|
AARCH64_OPND_SVE_AIMM, /* SVE unsigned arithmetic immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_ASIMM, /* SVE signed arithmetic immediate. */
|
2016-09-21 23:57:22 +08:00
|
|
|
|
AARCH64_OPND_SVE_FPIMM8, /* SVE 8-bit floating-point immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_I1_HALF_ONE, /* SVE choice between 0.5 and 1.0. */
|
|
|
|
|
AARCH64_OPND_SVE_I1_HALF_TWO, /* SVE choice between 0.5 and 2.0. */
|
|
|
|
|
AARCH64_OPND_SVE_I1_ZERO_ONE, /* SVE choice between 0.0 and 1.0. */
|
[AArch64] Additional SVE instructions
This patch supports some additions to the SVE architecture prior to
its public release.
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_ADDR_RI_S4x16)
(AARCH64_OPND_SVE_IMM_ROT1, AARCH64_OPND_SVE_IMM_ROT2)
(AARCH64_OPND_SVE_Zm3_INDEX, AARCH64_OPND_SVE_Zm3_22_INDEX)
(AARCH64_OPND_SVE_Zm4_INDEX): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (OP_SVE_HMH, OP_SVE_VMU_HSD, OP_SVE_VMVU_HSD)
(OP_SVE_VMVV_HSD, OP_SVE_VMVVU_HSD, OP_SVE_VM_HSD, OP_SVE_VUVV_HSD)
(OP_SVE_VUV_HSD, OP_SVE_VU_HSD, OP_SVE_VVVU_H, OP_SVE_VVVU_S)
(OP_SVE_VVVU_HSD, OP_SVE_VVV_D, OP_SVE_VVV_D_H, OP_SVE_VVV_H)
(OP_SVE_VVV_HSD, OP_SVE_VVV_S, OP_SVE_VVV_S_B, OP_SVE_VVV_SD_BH)
(OP_SVE_VV_BHSDQ, OP_SVE_VV_HSD, OP_SVE_VZVV_HSD, OP_SVE_VZV_HSD)
(OP_SVE_V_HSD): New macros.
(OP_SVE_VMU_SD, OP_SVE_VMVU_SD, OP_SVE_VM_SD, OP_SVE_VUVV_SD)
(OP_SVE_VU_SD, OP_SVE_VVVU_SD, OP_SVE_VVV_SD, OP_SVE_VZVV_SD)
(OP_SVE_VZV_SD, OP_SVE_V_SD): Delete.
(aarch64_opcode_table): Add new SVE instructions.
(aarch64_opcode_table): Use imm_rotate{1,2} instead of imm_rotate
for rotation operands. Add new SVE operands.
* aarch64-asm.h (ins_sve_addr_ri_s4): New inserter.
(ins_sve_quad_index): Likewise.
(ins_imm_rotate): Split into...
(ins_imm_rotate1, ins_imm_rotate2): ...these two inserters.
* aarch64-asm.c (aarch64_ins_imm_rotate): Split into...
(aarch64_ins_imm_rotate1, aarch64_ins_imm_rotate2): ...these two
functions.
(aarch64_ins_sve_addr_ri_s4): New function.
(aarch64_ins_sve_quad_index): Likewise.
(do_misc_encoding): Handle "MOV Zn.Q, Qm".
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_addr_ri_s4): New extractor.
(ext_sve_quad_index): Likewise.
(ext_imm_rotate): Split into...
(ext_imm_rotate1, ext_imm_rotate2): ...these two extractors.
* aarch64-dis.c (aarch64_ext_imm_rotate): Split into...
(aarch64_ext_imm_rotate1, aarch64_ext_imm_rotate2): ...these two
functions.
(aarch64_ext_sve_addr_ri_s4): New function.
(aarch64_ext_sve_quad_index): Likewise.
(aarch64_ext_sve_index): Allow quad indices.
(do_misc_decoding): Likewise.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (FLD_SVE_i3h, FLD_SVE_rot1, FLD_SVE_rot2): New
aarch64_field_kinds.
(OPD_F_OD_MASK): Widen by one bit.
(OPD_F_NO_ZR): Bump accordingly.
(get_operand_field_width): New function.
* aarch64-opc.c (fields): Add new SVE fields.
(operand_general_constraint_met_p): Handle new SVE operands.
(aarch64_print_operand): Likewise.
* aarch64-opc-2.c: Regenerate.
gas/
* doc/c-aarch64.texi: Document that sve implies fp16, simd and compnum.
* config/tc-aarch64.c (parse_vector_type_for_operand): Allow .q
to be used with SVE registers.
(parse_operands): Handle new SVE operands.
(aarch64_features): Make "sve" require F16 rather than FP. Also
require COMPNUM.
* testsuite/gas/aarch64/sve.s: Add tests for new instructions.
Include compnum tests.
* testsuite/gas/aarch64/sve.d: Update accordingly.
* testsuite/gas/aarch64/sve-invalid.s: Add tests for new instructions.
* testsuite/gas/aarch64/sve-invalid.l: Update accordingly. Also
update expected output for new FMOV and MOV alternatives.
2017-02-25 02:29:00 +08:00
|
|
|
|
AARCH64_OPND_SVE_IMM_ROT1, /* SVE 1-bit rotate operand (90 or 270). */
|
|
|
|
|
AARCH64_OPND_SVE_IMM_ROT2, /* SVE 2-bit rotate operand (N*90). */
|
[AArch64][SVE 27/32] Add SVE integer immediate operands
This patch adds the new SVE integer immediate operands. There are
three kinds:
- simple signed and unsigned ranges, but with new widths and positions.
- 13-bit logical immediates. These have the same form as in base AArch64,
but at a different bit position.
In the case of the "MOV Zn.<T>, #<limm>" alias of DUPM, the logical
immediate <limm> is not allowed to be a valid DUP immediate, since DUP
is preferred over DUPM for constants that both instructions can handle.
- a new 9-bit arithmetic immediate, of the form "<imm8>{, LSL #8}".
In some contexts the operand is signed and in others it's unsigned.
As an extension, we allow shifted immediates to be written as a single
integer, e.g. "#256" is equivalent to "#1, LSL #8". We also use the
shiftless form as the preferred disassembly, except for the special
case of "#0, LSL #8" (a redundant encoding of 0).
include/
* opcode/aarch64.h (AARCH64_OPND_SIMM5): New aarch64_opnd.
(AARCH64_OPND_SVE_AIMM, AARCH64_OPND_SVE_ASIMM)
(AARCH64_OPND_SVE_INV_LIMM, AARCH64_OPND_SVE_LIMM)
(AARCH64_OPND_SVE_LIMM_MOV, AARCH64_OPND_SVE_SHLIMM_PRED)
(AARCH64_OPND_SVE_SHLIMM_UNPRED, AARCH64_OPND_SVE_SHRIMM_PRED)
(AARCH64_OPND_SVE_SHRIMM_UNPRED, AARCH64_OPND_SVE_SIMM5)
(AARCH64_OPND_SVE_SIMM5B, AARCH64_OPND_SVE_SIMM6)
(AARCH64_OPND_SVE_SIMM8, AARCH64_OPND_SVE_UIMM3)
(AARCH64_OPND_SVE_UIMM7, AARCH64_OPND_SVE_UIMM8)
(AARCH64_OPND_SVE_UIMM8_53): Likewise.
(aarch64_sve_dupm_mov_immediate_p): Declare.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for the new SVE
integer immediate operands.
* aarch64-opc.h (FLD_SVE_immN, FLD_SVE_imm3, FLD_SVE_imm5)
(FLD_SVE_imm5b, FLD_SVE_imm7, FLD_SVE_imm8, FLD_SVE_imm9)
(FLD_SVE_immr, FLD_SVE_imms, FLD_SVE_tszh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries.
(operand_general_constraint_met_p): Handle the new SVE integer
immediate operands.
(aarch64_print_operand): Likewise.
(aarch64_sve_dupm_mov_immediate_p): New function.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_inv_limm, ins_sve_aimm, ins_sve_asimm)
(ins_sve_limm_mov, ins_sve_shlimm, ins_sve_shrimm): New inserters.
* aarch64-asm.c (aarch64_ins_limm_1): New function, split out from...
(aarch64_ins_limm): ...here.
(aarch64_ins_inv_limm): New function.
(aarch64_ins_sve_aimm): Likewise.
(aarch64_ins_sve_asimm): Likewise.
(aarch64_ins_sve_limm_mov): Likewise.
(aarch64_ins_sve_shlimm): Likewise.
(aarch64_ins_sve_shrimm): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_inv_limm, ext_sve_aimm, ext_sve_asimm)
(ext_sve_limm_mov, ext_sve_shlimm, ext_sve_shrimm): New extractors.
* aarch64-dis.c (decode_limm): New function, split out from...
(aarch64_ext_limm): ...here.
(aarch64_ext_inv_limm): New function.
(decode_sve_aimm): Likewise.
(aarch64_ext_sve_aimm): Likewise.
(aarch64_ext_sve_asimm): Likewise.
(aarch64_ext_sve_limm_mov): Likewise.
(aarch64_top_bit): Likewise.
(aarch64_ext_sve_shlimm): Likewise.
(aarch64_ext_sve_shrimm): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (parse_operands): Handle the new SVE integer
immediate operands.
2016-09-21 23:56:57 +08:00
|
|
|
|
AARCH64_OPND_SVE_INV_LIMM, /* SVE inverted logical immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_LIMM, /* SVE logical immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_LIMM_MOV, /* SVE logical immediate for MOV. */
|
2016-09-21 23:54:53 +08:00
|
|
|
|
AARCH64_OPND_SVE_PATTERN, /* SVE vector pattern enumeration. */
|
[AArch64][SVE 24/32] Add AARCH64_OPND_SVE_PATTERN_SCALED
Some SVE instructions count the number of elements in a given vector
pattern and allow a scale factor of [1, 16] to be applied to the result.
This scale factor is written ", MUL #n", where "MUL" is a new operator.
E.g.:
UQINCD X0, POW2, MUL #2
This patch adds support for this kind of operand.
All existing operators were shifts of some kind, so there was a natural
range of [0, 63] regardless of context. This was then narrowered further
by later checks (e.g. to [0, 31] when used for 32-bit values).
In contrast, MUL doesn't really have a natural context-independent range.
Rather than pick one arbitrarily, it seemed better to make the "shift"
amount a full 64-bit value and leave the range test to the usual
operand-checking code. I've rearranged the fields of aarch64_opnd_info
so that this doesn't increase the size of the structure (although I don't
think its size is critical anyway).
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_PATTERN_SCALED): New
aarch64_opnd.
(AARCH64_MOD_MUL): New aarch64_modifier_kind.
(aarch64_opnd_info): Make shifter.amount an int64_t and
rearrange the fields.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add an entry for
AARCH64_OPND_SVE_PATTERN_SCALED.
* aarch64-opc.h (FLD_SVE_imm4): New aarch64_field_kind.
* aarch64-opc.c (fields): Add a corresponding entry.
(set_multiplier_out_of_range_error): New function.
(aarch64_operand_modifiers): Add entry for AARCH64_MOD_MUL.
(operand_general_constraint_met_p): Handle
AARCH64_OPND_SVE_PATTERN_SCALED.
(print_register_offset_address): Use PRIi64 to print the
shift amount.
(aarch64_print_operand): Likewise. Handle
AARCH64_OPND_SVE_PATTERN_SCALED.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_scale): New inserter.
* aarch64-asm.c (aarch64_ins_sve_scale): New function.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_scale): New inserter.
* aarch64-dis.c (aarch64_ext_sve_scale): New function.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (SHIFTED_MUL): New parse_shift_mode.
(parse_shift): Handle it. Reject AARCH64_MOD_MUL for all other
shift modes. Skip range tests for AARCH64_MOD_MUL.
(process_omitted_operand): Handle AARCH64_OPND_SVE_PATTERN_SCALED.
(parse_operands): Likewise.
2016-09-21 23:55:22 +08:00
|
|
|
|
AARCH64_OPND_SVE_PATTERN_SCALED, /* Likewise, with additional MUL factor. */
|
2016-09-21 23:54:53 +08:00
|
|
|
|
AARCH64_OPND_SVE_PRFOP, /* SVE prefetch operation. */
|
[AArch64][SVE 21/32] Add Zn and Pn registers
This patch adds the Zn and Pn registers, and associated fields and
operands.
include/
* opcode/aarch64.h (AARCH64_OPND_CLASS_SVE_REG): New
aarch64_operand_class.
(AARCH64_OPND_CLASS_PRED_REG): Likewise.
(AARCH64_OPND_SVE_Pd, AARCH64_OPND_SVE_Pg3, AARCH64_OPND_SVE_Pg4_5)
(AARCH64_OPND_SVE_Pg4_10, AARCH64_OPND_SVE_Pg4_16)
(AARCH64_OPND_SVE_Pm, AARCH64_OPND_SVE_Pn, AARCH64_OPND_SVE_Pt)
(AARCH64_OPND_SVE_Za_5, AARCH64_OPND_SVE_Za_16, AARCH64_OPND_SVE_Zd)
(AARCH64_OPND_SVE_Zm_5, AARCH64_OPND_SVE_Zm_16, AARCH64_OPND_SVE_Zn)
(AARCH64_OPND_SVE_Zn_INDEX, AARCH64_OPND_SVE_ZnxN)
(AARCH64_OPND_SVE_Zt, AARCH64_OPND_SVE_ZtxN): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for new SVE operands.
* aarch64-opc.h (FLD_SVE_Pd, FLD_SVE_Pg3, FLD_SVE_Pg4_5)
(FLD_SVE_Pg4_10, FLD_SVE_Pg4_16, FLD_SVE_Pm, FLD_SVE_Pn, FLD_SVE_Pt)
(FLD_SVE_Za_5, FLD_SVE_Za_16, FLD_SVE_Zd, FLD_SVE_Zm_5, FLD_SVE_Zm_16)
(FLD_SVE_Zn, FLD_SVE_Zt, FLD_SVE_tzsh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries here.
(operand_general_constraint_met_p): Check that SVE register lists
have the correct length. Check the ranges of SVE index registers.
Check for cases where p8-p15 are used in 3-bit predicate fields.
(aarch64_print_operand): Handle the new SVE operands.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_index, ins_sve_reglist): New inserters.
* aarch64-asm.c (aarch64_ins_sve_index): New function.
(aarch64_ins_sve_reglist): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_index, ext_sve_reglist): New extractors.
* aarch64-dis.c (aarch64_ext_sve_index): New function.
(aarch64_ext_sve_reglist): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (NTA_HASVARWIDTH): New macro.
(AARCH64_REG_TYPES): Add ZN and PN.
(get_reg_expected_msg): Handle them.
(parse_vector_type_for_operand): Add a reg_type parameter.
Skip the width for Zn and Pn registers.
(parse_typed_reg): Extend vector handling to Zn and Pn. Update the
call to parse_vector_type_for_operand. Set HASVARTYPE for Zn and Pn,
expecting the width to be 0.
(parse_vector_reg_list): Restrict error about [BHSD]nn operands to
REG_TYPE_VN.
(vectype_to_qualifier): Use S_[BHSD] qualifiers for NTA_HASVARWIDTH.
(parse_operands): Handle the new Zn and Pn operands.
(REGSET16): New macro, split out from...
(REGSET31): ...here.
(reg_names): Add Zn and Pn entries.
2016-09-21 23:53:54 +08:00
|
|
|
|
AARCH64_OPND_SVE_Pd, /* SVE p0-p15 in Pd. */
|
|
|
|
|
AARCH64_OPND_SVE_Pg3, /* SVE p0-p7 in Pg. */
|
|
|
|
|
AARCH64_OPND_SVE_Pg4_5, /* SVE p0-p15 in Pg, bits [8,5]. */
|
|
|
|
|
AARCH64_OPND_SVE_Pg4_10, /* SVE p0-p15 in Pg, bits [13,10]. */
|
|
|
|
|
AARCH64_OPND_SVE_Pg4_16, /* SVE p0-p15 in Pg, bits [19,16]. */
|
|
|
|
|
AARCH64_OPND_SVE_Pm, /* SVE p0-p15 in Pm. */
|
|
|
|
|
AARCH64_OPND_SVE_Pn, /* SVE p0-p15 in Pn. */
|
|
|
|
|
AARCH64_OPND_SVE_Pt, /* SVE p0-p15 in Pt. */
|
2016-09-21 23:57:43 +08:00
|
|
|
|
AARCH64_OPND_SVE_Rm, /* Integer Rm or ZR, alt. SVE position. */
|
|
|
|
|
AARCH64_OPND_SVE_Rn_SP, /* Integer Rn or SP, alt. SVE position. */
|
[AArch64][SVE 27/32] Add SVE integer immediate operands
This patch adds the new SVE integer immediate operands. There are
three kinds:
- simple signed and unsigned ranges, but with new widths and positions.
- 13-bit logical immediates. These have the same form as in base AArch64,
but at a different bit position.
In the case of the "MOV Zn.<T>, #<limm>" alias of DUPM, the logical
immediate <limm> is not allowed to be a valid DUP immediate, since DUP
is preferred over DUPM for constants that both instructions can handle.
- a new 9-bit arithmetic immediate, of the form "<imm8>{, LSL #8}".
In some contexts the operand is signed and in others it's unsigned.
As an extension, we allow shifted immediates to be written as a single
integer, e.g. "#256" is equivalent to "#1, LSL #8". We also use the
shiftless form as the preferred disassembly, except for the special
case of "#0, LSL #8" (a redundant encoding of 0).
include/
* opcode/aarch64.h (AARCH64_OPND_SIMM5): New aarch64_opnd.
(AARCH64_OPND_SVE_AIMM, AARCH64_OPND_SVE_ASIMM)
(AARCH64_OPND_SVE_INV_LIMM, AARCH64_OPND_SVE_LIMM)
(AARCH64_OPND_SVE_LIMM_MOV, AARCH64_OPND_SVE_SHLIMM_PRED)
(AARCH64_OPND_SVE_SHLIMM_UNPRED, AARCH64_OPND_SVE_SHRIMM_PRED)
(AARCH64_OPND_SVE_SHRIMM_UNPRED, AARCH64_OPND_SVE_SIMM5)
(AARCH64_OPND_SVE_SIMM5B, AARCH64_OPND_SVE_SIMM6)
(AARCH64_OPND_SVE_SIMM8, AARCH64_OPND_SVE_UIMM3)
(AARCH64_OPND_SVE_UIMM7, AARCH64_OPND_SVE_UIMM8)
(AARCH64_OPND_SVE_UIMM8_53): Likewise.
(aarch64_sve_dupm_mov_immediate_p): Declare.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for the new SVE
integer immediate operands.
* aarch64-opc.h (FLD_SVE_immN, FLD_SVE_imm3, FLD_SVE_imm5)
(FLD_SVE_imm5b, FLD_SVE_imm7, FLD_SVE_imm8, FLD_SVE_imm9)
(FLD_SVE_immr, FLD_SVE_imms, FLD_SVE_tszh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries.
(operand_general_constraint_met_p): Handle the new SVE integer
immediate operands.
(aarch64_print_operand): Likewise.
(aarch64_sve_dupm_mov_immediate_p): New function.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_inv_limm, ins_sve_aimm, ins_sve_asimm)
(ins_sve_limm_mov, ins_sve_shlimm, ins_sve_shrimm): New inserters.
* aarch64-asm.c (aarch64_ins_limm_1): New function, split out from...
(aarch64_ins_limm): ...here.
(aarch64_ins_inv_limm): New function.
(aarch64_ins_sve_aimm): Likewise.
(aarch64_ins_sve_asimm): Likewise.
(aarch64_ins_sve_limm_mov): Likewise.
(aarch64_ins_sve_shlimm): Likewise.
(aarch64_ins_sve_shrimm): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_inv_limm, ext_sve_aimm, ext_sve_asimm)
(ext_sve_limm_mov, ext_sve_shlimm, ext_sve_shrimm): New extractors.
* aarch64-dis.c (decode_limm): New function, split out from...
(aarch64_ext_limm): ...here.
(aarch64_ext_inv_limm): New function.
(decode_sve_aimm): Likewise.
(aarch64_ext_sve_aimm): Likewise.
(aarch64_ext_sve_asimm): Likewise.
(aarch64_ext_sve_limm_mov): Likewise.
(aarch64_top_bit): Likewise.
(aarch64_ext_sve_shlimm): Likewise.
(aarch64_ext_sve_shrimm): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (parse_operands): Handle the new SVE integer
immediate operands.
2016-09-21 23:56:57 +08:00
|
|
|
|
AARCH64_OPND_SVE_SHLIMM_PRED, /* SVE shift left amount (predicated). */
|
|
|
|
|
AARCH64_OPND_SVE_SHLIMM_UNPRED, /* SVE shift left amount (unpredicated). */
|
|
|
|
|
AARCH64_OPND_SVE_SHRIMM_PRED, /* SVE shift right amount (predicated). */
|
|
|
|
|
AARCH64_OPND_SVE_SHRIMM_UNPRED, /* SVE shift right amount (unpredicated). */
|
|
|
|
|
AARCH64_OPND_SVE_SIMM5, /* SVE signed 5-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_SIMM5B, /* SVE secondary signed 5-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_SIMM6, /* SVE signed 6-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_SIMM8, /* SVE signed 8-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_UIMM3, /* SVE unsigned 3-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_UIMM7, /* SVE unsigned 7-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_UIMM8, /* SVE unsigned 8-bit immediate. */
|
|
|
|
|
AARCH64_OPND_SVE_UIMM8_53, /* SVE split unsigned 8-bit immediate. */
|
2016-09-21 23:57:43 +08:00
|
|
|
|
AARCH64_OPND_SVE_VZn, /* Scalar SIMD&FP register in Zn field. */
|
|
|
|
|
AARCH64_OPND_SVE_Vd, /* Scalar SIMD&FP register in Vd. */
|
|
|
|
|
AARCH64_OPND_SVE_Vm, /* Scalar SIMD&FP register in Vm. */
|
|
|
|
|
AARCH64_OPND_SVE_Vn, /* Scalar SIMD&FP register in Vn. */
|
[AArch64][SVE 21/32] Add Zn and Pn registers
This patch adds the Zn and Pn registers, and associated fields and
operands.
include/
* opcode/aarch64.h (AARCH64_OPND_CLASS_SVE_REG): New
aarch64_operand_class.
(AARCH64_OPND_CLASS_PRED_REG): Likewise.
(AARCH64_OPND_SVE_Pd, AARCH64_OPND_SVE_Pg3, AARCH64_OPND_SVE_Pg4_5)
(AARCH64_OPND_SVE_Pg4_10, AARCH64_OPND_SVE_Pg4_16)
(AARCH64_OPND_SVE_Pm, AARCH64_OPND_SVE_Pn, AARCH64_OPND_SVE_Pt)
(AARCH64_OPND_SVE_Za_5, AARCH64_OPND_SVE_Za_16, AARCH64_OPND_SVE_Zd)
(AARCH64_OPND_SVE_Zm_5, AARCH64_OPND_SVE_Zm_16, AARCH64_OPND_SVE_Zn)
(AARCH64_OPND_SVE_Zn_INDEX, AARCH64_OPND_SVE_ZnxN)
(AARCH64_OPND_SVE_Zt, AARCH64_OPND_SVE_ZtxN): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for new SVE operands.
* aarch64-opc.h (FLD_SVE_Pd, FLD_SVE_Pg3, FLD_SVE_Pg4_5)
(FLD_SVE_Pg4_10, FLD_SVE_Pg4_16, FLD_SVE_Pm, FLD_SVE_Pn, FLD_SVE_Pt)
(FLD_SVE_Za_5, FLD_SVE_Za_16, FLD_SVE_Zd, FLD_SVE_Zm_5, FLD_SVE_Zm_16)
(FLD_SVE_Zn, FLD_SVE_Zt, FLD_SVE_tzsh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries here.
(operand_general_constraint_met_p): Check that SVE register lists
have the correct length. Check the ranges of SVE index registers.
Check for cases where p8-p15 are used in 3-bit predicate fields.
(aarch64_print_operand): Handle the new SVE operands.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_index, ins_sve_reglist): New inserters.
* aarch64-asm.c (aarch64_ins_sve_index): New function.
(aarch64_ins_sve_reglist): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_index, ext_sve_reglist): New extractors.
* aarch64-dis.c (aarch64_ext_sve_index): New function.
(aarch64_ext_sve_reglist): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (NTA_HASVARWIDTH): New macro.
(AARCH64_REG_TYPES): Add ZN and PN.
(get_reg_expected_msg): Handle them.
(parse_vector_type_for_operand): Add a reg_type parameter.
Skip the width for Zn and Pn registers.
(parse_typed_reg): Extend vector handling to Zn and Pn. Update the
call to parse_vector_type_for_operand. Set HASVARTYPE for Zn and Pn,
expecting the width to be 0.
(parse_vector_reg_list): Restrict error about [BHSD]nn operands to
REG_TYPE_VN.
(vectype_to_qualifier): Use S_[BHSD] qualifiers for NTA_HASVARWIDTH.
(parse_operands): Handle the new Zn and Pn operands.
(REGSET16): New macro, split out from...
(REGSET31): ...here.
(reg_names): Add Zn and Pn entries.
2016-09-21 23:53:54 +08:00
|
|
|
|
AARCH64_OPND_SVE_Za_5, /* SVE vector register in Za, bits [9,5]. */
|
|
|
|
|
AARCH64_OPND_SVE_Za_16, /* SVE vector register in Za, bits [20,16]. */
|
|
|
|
|
AARCH64_OPND_SVE_Zd, /* SVE vector register in Zd. */
|
|
|
|
|
AARCH64_OPND_SVE_Zm_5, /* SVE vector register in Zm, bits [9,5]. */
|
|
|
|
|
AARCH64_OPND_SVE_Zm_16, /* SVE vector register in Zm, bits [20,16]. */
|
[AArch64] Additional SVE instructions
This patch supports some additions to the SVE architecture prior to
its public release.
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_ADDR_RI_S4x16)
(AARCH64_OPND_SVE_IMM_ROT1, AARCH64_OPND_SVE_IMM_ROT2)
(AARCH64_OPND_SVE_Zm3_INDEX, AARCH64_OPND_SVE_Zm3_22_INDEX)
(AARCH64_OPND_SVE_Zm4_INDEX): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (OP_SVE_HMH, OP_SVE_VMU_HSD, OP_SVE_VMVU_HSD)
(OP_SVE_VMVV_HSD, OP_SVE_VMVVU_HSD, OP_SVE_VM_HSD, OP_SVE_VUVV_HSD)
(OP_SVE_VUV_HSD, OP_SVE_VU_HSD, OP_SVE_VVVU_H, OP_SVE_VVVU_S)
(OP_SVE_VVVU_HSD, OP_SVE_VVV_D, OP_SVE_VVV_D_H, OP_SVE_VVV_H)
(OP_SVE_VVV_HSD, OP_SVE_VVV_S, OP_SVE_VVV_S_B, OP_SVE_VVV_SD_BH)
(OP_SVE_VV_BHSDQ, OP_SVE_VV_HSD, OP_SVE_VZVV_HSD, OP_SVE_VZV_HSD)
(OP_SVE_V_HSD): New macros.
(OP_SVE_VMU_SD, OP_SVE_VMVU_SD, OP_SVE_VM_SD, OP_SVE_VUVV_SD)
(OP_SVE_VU_SD, OP_SVE_VVVU_SD, OP_SVE_VVV_SD, OP_SVE_VZVV_SD)
(OP_SVE_VZV_SD, OP_SVE_V_SD): Delete.
(aarch64_opcode_table): Add new SVE instructions.
(aarch64_opcode_table): Use imm_rotate{1,2} instead of imm_rotate
for rotation operands. Add new SVE operands.
* aarch64-asm.h (ins_sve_addr_ri_s4): New inserter.
(ins_sve_quad_index): Likewise.
(ins_imm_rotate): Split into...
(ins_imm_rotate1, ins_imm_rotate2): ...these two inserters.
* aarch64-asm.c (aarch64_ins_imm_rotate): Split into...
(aarch64_ins_imm_rotate1, aarch64_ins_imm_rotate2): ...these two
functions.
(aarch64_ins_sve_addr_ri_s4): New function.
(aarch64_ins_sve_quad_index): Likewise.
(do_misc_encoding): Handle "MOV Zn.Q, Qm".
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_addr_ri_s4): New extractor.
(ext_sve_quad_index): Likewise.
(ext_imm_rotate): Split into...
(ext_imm_rotate1, ext_imm_rotate2): ...these two extractors.
* aarch64-dis.c (aarch64_ext_imm_rotate): Split into...
(aarch64_ext_imm_rotate1, aarch64_ext_imm_rotate2): ...these two
functions.
(aarch64_ext_sve_addr_ri_s4): New function.
(aarch64_ext_sve_quad_index): Likewise.
(aarch64_ext_sve_index): Allow quad indices.
(do_misc_decoding): Likewise.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (FLD_SVE_i3h, FLD_SVE_rot1, FLD_SVE_rot2): New
aarch64_field_kinds.
(OPD_F_OD_MASK): Widen by one bit.
(OPD_F_NO_ZR): Bump accordingly.
(get_operand_field_width): New function.
* aarch64-opc.c (fields): Add new SVE fields.
(operand_general_constraint_met_p): Handle new SVE operands.
(aarch64_print_operand): Likewise.
* aarch64-opc-2.c: Regenerate.
gas/
* doc/c-aarch64.texi: Document that sve implies fp16, simd and compnum.
* config/tc-aarch64.c (parse_vector_type_for_operand): Allow .q
to be used with SVE registers.
(parse_operands): Handle new SVE operands.
(aarch64_features): Make "sve" require F16 rather than FP. Also
require COMPNUM.
* testsuite/gas/aarch64/sve.s: Add tests for new instructions.
Include compnum tests.
* testsuite/gas/aarch64/sve.d: Update accordingly.
* testsuite/gas/aarch64/sve-invalid.s: Add tests for new instructions.
* testsuite/gas/aarch64/sve-invalid.l: Update accordingly. Also
update expected output for new FMOV and MOV alternatives.
2017-02-25 02:29:00 +08:00
|
|
|
|
AARCH64_OPND_SVE_Zm3_INDEX, /* z0-z7[0-3] in Zm, bits [20,16]. */
|
|
|
|
|
AARCH64_OPND_SVE_Zm3_22_INDEX, /* z0-z7[0-7] in Zm3_INDEX plus bit 22. */
|
|
|
|
|
AARCH64_OPND_SVE_Zm4_INDEX, /* z0-z15[0-1] in Zm, bits [20,16]. */
|
[AArch64][SVE 21/32] Add Zn and Pn registers
This patch adds the Zn and Pn registers, and associated fields and
operands.
include/
* opcode/aarch64.h (AARCH64_OPND_CLASS_SVE_REG): New
aarch64_operand_class.
(AARCH64_OPND_CLASS_PRED_REG): Likewise.
(AARCH64_OPND_SVE_Pd, AARCH64_OPND_SVE_Pg3, AARCH64_OPND_SVE_Pg4_5)
(AARCH64_OPND_SVE_Pg4_10, AARCH64_OPND_SVE_Pg4_16)
(AARCH64_OPND_SVE_Pm, AARCH64_OPND_SVE_Pn, AARCH64_OPND_SVE_Pt)
(AARCH64_OPND_SVE_Za_5, AARCH64_OPND_SVE_Za_16, AARCH64_OPND_SVE_Zd)
(AARCH64_OPND_SVE_Zm_5, AARCH64_OPND_SVE_Zm_16, AARCH64_OPND_SVE_Zn)
(AARCH64_OPND_SVE_Zn_INDEX, AARCH64_OPND_SVE_ZnxN)
(AARCH64_OPND_SVE_Zt, AARCH64_OPND_SVE_ZtxN): New aarch64_opnds.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for new SVE operands.
* aarch64-opc.h (FLD_SVE_Pd, FLD_SVE_Pg3, FLD_SVE_Pg4_5)
(FLD_SVE_Pg4_10, FLD_SVE_Pg4_16, FLD_SVE_Pm, FLD_SVE_Pn, FLD_SVE_Pt)
(FLD_SVE_Za_5, FLD_SVE_Za_16, FLD_SVE_Zd, FLD_SVE_Zm_5, FLD_SVE_Zm_16)
(FLD_SVE_Zn, FLD_SVE_Zt, FLD_SVE_tzsh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries here.
(operand_general_constraint_met_p): Check that SVE register lists
have the correct length. Check the ranges of SVE index registers.
Check for cases where p8-p15 are used in 3-bit predicate fields.
(aarch64_print_operand): Handle the new SVE operands.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_index, ins_sve_reglist): New inserters.
* aarch64-asm.c (aarch64_ins_sve_index): New function.
(aarch64_ins_sve_reglist): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_index, ext_sve_reglist): New extractors.
* aarch64-dis.c (aarch64_ext_sve_index): New function.
(aarch64_ext_sve_reglist): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (NTA_HASVARWIDTH): New macro.
(AARCH64_REG_TYPES): Add ZN and PN.
(get_reg_expected_msg): Handle them.
(parse_vector_type_for_operand): Add a reg_type parameter.
Skip the width for Zn and Pn registers.
(parse_typed_reg): Extend vector handling to Zn and Pn. Update the
call to parse_vector_type_for_operand. Set HASVARTYPE for Zn and Pn,
expecting the width to be 0.
(parse_vector_reg_list): Restrict error about [BHSD]nn operands to
REG_TYPE_VN.
(vectype_to_qualifier): Use S_[BHSD] qualifiers for NTA_HASVARWIDTH.
(parse_operands): Handle the new Zn and Pn operands.
(REGSET16): New macro, split out from...
(REGSET31): ...here.
(reg_names): Add Zn and Pn entries.
2016-09-21 23:53:54 +08:00
|
|
|
|
AARCH64_OPND_SVE_Zn, /* SVE vector register in Zn. */
|
|
|
|
|
AARCH64_OPND_SVE_Zn_INDEX, /* Indexed SVE vector register, for DUP. */
|
|
|
|
|
AARCH64_OPND_SVE_ZnxN, /* SVE vector register list in Zn. */
|
|
|
|
|
AARCH64_OPND_SVE_Zt, /* SVE vector register in Zt. */
|
|
|
|
|
AARCH64_OPND_SVE_ZtxN, /* SVE vector register list in Zt. */
|
Adds the new Fields and Operand types for the new instructions in Armv8.4-a.
gas/
* config/tc-aarch64.c (process_omitted_operand):
Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2
and AARCH64_OPND_IMM_2.
(parse_operands): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_IMM_2, AARCH64_OPND_MASK
and AARCH64_OPND_ADDR_OFFSET.
include/
* opcode/aarch64.h:
(aarch64_opnd): Add AARCH64_OPND_Va, AARCH64_OPND_MASK,
AARCH64_OPND_IMM_2, AARCH64_OPND_ADDR_OFFSET
and AARCH64_OPND_SM3_IMM2.
(aarch64_insn_class): Add cryptosm3 and cryptosm4.
(arch64_feature_set): Make uint64_t.
opcodes/
* aarch64-asm.h (ins_addr_offset): New.
* aarch64-asm.c (aarch64_ins_reglane): Add cryptosm3.
(aarch64_ins_addr_offset): New.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_addr_offset): New.
* aarch64-dis.c (aarch64_ext_reglane): Add cryptosm3.
(aarch64_ext_addr_offset): New.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (aarch64_field_kind): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
* aarch64-opc.c (fields): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
(operand_general_constraint_met_p): Add AARCH64_OPND_ADDR_OFFSET.
(aarch64_print_operand): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_MASK, AARCH64_OPND_IMM_2 and AARCH64_OPND_ADDR_OFFSET.
* aarch64-opc-2.c (Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2): New.
* aarch64-tbl.h
(aarch64_opcode_table): Add Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2.
2017-11-09 23:22:30 +08:00
|
|
|
|
AARCH64_OPND_SM3_IMM2, /* SM3 encodes lane in bits [13, 14]. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* 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,
|
2017-12-19 20:05:20 +08:00
|
|
|
|
/* This type qualifier has a special meaning in that it means that 4 x 1 byte
|
|
|
|
|
are selected by the instruction. Other than that it has no difference
|
|
|
|
|
with AARCH64_OPND_QLF_S_B in encoding. It is here purely for syntactical
|
|
|
|
|
reasons and is an exception from normal AArch64 disassembly scheme. */
|
|
|
|
|
AARCH64_OPND_QLF_S_4B,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
/* 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. */
|
2017-12-19 20:04:13 +08:00
|
|
|
|
AARCH64_OPND_QLF_V_4B,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
AARCH64_OPND_QLF_V_8B,
|
|
|
|
|
AARCH64_OPND_QLF_V_16B,
|
2015-12-15 01:27:52 +08:00
|
|
|
|
AARCH64_OPND_QLF_V_2H,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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,
|
|
|
|
|
|
2016-09-21 23:54:30 +08:00
|
|
|
|
AARCH64_OPND_QLF_P_Z,
|
|
|
|
|
AARCH64_OPND_QLF_P_M,
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
/* Constraint on value. */
|
2016-12-13 20:37:18 +08:00
|
|
|
|
AARCH64_OPND_QLF_CR, /* CRn, CRm. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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 */
|
2016-11-18 17:49:06 +08:00
|
|
|
|
ldst_imm10, /* LDRAA/LDRAB */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
ldst_pos,
|
|
|
|
|
ldst_regoff,
|
|
|
|
|
ldst_unpriv,
|
|
|
|
|
ldst_unscaled,
|
|
|
|
|
ldstexcl,
|
|
|
|
|
ldstnapair_offs,
|
|
|
|
|
ldstpair_off,
|
|
|
|
|
ldstpair_indexed,
|
|
|
|
|
loadlit,
|
|
|
|
|
log_imm,
|
|
|
|
|
log_shift,
|
2014-09-03 21:40:41 +08:00
|
|
|
|
lse_atomic,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
movewide,
|
|
|
|
|
pcreladdr,
|
|
|
|
|
ic_system,
|
[AArch64][SVE 30/32] Add SVE instruction classes
The main purpose of the SVE aarch64_insn_classes is to describe how
an index into an aarch64_opnd_qualifier_seq_t is represented in the
instruction encoding. Other instructions usually use flags for this
information, but (a) we're running out of those and (b) the iclass
would otherwise be unused for SVE.
include/
* opcode/aarch64.h (sve_cpy, sve_index, sve_limm, sve_misc)
(sve_movprfx, sve_pred_zm, sve_shift_pred, sve_shift_unpred)
(sve_size_bhs, sve_size_bhsd, sve_size_hsd, sve_size_sd): New
aarch64_insn_classes.
opcodes/
* aarch64-opc.h (FLD_SVE_M_4, FLD_SVE_M_14, FLD_SVE_M_16)
(FLD_SVE_sz, FLD_SVE_tsz, FLD_SVE_tszl_8, FLD_SVE_tszl_19): New
aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries.
* aarch64-asm.c (aarch64_get_variant): New function.
(aarch64_encode_variant_using_iclass): Likewise.
(aarch64_opcode_encode): Call it.
* aarch64-dis.c (aarch64_decode_variant_using_iclass): New function.
(aarch64_opcode_decode): Call it.
2016-09-21 23:58:22 +08:00
|
|
|
|
sve_cpy,
|
|
|
|
|
sve_index,
|
|
|
|
|
sve_limm,
|
|
|
|
|
sve_misc,
|
|
|
|
|
sve_movprfx,
|
|
|
|
|
sve_pred_zm,
|
|
|
|
|
sve_shift_pred,
|
|
|
|
|
sve_shift_unpred,
|
|
|
|
|
sve_size_bhs,
|
|
|
|
|
sve_size_bhsd,
|
|
|
|
|
sve_size_hsd,
|
|
|
|
|
sve_size_sd,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
testbranch,
|
Adds the new Fields and Operand types for the new instructions in Armv8.4-a.
gas/
* config/tc-aarch64.c (process_omitted_operand):
Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2
and AARCH64_OPND_IMM_2.
(parse_operands): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_IMM_2, AARCH64_OPND_MASK
and AARCH64_OPND_ADDR_OFFSET.
include/
* opcode/aarch64.h:
(aarch64_opnd): Add AARCH64_OPND_Va, AARCH64_OPND_MASK,
AARCH64_OPND_IMM_2, AARCH64_OPND_ADDR_OFFSET
and AARCH64_OPND_SM3_IMM2.
(aarch64_insn_class): Add cryptosm3 and cryptosm4.
(arch64_feature_set): Make uint64_t.
opcodes/
* aarch64-asm.h (ins_addr_offset): New.
* aarch64-asm.c (aarch64_ins_reglane): Add cryptosm3.
(aarch64_ins_addr_offset): New.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_addr_offset): New.
* aarch64-dis.c (aarch64_ext_reglane): Add cryptosm3.
(aarch64_ext_addr_offset): New.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc.h (aarch64_field_kind): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
* aarch64-opc.c (fields): Add FLD_imm6_2,
FLD_imm4_2 and FLD_SM3_imm2.
(operand_general_constraint_met_p): Add AARCH64_OPND_ADDR_OFFSET.
(aarch64_print_operand): Add AARCH64_OPND_Va, AARCH64_OPND_SM3_IMM2,
AARCH64_OPND_MASK, AARCH64_OPND_IMM_2 and AARCH64_OPND_ADDR_OFFSET.
* aarch64-opc-2.c (Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2): New.
* aarch64-tbl.h
(aarch64_opcode_table): Add Va, MASK, IMM_2, ADDR_OFFSET, SM3_IMM2.
2017-11-09 23:22:30 +08:00
|
|
|
|
cryptosm3,
|
|
|
|
|
cryptosm4,
|
2017-06-28 18:09:01 +08:00
|
|
|
|
dotproduct,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* 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,
|
2015-11-27 23:25:08 +08:00
|
|
|
|
OP_BFC, /* ARMv8.2. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
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,
|
|
|
|
|
|
include/opcode/
2013-01-30 Yufeng Zhang <yufeng.zhang@arm.com>
* aarch64.h (aarch64_op): Add OP_SXTL, OP_SXTL2, OP_UXTL and OP_UXTL2.
opcodes/
2013-01-30 Yufeng Zhang <yufeng.zhang@arm.com>
* aarch64-tbl.h (aarch64_opcode_table): Flag sshll, sshll2, ushll and
ushll2 with F_HAS_ALIAS. Add entries for sxtl, sxtl2, uxtl and uxtl2.
* aarch64-asm.c (convert_xtl_to_shll): New function.
(convert_to_real): Handle OP_SXTL, OP_SXTL2, OP_UXTL and OP_UXTL2 by
calling convert_xtl_to_shll.
* aarch64-dis.c (convert_shll_to_xtl): New function.
(convert_to_alias): Handle OP_SXTL, OP_SXTL2, OP_UXTL and OP_UXTL2 by
calling convert_shll_to_xtl.
* aarch64-gen.c: Update copyright year.
* aarch64-asm-2.c: Re-generate.
* aarch64-dis-2.c: Re-generate.
* aarch64-opc-2.c: Re-generate.
gas/testsuite/
2013-01-30 Yufeng Zhang <yufeng.zhang@arm.com>
* gas/aarch64/alias.s: Add new tests.
* gas/aarch64/alias.d: Update.
* gas/aarch64/no-aliases.d: Update.
2013-01-30 23:43:32 +08:00
|
|
|
|
OP_SXTL,
|
|
|
|
|
OP_SXTL2,
|
|
|
|
|
OP_UXTL,
|
|
|
|
|
OP_UXTL2,
|
|
|
|
|
|
[AArch64][SVE 31/32] Add SVE instructions
This patch adds the SVE instruction definitions and associated OP_*
enum values.
include/
* opcode/aarch64.h (AARCH64_FEATURE_SVE): New macro.
(OP_MOV_P_P, OP_MOV_Z_P_Z, OP_MOV_Z_V, OP_MOV_Z_Z, OP_MOV_Z_Zi)
(OP_MOVM_P_P_P, OP_MOVS_P_P, OP_MOVZS_P_P_P, OP_MOVZ_P_P_P)
(OP_NOTS_P_P_P_Z, OP_NOT_P_P_P_Z): New aarch64_ops.
opcodes/
* aarch64-tbl.h (OP_SVE_B, OP_SVE_BB, OP_SVE_BBBU, OP_SVE_BMB)
(OP_SVE_BPB, OP_SVE_BUB, OP_SVE_BUBB, OP_SVE_BUU, OP_SVE_BZ)
(OP_SVE_BZB, OP_SVE_BZBB, OP_SVE_BZU, OP_SVE_DD, OP_SVE_DDD)
(OP_SVE_DMD, OP_SVE_DMH, OP_SVE_DMS, OP_SVE_DU, OP_SVE_DUD, OP_SVE_DUU)
(OP_SVE_DUV_BHS, OP_SVE_DUV_BHSD, OP_SVE_DZD, OP_SVE_DZU, OP_SVE_HB)
(OP_SVE_HMD, OP_SVE_HMS, OP_SVE_HU, OP_SVE_HUU, OP_SVE_HZU, OP_SVE_RR)
(OP_SVE_RURV_BHSD, OP_SVE_RUV_BHSD, OP_SVE_SMD, OP_SVE_SMH, OP_SVE_SMS)
(OP_SVE_SU, OP_SVE_SUS, OP_SVE_SUU, OP_SVE_SZS, OP_SVE_SZU, OP_SVE_UB)
(OP_SVE_UUD, OP_SVE_UUS, OP_SVE_VMR_BHSD, OP_SVE_VMU_SD)
(OP_SVE_VMVD_BHS, OP_SVE_VMVU_BHSD, OP_SVE_VMVU_SD, OP_SVE_VMVV_BHSD)
(OP_SVE_VMVV_SD, OP_SVE_VMV_BHSD, OP_SVE_VMV_HSD, OP_SVE_VMV_SD)
(OP_SVE_VM_SD, OP_SVE_VPU_BHSD, OP_SVE_VPV_BHSD, OP_SVE_VRR_BHSD)
(OP_SVE_VRU_BHSD, OP_SVE_VR_BHSD, OP_SVE_VUR_BHSD, OP_SVE_VUU_BHSD)
(OP_SVE_VUVV_BHSD, OP_SVE_VUVV_SD, OP_SVE_VUV_BHSD, OP_SVE_VUV_SD)
(OP_SVE_VU_BHSD, OP_SVE_VU_HSD, OP_SVE_VU_SD, OP_SVE_VVD_BHS)
(OP_SVE_VVU_BHSD, OP_SVE_VVVU_SD, OP_SVE_VVV_BHSD, OP_SVE_VVV_SD)
(OP_SVE_VV_BHSD, OP_SVE_VV_HSD_BHS, OP_SVE_VV_SD, OP_SVE_VWW_BHSD)
(OP_SVE_VXX_BHSD, OP_SVE_VZVD_BHS, OP_SVE_VZVU_BHSD, OP_SVE_VZVV_BHSD)
(OP_SVE_VZVV_SD, OP_SVE_VZV_SD, OP_SVE_V_SD, OP_SVE_WU, OP_SVE_WV_BHSD)
(OP_SVE_XU, OP_SVE_XUV_BHSD, OP_SVE_XVW_BHSD, OP_SVE_XV_BHSD)
(OP_SVE_XWU, OP_SVE_XXU): New macros.
(aarch64_feature_sve): New variable.
(SVE): New macro.
(_SVE_INSN): Likewise.
(aarch64_opcode_table): Add SVE instructions.
* aarch64-opc.h (extract_fields): Declare.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.c (do_misc_encoding): Handle the new SVE aarch64_ops.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.c (extract_fields): Make global.
(do_misc_decoding): Handle the new SVE aarch64_ops.
* aarch64-dis-2.c: Regenerate.
gas/
* doc/c-aarch64.texi: Document the "sve" feature.
* config/tc-aarch64.c (REG_TYPE_R_Z_BHSDQ_VZP): New register type.
(get_reg_expected_msg): Handle it.
(parse_operands): When parsing operands of an SVE instruction,
disallow immediates that match REG_TYPE_R_Z_BHSDQ_VZP.
(aarch64_features): Add an entry for SVE.
2016-09-21 23:58:48 +08:00
|
|
|
|
OP_MOV_P_P,
|
|
|
|
|
OP_MOV_Z_P_Z,
|
|
|
|
|
OP_MOV_Z_V,
|
|
|
|
|
OP_MOV_Z_Z,
|
|
|
|
|
OP_MOV_Z_Zi,
|
|
|
|
|
OP_MOVM_P_P_P,
|
|
|
|
|
OP_MOVS_P_P,
|
|
|
|
|
OP_MOVZS_P_P_P,
|
|
|
|
|
OP_MOVZ_P_P_P,
|
|
|
|
|
OP_NOTS_P_P_P_Z,
|
|
|
|
|
OP_NOT_P_P_P_Z,
|
|
|
|
|
|
[AArch64] Add ARMv8.3 FCMLA and FCADD instructions
Add support for FCMLA and FCADD complex arithmetic SIMD instructions.
FCMLA has an indexed element variant where the index range has to be
treated specially because a complex number takes two elements and the
indexed vector size depends on the other operands.
These complex number SIMD instructions are part of ARMv8.3
https://community.arm.com/groups/processors/blog/2016/10/27/armv8-a-architecture-2016-additions
include/
2016-11-18 Szabolcs Nagy <szabolcs.nagy@arm.com>
* opcode/aarch64.h (enum aarch64_opnd): Add AARCH64_OPND_IMM_ROT1,
AARCH64_OPND_IMM_ROT2, AARCH64_OPND_IMM_ROT3.
(enum aarch64_op): Add OP_FCMLA_ELEM.
opcodes/
2016-11-18 Szabolcs Nagy <szabolcs.nagy@arm.com>
* aarch64-tbl.h (QL_V3SAMEHSD_ROT, QL_ELEMENT_ROT): Define.
(aarch64_feature_simd_v8_3, SIMD_V8_3): Define.
(aarch64_opcode_table): Add fcmla and fcadd.
(AARCH64_OPERANDS): Add IMM_ROT{1,2,3}.
* aarch64-asm.h (aarch64_ins_imm_rotate): Declare.
* aarch64-asm.c (aarch64_ins_imm_rotate): Define.
* aarch64-dis.h (aarch64_ext_imm_rotate): Declare.
* aarch64-dis.c (aarch64_ext_imm_rotate): Define.
* aarch64-opc.h (enum aarch64_field_kind): Add FLD_rotate{1,2,3}.
* aarch64-opc.c (fields): Add FLD_rotate{1,2,3}.
(operand_general_constraint_met_p): Rotate and index range check.
(aarch64_print_operand): Handle rotate operand.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis-2.c: Likewise.
* aarch64-opc-2.c: Likewise.
gas/
2016-11-18 Szabolcs Nagy <szabolcs.nagy@arm.com>
* config/tc-aarch64.c (parse_operands): Handle AARCH64_OPND_IMM_ROT*.
* testsuite/gas/aarch64/advsimd-armv8_3.d: New.
* testsuite/gas/aarch64/advsimd-armv8_3.s: New.
* testsuite/gas/aarch64/illegal-fcmla.s: New.
* testsuite/gas/aarch64/illegal-fcmla.l: New.
* testsuite/gas/aarch64/illegal-fcmla.d: New.
2016-11-18 18:02:16 +08:00
|
|
|
|
OP_FCMLA_ELEM, /* ARMv8.3, indexed element version. */
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
OP_TOTAL_NUM, /* Pseudo. */
|
|
|
|
|
};
|
|
|
|
|
|
2018-10-04 01:35:15 +08:00
|
|
|
|
/* Error types. */
|
|
|
|
|
enum err_type
|
|
|
|
|
{
|
|
|
|
|
ERR_OK,
|
|
|
|
|
ERR_UND,
|
|
|
|
|
ERR_UNP,
|
|
|
|
|
ERR_NYI,
|
2018-10-04 01:38:42 +08:00
|
|
|
|
ERR_VFI,
|
2018-10-04 01:35:15 +08:00
|
|
|
|
ERR_NR_ENTRIES
|
|
|
|
|
};
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
/* 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_boolean
|
|
|
|
|
empty_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;
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-04 01:27:52 +08:00
|
|
|
|
/* Forward declare error reporting type. */
|
|
|
|
|
typedef struct aarch64_operand_error aarch64_operand_error;
|
|
|
|
|
/* Forward declare instruction sequence type. */
|
|
|
|
|
typedef struct aarch64_instr_sequence aarch64_instr_sequence;
|
|
|
|
|
/* Forward declare instruction definition. */
|
|
|
|
|
typedef struct aarch64_inst aarch64_inst;
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
/* 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 */
|
AArch64: Mark sve instructions that require MOVPRFX constraints
This patch series is to allow certain instructions such as the SVE MOVPRFX
instruction to apply a constraint/dependency on the instruction at PC+4.
This patch starts this off by marking which instructions impose the constraint
and which instructions must adhere to the constraint. This is done in a
generic way by extending the verifiers.
* The constraint F_SCAN indicates that an instruction opens a sequence and imposes
a constraint on an instructions following it. The length of the sequence depends
on the instruction itself and it handled in the verifier code.
* The C_SCAN_MOVPRFX flag is used to indicate which constrain the instruction is
checked against. An instruction with both F_SCAN and C_SCAN_MOVPRFX starts a
block for the C_SCAN_MOVPRFX instruction, and one with only C_SCAN_MOVPRFX must
adhere to a previous block constraint is applicable.
The SVE instructions in this list have been marked according to the SVE
specification[1].
[1] https://developer.arm.com/docs/ddi0584/latest/arm-architecture-reference-manual-supplement-the-scalable-vector-extension-sve-for-armv8-a
include/
* opcode/aarch64.h (struct aarch64_opcode): Add constraints,
extend flags field size.
(F_SCAN, C_SCAN_MOVPRFX, C_MAX_ELEM): New.
opcodes/
* aarch64-tbl.h (CORE_INSN, __FP_INSN, SIMD_INSN, CRYP_INSN, _CRC_INSN,
_LSE_INSN, _LOR_INSN, RDMA_INSN, FF16_INSN, SF16_INSN, V8_2_INSN,
_SVE_INSN, V8_3_INSN, CNUM_INSN, RCPC_INSN, SHA2_INSN, AES_INSN,
V8_4_INSN, SHA3_INSN, SM4_INSN, FP16_V8_2_INSN, DOT_INSN): Initialize
constraints.
(_SVE_INSNC): New.
(struct aarch64_opcode): (fjcvtzs, ldpsw, ldpsw, esb, psb): Initialize
constraints.
(movprfx): Change _SVE_INSN into _SVE_INSNC, add C_SCAN_MOVPRFX and
F_SCAN flags.
(msb, mul, neg, not, orr, rbit, revb, revh, revw, sabd, scvtf,
sdiv, sdivr, sdot, smax, smin, smulh, splice, sqadd, sqdecd, sqdech,
sqdecp, sqdecw, sqincd, sqinch, sqincp, sqincw, sqsub, sub, subr, sxtb,
sxth, sxtw, uabd, ucvtf, udiv, udivr, udot, umax, umin, umulh, uqadd,
uqdecd, uqdech, uqdecp, uqdecw, uqincd, uqinch, uqincp, uqincw, uqsub,
uxtb, uxth, uxtw, bic, eon, orn, mov, fmov): Change _SVE_INSN into _SVE_INSNC and add
C_SCAN_MOVPRFX and C_MAX_ELEM constraints.
2018-10-04 01:22:15 +08:00
|
|
|
|
uint64_t flags;
|
|
|
|
|
|
|
|
|
|
/* Extra constraints on the instruction that the verifier checks. */
|
|
|
|
|
uint32_t constraints;
|
2016-04-28 16:11:03 +08:00
|
|
|
|
|
[AArch64][SVE 20/32] Add support for tied operands
SVE has some instructions in which the same register appears twice
in the assembly string, once as an input and once as an output.
This patch adds a general mechanism for that.
The patch needs to add new information to the instruction entries.
One option would have been to extend the flags field of the opcode
to 64 bits (since we already rely on 64-bit integers being available
on the host). However, the *_INSN macros mean that it's easy to add
new information as top-level fields without affecting the existing
table entries too much. Going for that option seemed to give slightly
neater code.
include/
* opcode/aarch64.h (aarch64_opcode): Add a tied_operand field.
(AARCH64_OPDE_UNTIED_OPERAND): New aarch64_operand_error_kind.
opcodes/
* aarch64-tbl.h (CORE_INSN, __FP_INSN, SIMD_INSN, CRYP_INSN)
(_CRC_INSN, _LSE_INSN, _LOR_INSN, RDMA_INSN, FP16_INSN, SF16_INSN)
(V8_2_INSN, aarch64_opcode_table): Initialize tied_operand field.
* aarch64-opc.c (aarch64_match_operands_constraint): Check for
tied operands.
gas/
* config/tc-aarch64.c (output_operand_error_record): Handle
AARCH64_OPDE_UNTIED_OPERAND.
2016-09-21 23:52:30 +08:00
|
|
|
|
/* If nonzero, this operand and operand 0 are both registers and
|
|
|
|
|
are required to have the same register number. */
|
|
|
|
|
unsigned char tied_operand;
|
|
|
|
|
|
2016-04-28 16:11:03 +08:00
|
|
|
|
/* If non-NULL, a function to verify that a given instruction is valid. */
|
2018-10-04 01:37:07 +08:00
|
|
|
|
enum err_type (* verifier) (const struct aarch64_inst *, const aarch64_insn,
|
|
|
|
|
bfd_vma, bfd_boolean, aarch64_operand_error *,
|
|
|
|
|
struct aarch64_instr_sequence *);
|
2012-08-13 22:52:54 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct aarch64_opcode aarch64_opcode;
|
|
|
|
|
|
|
|
|
|
/* Table describing all the AArch64 opcodes. */
|
|
|
|
|
extern aarch64_opcode aarch64_opcode_table[];
|
|
|
|
|
|
|
|
|
|
/* Opcode flags. */
|
|
|
|
|
#define F_ALIAS (1 << 0)
|
|
|
|
|
#define F_HAS_ALIAS (1 << 1)
|
|
|
|
|
/* Disassembly preference priority 1-3 (the larger the higher). If nothing
|
|
|
|
|
is specified, it is the priority 0 by default, i.e. the lowest priority. */
|
|
|
|
|
#define F_P1 (1 << 2)
|
|
|
|
|
#define F_P2 (2 << 2)
|
|
|
|
|
#define F_P3 (3 << 2)
|
|
|
|
|
/* Flag an instruction that is truly conditional executed, e.g. b.cond. */
|
|
|
|
|
#define F_COND (1 << 4)
|
|
|
|
|
/* Instruction has the field of 'sf'. */
|
|
|
|
|
#define F_SF (1 << 5)
|
|
|
|
|
/* Instruction has the field of 'size:Q'. */
|
|
|
|
|
#define F_SIZEQ (1 << 6)
|
|
|
|
|
/* Floating-point instruction has the field of 'type'. */
|
|
|
|
|
#define F_FPTYPE (1 << 7)
|
|
|
|
|
/* AdvSIMD scalar instruction has the field of 'size'. */
|
|
|
|
|
#define F_SSIZE (1 << 8)
|
|
|
|
|
/* AdvSIMD vector register arrangement specifier encoded in "imm5<3:0>:Q". */
|
|
|
|
|
#define F_T (1 << 9)
|
|
|
|
|
/* Size of GPR operand in AdvSIMD instructions encoded in Q. */
|
|
|
|
|
#define F_GPRSIZE_IN_Q (1 << 10)
|
|
|
|
|
/* Size of Rt load signed instruction encoded in opc[0], i.e. bit 22. */
|
|
|
|
|
#define F_LDS_SIZE (1 << 11)
|
|
|
|
|
/* Optional operand; assume maximum of 1 operand can be optional. */
|
|
|
|
|
#define F_OPD0_OPT (1 << 12)
|
|
|
|
|
#define F_OPD1_OPT (2 << 12)
|
|
|
|
|
#define F_OPD2_OPT (3 << 12)
|
|
|
|
|
#define F_OPD3_OPT (4 << 12)
|
|
|
|
|
#define F_OPD4_OPT (5 << 12)
|
|
|
|
|
/* Default value for the optional operand when omitted from the assembly. */
|
|
|
|
|
#define F_DEFAULT(X) (((X) & 0x1f) << 15)
|
|
|
|
|
/* Instruction that is an alias of another instruction needs to be
|
|
|
|
|
encoded/decoded by converting it to/from the real form, followed by
|
|
|
|
|
the encoding/decoding according to the rules of the real opcode.
|
|
|
|
|
This compares to the direct coding using the alias's information.
|
|
|
|
|
N.B. this flag requires F_ALIAS to be used together. */
|
|
|
|
|
#define F_CONV (1 << 20)
|
|
|
|
|
/* Use together with F_ALIAS to indicate an alias opcode is a programmer
|
|
|
|
|
friendly pseudo instruction available only in the assembly code (thus will
|
|
|
|
|
not show up in the disassembly). */
|
|
|
|
|
#define F_PSEUDO (1 << 21)
|
|
|
|
|
/* Instruction has miscellaneous encoding/decoding rules. */
|
|
|
|
|
#define F_MISC (1 << 22)
|
|
|
|
|
/* Instruction has the field of 'N'; used in conjunction with F_SF. */
|
|
|
|
|
#define F_N (1 << 23)
|
|
|
|
|
/* Opcode dependent field. */
|
|
|
|
|
#define F_OD(X) (((X) & 0x7) << 24)
|
2014-09-03 21:40:41 +08:00
|
|
|
|
/* Instruction has the field of 'sz'. */
|
|
|
|
|
#define F_LSE_SZ (1 << 27)
|
2016-09-21 23:51:00 +08:00
|
|
|
|
/* Require an exact qualifier match, even for NIL qualifiers. */
|
|
|
|
|
#define F_STRICT (1ULL << 28)
|
Implement Read/Write constraints on system registers on AArch64
This patch adds constraints for read and write only system registers with the
msr and mrs instructions. The code will treat having both flags set and none
set as the same. These flags add constraints that must be matched up. e.g. a
system register with a READ only flag set, can only be used with mrs. If The
constraint fails a warning is emitted.
Examples of the warnings generated:
test.s: Assembler messages:
test.s:5: Warning: specified register cannot be written to at operand 1 -- `msr dbgdtrrx_el0,x3'
test.s:7: Warning: specified register cannot be read from at operand 2 -- `mrs x3,dbgdtrtx_el0'
test.s:8: Warning: specified register cannot be written to at operand 1 -- `msr midr_el1,x3'
and disassembly notes:
0000000000000000 <main>:
0: d5130503 msr dbgdtrtx_el0, x3
4: d5130503 msr dbgdtrtx_el0, x3
8: d5330503 mrs x3, dbgdtrrx_el0
c: d5330503 mrs x3, dbgdtrrx_el0
10: d5180003 msr midr_el1, x3 ; note: writing to a read-only register.
Note that because dbgdtrrx_el0 and dbgdtrtx_el0 have the same encoding, during
disassembly the constraints are use to disambiguate between the two. An exact
constraint match is always prefered over partial ones if available.
As always the warnings can be suppressed with -w and also be made errors using
warnings as errors.
binutils/
PR binutils/21446
* doc/binutils.texi (-M): Document AArch64 options.
gas/
PR binutils/21446
* testsuite/gas/aarch64/illegal-sysreg-2.s: Fix pmbidr_el1 test.
* testsuite/gas/aarch64/illegal-sysreg-2.l: Likewise.
* testsuite/gas/aarch64/illegal-sysreg-2.d: Likewise.
* testsuite/gas/aarch64/sysreg-diagnostic.s: New.
* testsuite/gas/aarch64/sysreg-diagnostic.l: New.
* testsuite/gas/aarch64/sysreg-diagnostic.d: New.
include/
PR binutils/21446
* opcode/aarch64.h (F_SYS_READ, F_SYS_WRITE): New.
opcodes/
PR binutils/21446
* aarch64-asm.c (opintl.h): Include.
(aarch64_ins_sysreg): Enforce read/write constraints.
* aarch64-dis.c (aarch64_ext_sysreg): Likewise.
* aarch64-opc.h (F_DEPRECATED, F_ARCHEXT, F_HASXT): Moved here.
(F_REG_READ, F_REG_WRITE): New.
* aarch64-opc.c (aarch64_print_operand): Generate notes for
AARCH64_OPND_SYSREG.
(F_DEPRECATED, F_ARCHEXT, F_HASXT): Move to aarch64-opc.h.
(aarch64_sys_regs): Add constraints to currentel, midr_el1, ctr_el0,
mpidr_el1, revidr_el1, aidr_el1, dczid_el0, id_dfr0_el1, id_pfr0_el1,
id_pfr1_el1, id_afr0_el1, id_mmfr0_el1, id_mmfr1_el1, id_mmfr2_el1,
id_mmfr3_el1, id_mmfr4_el1, id_isar0_el1, id_isar1_el1, id_isar2_el1,
id_isar3_el1, id_isar4_el1, id_isar5_el1, mvfr0_el1, mvfr1_el1,
mvfr2_el1, ccsidr_el1, id_aa64pfr0_el1, id_aa64pfr1_el1,
id_aa64dfr0_el1, id_aa64dfr1_el1, id_aa64isar0_el1, id_aa64isar1_el1,
id_aa64mmfr0_el1, id_aa64mmfr1_el1, id_aa64mmfr2_el1, id_aa64afr0_el1,
id_aa64afr0_el1, id_aa64afr1_el1, id_aa64zfr0_el1, clidr_el1,
csselr_el1, vsesr_el2, erridr_el1, erxfr_el1, rvbar_el1, rvbar_el2,
rvbar_el3, isr_el1, tpidrro_el0, cntfrq_el0, cntpct_el0, cntvct_el0,
mdccsr_el0, dbgdtrrx_el0, dbgdtrtx_el0, osdtrrx_el1, osdtrtx_el1,
mdrar_el1, oslar_el1, oslsr_el1, dbgauthstatus_el1, pmbidr_el1,
pmsidr_el1, pmswinc_el0, pmceid0_el0, pmceid1_el0.
* aarch64-tbl.h (aarch64_opcode_table): Add constraints to
msr (F_SYS_WRITE), mrs (F_SYS_READ).
2018-05-15 23:37:20 +08:00
|
|
|
|
/* This system instruction is used to read system registers. */
|
|
|
|
|
#define F_SYS_READ (1ULL << 29)
|
|
|
|
|
/* This system instruction is used to write system registers. */
|
|
|
|
|
#define F_SYS_WRITE (1ULL << 30)
|
AArch64: Mark sve instructions that require MOVPRFX constraints
This patch series is to allow certain instructions such as the SVE MOVPRFX
instruction to apply a constraint/dependency on the instruction at PC+4.
This patch starts this off by marking which instructions impose the constraint
and which instructions must adhere to the constraint. This is done in a
generic way by extending the verifiers.
* The constraint F_SCAN indicates that an instruction opens a sequence and imposes
a constraint on an instructions following it. The length of the sequence depends
on the instruction itself and it handled in the verifier code.
* The C_SCAN_MOVPRFX flag is used to indicate which constrain the instruction is
checked against. An instruction with both F_SCAN and C_SCAN_MOVPRFX starts a
block for the C_SCAN_MOVPRFX instruction, and one with only C_SCAN_MOVPRFX must
adhere to a previous block constraint is applicable.
The SVE instructions in this list have been marked according to the SVE
specification[1].
[1] https://developer.arm.com/docs/ddi0584/latest/arm-architecture-reference-manual-supplement-the-scalable-vector-extension-sve-for-armv8-a
include/
* opcode/aarch64.h (struct aarch64_opcode): Add constraints,
extend flags field size.
(F_SCAN, C_SCAN_MOVPRFX, C_MAX_ELEM): New.
opcodes/
* aarch64-tbl.h (CORE_INSN, __FP_INSN, SIMD_INSN, CRYP_INSN, _CRC_INSN,
_LSE_INSN, _LOR_INSN, RDMA_INSN, FF16_INSN, SF16_INSN, V8_2_INSN,
_SVE_INSN, V8_3_INSN, CNUM_INSN, RCPC_INSN, SHA2_INSN, AES_INSN,
V8_4_INSN, SHA3_INSN, SM4_INSN, FP16_V8_2_INSN, DOT_INSN): Initialize
constraints.
(_SVE_INSNC): New.
(struct aarch64_opcode): (fjcvtzs, ldpsw, ldpsw, esb, psb): Initialize
constraints.
(movprfx): Change _SVE_INSN into _SVE_INSNC, add C_SCAN_MOVPRFX and
F_SCAN flags.
(msb, mul, neg, not, orr, rbit, revb, revh, revw, sabd, scvtf,
sdiv, sdivr, sdot, smax, smin, smulh, splice, sqadd, sqdecd, sqdech,
sqdecp, sqdecw, sqincd, sqinch, sqincp, sqincw, sqsub, sub, subr, sxtb,
sxth, sxtw, uabd, ucvtf, udiv, udivr, udot, umax, umin, umulh, uqadd,
uqdecd, uqdech, uqdecp, uqdecw, uqincd, uqinch, uqincp, uqincw, uqsub,
uxtb, uxth, uxtw, bic, eon, orn, mov, fmov): Change _SVE_INSN into _SVE_INSNC and add
C_SCAN_MOVPRFX and C_MAX_ELEM constraints.
2018-10-04 01:22:15 +08:00
|
|
|
|
/* This instruction has an extra constraint on it that imposes a requirement on
|
|
|
|
|
subsequent instructions. */
|
|
|
|
|
#define F_SCAN (1ULL << 31)
|
|
|
|
|
/* Next bit is 32. */
|
|
|
|
|
|
|
|
|
|
/* Instruction constraints. */
|
|
|
|
|
/* This instruction has a predication constraint on the instruction at PC+4. */
|
|
|
|
|
#define C_SCAN_MOVPRFX (1U << 0)
|
|
|
|
|
/* This instruction's operation width is determined by the operand with the
|
|
|
|
|
largest element size. */
|
|
|
|
|
#define C_MAX_ELEM (1U << 1)
|
|
|
|
|
/* Next bit is 2. */
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
static inline bfd_boolean
|
|
|
|
|
alias_opcode_p (const aarch64_opcode *opcode)
|
|
|
|
|
{
|
|
|
|
|
return (opcode->flags & F_ALIAS) ? TRUE : FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bfd_boolean
|
|
|
|
|
opcode_has_alias (const aarch64_opcode *opcode)
|
|
|
|
|
{
|
|
|
|
|
return (opcode->flags & F_HAS_ALIAS) ? TRUE : FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Priority for disassembling preference. */
|
|
|
|
|
static inline int
|
|
|
|
|
opcode_priority (const aarch64_opcode *opcode)
|
|
|
|
|
{
|
|
|
|
|
return (opcode->flags >> 2) & 0x3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bfd_boolean
|
|
|
|
|
pseudo_opcode_p (const aarch64_opcode *opcode)
|
|
|
|
|
{
|
|
|
|
|
return (opcode->flags & F_PSEUDO) != 0lu ? TRUE : FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bfd_boolean
|
|
|
|
|
optional_operand_p (const aarch64_opcode *opcode, unsigned int idx)
|
|
|
|
|
{
|
|
|
|
|
return (((opcode->flags >> 12) & 0x7) == idx + 1)
|
|
|
|
|
? TRUE : FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline aarch64_insn
|
|
|
|
|
get_optional_operand_default_value (const aarch64_opcode *opcode)
|
|
|
|
|
{
|
|
|
|
|
return (opcode->flags >> 15) & 0x1f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline unsigned int
|
|
|
|
|
get_opcode_dependent_value (const aarch64_opcode *opcode)
|
|
|
|
|
{
|
|
|
|
|
return (opcode->flags >> 24) & 0x7;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bfd_boolean
|
|
|
|
|
opcode_has_special_coder (const aarch64_opcode *opcode)
|
|
|
|
|
{
|
2014-09-03 21:40:41 +08:00
|
|
|
|
return (opcode->flags & (F_SF | F_LSE_SZ | F_SIZEQ | F_FPTYPE | F_SSIZE | F_T
|
2012-08-13 22:52:54 +08:00
|
|
|
|
| F_GPRSIZE_IN_Q | F_LDS_SIZE | F_MISC | F_N | F_COND)) ? TRUE
|
|
|
|
|
: FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct aarch64_name_value_pair
|
|
|
|
|
{
|
|
|
|
|
const char * name;
|
|
|
|
|
aarch64_insn value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern const struct aarch64_name_value_pair aarch64_operand_modifiers [];
|
|
|
|
|
extern const struct aarch64_name_value_pair aarch64_barrier_options [16];
|
|
|
|
|
extern const struct aarch64_name_value_pair aarch64_prfops [32];
|
2015-12-11 18:11:27 +08:00
|
|
|
|
extern const struct aarch64_name_value_pair aarch64_hint_options [];
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
2013-11-06 04:54:22 +08:00
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
const char * name;
|
|
|
|
|
aarch64_insn value;
|
|
|
|
|
uint32_t flags;
|
|
|
|
|
} aarch64_sys_reg;
|
|
|
|
|
|
|
|
|
|
extern const aarch64_sys_reg aarch64_sys_regs [];
|
2013-11-20 19:22:40 +08:00
|
|
|
|
extern const aarch64_sys_reg aarch64_pstatefields [];
|
2013-11-06 04:54:22 +08:00
|
|
|
|
extern bfd_boolean aarch64_sys_reg_deprecated_p (const aarch64_sys_reg *);
|
2015-06-01 23:00:28 +08:00
|
|
|
|
extern bfd_boolean aarch64_sys_reg_supported_p (const aarch64_feature_set,
|
|
|
|
|
const aarch64_sys_reg *);
|
|
|
|
|
extern bfd_boolean aarch64_pstatefield_supported_p (const aarch64_feature_set,
|
|
|
|
|
const aarch64_sys_reg *);
|
2013-11-06 04:54:22 +08:00
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
typedef struct
|
|
|
|
|
{
|
2015-10-07 19:23:15 +08:00
|
|
|
|
const char *name;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
uint32_t value;
|
2015-12-11 00:31:35 +08:00
|
|
|
|
uint32_t flags ;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
} aarch64_sys_ins_reg;
|
|
|
|
|
|
2015-12-11 00:31:35 +08:00
|
|
|
|
extern bfd_boolean aarch64_sys_ins_reg_has_xt (const aarch64_sys_ins_reg *);
|
2015-12-11 00:38:44 +08:00
|
|
|
|
extern bfd_boolean
|
|
|
|
|
aarch64_sys_ins_reg_supported_p (const aarch64_feature_set,
|
|
|
|
|
const aarch64_sys_ins_reg *);
|
2015-12-11 00:31:35 +08:00
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
extern const aarch64_sys_ins_reg aarch64_sys_regs_ic [];
|
|
|
|
|
extern const aarch64_sys_ins_reg aarch64_sys_regs_dc [];
|
|
|
|
|
extern const aarch64_sys_ins_reg aarch64_sys_regs_at [];
|
|
|
|
|
extern const aarch64_sys_ins_reg aarch64_sys_regs_tlbi [];
|
|
|
|
|
|
|
|
|
|
/* Shift/extending operator kinds.
|
|
|
|
|
N.B. order is important; keep aarch64_operand_modifiers synced. */
|
|
|
|
|
enum aarch64_modifier_kind
|
|
|
|
|
{
|
|
|
|
|
AARCH64_MOD_NONE,
|
|
|
|
|
AARCH64_MOD_MSL,
|
|
|
|
|
AARCH64_MOD_ROR,
|
|
|
|
|
AARCH64_MOD_ASR,
|
|
|
|
|
AARCH64_MOD_LSR,
|
|
|
|
|
AARCH64_MOD_LSL,
|
|
|
|
|
AARCH64_MOD_UXTB,
|
|
|
|
|
AARCH64_MOD_UXTH,
|
|
|
|
|
AARCH64_MOD_UXTW,
|
|
|
|
|
AARCH64_MOD_UXTX,
|
|
|
|
|
AARCH64_MOD_SXTB,
|
|
|
|
|
AARCH64_MOD_SXTH,
|
|
|
|
|
AARCH64_MOD_SXTW,
|
|
|
|
|
AARCH64_MOD_SXTX,
|
[AArch64][SVE 24/32] Add AARCH64_OPND_SVE_PATTERN_SCALED
Some SVE instructions count the number of elements in a given vector
pattern and allow a scale factor of [1, 16] to be applied to the result.
This scale factor is written ", MUL #n", where "MUL" is a new operator.
E.g.:
UQINCD X0, POW2, MUL #2
This patch adds support for this kind of operand.
All existing operators were shifts of some kind, so there was a natural
range of [0, 63] regardless of context. This was then narrowered further
by later checks (e.g. to [0, 31] when used for 32-bit values).
In contrast, MUL doesn't really have a natural context-independent range.
Rather than pick one arbitrarily, it seemed better to make the "shift"
amount a full 64-bit value and leave the range test to the usual
operand-checking code. I've rearranged the fields of aarch64_opnd_info
so that this doesn't increase the size of the structure (although I don't
think its size is critical anyway).
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_PATTERN_SCALED): New
aarch64_opnd.
(AARCH64_MOD_MUL): New aarch64_modifier_kind.
(aarch64_opnd_info): Make shifter.amount an int64_t and
rearrange the fields.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add an entry for
AARCH64_OPND_SVE_PATTERN_SCALED.
* aarch64-opc.h (FLD_SVE_imm4): New aarch64_field_kind.
* aarch64-opc.c (fields): Add a corresponding entry.
(set_multiplier_out_of_range_error): New function.
(aarch64_operand_modifiers): Add entry for AARCH64_MOD_MUL.
(operand_general_constraint_met_p): Handle
AARCH64_OPND_SVE_PATTERN_SCALED.
(print_register_offset_address): Use PRIi64 to print the
shift amount.
(aarch64_print_operand): Likewise. Handle
AARCH64_OPND_SVE_PATTERN_SCALED.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_scale): New inserter.
* aarch64-asm.c (aarch64_ins_sve_scale): New function.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_scale): New inserter.
* aarch64-dis.c (aarch64_ext_sve_scale): New function.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (SHIFTED_MUL): New parse_shift_mode.
(parse_shift): Handle it. Reject AARCH64_MOD_MUL for all other
shift modes. Skip range tests for AARCH64_MOD_MUL.
(process_omitted_operand): Handle AARCH64_OPND_SVE_PATTERN_SCALED.
(parse_operands): Likewise.
2016-09-21 23:55:22 +08:00
|
|
|
|
AARCH64_MOD_MUL,
|
[AArch64][SVE 26/32] Add SVE MUL VL addressing modes
This patch adds support for addresses of the form:
[<base>, #<offset>, MUL VL]
This involves adding a new AARCH64_MOD_MUL_VL modifier, which is
why I split it out from the other addressing modes.
For LD2, LD3 and LD4, the offset must be a multiple of the structure
size, so for LD3 the possible values are 0, 3, 6, .... The patch
therefore extends value_aligned_p to handle non-power-of-2 alignments.
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_ADDR_RI_S4xVL): New aarch64_opnd.
(AARCH64_OPND_SVE_ADDR_RI_S4x2xVL, AARCH64_OPND_SVE_ADDR_RI_S4x3xVL)
(AARCH64_OPND_SVE_ADDR_RI_S4x4xVL, AARCH64_OPND_SVE_ADDR_RI_S6xVL)
(AARCH64_OPND_SVE_ADDR_RI_S9xVL): Likewise.
(AARCH64_MOD_MUL_VL): New aarch64_modifier_kind.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for new MUL VL
operands.
* aarch64-opc.c (aarch64_operand_modifiers): Initialize
the AARCH64_MOD_MUL_VL entry.
(value_aligned_p): Cope with non-power-of-two alignments.
(operand_general_constraint_met_p): Handle the new MUL VL addresses.
(print_immediate_offset_address): Likewise.
(aarch64_print_operand): Likewise.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_addr_ri_s4xvl, ins_sve_addr_ri_s6xvl)
(ins_sve_addr_ri_s9xvl): New inserters.
* aarch64-asm.c (aarch64_ins_sve_addr_ri_s4xvl): New function.
(aarch64_ins_sve_addr_ri_s6xvl): Likewise.
(aarch64_ins_sve_addr_ri_s9xvl): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_addr_ri_s4xvl, ext_sve_addr_ri_s6xvl)
(ext_sve_addr_ri_s9xvl): New extractors.
* aarch64-dis.c (aarch64_ext_sve_addr_reg_mul_vl): New function.
(aarch64_ext_sve_addr_ri_s4xvl): Likewise.
(aarch64_ext_sve_addr_ri_s6xvl): Likewise.
(aarch64_ext_sve_addr_ri_s9xvl): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (SHIFTED_NONE, SHIFTED_MUL_VL): New
parse_shift_modes.
(parse_shift): Handle SHIFTED_MUL_VL.
(parse_address_main): Add an imm_shift_mode parameter.
(parse_address, parse_sve_address): Update accordingly.
(parse_operands): Handle MUL VL addressing modes.
2016-09-21 23:56:15 +08:00
|
|
|
|
AARCH64_MOD_MUL_VL,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
bfd_boolean
|
|
|
|
|
aarch64_extend_operator_p (enum aarch64_modifier_kind);
|
|
|
|
|
|
|
|
|
|
enum aarch64_modifier_kind
|
|
|
|
|
aarch64_get_operand_modifier (const struct aarch64_name_value_pair *);
|
|
|
|
|
/* Condition. */
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
/* A list of names with the first one as the disassembly preference;
|
|
|
|
|
terminated by NULL if fewer than 3. */
|
[AArch64] Add SVE condition codes
SVE defines new names for existing NZCV conditions, to reflect the
result of instructions like PTEST. This patch adds support for these
names.
The patch also adds comments to the disassembly output to show the
alternative names of a condition code. For example:
cinv x0, x1, cc
becomes:
cinv x0, x1, cc // cc = lo, ul, last
and:
b.cc f0 <...>
becomes:
b.cc f0 <...> // b.lo, b.ul, b.last
Doing this for the SVE names follows the practice recommended by the
SVE specification and is definitely useful when reading SVE code.
If the feeling is that it's too distracting elsewhere, we could add
an option to turn it off.
include/
* opcode/aarch64.h (aarch64_cond): Bump array size to 4.
opcodes/
* aarch64-dis.c (remove_dot_suffix): New function, split out from...
(print_mnemonic_name): ...here.
(print_comment): New function.
(print_aarch64_insn): Call it.
* aarch64-opc.c (aarch64_conds): Add SVE names.
(aarch64_print_operand): Print alternative condition names in
a comment.
gas/
* config/tc-aarch64.c (opcode_lookup): Search for the end of
a condition name, rather than assuming that it will have exactly
2 characters.
(parse_operands): Likewise.
* testsuite/gas/aarch64/alias.d: Add new condition-code comments
to the expected output.
* testsuite/gas/aarch64/beq_1.d: Likewise.
* testsuite/gas/aarch64/float-fp16.d: Likewise.
* testsuite/gas/aarch64/int-insns.d: Likewise.
* testsuite/gas/aarch64/no-aliases.d: Likewise.
* testsuite/gas/aarch64/programmer-friendly.d: Likewise.
* testsuite/gas/aarch64/reloc-insn.d: Likewise.
* testsuite/gas/aarch64/b_c_1.d, testsuite/gas/aarch64/b_c_1.s:
New test.
ld/
* testsuite/ld-aarch64/emit-relocs-280.d: Match branch comments.
* testsuite/ld-aarch64/weak-undefined.d: Likewise.
2016-09-22 00:09:59 +08:00
|
|
|
|
const char *names[4];
|
2012-08-13 22:52:54 +08:00
|
|
|
|
aarch64_insn value;
|
|
|
|
|
} aarch64_cond;
|
|
|
|
|
|
|
|
|
|
extern const aarch64_cond aarch64_conds[16];
|
|
|
|
|
|
|
|
|
|
const aarch64_cond* get_cond_from_value (aarch64_insn value);
|
|
|
|
|
const aarch64_cond* get_inverted_cond (const aarch64_cond *cond);
|
|
|
|
|
|
|
|
|
|
/* Structure representing an operand. */
|
|
|
|
|
|
|
|
|
|
struct aarch64_opnd_info
|
|
|
|
|
{
|
|
|
|
|
enum aarch64_opnd type;
|
|
|
|
|
aarch64_opnd_qualifier_t qualifier;
|
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
unsigned regno;
|
|
|
|
|
} reg;
|
|
|
|
|
struct
|
|
|
|
|
{
|
2016-06-28 16:21:04 +08:00
|
|
|
|
unsigned int regno;
|
|
|
|
|
int64_t index;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
} reglane;
|
|
|
|
|
/* e.g. LVn. */
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
unsigned first_regno : 5;
|
|
|
|
|
unsigned num_regs : 3;
|
|
|
|
|
/* 1 if it is a list of reg element. */
|
|
|
|
|
unsigned has_index : 1;
|
|
|
|
|
/* Lane index; valid only when has_index is 1. */
|
2016-06-28 16:21:04 +08:00
|
|
|
|
int64_t index;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
} reglist;
|
|
|
|
|
/* e.g. immediate or pc relative address offset. */
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
int64_t value;
|
|
|
|
|
unsigned is_fp : 1;
|
|
|
|
|
} imm;
|
|
|
|
|
/* e.g. address in STR (register offset). */
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
unsigned base_regno;
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
int imm;
|
|
|
|
|
unsigned regno;
|
|
|
|
|
};
|
|
|
|
|
unsigned is_reg;
|
|
|
|
|
} offset;
|
|
|
|
|
unsigned pcrel : 1; /* PC-relative. */
|
|
|
|
|
unsigned writeback : 1;
|
|
|
|
|
unsigned preind : 1; /* Pre-indexed. */
|
|
|
|
|
unsigned postind : 1; /* Post-indexed. */
|
|
|
|
|
} addr;
|
Modify AArch64 Assembly and disassembly functions to be able to fail and report why.
This patch if the first patch in a series to add the ability to add constraints
to system registers that an instruction must adhere to in order for the register
to be usable with that instruction.
These constraints can also be used to disambiguate between registers with the
same encoding during disassembly.
This patch adds a new flags entry in the sysreg structures and ensures it is
filled in and read out during assembly/disassembly. It also adds the ability for
the assemble and disassemble functions to be able to gracefully fail and re-use
the existing error reporting infrastructure.
The return type of these functions are changed to a boolean to denote success or
failure and the error structure is passed around to them. This requires
aarch64-gen changes so a lot of the changes here are just mechanical.
gas/
PR binutils/21446
* config/tc-aarch64.c (parse_sys_reg): Return register flags.
(parse_operands): Fill in register flags.
gdb/
PR binutils/21446
* aarch64-tdep.c (aarch64_analyze_prologue,
aarch64_software_single_step, aarch64_displaced_step_copy_insn):
Indicate not interested in errors.
include/
PR binutils/21446
* opcode/aarch64.h (aarch64_opnd_info): Change sysreg to struct.
(aarch64_decode_insn): Accept error struct.
opcodes/
PR binutils/21446
* aarch64-asm.h (aarch64_insert_operand, aarch64_##x): Return boolean
and take error struct.
* aarch64-asm.c (aarch64_ext_regno, aarch64_ins_reglane,
aarch64_ins_reglist, aarch64_ins_ldst_reglist,
aarch64_ins_ldst_reglist_r, aarch64_ins_ldst_elemlist,
aarch64_ins_advsimd_imm_shift, aarch64_ins_imm, aarch64_ins_imm_half,
aarch64_ins_advsimd_imm_modified, aarch64_ins_fpimm,
aarch64_ins_imm_rotate1, aarch64_ins_imm_rotate2, aarch64_ins_fbits,
aarch64_ins_aimm, aarch64_ins_limm_1, aarch64_ins_limm,
aarch64_ins_inv_limm, aarch64_ins_ft, aarch64_ins_addr_simple,
aarch64_ins_addr_regoff, aarch64_ins_addr_offset, aarch64_ins_addr_simm,
aarch64_ins_addr_simm10, aarch64_ins_addr_uimm12,
aarch64_ins_simd_addr_post, aarch64_ins_cond, aarch64_ins_sysreg,
aarch64_ins_pstatefield, aarch64_ins_sysins_op, aarch64_ins_barrier,
aarch64_ins_prfop, aarch64_ins_hint, aarch64_ins_reg_extended,
aarch64_ins_reg_shifted, aarch64_ins_sve_addr_ri_s4xvl,
aarch64_ins_sve_addr_ri_s6xvl, aarch64_ins_sve_addr_ri_s9xvl,
aarch64_ins_sve_addr_ri_s4, aarch64_ins_sve_addr_ri_u6,
aarch64_ins_sve_addr_rr_lsl, aarch64_ins_sve_addr_rz_xtw,
aarch64_ins_sve_addr_zi_u5, aarch64_ext_sve_addr_zz,
aarch64_ins_sve_addr_zz_lsl, aarch64_ins_sve_addr_zz_sxtw,
aarch64_ins_sve_addr_zz_uxtw, aarch64_ins_sve_aimm,
aarch64_ins_sve_asimm, aarch64_ins_sve_index, aarch64_ins_sve_limm_mov,
aarch64_ins_sve_quad_index, aarch64_ins_sve_reglist,
aarch64_ins_sve_scale, aarch64_ins_sve_shlimm, aarch64_ins_sve_shrimm,
aarch64_ins_sve_float_half_one, aarch64_ins_sve_float_half_two,
aarch64_ins_sve_float_zero_one, aarch64_opcode_encode): Likewise.
* aarch64-dis.h (aarch64_extract_operand, aarch64_##x): Likewise.
* aarch64-dis.c (aarch64_ext_regno, aarch64_ext_reglane,
aarch64_ext_reglist, aarch64_ext_ldst_reglist,
aarch64_ext_ldst_reglist_r, aarch64_ext_ldst_elemlist,
aarch64_ext_advsimd_imm_shift, aarch64_ext_imm, aarch64_ext_imm_half,
aarch64_ext_advsimd_imm_modified, aarch64_ext_fpimm,
aarch64_ext_imm_rotate1, aarch64_ext_imm_rotate2, aarch64_ext_fbits,
aarch64_ext_aimm, aarch64_ext_limm_1, aarch64_ext_limm, decode_limm,
aarch64_ext_inv_limm, aarch64_ext_ft, aarch64_ext_addr_simple,
aarch64_ext_addr_regoff, aarch64_ext_addr_offset, aarch64_ext_addr_simm,
aarch64_ext_addr_simm10, aarch64_ext_addr_uimm12,
aarch64_ext_simd_addr_post, aarch64_ext_cond, aarch64_ext_sysreg,
aarch64_ext_pstatefield, aarch64_ext_sysins_op, aarch64_ext_barrier,
aarch64_ext_prfop, aarch64_ext_hint, aarch64_ext_reg_extended,
aarch64_ext_reg_shifted, aarch64_ext_sve_addr_ri_s4xvl,
aarch64_ext_sve_addr_ri_s6xvl, aarch64_ext_sve_addr_ri_s9xvl,
aarch64_ext_sve_addr_ri_s4, aarch64_ext_sve_addr_ri_u6,
aarch64_ext_sve_addr_rr_lsl, aarch64_ext_sve_addr_rz_xtw,
aarch64_ext_sve_addr_zi_u5, aarch64_ext_sve_addr_zz,
aarch64_ext_sve_addr_zz_lsl, aarch64_ext_sve_addr_zz_sxtw,
aarch64_ext_sve_addr_zz_uxtw, aarch64_ext_sve_aimm,
aarch64_ext_sve_asimm, aarch64_ext_sve_index, aarch64_ext_sve_limm_mov,
aarch64_ext_sve_quad_index, aarch64_ext_sve_reglist,
aarch64_ext_sve_scale, aarch64_ext_sve_shlimm, aarch64_ext_sve_shrimm,
aarch64_ext_sve_float_half_one, aarch64_ext_sve_float_half_two,
aarch64_ext_sve_float_zero_one, aarch64_opcode_decode): Likewise.
(determine_disassembling_preference, aarch64_decode_insn,
print_insn_aarch64_word, print_insn_data): Take errors struct.
(print_insn_aarch64): Use errors.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis-2.c: Regenerate.
* aarch64-gen.c (print_operand_inserter): Use errors and change type to
boolean in aarch64_insert_operan.
(print_operand_extractor): Likewise.
* aarch64-opc.c (aarch64_print_operand): Use sysreg struct.
2018-05-15 23:11:42 +08:00
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
/* The encoding of the system register. */
|
|
|
|
|
aarch64_insn value;
|
|
|
|
|
|
|
|
|
|
/* The system register flags. */
|
|
|
|
|
uint32_t flags;
|
|
|
|
|
} sysreg;
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
const aarch64_cond *cond;
|
|
|
|
|
/* The encoding of the PSTATE field. */
|
|
|
|
|
aarch64_insn pstatefield;
|
|
|
|
|
const aarch64_sys_ins_reg *sysins_op;
|
|
|
|
|
const struct aarch64_name_value_pair *barrier;
|
2015-12-11 18:11:27 +08:00
|
|
|
|
const struct aarch64_name_value_pair *hint_option;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
const struct aarch64_name_value_pair *prfop;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Operand shifter; in use when the operand is a register offset address,
|
|
|
|
|
add/sub extended reg, etc. e.g. <R><m>{, <extend> {#<amount>}}. */
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
enum aarch64_modifier_kind kind;
|
|
|
|
|
unsigned operator_present: 1; /* Only valid during encoding. */
|
|
|
|
|
/* Value of the 'S' field in ld/st reg offset; used only in decoding. */
|
|
|
|
|
unsigned amount_present: 1;
|
[AArch64][SVE 24/32] Add AARCH64_OPND_SVE_PATTERN_SCALED
Some SVE instructions count the number of elements in a given vector
pattern and allow a scale factor of [1, 16] to be applied to the result.
This scale factor is written ", MUL #n", where "MUL" is a new operator.
E.g.:
UQINCD X0, POW2, MUL #2
This patch adds support for this kind of operand.
All existing operators were shifts of some kind, so there was a natural
range of [0, 63] regardless of context. This was then narrowered further
by later checks (e.g. to [0, 31] when used for 32-bit values).
In contrast, MUL doesn't really have a natural context-independent range.
Rather than pick one arbitrarily, it seemed better to make the "shift"
amount a full 64-bit value and leave the range test to the usual
operand-checking code. I've rearranged the fields of aarch64_opnd_info
so that this doesn't increase the size of the structure (although I don't
think its size is critical anyway).
include/
* opcode/aarch64.h (AARCH64_OPND_SVE_PATTERN_SCALED): New
aarch64_opnd.
(AARCH64_MOD_MUL): New aarch64_modifier_kind.
(aarch64_opnd_info): Make shifter.amount an int64_t and
rearrange the fields.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add an entry for
AARCH64_OPND_SVE_PATTERN_SCALED.
* aarch64-opc.h (FLD_SVE_imm4): New aarch64_field_kind.
* aarch64-opc.c (fields): Add a corresponding entry.
(set_multiplier_out_of_range_error): New function.
(aarch64_operand_modifiers): Add entry for AARCH64_MOD_MUL.
(operand_general_constraint_met_p): Handle
AARCH64_OPND_SVE_PATTERN_SCALED.
(print_register_offset_address): Use PRIi64 to print the
shift amount.
(aarch64_print_operand): Likewise. Handle
AARCH64_OPND_SVE_PATTERN_SCALED.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_sve_scale): New inserter.
* aarch64-asm.c (aarch64_ins_sve_scale): New function.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_sve_scale): New inserter.
* aarch64-dis.c (aarch64_ext_sve_scale): New function.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (SHIFTED_MUL): New parse_shift_mode.
(parse_shift): Handle it. Reject AARCH64_MOD_MUL for all other
shift modes. Skip range tests for AARCH64_MOD_MUL.
(process_omitted_operand): Handle AARCH64_OPND_SVE_PATTERN_SCALED.
(parse_operands): Likewise.
2016-09-21 23:55:22 +08:00
|
|
|
|
int64_t amount;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
} shifter;
|
|
|
|
|
|
|
|
|
|
unsigned skip:1; /* Operand is not completed if there is a fixup needed
|
|
|
|
|
to be done on it. In some (but not all) of these
|
|
|
|
|
cases, we need to tell libopcodes to skip the
|
|
|
|
|
constraint checking and the encoding for this
|
|
|
|
|
operand, so that the libopcodes can pick up the
|
|
|
|
|
right opcode before the operand is fixed-up. This
|
|
|
|
|
flag should only be used during the
|
|
|
|
|
assembling/encoding. */
|
|
|
|
|
unsigned present:1; /* Whether this operand is present in the assembly
|
|
|
|
|
line; not used during the disassembly. */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct aarch64_opnd_info aarch64_opnd_info;
|
|
|
|
|
|
|
|
|
|
/* Structure representing an instruction.
|
|
|
|
|
|
|
|
|
|
It is used during both the assembling and disassembling. The assembler
|
|
|
|
|
fills an aarch64_inst after a successful parsing and then passes it to the
|
|
|
|
|
encoding routine to do the encoding. During the disassembling, the
|
|
|
|
|
disassembler calls the decoding routine to decode a binary instruction; on a
|
|
|
|
|
successful return, such a structure will be filled with information of the
|
|
|
|
|
instruction; then the disassembler uses the information to print out the
|
|
|
|
|
instruction. */
|
|
|
|
|
|
|
|
|
|
struct aarch64_inst
|
|
|
|
|
{
|
|
|
|
|
/* The value of the binary instruction. */
|
|
|
|
|
aarch64_insn value;
|
|
|
|
|
|
|
|
|
|
/* Corresponding opcode entry. */
|
|
|
|
|
const aarch64_opcode *opcode;
|
|
|
|
|
|
|
|
|
|
/* Condition for a truly conditional-executed instrutions, e.g. b.cond. */
|
|
|
|
|
const aarch64_cond *cond;
|
|
|
|
|
|
|
|
|
|
/* Operands information. */
|
|
|
|
|
aarch64_opnd_info operands[AARCH64_MAX_OPND_NUM];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Diagnosis related declaration and interface. */
|
|
|
|
|
|
|
|
|
|
/* Operand error kind enumerators.
|
|
|
|
|
|
|
|
|
|
AARCH64_OPDE_RECOVERABLE
|
|
|
|
|
Less severe error found during the parsing, very possibly because that
|
|
|
|
|
GAS has picked up a wrong instruction template for the parsing.
|
|
|
|
|
|
|
|
|
|
AARCH64_OPDE_SYNTAX_ERROR
|
|
|
|
|
General syntax error; it can be either a user error, or simply because
|
|
|
|
|
that GAS is trying a wrong instruction template.
|
|
|
|
|
|
|
|
|
|
AARCH64_OPDE_FATAL_SYNTAX_ERROR
|
|
|
|
|
Definitely a user syntax error.
|
|
|
|
|
|
|
|
|
|
AARCH64_OPDE_INVALID_VARIANT
|
|
|
|
|
No syntax error, but the operands are not a valid combination, e.g.
|
|
|
|
|
FMOV D0,S0
|
|
|
|
|
|
[AArch64][SVE 20/32] Add support for tied operands
SVE has some instructions in which the same register appears twice
in the assembly string, once as an input and once as an output.
This patch adds a general mechanism for that.
The patch needs to add new information to the instruction entries.
One option would have been to extend the flags field of the opcode
to 64 bits (since we already rely on 64-bit integers being available
on the host). However, the *_INSN macros mean that it's easy to add
new information as top-level fields without affecting the existing
table entries too much. Going for that option seemed to give slightly
neater code.
include/
* opcode/aarch64.h (aarch64_opcode): Add a tied_operand field.
(AARCH64_OPDE_UNTIED_OPERAND): New aarch64_operand_error_kind.
opcodes/
* aarch64-tbl.h (CORE_INSN, __FP_INSN, SIMD_INSN, CRYP_INSN)
(_CRC_INSN, _LSE_INSN, _LOR_INSN, RDMA_INSN, FP16_INSN, SF16_INSN)
(V8_2_INSN, aarch64_opcode_table): Initialize tied_operand field.
* aarch64-opc.c (aarch64_match_operands_constraint): Check for
tied operands.
gas/
* config/tc-aarch64.c (output_operand_error_record): Handle
AARCH64_OPDE_UNTIED_OPERAND.
2016-09-21 23:52:30 +08:00
|
|
|
|
AARCH64_OPDE_UNTIED_OPERAND
|
|
|
|
|
The asm failed to use the same register for a destination operand
|
|
|
|
|
and a tied source operand.
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
AARCH64_OPDE_OUT_OF_RANGE
|
|
|
|
|
Error about some immediate value out of a valid range.
|
|
|
|
|
|
|
|
|
|
AARCH64_OPDE_UNALIGNED
|
|
|
|
|
Error about some immediate value not properly aligned (i.e. not being a
|
|
|
|
|
multiple times of a certain value).
|
|
|
|
|
|
|
|
|
|
AARCH64_OPDE_REG_LIST
|
|
|
|
|
Error about the register list operand having unexpected number of
|
|
|
|
|
registers.
|
|
|
|
|
|
|
|
|
|
AARCH64_OPDE_OTHER_ERROR
|
|
|
|
|
Error of the highest severity and used for any severe issue that does not
|
|
|
|
|
fall into any of the above categories.
|
|
|
|
|
|
|
|
|
|
The enumerators are only interesting to GAS. They are declared here (in
|
|
|
|
|
libopcodes) because that some errors are detected (and then notified to GAS)
|
|
|
|
|
by libopcodes (rather than by GAS solely).
|
|
|
|
|
|
|
|
|
|
The first three errors are only deteced by GAS while the
|
|
|
|
|
AARCH64_OPDE_INVALID_VARIANT error can only be spotted by libopcodes as
|
|
|
|
|
only libopcodes has the information about the valid variants of each
|
|
|
|
|
instruction.
|
|
|
|
|
|
|
|
|
|
The enumerators have an increasing severity. This is helpful when there are
|
|
|
|
|
multiple instruction templates available for a given mnemonic name (e.g.
|
|
|
|
|
FMOV); this mechanism will help choose the most suitable template from which
|
|
|
|
|
the generated diagnostics can most closely describe the issues, if any. */
|
|
|
|
|
|
|
|
|
|
enum aarch64_operand_error_kind
|
|
|
|
|
{
|
|
|
|
|
AARCH64_OPDE_NIL,
|
|
|
|
|
AARCH64_OPDE_RECOVERABLE,
|
|
|
|
|
AARCH64_OPDE_SYNTAX_ERROR,
|
|
|
|
|
AARCH64_OPDE_FATAL_SYNTAX_ERROR,
|
|
|
|
|
AARCH64_OPDE_INVALID_VARIANT,
|
[AArch64][SVE 20/32] Add support for tied operands
SVE has some instructions in which the same register appears twice
in the assembly string, once as an input and once as an output.
This patch adds a general mechanism for that.
The patch needs to add new information to the instruction entries.
One option would have been to extend the flags field of the opcode
to 64 bits (since we already rely on 64-bit integers being available
on the host). However, the *_INSN macros mean that it's easy to add
new information as top-level fields without affecting the existing
table entries too much. Going for that option seemed to give slightly
neater code.
include/
* opcode/aarch64.h (aarch64_opcode): Add a tied_operand field.
(AARCH64_OPDE_UNTIED_OPERAND): New aarch64_operand_error_kind.
opcodes/
* aarch64-tbl.h (CORE_INSN, __FP_INSN, SIMD_INSN, CRYP_INSN)
(_CRC_INSN, _LSE_INSN, _LOR_INSN, RDMA_INSN, FP16_INSN, SF16_INSN)
(V8_2_INSN, aarch64_opcode_table): Initialize tied_operand field.
* aarch64-opc.c (aarch64_match_operands_constraint): Check for
tied operands.
gas/
* config/tc-aarch64.c (output_operand_error_record): Handle
AARCH64_OPDE_UNTIED_OPERAND.
2016-09-21 23:52:30 +08:00
|
|
|
|
AARCH64_OPDE_UNTIED_OPERAND,
|
2012-08-13 22:52:54 +08:00
|
|
|
|
AARCH64_OPDE_OUT_OF_RANGE,
|
|
|
|
|
AARCH64_OPDE_UNALIGNED,
|
|
|
|
|
AARCH64_OPDE_REG_LIST,
|
|
|
|
|
AARCH64_OPDE_OTHER_ERROR
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* N.B. GAS assumes that this structure work well with shallow copy. */
|
|
|
|
|
struct aarch64_operand_error
|
|
|
|
|
{
|
|
|
|
|
enum aarch64_operand_error_kind kind;
|
|
|
|
|
int index;
|
|
|
|
|
const char *error;
|
|
|
|
|
int data[3]; /* Some data for extra information. */
|
2018-05-15 23:34:54 +08:00
|
|
|
|
bfd_boolean non_fatal;
|
2012-08-13 22:52:54 +08:00
|
|
|
|
};
|
|
|
|
|
|
2018-10-04 01:27:52 +08:00
|
|
|
|
/* AArch64 sequence structure used to track instructions with F_SCAN
|
|
|
|
|
dependencies for both assembler and disassembler. */
|
|
|
|
|
struct aarch64_instr_sequence
|
|
|
|
|
{
|
|
|
|
|
/* The instruction that caused this sequence to be opened. */
|
|
|
|
|
aarch64_inst *instr;
|
|
|
|
|
/* The number of instructions the above instruction allows to be kept in the
|
|
|
|
|
sequence before an automatic close is done. */
|
|
|
|
|
int num_insns;
|
|
|
|
|
/* The instructions currently added to the sequence. */
|
|
|
|
|
aarch64_inst **current_insns;
|
|
|
|
|
/* The number of instructions already in the sequence. */
|
|
|
|
|
int next_insn;
|
|
|
|
|
};
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
/* Encoding entrypoint. */
|
|
|
|
|
|
|
|
|
|
extern int
|
|
|
|
|
aarch64_opcode_encode (const aarch64_opcode *, const aarch64_inst *,
|
|
|
|
|
aarch64_insn *, aarch64_opnd_qualifier_t *,
|
2018-10-04 01:27:52 +08:00
|
|
|
|
aarch64_operand_error *, aarch64_instr_sequence *);
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
extern const aarch64_opcode *
|
|
|
|
|
aarch64_replace_opcode (struct aarch64_inst *,
|
|
|
|
|
const aarch64_opcode *);
|
|
|
|
|
|
|
|
|
|
/* Given the opcode enumerator OP, return the pointer to the corresponding
|
|
|
|
|
opcode entry. */
|
|
|
|
|
|
|
|
|
|
extern const aarch64_opcode *
|
|
|
|
|
aarch64_get_opcode (enum aarch64_op);
|
|
|
|
|
|
|
|
|
|
/* Generate the string representation of an operand. */
|
|
|
|
|
extern void
|
|
|
|
|
aarch64_print_operand (char *, size_t, bfd_vma, const aarch64_opcode *,
|
2018-05-15 23:34:54 +08:00
|
|
|
|
const aarch64_opnd_info *, int, int *, bfd_vma *,
|
|
|
|
|
char **);
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
|
|
/* Miscellaneous interface. */
|
|
|
|
|
|
|
|
|
|
extern int
|
|
|
|
|
aarch64_operand_index (const enum aarch64_opnd *, enum aarch64_opnd);
|
|
|
|
|
|
|
|
|
|
extern aarch64_opnd_qualifier_t
|
|
|
|
|
aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *, int,
|
|
|
|
|
const aarch64_opnd_qualifier_t, int);
|
|
|
|
|
|
2018-10-04 01:38:42 +08:00
|
|
|
|
extern bfd_boolean
|
|
|
|
|
aarch64_is_destructive_by_operands (const aarch64_opcode *);
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
extern int
|
|
|
|
|
aarch64_num_of_operands (const aarch64_opcode *);
|
|
|
|
|
|
|
|
|
|
extern int
|
|
|
|
|
aarch64_stack_pointer_p (const aarch64_opnd_info *);
|
|
|
|
|
|
2015-10-02 22:39:26 +08:00
|
|
|
|
extern int
|
|
|
|
|
aarch64_zero_register_p (const aarch64_opnd_info *);
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
2018-10-04 01:35:15 +08:00
|
|
|
|
extern enum err_type
|
Modify AArch64 Assembly and disassembly functions to be able to fail and report why.
This patch if the first patch in a series to add the ability to add constraints
to system registers that an instruction must adhere to in order for the register
to be usable with that instruction.
These constraints can also be used to disambiguate between registers with the
same encoding during disassembly.
This patch adds a new flags entry in the sysreg structures and ensures it is
filled in and read out during assembly/disassembly. It also adds the ability for
the assemble and disassemble functions to be able to gracefully fail and re-use
the existing error reporting infrastructure.
The return type of these functions are changed to a boolean to denote success or
failure and the error structure is passed around to them. This requires
aarch64-gen changes so a lot of the changes here are just mechanical.
gas/
PR binutils/21446
* config/tc-aarch64.c (parse_sys_reg): Return register flags.
(parse_operands): Fill in register flags.
gdb/
PR binutils/21446
* aarch64-tdep.c (aarch64_analyze_prologue,
aarch64_software_single_step, aarch64_displaced_step_copy_insn):
Indicate not interested in errors.
include/
PR binutils/21446
* opcode/aarch64.h (aarch64_opnd_info): Change sysreg to struct.
(aarch64_decode_insn): Accept error struct.
opcodes/
PR binutils/21446
* aarch64-asm.h (aarch64_insert_operand, aarch64_##x): Return boolean
and take error struct.
* aarch64-asm.c (aarch64_ext_regno, aarch64_ins_reglane,
aarch64_ins_reglist, aarch64_ins_ldst_reglist,
aarch64_ins_ldst_reglist_r, aarch64_ins_ldst_elemlist,
aarch64_ins_advsimd_imm_shift, aarch64_ins_imm, aarch64_ins_imm_half,
aarch64_ins_advsimd_imm_modified, aarch64_ins_fpimm,
aarch64_ins_imm_rotate1, aarch64_ins_imm_rotate2, aarch64_ins_fbits,
aarch64_ins_aimm, aarch64_ins_limm_1, aarch64_ins_limm,
aarch64_ins_inv_limm, aarch64_ins_ft, aarch64_ins_addr_simple,
aarch64_ins_addr_regoff, aarch64_ins_addr_offset, aarch64_ins_addr_simm,
aarch64_ins_addr_simm10, aarch64_ins_addr_uimm12,
aarch64_ins_simd_addr_post, aarch64_ins_cond, aarch64_ins_sysreg,
aarch64_ins_pstatefield, aarch64_ins_sysins_op, aarch64_ins_barrier,
aarch64_ins_prfop, aarch64_ins_hint, aarch64_ins_reg_extended,
aarch64_ins_reg_shifted, aarch64_ins_sve_addr_ri_s4xvl,
aarch64_ins_sve_addr_ri_s6xvl, aarch64_ins_sve_addr_ri_s9xvl,
aarch64_ins_sve_addr_ri_s4, aarch64_ins_sve_addr_ri_u6,
aarch64_ins_sve_addr_rr_lsl, aarch64_ins_sve_addr_rz_xtw,
aarch64_ins_sve_addr_zi_u5, aarch64_ext_sve_addr_zz,
aarch64_ins_sve_addr_zz_lsl, aarch64_ins_sve_addr_zz_sxtw,
aarch64_ins_sve_addr_zz_uxtw, aarch64_ins_sve_aimm,
aarch64_ins_sve_asimm, aarch64_ins_sve_index, aarch64_ins_sve_limm_mov,
aarch64_ins_sve_quad_index, aarch64_ins_sve_reglist,
aarch64_ins_sve_scale, aarch64_ins_sve_shlimm, aarch64_ins_sve_shrimm,
aarch64_ins_sve_float_half_one, aarch64_ins_sve_float_half_two,
aarch64_ins_sve_float_zero_one, aarch64_opcode_encode): Likewise.
* aarch64-dis.h (aarch64_extract_operand, aarch64_##x): Likewise.
* aarch64-dis.c (aarch64_ext_regno, aarch64_ext_reglane,
aarch64_ext_reglist, aarch64_ext_ldst_reglist,
aarch64_ext_ldst_reglist_r, aarch64_ext_ldst_elemlist,
aarch64_ext_advsimd_imm_shift, aarch64_ext_imm, aarch64_ext_imm_half,
aarch64_ext_advsimd_imm_modified, aarch64_ext_fpimm,
aarch64_ext_imm_rotate1, aarch64_ext_imm_rotate2, aarch64_ext_fbits,
aarch64_ext_aimm, aarch64_ext_limm_1, aarch64_ext_limm, decode_limm,
aarch64_ext_inv_limm, aarch64_ext_ft, aarch64_ext_addr_simple,
aarch64_ext_addr_regoff, aarch64_ext_addr_offset, aarch64_ext_addr_simm,
aarch64_ext_addr_simm10, aarch64_ext_addr_uimm12,
aarch64_ext_simd_addr_post, aarch64_ext_cond, aarch64_ext_sysreg,
aarch64_ext_pstatefield, aarch64_ext_sysins_op, aarch64_ext_barrier,
aarch64_ext_prfop, aarch64_ext_hint, aarch64_ext_reg_extended,
aarch64_ext_reg_shifted, aarch64_ext_sve_addr_ri_s4xvl,
aarch64_ext_sve_addr_ri_s6xvl, aarch64_ext_sve_addr_ri_s9xvl,
aarch64_ext_sve_addr_ri_s4, aarch64_ext_sve_addr_ri_u6,
aarch64_ext_sve_addr_rr_lsl, aarch64_ext_sve_addr_rz_xtw,
aarch64_ext_sve_addr_zi_u5, aarch64_ext_sve_addr_zz,
aarch64_ext_sve_addr_zz_lsl, aarch64_ext_sve_addr_zz_sxtw,
aarch64_ext_sve_addr_zz_uxtw, aarch64_ext_sve_aimm,
aarch64_ext_sve_asimm, aarch64_ext_sve_index, aarch64_ext_sve_limm_mov,
aarch64_ext_sve_quad_index, aarch64_ext_sve_reglist,
aarch64_ext_sve_scale, aarch64_ext_sve_shlimm, aarch64_ext_sve_shrimm,
aarch64_ext_sve_float_half_one, aarch64_ext_sve_float_half_two,
aarch64_ext_sve_float_zero_one, aarch64_opcode_decode): Likewise.
(determine_disassembling_preference, aarch64_decode_insn,
print_insn_aarch64_word, print_insn_data): Take errors struct.
(print_insn_aarch64): Use errors.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis-2.c: Regenerate.
* aarch64-gen.c (print_operand_inserter): Use errors and change type to
boolean in aarch64_insert_operan.
(print_operand_extractor): Likewise.
* aarch64-opc.c (aarch64_print_operand): Use sysreg struct.
2018-05-15 23:11:42 +08:00
|
|
|
|
aarch64_decode_insn (aarch64_insn, aarch64_inst *, bfd_boolean,
|
2018-10-04 01:38:42 +08:00
|
|
|
|
aarch64_operand_error *);
|
|
|
|
|
|
|
|
|
|
extern void
|
|
|
|
|
init_insn_sequence (const struct aarch64_inst *, aarch64_instr_sequence *);
|
2015-10-02 18:36:00 +08:00
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
/* Given an operand qualifier, return the expected data element size
|
|
|
|
|
of a qualified operand. */
|
|
|
|
|
extern unsigned char
|
|
|
|
|
aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t);
|
|
|
|
|
|
|
|
|
|
extern enum aarch64_operand_class
|
|
|
|
|
aarch64_get_operand_class (enum aarch64_opnd);
|
|
|
|
|
|
|
|
|
|
extern const char *
|
|
|
|
|
aarch64_get_operand_name (enum aarch64_opnd);
|
|
|
|
|
|
|
|
|
|
extern const char *
|
|
|
|
|
aarch64_get_operand_desc (enum aarch64_opnd);
|
|
|
|
|
|
[AArch64][SVE 27/32] Add SVE integer immediate operands
This patch adds the new SVE integer immediate operands. There are
three kinds:
- simple signed and unsigned ranges, but with new widths and positions.
- 13-bit logical immediates. These have the same form as in base AArch64,
but at a different bit position.
In the case of the "MOV Zn.<T>, #<limm>" alias of DUPM, the logical
immediate <limm> is not allowed to be a valid DUP immediate, since DUP
is preferred over DUPM for constants that both instructions can handle.
- a new 9-bit arithmetic immediate, of the form "<imm8>{, LSL #8}".
In some contexts the operand is signed and in others it's unsigned.
As an extension, we allow shifted immediates to be written as a single
integer, e.g. "#256" is equivalent to "#1, LSL #8". We also use the
shiftless form as the preferred disassembly, except for the special
case of "#0, LSL #8" (a redundant encoding of 0).
include/
* opcode/aarch64.h (AARCH64_OPND_SIMM5): New aarch64_opnd.
(AARCH64_OPND_SVE_AIMM, AARCH64_OPND_SVE_ASIMM)
(AARCH64_OPND_SVE_INV_LIMM, AARCH64_OPND_SVE_LIMM)
(AARCH64_OPND_SVE_LIMM_MOV, AARCH64_OPND_SVE_SHLIMM_PRED)
(AARCH64_OPND_SVE_SHLIMM_UNPRED, AARCH64_OPND_SVE_SHRIMM_PRED)
(AARCH64_OPND_SVE_SHRIMM_UNPRED, AARCH64_OPND_SVE_SIMM5)
(AARCH64_OPND_SVE_SIMM5B, AARCH64_OPND_SVE_SIMM6)
(AARCH64_OPND_SVE_SIMM8, AARCH64_OPND_SVE_UIMM3)
(AARCH64_OPND_SVE_UIMM7, AARCH64_OPND_SVE_UIMM8)
(AARCH64_OPND_SVE_UIMM8_53): Likewise.
(aarch64_sve_dupm_mov_immediate_p): Declare.
opcodes/
* aarch64-tbl.h (AARCH64_OPERANDS): Add entries for the new SVE
integer immediate operands.
* aarch64-opc.h (FLD_SVE_immN, FLD_SVE_imm3, FLD_SVE_imm5)
(FLD_SVE_imm5b, FLD_SVE_imm7, FLD_SVE_imm8, FLD_SVE_imm9)
(FLD_SVE_immr, FLD_SVE_imms, FLD_SVE_tszh): New aarch64_field_kinds.
* aarch64-opc.c (fields): Add corresponding entries.
(operand_general_constraint_met_p): Handle the new SVE integer
immediate operands.
(aarch64_print_operand): Likewise.
(aarch64_sve_dupm_mov_immediate_p): New function.
* aarch64-opc-2.c: Regenerate.
* aarch64-asm.h (ins_inv_limm, ins_sve_aimm, ins_sve_asimm)
(ins_sve_limm_mov, ins_sve_shlimm, ins_sve_shrimm): New inserters.
* aarch64-asm.c (aarch64_ins_limm_1): New function, split out from...
(aarch64_ins_limm): ...here.
(aarch64_ins_inv_limm): New function.
(aarch64_ins_sve_aimm): Likewise.
(aarch64_ins_sve_asimm): Likewise.
(aarch64_ins_sve_limm_mov): Likewise.
(aarch64_ins_sve_shlimm): Likewise.
(aarch64_ins_sve_shrimm): Likewise.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis.h (ext_inv_limm, ext_sve_aimm, ext_sve_asimm)
(ext_sve_limm_mov, ext_sve_shlimm, ext_sve_shrimm): New extractors.
* aarch64-dis.c (decode_limm): New function, split out from...
(aarch64_ext_limm): ...here.
(aarch64_ext_inv_limm): New function.
(decode_sve_aimm): Likewise.
(aarch64_ext_sve_aimm): Likewise.
(aarch64_ext_sve_asimm): Likewise.
(aarch64_ext_sve_limm_mov): Likewise.
(aarch64_top_bit): Likewise.
(aarch64_ext_sve_shlimm): Likewise.
(aarch64_ext_sve_shrimm): Likewise.
* aarch64-dis-2.c: Regenerate.
gas/
* config/tc-aarch64.c (parse_operands): Handle the new SVE integer
immediate operands.
2016-09-21 23:56:57 +08:00
|
|
|
|
extern bfd_boolean
|
|
|
|
|
aarch64_sve_dupm_mov_immediate_p (uint64_t, int);
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
#ifdef DEBUG_AARCH64
|
|
|
|
|
extern int debug_dump;
|
|
|
|
|
|
|
|
|
|
extern void
|
|
|
|
|
aarch64_verbose (const char *, ...) __attribute__ ((format (printf, 1, 2)));
|
|
|
|
|
|
|
|
|
|
#define DEBUG_TRACE(M, ...) \
|
|
|
|
|
{ \
|
|
|
|
|
if (debug_dump) \
|
|
|
|
|
aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__); \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define DEBUG_TRACE_IF(C, M, ...) \
|
|
|
|
|
{ \
|
|
|
|
|
if (debug_dump && (C)) \
|
|
|
|
|
aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__); \
|
|
|
|
|
}
|
|
|
|
|
#else /* !DEBUG_AARCH64 */
|
|
|
|
|
#define DEBUG_TRACE(M, ...) ;
|
|
|
|
|
#define DEBUG_TRACE_IF(C, M, ...) ;
|
|
|
|
|
#endif /* DEBUG_AARCH64 */
|
|
|
|
|
|
2016-09-21 23:54:53 +08:00
|
|
|
|
extern const char *const aarch64_sve_pattern_array[32];
|
|
|
|
|
extern const char *const aarch64_sve_prfop_array[16];
|
|
|
|
|
|
2015-10-07 19:35:46 +08:00
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
|
#endif /* OPCODE_AARCH64_H */
|