aboutsummaryrefslogtreecommitdiff
path: root/opcodes/aarch64-dis.c
diff options
context:
space:
mode:
authorSrinath Parvathaneni <srinath.parvathaneni@arm.com>2024-01-15 09:37:32 +0000
committerNick Clifton <nickc@redhat.com>2024-01-15 11:45:41 +0000
commit39092c7a1fb0927fbbdb40e1142de816d6f3f097 (patch)
tree39c066e97256ea52262332db3601294caf5708b6 /opcodes/aarch64-dis.c
parent88601c2d941b004b443dc4bfdf3b93ea1983d136 (diff)
downloadbinutils-39092c7a1fb0927fbbdb40e1142de816d6f3f097.zip
binutils-39092c7a1fb0927fbbdb40e1142de816d6f3f097.tar.gz
binutils-39092c7a1fb0927fbbdb40e1142de816d6f3f097.tar.bz2
aarch64: Add SVE2.1 dupq, eorqv and extq instructions.
Hi, This patch add support for SVE2.1 instruction dupq, eorqv and extq. Regression testing for aarch64-none-elf target and found no regressions. Ok for binutils-master? Regards, Srinath.
Diffstat (limited to 'opcodes/aarch64-dis.c')
-rw-r--r--opcodes/aarch64-dis.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c
index d395438..bffa760 100644
--- a/opcodes/aarch64-dis.c
+++ b/opcodes/aarch64-dis.c
@@ -2097,6 +2097,26 @@ aarch64_ext_sve_index (const aarch64_operand *self,
return true;
}
+/* Decode Zn.<T>[<imm>], where <imm> is an immediate with range of 0 to one less
+ than the number of elements in 128 bit, which can encode il:tsz. */
+bool
+aarch64_ext_sve_index_imm (const aarch64_operand *self,
+ aarch64_opnd_info *info, aarch64_insn code,
+ const aarch64_inst *inst ATTRIBUTE_UNUSED,
+ aarch64_operand_error *errors ATTRIBUTE_UNUSED)
+{
+ int val;
+
+ info->reglane.regno = extract_field (self->fields[0], code, 0);
+ val = extract_fields (code, 0, 2, self->fields[2], self->fields[1]);
+ if ((val & 15) == 0)
+ return 0;
+ while ((val & 1) == 0)
+ val /= 2;
+ info->reglane.index = val / 2;
+ return true;
+}
+
/* Decode a logical immediate for the MOV alias of SVE DUPM. */
bool
aarch64_ext_sve_limm_mov (const aarch64_operand *self,
@@ -3231,6 +3251,17 @@ aarch64_decode_variant_using_iclass (aarch64_inst *inst)
}
break;
+ case sve_index1:
+ i = extract_fields (inst->value, 0, 2, FLD_SVE_tsz, FLD_SVE_i2h);
+ if ((i & 15) == 0)
+ return false;
+ while ((i & 1) == 0)
+ {
+ i >>= 1;
+ variant += 1;
+ }
+ break;
+
case sve_limm:
/* Pick the smallest applicable element size. */
if ((inst->value & 0x20600) == 0x600)