aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2017-11-08 13:15:12 +0000
committerNick Clifton <nickc@redhat.com>2017-11-08 13:15:12 +0000
commitdec41383fff7116c9f66cdeca3105e968047a4e6 (patch)
treeb99323b823783fee1f4919216e048967e15f0ba7
parent6e98b3428bdd0bf388c3c72eb205105926b15a64 (diff)
downloadgdb-dec41383fff7116c9f66cdeca3105e968047a4e6.zip
gdb-dec41383fff7116c9f66cdeca3105e968047a4e6.tar.gz
gdb-dec41383fff7116c9f66cdeca3105e968047a4e6.tar.bz2
Adds command line support for Armv8.4-A, via the new command line option -march=armv8.4-a. Add support for "+dotprod" ARM feature (required for ARMv8.4-A). Add assembler and disassembler support for new FP16 instructions introduced in Armv8.4-A
gas * config/tc-arm.c (arm_extensions): (arm_archs): New entry for "armv8.4-a". Add FPU_ARCH_DOTPROD_NEON_VFP_ARMV8. (arm_ext_v8_2): New variable. (enum arm_reg_type): New enumeration REG_TYPE_NSD. (reg_expected_msgs): New entry for REG_TYPE_NSD. (parse_typed_reg_or_scalar): Handle REG_TYPE_NSD. (parse_scalar): Support REG_TYPE_VFS. (enum operand_parse_code): New enumerations OP_RNSD and OP_RNSD_RNSC. (parse_operands): Handle OP_RNSD and OP_RNSD_RNSC. (NEON_SHAPE_DEF): New entries for DHH and DHS. (neon_scalar_for_fmac_fp16_long): New function to generate Rm encoding for new FP16 instructions in ARMv8.2-A. (do_neon_fmac_maybe_scalar_long): New function to encode new FP16 instructions in ARMv8.2-A. (do_neon_vfmal): Wrapper function for vfmal. (do_neon_vfmsl): Wrapper function for vfmsl. (insns): New entries for vfmal and vfmsl. * doc/c-arm.texi (-march): Document "armv8.4-a". * testsuite/gas/arm/dotprod-mandatory.d: New test. * testsuite/gas/arm/armv8_2-a-fp16.s: New test source. * testsuite/gas/arm/armv8_2-a-fp16-illegal.s: New test source. * testsuite/gas/arm/armv8_2-a-fp16.d: New test. * testsuite/gas/arm/armv8_3-a-fp16.d: New test. * testsuite/gas/arm/armv8_4-a-fp16.d: New test. * testsuite/gas/arm/armv8_2-a-fp16-thumb2.d: New test. * testsuite/gas/arm/armv8_2-a-fp16-illegal.d: New test. * testsuite/gas/arm/armv8_2-a-fp16-illegal.l: New error file. opcodes * arm-dis.c (coprocessor_opcodes): New entries for ARMv8.2-A new FP16 instructions, including vfmal.f16 and vfmsl.f16. include * opcode/arm.h (ARM_AEXT2_V8_4A): Include Dot Product feature. (ARM_EXT2_V8_4A): New macro. (ARM_AEXT2_V8_4A): Likewise. (ARM_ARCH_V8_4A): Likewise.
-rw-r--r--gas/ChangeLog32
-rw-r--r--gas/config/tc-arm.c168
-rw-r--r--gas/doc/c-arm.texi1
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.d2
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.l5
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.s8
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2.d249
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16.d249
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16.s46
-rw-r--r--gas/testsuite/gas/arm/armv8_3-a-fp16.d249
-rw-r--r--gas/testsuite/gas/arm/armv8_4-a-fp16.d249
-rw-r--r--gas/testsuite/gas/arm/dotprod-mandatory.d297
-rw-r--r--include/ChangeLog7
-rw-r--r--include/opcode/arm.h9
-rw-r--r--opcodes/ChangeLog6
-rw-r--r--opcodes/arm-dis.c18
16 files changed, 1590 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index c13f9b1..81fa312 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,35 @@
+2017-11-08 Jiong Wang <jiong.wang@arm.com>
+ Tamar Christina <tamar.christina@arm.com>
+
+ * config/tc-arm.c (arm_extensions):
+ (arm_archs): New entry for "armv8.4-a".
+ Add FPU_ARCH_DOTPROD_NEON_VFP_ARMV8.
+ (arm_ext_v8_2): New variable.
+ (enum arm_reg_type): New enumeration REG_TYPE_NSD.
+ (reg_expected_msgs): New entry for REG_TYPE_NSD.
+ (parse_typed_reg_or_scalar): Handle REG_TYPE_NSD.
+ (parse_scalar): Support REG_TYPE_VFS.
+ (enum operand_parse_code): New enumerations OP_RNSD and OP_RNSD_RNSC.
+ (parse_operands): Handle OP_RNSD and OP_RNSD_RNSC.
+ (NEON_SHAPE_DEF): New entries for DHH and DHS.
+ (neon_scalar_for_fmac_fp16_long): New function to generate Rm encoding
+ for new FP16 instructions in ARMv8.2-A.
+ (do_neon_fmac_maybe_scalar_long): New function to encode new FP16
+ instructions in ARMv8.2-A.
+ (do_neon_vfmal): Wrapper function for vfmal.
+ (do_neon_vfmsl): Wrapper function for vfmsl.
+ (insns): New entries for vfmal and vfmsl.
+ * doc/c-arm.texi (-march): Document "armv8.4-a".
+ * testsuite/gas/arm/dotprod-mandatory.d: New test.
+ * testsuite/gas/arm/armv8_2-a-fp16.s: New test source.
+ * testsuite/gas/arm/armv8_2-a-fp16-illegal.s: New test source.
+ * testsuite/gas/arm/armv8_2-a-fp16.d: New test.
+ * testsuite/gas/arm/armv8_3-a-fp16.d: New test.
+ * testsuite/gas/arm/armv8_4-a-fp16.d: New test.
+ * testsuite/gas/arm/armv8_2-a-fp16-thumb2.d: New test.
+ * testsuite/gas/arm/armv8_2-a-fp16-illegal.d: New test.
+ * testsuite/gas/arm/armv8_2-a-fp16-illegal.l: New error file.
+
2017-11-08 Alan Modra <amodra@gmail.com>
* config/tc-xtensa.c (finish_vinsn): Properly pluralize error message.
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 5d3dd4e..128ab38 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -235,6 +235,8 @@ static const arm_feature_set arm_ext_ras =
/* FP16 instructions. */
static const arm_feature_set arm_ext_fp16 =
ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST);
+static const arm_feature_set arm_ext_v8_2 =
+ ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_2A);
static const arm_feature_set arm_ext_v8_3 =
ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A);
@@ -579,6 +581,7 @@ enum arm_reg_type
REG_TYPE_NQ,
REG_TYPE_VFSD,
REG_TYPE_NDQ,
+ REG_TYPE_NSD,
REG_TYPE_NSDQ,
REG_TYPE_VFC,
REG_TYPE_MVF,
@@ -619,6 +622,7 @@ const char * const reg_expected_msgs[] =
N_("Neon quad precision register expected"),
N_("VFP single or double precision register expected"),
N_("Neon double or quad precision register expected"),
+ N_("Neon single or double precision register expected"),
N_("VFP single, double or Neon quad precision register expected"),
N_("VFP system register expected"),
N_("Maverick MVF register expected"),
@@ -1506,6 +1510,8 @@ parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
|| (type == REG_TYPE_NSDQ
&& (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
|| reg->type == REG_TYPE_NQ))
+ || (type == REG_TYPE_NSD
+ && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
|| (type == REG_TYPE_MMXWC
&& (reg->type == REG_TYPE_MMXWCG)))
type = (enum arm_reg_type) reg->type;
@@ -1529,7 +1535,9 @@ parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
if (skip_past_char (&str, '[') == SUCCESS)
{
- if (type != REG_TYPE_VFD)
+ if (type != REG_TYPE_VFD
+ && !(type == REG_TYPE_VFS
+ && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8_2)))
{
first_error (_("only D registers may be indexed"));
return FAIL;
@@ -1625,8 +1633,12 @@ parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
int reg;
char *str = *ccp;
struct neon_typed_alias atype;
+ enum arm_reg_type reg_type = REG_TYPE_VFD;
+
+ if (elsize == 4)
+ reg_type = REG_TYPE_VFS;
- reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
+ reg = parse_typed_reg_or_scalar (&str, reg_type, NULL, &atype);
if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
return FAIL;
@@ -6486,6 +6498,7 @@ enum operand_parse_code
OP_RND, /* Neon double precision register (0..31) */
OP_RNQ, /* Neon quad precision register */
OP_RVSD, /* VFP single or double precision register */
+ OP_RNSD, /* Neon single or double precision register */
OP_RNDQ, /* Neon double or quad precision register */
OP_RNSDQ, /* Neon single, double or quad precision register */
OP_RNSC, /* Neon scalar D[X] */
@@ -6512,6 +6525,7 @@ enum operand_parse_code
OP_RVSD_I0, /* VFP S or D reg, or immediate zero. */
OP_RSVD_FI0, /* VFP S or D reg, or floating point immediate zero. */
OP_RR_RNSC, /* ARM reg or Neon scalar. */
+ OP_RNSD_RNSC, /* Neon S or D reg, or Neon scalar. */
OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar. */
OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar. */
OP_RND_RNSC, /* Neon D reg, or Neon scalar. */
@@ -6773,6 +6787,7 @@ parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
case OP_RXA: po_reg_or_fail (REG_TYPE_XSCALE); break;
case OP_oRNQ:
case OP_RNQ: po_reg_or_fail (REG_TYPE_NQ); break;
+ case OP_RNSD: po_reg_or_fail (REG_TYPE_NSD); break;
case OP_oRNDQ:
case OP_RNDQ: po_reg_or_fail (REG_TYPE_NDQ); break;
case OP_RVSD: po_reg_or_fail (REG_TYPE_VFSD); break;
@@ -6830,6 +6845,18 @@ parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
}
break;
+ case OP_RNSD_RNSC:
+ {
+ po_scalar_or_goto (8, try_s_scalar);
+ break;
+ try_s_scalar:
+ po_scalar_or_goto (4, try_nsd);
+ break;
+ try_nsd:
+ po_reg_or_fail (REG_TYPE_NSD);
+ }
+ break;
+
case OP_RNDQ_RNSC:
{
po_scalar_or_goto (8, try_ndq);
@@ -13423,7 +13450,9 @@ NEON_ENC_TAB
X (2, (H, I), HALF), \
X (3, (H, H, H), HALF), \
X (3, (H, F, I), MIXED), \
- X (3, (F, H, I), MIXED)
+ X (3, (F, H, I), MIXED), \
+ X (3, (D, H, H), MIXED), \
+ X (3, (D, H, S), MIXED)
#define S2(A,B) NS_##A##B
#define S3(A,B,C) NS_##A##B##C
@@ -16133,6 +16162,133 @@ do_neon_mac_maybe_scalar_long (void)
neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
}
+/* Like neon_scalar_for_mul, this function generate Rm encoding from GAS's
+ internal SCALAR. QUAD_P is 1 if it's for Q format, otherwise it's 0. */
+
+static unsigned
+neon_scalar_for_fmac_fp16_long (unsigned scalar, unsigned quad_p)
+{
+ unsigned regno = NEON_SCALAR_REG (scalar);
+ unsigned elno = NEON_SCALAR_INDEX (scalar);
+
+ if (quad_p)
+ {
+ if (regno > 7 || elno > 3)
+ goto bad_scalar;
+
+ return ((regno & 0x7)
+ | ((elno & 0x1) << 3)
+ | (((elno >> 1) & 0x1) << 5));
+ }
+ else
+ {
+ if (regno > 15 || elno > 1)
+ goto bad_scalar;
+
+ return (((regno & 0x1) << 5)
+ | ((regno >> 1) & 0x7)
+ | ((elno & 0x1) << 3));
+ }
+
+bad_scalar:
+ first_error (_("scalar out of range for multiply instruction"));
+ return 0;
+}
+
+static void
+do_neon_fmac_maybe_scalar_long (int subtype)
+{
+ enum neon_shape rs;
+ int high8;
+ /* NOTE: vfmal/vfmsl use slightly different NEON three-same encoding. 'size"
+ field (bits[21:20]) has different meaning. For scalar index variant, it's
+ used to differentiate add and subtract, otherwise it's with fixed value
+ 0x2. */
+ int size = -1;
+
+ if (inst.cond != COND_ALWAYS)
+ as_warn (_("vfmal/vfmsl with FP16 type cannot be conditional, the "
+ "behaviour is UNPREDICTABLE"));
+
+ constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16),
+ _(BAD_FP16));
+
+ constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
+ _(BAD_FPU));
+
+ /* vfmal/vfmsl are in three-same D/Q register format or the third operand can
+ be a scalar index register. */
+ if (inst.operands[2].isscalar)
+ {
+ high8 = 0xfe000000;
+ if (subtype)
+ size = 16;
+ rs = neon_select_shape (NS_DHS, NS_QDS, NS_NULL);
+ }
+ else
+ {
+ high8 = 0xfc000000;
+ size = 32;
+ if (subtype)
+ inst.instruction |= (0x1 << 23);
+ rs = neon_select_shape (NS_DHH, NS_QDD, NS_NULL);
+ }
+
+ neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_F16);
+
+ /* "opcode" from template has included "ubit", so simply pass 0 here. Also,
+ the "S" bit in size field has been reused to differentiate vfmal and vfmsl,
+ so we simply pass -1 as size. */
+ unsigned quad_p = (rs == NS_QDD || rs == NS_QDS);
+ neon_three_same (quad_p, 0, size);
+
+ /* Undo neon_dp_fixup. Redo the high eight bits. */
+ inst.instruction &= 0x00ffffff;
+ inst.instruction |= high8;
+
+#define LOW1(R) ((R) & 0x1)
+#define HI4(R) (((R) >> 1) & 0xf)
+ /* Unlike usually NEON three-same, encoding for Vn and Vm will depend on
+ whether the instruction is in Q form and whether Vm is a scalar indexed
+ operand. */
+ if (inst.operands[2].isscalar)
+ {
+ unsigned rm
+ = neon_scalar_for_fmac_fp16_long (inst.operands[2].reg, quad_p);
+ inst.instruction &= 0xffffffd0;
+ inst.instruction |= rm;
+
+ if (!quad_p)
+ {
+ /* Redo Rn as well. */
+ inst.instruction &= 0xfff0ff7f;
+ inst.instruction |= HI4 (inst.operands[1].reg) << 16;
+ inst.instruction |= LOW1 (inst.operands[1].reg) << 7;
+ }
+ }
+ else if (!quad_p)
+ {
+ /* Redo Rn and Rm. */
+ inst.instruction &= 0xfff0ff50;
+ inst.instruction |= HI4 (inst.operands[1].reg) << 16;
+ inst.instruction |= LOW1 (inst.operands[1].reg) << 7;
+ inst.instruction |= HI4 (inst.operands[2].reg);
+ inst.instruction |= LOW1 (inst.operands[2].reg) << 5;
+ }
+}
+
+static void
+do_neon_vfmal (void)
+{
+ return do_neon_fmac_maybe_scalar_long (0);
+}
+
+static void
+do_neon_vfmsl (void)
+{
+ return do_neon_fmac_maybe_scalar_long (1);
+}
+
static void
do_neon_dyadic_wide (void)
{
@@ -20644,6 +20800,10 @@ static const struct asm_opcode insns[] =
NCE (vmovx, eb00a40, 2, (RVS, RVS), neon_movhf),
NCE (vins, eb00ac0, 2, (RVS, RVS), neon_movhf),
+ /* New backported fma/fms instructions optional in v8.2. */
+ NCE (vfmal, 810, 3, (RNDQ, RNSD, RNSD_RNSC), neon_vfmal),
+ NCE (vfmsl, 810, 3, (RNDQ, RNSD, RNSD_RNSC), neon_vfmsl),
+
#undef THUMB_VARIANT
#define THUMB_VARIANT & fpu_neon_ext_v1
#undef ARM_VARIANT
@@ -26038,6 +26198,7 @@ static const struct arm_arch_option_table arm_archs[] =
ARM_ARCH_OPT ("armv8.2-a", ARM_ARCH_V8_2A, FPU_ARCH_VFP),
ARM_ARCH_OPT ("armv8.3-a", ARM_ARCH_V8_3A, FPU_ARCH_VFP),
ARM_ARCH_OPT ("armv8-r", ARM_ARCH_V8R, FPU_ARCH_VFP),
+ ARM_ARCH_OPT ("armv8.4-a", ARM_ARCH_V8_4A, FPU_ARCH_VFP),
ARM_ARCH_OPT ("xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP),
ARM_ARCH_OPT ("iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
ARM_ARCH_OPT ("iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
@@ -26736,6 +26897,7 @@ static const cpu_arch_ver_table cpu_arch_ver[] =
{16, ARM_ARCH_V8M_BASE},
{17, ARM_ARCH_V8M_MAIN},
{15, ARM_ARCH_V8R},
+ {16, ARM_ARCH_V8_4A},
{-1, ARM_ARCH_NONE}
};
diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi
index 9606de4..5e518c6 100644
--- a/gas/doc/c-arm.texi
+++ b/gas/doc/c-arm.texi
@@ -237,6 +237,7 @@ names are recognized:
@code{armv8.2-a},
@code{armv8.3-a},
@code{armv8-r},
+@code{armv8.4-a},
@code{iwmmxt}
@code{iwmmxt2}
and
diff --git a/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.d b/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.d
new file mode 100644
index 0000000..745ae05
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.d
@@ -0,0 +1,2 @@
+#as: -march=armv8.2-a+fp16 -mfpu=neon-fp-armv8
+#error-output: armv8_2-a-fp16-illegal.l
diff --git a/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.l b/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.l
new file mode 100644
index 0000000..b407d6c
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.l
@@ -0,0 +1,5 @@
+[^:]*.s: Assembler messages:
+[^:]*:4: Error: scalar out of range for multiply instruction -- `vfmal.f16 d2,s0,s16\[1\]'
+[^:]*:5: Error: scalar out of range for multiply instruction -- `vfmsl.f16 q13,d1,d8\[3\]'
+[^:]*:7: Error: scalar out of range for multiply instruction -- `vfmal.f16 d16,s2,s15\[2\]'
+[^:]*:8: Error: scalar out of range for multiply instruction -- `vfmsl.f16 q13,d1,d7\[4\]'
diff --git a/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.s b/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.s
new file mode 100644
index 0000000..740dd5c
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16-illegal.s
@@ -0,0 +1,8 @@
+ .text
+func:
+ # Scalar base register out of bound
+ vfmal.f16 d2, s0, s16[1]
+ vfmsl.f16 q13, d1, d8[3]
+ # Scalar index out of bound
+ vfmal.f16 d16, s2, s15[2]
+ vfmsl.f16 q13, d1, d7[4]
diff --git a/gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2.d b/gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2.d
new file mode 100644
index 0000000..b03a8ae
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.2-a+fp16 -mfpu=neon-fp-armv8 -mthumb
+#source: armv8_2-a-fp16.s
+#objdump: -d
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+.* <.*>:
+.*: fc21 0810 vfmal.f16 d0, s2, s0
+.*: fe00 2810 vfmal.f16 d2, s0, s0\[0\]
+.*: fca1 0810 vfmsl.f16 d0, s2, s0
+.*: fe10 2818 vfmsl.f16 d2, s0, s0\[1\]
+.*: fc21 0814 vfmal.f16 d0, s2, s8
+.*: fe00 2814 vfmal.f16 d2, s0, s8\[0\]
+.*: fca1 0814 vfmsl.f16 d0, s2, s8
+.*: fe10 281c vfmsl.f16 d2, s0, s8\[1\]
+.*: fc21 0837 vfmal.f16 d0, s2, s15
+.*: fe00 2837 vfmal.f16 d2, s0, s15\[0\]
+.*: fca1 0837 vfmsl.f16 d0, s2, s15
+.*: fe10 283f vfmsl.f16 d2, s0, s15\[1\]
+.*: fc27 0890 vfmal.f16 d0, s15, s0
+.*: fe00 f810 vfmal.f16 d15, s0, s0\[0\]
+.*: fca7 0890 vfmsl.f16 d0, s15, s0
+.*: fe10 f818 vfmsl.f16 d15, s0, s0\[1\]
+.*: fc27 0894 vfmal.f16 d0, s15, s8
+.*: fe00 f814 vfmal.f16 d15, s0, s8\[0\]
+.*: fca7 0894 vfmsl.f16 d0, s15, s8
+.*: fe10 f81c vfmsl.f16 d15, s0, s8\[1\]
+.*: fc27 08b7 vfmal.f16 d0, s15, s15
+.*: fe00 f837 vfmal.f16 d15, s0, s15\[0\]
+.*: fca7 08b7 vfmsl.f16 d0, s15, s15
+.*: fe10 f83f vfmsl.f16 d15, s0, s15\[1\]
+.*: fc2f 0810 vfmal.f16 d0, s30, s0
+.*: fe40 e810 vfmal.f16 d30, s0, s0\[0\]
+.*: fcaf 0810 vfmsl.f16 d0, s30, s0
+.*: fe50 e818 vfmsl.f16 d30, s0, s0\[1\]
+.*: fc2f 0814 vfmal.f16 d0, s30, s8
+.*: fe40 e814 vfmal.f16 d30, s0, s8\[0\]
+.*: fcaf 0814 vfmsl.f16 d0, s30, s8
+.*: fe50 e81c vfmsl.f16 d30, s0, s8\[1\]
+.*: fc2f 0837 vfmal.f16 d0, s30, s15
+.*: fe40 e837 vfmal.f16 d30, s0, s15\[0\]
+.*: fcaf 0837 vfmsl.f16 d0, s30, s15
+.*: fe50 e83f vfmsl.f16 d30, s0, s15\[1\]
+.*: fc21 7810 vfmal.f16 d7, s2, s0
+.*: fe03 2890 vfmal.f16 d2, s7, s0\[0\]
+.*: fca1 7810 vfmsl.f16 d7, s2, s0
+.*: fe13 2898 vfmsl.f16 d2, s7, s0\[1\]
+.*: fc21 7814 vfmal.f16 d7, s2, s8
+.*: fe03 2894 vfmal.f16 d2, s7, s8\[0\]
+.*: fca1 7814 vfmsl.f16 d7, s2, s8
+.*: fe13 289c vfmsl.f16 d2, s7, s8\[1\]
+.*: fc21 7837 vfmal.f16 d7, s2, s15
+.*: fe03 28b7 vfmal.f16 d2, s7, s15\[0\]
+.*: fca1 7837 vfmsl.f16 d7, s2, s15
+.*: fe13 28bf vfmsl.f16 d2, s7, s15\[1\]
+.*: fc27 7890 vfmal.f16 d7, s15, s0
+.*: fe03 f890 vfmal.f16 d15, s7, s0\[0\]
+.*: fca7 7890 vfmsl.f16 d7, s15, s0
+.*: fe13 f898 vfmsl.f16 d15, s7, s0\[1\]
+.*: fc27 7894 vfmal.f16 d7, s15, s8
+.*: fe03 f894 vfmal.f16 d15, s7, s8\[0\]
+.*: fca7 7894 vfmsl.f16 d7, s15, s8
+.*: fe13 f89c vfmsl.f16 d15, s7, s8\[1\]
+.*: fc27 78b7 vfmal.f16 d7, s15, s15
+.*: fe03 f8b7 vfmal.f16 d15, s7, s15\[0\]
+.*: fca7 78b7 vfmsl.f16 d7, s15, s15
+.*: fe13 f8bf vfmsl.f16 d15, s7, s15\[1\]
+.*: fc2f 7810 vfmal.f16 d7, s30, s0
+.*: fe43 e890 vfmal.f16 d30, s7, s0\[0\]
+.*: fcaf 7810 vfmsl.f16 d7, s30, s0
+.*: fe53 e898 vfmsl.f16 d30, s7, s0\[1\]
+.*: fc2f 7814 vfmal.f16 d7, s30, s8
+.*: fe43 e894 vfmal.f16 d30, s7, s8\[0\]
+.*: fcaf 7814 vfmsl.f16 d7, s30, s8
+.*: fe53 e89c vfmsl.f16 d30, s7, s8\[1\]
+.*: fc2f 7837 vfmal.f16 d7, s30, s15
+.*: fe43 e8b7 vfmal.f16 d30, s7, s15\[0\]
+.*: fcaf 7837 vfmsl.f16 d7, s30, s15
+.*: fe53 e8bf vfmsl.f16 d30, s7, s15\[1\]
+.*: fc61 0810 vfmal.f16 d16, s2, s0
+.*: fe08 2810 vfmal.f16 d2, s16, s0\[0\]
+.*: fce1 0810 vfmsl.f16 d16, s2, s0
+.*: fe18 2818 vfmsl.f16 d2, s16, s0\[1\]
+.*: fc61 0814 vfmal.f16 d16, s2, s8
+.*: fe08 2814 vfmal.f16 d2, s16, s8\[0\]
+.*: fce1 0814 vfmsl.f16 d16, s2, s8
+.*: fe18 281c vfmsl.f16 d2, s16, s8\[1\]
+.*: fc61 0837 vfmal.f16 d16, s2, s15
+.*: fe08 2837 vfmal.f16 d2, s16, s15\[0\]
+.*: fce1 0837 vfmsl.f16 d16, s2, s15
+.*: fe18 283f vfmsl.f16 d2, s16, s15\[1\]
+.*: fc67 0890 vfmal.f16 d16, s15, s0
+.*: fe08 f810 vfmal.f16 d15, s16, s0\[0\]
+.*: fce7 0890 vfmsl.f16 d16, s15, s0
+.*: fe18 f818 vfmsl.f16 d15, s16, s0\[1\]
+.*: fc67 0894 vfmal.f16 d16, s15, s8
+.*: fe08 f814 vfmal.f16 d15, s16, s8\[0\]
+.*: fce7 0894 vfmsl.f16 d16, s15, s8
+.*: fe18 f81c vfmsl.f16 d15, s16, s8\[1\]
+.*: fc67 08b7 vfmal.f16 d16, s15, s15
+.*: fe08 f837 vfmal.f16 d15, s16, s15\[0\]
+.*: fce7 08b7 vfmsl.f16 d16, s15, s15
+.*: fe18 f83f vfmsl.f16 d15, s16, s15\[1\]
+.*: fc6f 0810 vfmal.f16 d16, s30, s0
+.*: fe48 e810 vfmal.f16 d30, s16, s0\[0\]
+.*: fcef 0810 vfmsl.f16 d16, s30, s0
+.*: fe58 e818 vfmsl.f16 d30, s16, s0\[1\]
+.*: fc6f 0814 vfmal.f16 d16, s30, s8
+.*: fe48 e814 vfmal.f16 d30, s16, s8\[0\]
+.*: fcef 0814 vfmsl.f16 d16, s30, s8
+.*: fe58 e81c vfmsl.f16 d30, s16, s8\[1\]
+.*: fc6f 0837 vfmal.f16 d16, s30, s15
+.*: fe48 e837 vfmal.f16 d30, s16, s15\[0\]
+.*: fcef 0837 vfmsl.f16 d16, s30, s15
+.*: fe58 e83f vfmsl.f16 d30, s16, s15\[1\]
+.*: fc61 f810 vfmal.f16 d31, s2, s0
+.*: fe0f 2890 vfmal.f16 d2, s31, s0\[0\]
+.*: fce1 f810 vfmsl.f16 d31, s2, s0
+.*: fe1f 2898 vfmsl.f16 d2, s31, s0\[1\]
+.*: fc61 f814 vfmal.f16 d31, s2, s8
+.*: fe0f 2894 vfmal.f16 d2, s31, s8\[0\]
+.*: fce1 f814 vfmsl.f16 d31, s2, s8
+.*: fe1f 289c vfmsl.f16 d2, s31, s8\[1\]
+.*: fc61 f837 vfmal.f16 d31, s2, s15
+.*: fe0f 28b7 vfmal.f16 d2, s31, s15\[0\]
+.*: fce1 f837 vfmsl.f16 d31, s2, s15
+.*: fe1f 28bf vfmsl.f16 d2, s31, s15\[1\]
+.*: fc67 f890 vfmal.f16 d31, s15, s0
+.*: fe0f f890 vfmal.f16 d15, s31, s0\[0\]
+.*: fce7 f890 vfmsl.f16 d31, s15, s0
+.*: fe1f f898 vfmsl.f16 d15, s31, s0\[1\]
+.*: fc67 f894 vfmal.f16 d31, s15, s8
+.*: fe0f f894 vfmal.f16 d15, s31, s8\[0\]
+.*: fce7 f894 vfmsl.f16 d31, s15, s8
+.*: fe1f f89c vfmsl.f16 d15, s31, s8\[1\]
+.*: fc67 f8b7 vfmal.f16 d31, s15, s15
+.*: fe0f f8b7 vfmal.f16 d15, s31, s15\[0\]
+.*: fce7 f8b7 vfmsl.f16 d31, s15, s15
+.*: fe1f f8bf vfmsl.f16 d15, s31, s15\[1\]
+.*: fc6f f810 vfmal.f16 d31, s30, s0
+.*: fe4f e890 vfmal.f16 d30, s31, s0\[0\]
+.*: fcef f810 vfmsl.f16 d31, s30, s0
+.*: fe5f e898 vfmsl.f16 d30, s31, s0\[1\]
+.*: fc6f f814 vfmal.f16 d31, s30, s8
+.*: fe4f e894 vfmal.f16 d30, s31, s8\[0\]
+.*: fcef f814 vfmsl.f16 d31, s30, s8
+.*: fe5f e89c vfmsl.f16 d30, s31, s8\[1\]
+.*: fc6f f837 vfmal.f16 d31, s30, s15
+.*: fe4f e8b7 vfmal.f16 d30, s31, s15\[0\]
+.*: fcef f837 vfmsl.f16 d31, s30, s15
+.*: fe5f e8bf vfmsl.f16 d30, s31, s15\[1\]
+.*: fc20 4850 vfmal.f16 q2, d0, d0
+.*: fe02 0850 vfmal.f16 q0, d2, d0\[0\]
+.*: fca0 4850 vfmsl.f16 q2, d0, d0
+.*: fe12 0878 vfmsl.f16 q0, d2, d0\[3\]
+.*: fc20 4857 vfmal.f16 q2, d0, d7
+.*: fe02 0857 vfmal.f16 q0, d2, d7\[0\]
+.*: fca0 4857 vfmsl.f16 q2, d0, d7
+.*: fe12 087f vfmsl.f16 q0, d2, d7\[3\]
+.*: fc20 6850 vfmal.f16 q3, d0, d0
+.*: fe03 0850 vfmal.f16 q0, d3, d0\[0\]
+.*: fca0 6850 vfmsl.f16 q3, d0, d0
+.*: fe13 0878 vfmsl.f16 q0, d3, d0\[3\]
+.*: fc20 6857 vfmal.f16 q3, d0, d7
+.*: fe03 0857 vfmal.f16 q0, d3, d7\[0\]
+.*: fca0 6857 vfmsl.f16 q3, d0, d7
+.*: fe13 087f vfmsl.f16 q0, d3, d7\[3\]
+.*: fc60 a850 vfmal.f16 q13, d0, d0
+.*: fe0d 0850 vfmal.f16 q0, d13, d0\[0\]
+.*: fce0 a850 vfmsl.f16 q13, d0, d0
+.*: fe1d 0878 vfmsl.f16 q0, d13, d0\[3\]
+.*: fc60 a857 vfmal.f16 q13, d0, d7
+.*: fe0d 0857 vfmal.f16 q0, d13, d7\[0\]
+.*: fce0 a857 vfmsl.f16 q13, d0, d7
+.*: fe1d 087f vfmsl.f16 q0, d13, d7\[3\]
+.*: fc21 4850 vfmal.f16 q2, d1, d0
+.*: fe02 2850 vfmal.f16 q1, d2, d0\[0\]
+.*: fca1 4850 vfmsl.f16 q2, d1, d0
+.*: fe12 2878 vfmsl.f16 q1, d2, d0\[3\]
+.*: fc21 4857 vfmal.f16 q2, d1, d7
+.*: fe02 2857 vfmal.f16 q1, d2, d7\[0\]
+.*: fca1 4857 vfmsl.f16 q2, d1, d7
+.*: fe12 287f vfmsl.f16 q1, d2, d7\[3\]
+.*: fc21 6850 vfmal.f16 q3, d1, d0
+.*: fe03 2850 vfmal.f16 q1, d3, d0\[0\]
+.*: fca1 6850 vfmsl.f16 q3, d1, d0
+.*: fe13 2878 vfmsl.f16 q1, d3, d0\[3\]
+.*: fc21 6857 vfmal.f16 q3, d1, d7
+.*: fe03 2857 vfmal.f16 q1, d3, d7\[0\]
+.*: fca1 6857 vfmsl.f16 q3, d1, d7
+.*: fe13 287f vfmsl.f16 q1, d3, d7\[3\]
+.*: fc61 a850 vfmal.f16 q13, d1, d0
+.*: fe0d 2850 vfmal.f16 q1, d13, d0\[0\]
+.*: fce1 a850 vfmsl.f16 q13, d1, d0
+.*: fe1d 2878 vfmsl.f16 q1, d13, d0\[3\]
+.*: fc61 a857 vfmal.f16 q13, d1, d7
+.*: fe0d 2857 vfmal.f16 q1, d13, d7\[0\]
+.*: fce1 a857 vfmsl.f16 q13, d1, d7
+.*: fe1d 287f vfmsl.f16 q1, d13, d7\[3\]
+.*: fc26 4850 vfmal.f16 q2, d6, d0
+.*: fe02 c850 vfmal.f16 q6, d2, d0\[0\]
+.*: fca6 4850 vfmsl.f16 q2, d6, d0
+.*: fe12 c878 vfmsl.f16 q6, d2, d0\[3\]
+.*: fc26 4857 vfmal.f16 q2, d6, d7
+.*: fe02 c857 vfmal.f16 q6, d2, d7\[0\]
+.*: fca6 4857 vfmsl.f16 q2, d6, d7
+.*: fe12 c87f vfmsl.f16 q6, d2, d7\[3\]
+.*: fc26 6850 vfmal.f16 q3, d6, d0
+.*: fe03 c850 vfmal.f16 q6, d3, d0\[0\]
+.*: fca6 6850 vfmsl.f16 q3, d6, d0
+.*: fe13 c878 vfmsl.f16 q6, d3, d0\[3\]
+.*: fc26 6857 vfmal.f16 q3, d6, d7
+.*: fe03 c857 vfmal.f16 q6, d3, d7\[0\]
+.*: fca6 6857 vfmsl.f16 q3, d6, d7
+.*: fe13 c87f vfmsl.f16 q6, d3, d7\[3\]
+.*: fc66 a850 vfmal.f16 q13, d6, d0
+.*: fe0d c850 vfmal.f16 q6, d13, d0\[0\]
+.*: fce6 a850 vfmsl.f16 q13, d6, d0
+.*: fe1d c878 vfmsl.f16 q6, d13, d0\[3\]
+.*: fc66 a857 vfmal.f16 q13, d6, d7
+.*: fe0d c857 vfmal.f16 q6, d13, d7\[0\]
+.*: fce6 a857 vfmsl.f16 q13, d6, d7
+.*: fe1d c87f vfmsl.f16 q6, d13, d7\[3\]
+.*: fc2f 4850 vfmal.f16 q2, d15, d0
+.*: fe42 e850 vfmal.f16 q15, d2, d0\[0\]
+.*: fcaf 4850 vfmsl.f16 q2, d15, d0
+.*: fe52 e878 vfmsl.f16 q15, d2, d0\[3\]
+.*: fc2f 4857 vfmal.f16 q2, d15, d7
+.*: fe42 e857 vfmal.f16 q15, d2, d7\[0\]
+.*: fcaf 4857 vfmsl.f16 q2, d15, d7
+.*: fe52 e87f vfmsl.f16 q15, d2, d7\[3\]
+.*: fc2f 6850 vfmal.f16 q3, d15, d0
+.*: fe43 e850 vfmal.f16 q15, d3, d0\[0\]
+.*: fcaf 6850 vfmsl.f16 q3, d15, d0
+.*: fe53 e878 vfmsl.f16 q15, d3, d0\[3\]
+.*: fc2f 6857 vfmal.f16 q3, d15, d7
+.*: fe43 e857 vfmal.f16 q15, d3, d7\[0\]
+.*: fcaf 6857 vfmsl.f16 q3, d15, d7
+.*: fe53 e87f vfmsl.f16 q15, d3, d7\[3\]
+.*: fc6f a850 vfmal.f16 q13, d15, d0
+.*: fe4d e850 vfmal.f16 q15, d13, d0\[0\]
+.*: fcef a850 vfmsl.f16 q13, d15, d0
+.*: fe5d e878 vfmsl.f16 q15, d13, d0\[3\]
+.*: fc6f a857 vfmal.f16 q13, d15, d7
+.*: fe4d e857 vfmal.f16 q15, d13, d7\[0\]
+.*: fcef a857 vfmsl.f16 q13, d15, d7
+.*: fe5d e87f vfmsl.f16 q15, d13, d7\[3\]
diff --git a/gas/testsuite/gas/arm/armv8_2-a-fp16.d b/gas/testsuite/gas/arm/armv8_2-a-fp16.d
new file mode 100644
index 0000000..9f99828
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.2-a+fp16 -mfpu=neon-fp-armv8
+#source: armv8_2-a-fp16.s
+#objdump: -d
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+.* <.*>:
+.*: fc210810 vfmal.f16 d0, s2, s0
+.*: fe002810 vfmal.f16 d2, s0, s0\[0\]
+.*: fca10810 vfmsl.f16 d0, s2, s0
+.*: fe102818 vfmsl.f16 d2, s0, s0\[1\]
+.*: fc210814 vfmal.f16 d0, s2, s8
+.*: fe002814 vfmal.f16 d2, s0, s8\[0\]
+.*: fca10814 vfmsl.f16 d0, s2, s8
+.*: fe10281c vfmsl.f16 d2, s0, s8\[1\]
+.*: fc210837 vfmal.f16 d0, s2, s15
+.*: fe002837 vfmal.f16 d2, s0, s15\[0\]
+.*: fca10837 vfmsl.f16 d0, s2, s15
+.*: fe10283f vfmsl.f16 d2, s0, s15\[1\]
+.*: fc270890 vfmal.f16 d0, s15, s0
+.*: fe00f810 vfmal.f16 d15, s0, s0\[0\]
+.*: fca70890 vfmsl.f16 d0, s15, s0
+.*: fe10f818 vfmsl.f16 d15, s0, s0\[1\]
+.*: fc270894 vfmal.f16 d0, s15, s8
+.*: fe00f814 vfmal.f16 d15, s0, s8\[0\]
+.*: fca70894 vfmsl.f16 d0, s15, s8
+.*: fe10f81c vfmsl.f16 d15, s0, s8\[1\]
+.*: fc2708b7 vfmal.f16 d0, s15, s15
+.*: fe00f837 vfmal.f16 d15, s0, s15\[0\]
+.*: fca708b7 vfmsl.f16 d0, s15, s15
+.*: fe10f83f vfmsl.f16 d15, s0, s15\[1\]
+.*: fc2f0810 vfmal.f16 d0, s30, s0
+.*: fe40e810 vfmal.f16 d30, s0, s0\[0\]
+.*: fcaf0810 vfmsl.f16 d0, s30, s0
+.*: fe50e818 vfmsl.f16 d30, s0, s0\[1\]
+.*: fc2f0814 vfmal.f16 d0, s30, s8
+.*: fe40e814 vfmal.f16 d30, s0, s8\[0\]
+.*: fcaf0814 vfmsl.f16 d0, s30, s8
+.*: fe50e81c vfmsl.f16 d30, s0, s8\[1\]
+.*: fc2f0837 vfmal.f16 d0, s30, s15
+.*: fe40e837 vfmal.f16 d30, s0, s15\[0\]
+.*: fcaf0837 vfmsl.f16 d0, s30, s15
+.*: fe50e83f vfmsl.f16 d30, s0, s15\[1\]
+.*: fc217810 vfmal.f16 d7, s2, s0
+.*: fe032890 vfmal.f16 d2, s7, s0\[0\]
+.*: fca17810 vfmsl.f16 d7, s2, s0
+.*: fe132898 vfmsl.f16 d2, s7, s0\[1\]
+.*: fc217814 vfmal.f16 d7, s2, s8
+.*: fe032894 vfmal.f16 d2, s7, s8\[0\]
+.*: fca17814 vfmsl.f16 d7, s2, s8
+.*: fe13289c vfmsl.f16 d2, s7, s8\[1\]
+.*: fc217837 vfmal.f16 d7, s2, s15
+.*: fe0328b7 vfmal.f16 d2, s7, s15\[0\]
+.*: fca17837 vfmsl.f16 d7, s2, s15
+.*: fe1328bf vfmsl.f16 d2, s7, s15\[1\]
+.*: fc277890 vfmal.f16 d7, s15, s0
+.*: fe03f890 vfmal.f16 d15, s7, s0\[0\]
+.*: fca77890 vfmsl.f16 d7, s15, s0
+.*: fe13f898 vfmsl.f16 d15, s7, s0\[1\]
+.*: fc277894 vfmal.f16 d7, s15, s8
+.*: fe03f894 vfmal.f16 d15, s7, s8\[0\]
+.*: fca77894 vfmsl.f16 d7, s15, s8
+.*: fe13f89c vfmsl.f16 d15, s7, s8\[1\]
+.*: fc2778b7 vfmal.f16 d7, s15, s15
+.*: fe03f8b7 vfmal.f16 d15, s7, s15\[0\]
+.*: fca778b7 vfmsl.f16 d7, s15, s15
+.*: fe13f8bf vfmsl.f16 d15, s7, s15\[1\]
+.*: fc2f7810 vfmal.f16 d7, s30, s0
+.*: fe43e890 vfmal.f16 d30, s7, s0\[0\]
+.*: fcaf7810 vfmsl.f16 d7, s30, s0
+.*: fe53e898 vfmsl.f16 d30, s7, s0\[1\]
+.*: fc2f7814 vfmal.f16 d7, s30, s8
+.*: fe43e894 vfmal.f16 d30, s7, s8\[0\]
+.*: fcaf7814 vfmsl.f16 d7, s30, s8
+.*: fe53e89c vfmsl.f16 d30, s7, s8\[1\]
+.*: fc2f7837 vfmal.f16 d7, s30, s15
+.*: fe43e8b7 vfmal.f16 d30, s7, s15\[0\]
+.*: fcaf7837 vfmsl.f16 d7, s30, s15
+.*: fe53e8bf vfmsl.f16 d30, s7, s15\[1\]
+.*: fc610810 vfmal.f16 d16, s2, s0
+.*: fe082810 vfmal.f16 d2, s16, s0\[0\]
+.*: fce10810 vfmsl.f16 d16, s2, s0
+.*: fe182818 vfmsl.f16 d2, s16, s0\[1\]
+.*: fc610814 vfmal.f16 d16, s2, s8
+.*: fe082814 vfmal.f16 d2, s16, s8\[0\]
+.*: fce10814 vfmsl.f16 d16, s2, s8
+.*: fe18281c vfmsl.f16 d2, s16, s8\[1\]
+.*: fc610837 vfmal.f16 d16, s2, s15
+.*: fe082837 vfmal.f16 d2, s16, s15\[0\]
+.*: fce10837 vfmsl.f16 d16, s2, s15
+.*: fe18283f vfmsl.f16 d2, s16, s15\[1\]
+.*: fc670890 vfmal.f16 d16, s15, s0
+.*: fe08f810 vfmal.f16 d15, s16, s0\[0\]
+.*: fce70890 vfmsl.f16 d16, s15, s0
+.*: fe18f818 vfmsl.f16 d15, s16, s0\[1\]
+.*: fc670894 vfmal.f16 d16, s15, s8
+.*: fe08f814 vfmal.f16 d15, s16, s8\[0\]
+.*: fce70894 vfmsl.f16 d16, s15, s8
+.*: fe18f81c vfmsl.f16 d15, s16, s8\[1\]
+.*: fc6708b7 vfmal.f16 d16, s15, s15
+.*: fe08f837 vfmal.f16 d15, s16, s15\[0\]
+.*: fce708b7 vfmsl.f16 d16, s15, s15
+.*: fe18f83f vfmsl.f16 d15, s16, s15\[1\]
+.*: fc6f0810 vfmal.f16 d16, s30, s0
+.*: fe48e810 vfmal.f16 d30, s16, s0\[0\]
+.*: fcef0810 vfmsl.f16 d16, s30, s0
+.*: fe58e818 vfmsl.f16 d30, s16, s0\[1\]
+.*: fc6f0814 vfmal.f16 d16, s30, s8
+.*: fe48e814 vfmal.f16 d30, s16, s8\[0\]
+.*: fcef0814 vfmsl.f16 d16, s30, s8
+.*: fe58e81c vfmsl.f16 d30, s16, s8\[1\]
+.*: fc6f0837 vfmal.f16 d16, s30, s15
+.*: fe48e837 vfmal.f16 d30, s16, s15\[0\]
+.*: fcef0837 vfmsl.f16 d16, s30, s15
+.*: fe58e83f vfmsl.f16 d30, s16, s15\[1\]
+.*: fc61f810 vfmal.f16 d31, s2, s0
+.*: fe0f2890 vfmal.f16 d2, s31, s0\[0\]
+.*: fce1f810 vfmsl.f16 d31, s2, s0
+.*: fe1f2898 vfmsl.f16 d2, s31, s0\[1\]
+.*: fc61f814 vfmal.f16 d31, s2, s8
+.*: fe0f2894 vfmal.f16 d2, s31, s8\[0\]
+.*: fce1f814 vfmsl.f16 d31, s2, s8
+.*: fe1f289c vfmsl.f16 d2, s31, s8\[1\]
+.*: fc61f837 vfmal.f16 d31, s2, s15
+.*: fe0f28b7 vfmal.f16 d2, s31, s15\[0\]
+.*: fce1f837 vfmsl.f16 d31, s2, s15
+.*: fe1f28bf vfmsl.f16 d2, s31, s15\[1\]
+.*: fc67f890 vfmal.f16 d31, s15, s0
+.*: fe0ff890 vfmal.f16 d15, s31, s0\[0\]
+.*: fce7f890 vfmsl.f16 d31, s15, s0
+.*: fe1ff898 vfmsl.f16 d15, s31, s0\[1\]
+.*: fc67f894 vfmal.f16 d31, s15, s8
+.*: fe0ff894 vfmal.f16 d15, s31, s8\[0\]
+.*: fce7f894 vfmsl.f16 d31, s15, s8
+.*: fe1ff89c vfmsl.f16 d15, s31, s8\[1\]
+.*: fc67f8b7 vfmal.f16 d31, s15, s15
+.*: fe0ff8b7 vfmal.f16 d15, s31, s15\[0\]
+.*: fce7f8b7 vfmsl.f16 d31, s15, s15
+.*: fe1ff8bf vfmsl.f16 d15, s31, s15\[1\]
+.*: fc6ff810 vfmal.f16 d31, s30, s0
+.*: fe4fe890 vfmal.f16 d30, s31, s0\[0\]
+.*: fceff810 vfmsl.f16 d31, s30, s0
+.*: fe5fe898 vfmsl.f16 d30, s31, s0\[1\]
+.*: fc6ff814 vfmal.f16 d31, s30, s8
+.*: fe4fe894 vfmal.f16 d30, s31, s8\[0\]
+.*: fceff814 vfmsl.f16 d31, s30, s8
+.*: fe5fe89c vfmsl.f16 d30, s31, s8\[1\]
+.*: fc6ff837 vfmal.f16 d31, s30, s15
+.*: fe4fe8b7 vfmal.f16 d30, s31, s15\[0\]
+.*: fceff837 vfmsl.f16 d31, s30, s15
+.*: fe5fe8bf vfmsl.f16 d30, s31, s15\[1\]
+.*: fc204850 vfmal.f16 q2, d0, d0
+.*: fe020850 vfmal.f16 q0, d2, d0\[0\]
+.*: fca04850 vfmsl.f16 q2, d0, d0
+.*: fe120878 vfmsl.f16 q0, d2, d0\[3\]
+.*: fc204857 vfmal.f16 q2, d0, d7
+.*: fe020857 vfmal.f16 q0, d2, d7\[0\]
+.*: fca04857 vfmsl.f16 q2, d0, d7
+.*: fe12087f vfmsl.f16 q0, d2, d7\[3\]
+.*: fc206850 vfmal.f16 q3, d0, d0
+.*: fe030850 vfmal.f16 q0, d3, d0\[0\]
+.*: fca06850 vfmsl.f16 q3, d0, d0
+.*: fe130878 vfmsl.f16 q0, d3, d0\[3\]
+.*: fc206857 vfmal.f16 q3, d0, d7
+.*: fe030857 vfmal.f16 q0, d3, d7\[0\]
+.*: fca06857 vfmsl.f16 q3, d0, d7
+.*: fe13087f vfmsl.f16 q0, d3, d7\[3\]
+.*: fc60a850 vfmal.f16 q13, d0, d0
+.*: fe0d0850 vfmal.f16 q0, d13, d0\[0\]
+.*: fce0a850 vfmsl.f16 q13, d0, d0
+.*: fe1d0878 vfmsl.f16 q0, d13, d0\[3\]
+.*: fc60a857 vfmal.f16 q13, d0, d7
+.*: fe0d0857 vfmal.f16 q0, d13, d7\[0\]
+.*: fce0a857 vfmsl.f16 q13, d0, d7
+.*: fe1d087f vfmsl.f16 q0, d13, d7\[3\]
+.*: fc214850 vfmal.f16 q2, d1, d0
+.*: fe022850 vfmal.f16 q1, d2, d0\[0\]
+.*: fca14850 vfmsl.f16 q2, d1, d0
+.*: fe122878 vfmsl.f16 q1, d2, d0\[3\]
+.*: fc214857 vfmal.f16 q2, d1, d7
+.*: fe022857 vfmal.f16 q1, d2, d7\[0\]
+.*: fca14857 vfmsl.f16 q2, d1, d7
+.*: fe12287f vfmsl.f16 q1, d2, d7\[3\]
+.*: fc216850 vfmal.f16 q3, d1, d0
+.*: fe032850 vfmal.f16 q1, d3, d0\[0\]
+.*: fca16850 vfmsl.f16 q3, d1, d0
+.*: fe132878 vfmsl.f16 q1, d3, d0\[3\]
+.*: fc216857 vfmal.f16 q3, d1, d7
+.*: fe032857 vfmal.f16 q1, d3, d7\[0\]
+.*: fca16857 vfmsl.f16 q3, d1, d7
+.*: fe13287f vfmsl.f16 q1, d3, d7\[3\]
+.*: fc61a850 vfmal.f16 q13, d1, d0
+.*: fe0d2850 vfmal.f16 q1, d13, d0\[0\]
+.*: fce1a850 vfmsl.f16 q13, d1, d0
+.*: fe1d2878 vfmsl.f16 q1, d13, d0\[3\]
+.*: fc61a857 vfmal.f16 q13, d1, d7
+.*: fe0d2857 vfmal.f16 q1, d13, d7\[0\]
+.*: fce1a857 vfmsl.f16 q13, d1, d7
+.*: fe1d287f vfmsl.f16 q1, d13, d7\[3\]
+.*: fc264850 vfmal.f16 q2, d6, d0
+.*: fe02c850 vfmal.f16 q6, d2, d0\[0\]
+.*: fca64850 vfmsl.f16 q2, d6, d0
+.*: fe12c878 vfmsl.f16 q6, d2, d0\[3\]
+.*: fc264857 vfmal.f16 q2, d6, d7
+.*: fe02c857 vfmal.f16 q6, d2, d7\[0\]
+.*: fca64857 vfmsl.f16 q2, d6, d7
+.*: fe12c87f vfmsl.f16 q6, d2, d7\[3\]
+.*: fc266850 vfmal.f16 q3, d6, d0
+.*: fe03c850 vfmal.f16 q6, d3, d0\[0\]
+.*: fca66850 vfmsl.f16 q3, d6, d0
+.*: fe13c878 vfmsl.f16 q6, d3, d0\[3\]
+.*: fc266857 vfmal.f16 q3, d6, d7
+.*: fe03c857 vfmal.f16 q6, d3, d7\[0\]
+.*: fca66857 vfmsl.f16 q3, d6, d7
+.*: fe13c87f vfmsl.f16 q6, d3, d7\[3\]
+.*: fc66a850 vfmal.f16 q13, d6, d0
+.*: fe0dc850 vfmal.f16 q6, d13, d0\[0\]
+.*: fce6a850 vfmsl.f16 q13, d6, d0
+.*: fe1dc878 vfmsl.f16 q6, d13, d0\[3\]
+.*: fc66a857 vfmal.f16 q13, d6, d7
+.*: fe0dc857 vfmal.f16 q6, d13, d7\[0\]
+.*: fce6a857 vfmsl.f16 q13, d6, d7
+.*: fe1dc87f vfmsl.f16 q6, d13, d7\[3\]
+.*: fc2f4850 vfmal.f16 q2, d15, d0
+.*: fe42e850 vfmal.f16 q15, d2, d0\[0\]
+.*: fcaf4850 vfmsl.f16 q2, d15, d0
+.*: fe52e878 vfmsl.f16 q15, d2, d0\[3\]
+.*: fc2f4857 vfmal.f16 q2, d15, d7
+.*: fe42e857 vfmal.f16 q15, d2, d7\[0\]
+.*: fcaf4857 vfmsl.f16 q2, d15, d7
+.*: fe52e87f vfmsl.f16 q15, d2, d7\[3\]
+.*: fc2f6850 vfmal.f16 q3, d15, d0
+.*: fe43e850 vfmal.f16 q15, d3, d0\[0\]
+.*: fcaf6850 vfmsl.f16 q3, d15, d0
+.*: fe53e878 vfmsl.f16 q15, d3, d0\[3\]
+.*: fc2f6857 vfmal.f16 q3, d15, d7
+.*: fe43e857 vfmal.f16 q15, d3, d7\[0\]
+.*: fcaf6857 vfmsl.f16 q3, d15, d7
+.*: fe53e87f vfmsl.f16 q15, d3, d7\[3\]
+.*: fc6fa850 vfmal.f16 q13, d15, d0
+.*: fe4de850 vfmal.f16 q15, d13, d0\[0\]
+.*: fcefa850 vfmsl.f16 q13, d15, d0
+.*: fe5de878 vfmsl.f16 q15, d13, d0\[3\]
+.*: fc6fa857 vfmal.f16 q13, d15, d7
+.*: fe4de857 vfmal.f16 q15, d13, d7\[0\]
+.*: fcefa857 vfmsl.f16 q13, d15, d7
+.*: fe5de87f vfmsl.f16 q15, d13, d7\[3\]
diff --git a/gas/testsuite/gas/arm/armv8_2-a-fp16.s b/gas/testsuite/gas/arm/armv8_2-a-fp16.s
new file mode 100644
index 0000000..0adbd42
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16.s
@@ -0,0 +1,46 @@
+ .macro fmac_iter_d_n op, d, n
+ .irp m, 0, 8, 15
+ vfmal.f16 d\d, s\n, s\m
+ vfmal.f16 d\n, s\d, s\m[0]
+ vfmsl.f16 d\d, s\n, s\m
+ vfmsl.f16 d\n, s\d, s\m[1]
+ .endr
+ .endm
+
+ .macro fmac_iter_d op, d
+ .irp n, 2, 15, 30
+ fmac_iter_d_n \op, \d, \n
+ .endr
+ .endm
+
+ .macro iter
+ .irp d, 0, 7, 16, 31
+ fmac_iter_d \op, \d
+ .endr
+ .endm
+
+ .macro fmac_q_iter_d_n op, d, n
+ .irp m, 0, 7
+ vfmal.f16 q\n, d\d, d\m
+ vfmal.f16 q\d, d\n, d\m[0]
+ vfmsl.f16 q\n, d\d, d\m
+ vfmsl.f16 q\d, d\n, d\m[3]
+ .endr
+ .endm
+
+ .macro fmac_q_iter_d op, d
+ .irp n, 2, 3, 13
+ fmac_q_iter_d_n \op, \d, \n
+ .endr
+ .endm
+
+ .macro q_iter
+ .irp d, 0, 1, 6, 15
+ fmac_q_iter_d \op, \d
+ .endr
+ .endm
+
+ .text
+func:
+ iter
+ q_iter
diff --git a/gas/testsuite/gas/arm/armv8_3-a-fp16.d b/gas/testsuite/gas/arm/armv8_3-a-fp16.d
new file mode 100644
index 0000000..545275a
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_3-a-fp16.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.3-a+fp16 -mfpu=neon-fp-armv8
+#source: armv8_2-a-fp16.s
+#objdump: -d
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+.* <.*>:
+.*: fc210810 vfmal.f16 d0, s2, s0
+.*: fe002810 vfmal.f16 d2, s0, s0\[0\]
+.*: fca10810 vfmsl.f16 d0, s2, s0
+.*: fe102818 vfmsl.f16 d2, s0, s0\[1\]
+.*: fc210814 vfmal.f16 d0, s2, s8
+.*: fe002814 vfmal.f16 d2, s0, s8\[0\]
+.*: fca10814 vfmsl.f16 d0, s2, s8
+.*: fe10281c vfmsl.f16 d2, s0, s8\[1\]
+.*: fc210837 vfmal.f16 d0, s2, s15
+.*: fe002837 vfmal.f16 d2, s0, s15\[0\]
+.*: fca10837 vfmsl.f16 d0, s2, s15
+.*: fe10283f vfmsl.f16 d2, s0, s15\[1\]
+.*: fc270890 vfmal.f16 d0, s15, s0
+.*: fe00f810 vfmal.f16 d15, s0, s0\[0\]
+.*: fca70890 vfmsl.f16 d0, s15, s0
+.*: fe10f818 vfmsl.f16 d15, s0, s0\[1\]
+.*: fc270894 vfmal.f16 d0, s15, s8
+.*: fe00f814 vfmal.f16 d15, s0, s8\[0\]
+.*: fca70894 vfmsl.f16 d0, s15, s8
+.*: fe10f81c vfmsl.f16 d15, s0, s8\[1\]
+.*: fc2708b7 vfmal.f16 d0, s15, s15
+.*: fe00f837 vfmal.f16 d15, s0, s15\[0\]
+.*: fca708b7 vfmsl.f16 d0, s15, s15
+.*: fe10f83f vfmsl.f16 d15, s0, s15\[1\]
+.*: fc2f0810 vfmal.f16 d0, s30, s0
+.*: fe40e810 vfmal.f16 d30, s0, s0\[0\]
+.*: fcaf0810 vfmsl.f16 d0, s30, s0
+.*: fe50e818 vfmsl.f16 d30, s0, s0\[1\]
+.*: fc2f0814 vfmal.f16 d0, s30, s8
+.*: fe40e814 vfmal.f16 d30, s0, s8\[0\]
+.*: fcaf0814 vfmsl.f16 d0, s30, s8
+.*: fe50e81c vfmsl.f16 d30, s0, s8\[1\]
+.*: fc2f0837 vfmal.f16 d0, s30, s15
+.*: fe40e837 vfmal.f16 d30, s0, s15\[0\]
+.*: fcaf0837 vfmsl.f16 d0, s30, s15
+.*: fe50e83f vfmsl.f16 d30, s0, s15\[1\]
+.*: fc217810 vfmal.f16 d7, s2, s0
+.*: fe032890 vfmal.f16 d2, s7, s0\[0\]
+.*: fca17810 vfmsl.f16 d7, s2, s0
+.*: fe132898 vfmsl.f16 d2, s7, s0\[1\]
+.*: fc217814 vfmal.f16 d7, s2, s8
+.*: fe032894 vfmal.f16 d2, s7, s8\[0\]
+.*: fca17814 vfmsl.f16 d7, s2, s8
+.*: fe13289c vfmsl.f16 d2, s7, s8\[1\]
+.*: fc217837 vfmal.f16 d7, s2, s15
+.*: fe0328b7 vfmal.f16 d2, s7, s15\[0\]
+.*: fca17837 vfmsl.f16 d7, s2, s15
+.*: fe1328bf vfmsl.f16 d2, s7, s15\[1\]
+.*: fc277890 vfmal.f16 d7, s15, s0
+.*: fe03f890 vfmal.f16 d15, s7, s0\[0\]
+.*: fca77890 vfmsl.f16 d7, s15, s0
+.*: fe13f898 vfmsl.f16 d15, s7, s0\[1\]
+.*: fc277894 vfmal.f16 d7, s15, s8
+.*: fe03f894 vfmal.f16 d15, s7, s8\[0\]
+.*: fca77894 vfmsl.f16 d7, s15, s8
+.*: fe13f89c vfmsl.f16 d15, s7, s8\[1\]
+.*: fc2778b7 vfmal.f16 d7, s15, s15
+.*: fe03f8b7 vfmal.f16 d15, s7, s15\[0\]
+.*: fca778b7 vfmsl.f16 d7, s15, s15
+.*: fe13f8bf vfmsl.f16 d15, s7, s15\[1\]
+.*: fc2f7810 vfmal.f16 d7, s30, s0
+.*: fe43e890 vfmal.f16 d30, s7, s0\[0\]
+.*: fcaf7810 vfmsl.f16 d7, s30, s0
+.*: fe53e898 vfmsl.f16 d30, s7, s0\[1\]
+.*: fc2f7814 vfmal.f16 d7, s30, s8
+.*: fe43e894 vfmal.f16 d30, s7, s8\[0\]
+.*: fcaf7814 vfmsl.f16 d7, s30, s8
+.*: fe53e89c vfmsl.f16 d30, s7, s8\[1\]
+.*: fc2f7837 vfmal.f16 d7, s30, s15
+.*: fe43e8b7 vfmal.f16 d30, s7, s15\[0\]
+.*: fcaf7837 vfmsl.f16 d7, s30, s15
+.*: fe53e8bf vfmsl.f16 d30, s7, s15\[1\]
+.*: fc610810 vfmal.f16 d16, s2, s0
+.*: fe082810 vfmal.f16 d2, s16, s0\[0\]
+.*: fce10810 vfmsl.f16 d16, s2, s0
+.*: fe182818 vfmsl.f16 d2, s16, s0\[1\]
+.*: fc610814 vfmal.f16 d16, s2, s8
+.*: fe082814 vfmal.f16 d2, s16, s8\[0\]
+.*: fce10814 vfmsl.f16 d16, s2, s8
+.*: fe18281c vfmsl.f16 d2, s16, s8\[1\]
+.*: fc610837 vfmal.f16 d16, s2, s15
+.*: fe082837 vfmal.f16 d2, s16, s15\[0\]
+.*: fce10837 vfmsl.f16 d16, s2, s15
+.*: fe18283f vfmsl.f16 d2, s16, s15\[1\]
+.*: fc670890 vfmal.f16 d16, s15, s0
+.*: fe08f810 vfmal.f16 d15, s16, s0\[0\]
+.*: fce70890 vfmsl.f16 d16, s15, s0
+.*: fe18f818 vfmsl.f16 d15, s16, s0\[1\]
+.*: fc670894 vfmal.f16 d16, s15, s8
+.*: fe08f814 vfmal.f16 d15, s16, s8\[0\]
+.*: fce70894 vfmsl.f16 d16, s15, s8
+.*: fe18f81c vfmsl.f16 d15, s16, s8\[1\]
+.*: fc6708b7 vfmal.f16 d16, s15, s15
+.*: fe08f837 vfmal.f16 d15, s16, s15\[0\]
+.*: fce708b7 vfmsl.f16 d16, s15, s15
+.*: fe18f83f vfmsl.f16 d15, s16, s15\[1\]
+.*: fc6f0810 vfmal.f16 d16, s30, s0
+.*: fe48e810 vfmal.f16 d30, s16, s0\[0\]
+.*: fcef0810 vfmsl.f16 d16, s30, s0
+.*: fe58e818 vfmsl.f16 d30, s16, s0\[1\]
+.*: fc6f0814 vfmal.f16 d16, s30, s8
+.*: fe48e814 vfmal.f16 d30, s16, s8\[0\]
+.*: fcef0814 vfmsl.f16 d16, s30, s8
+.*: fe58e81c vfmsl.f16 d30, s16, s8\[1\]
+.*: fc6f0837 vfmal.f16 d16, s30, s15
+.*: fe48e837 vfmal.f16 d30, s16, s15\[0\]
+.*: fcef0837 vfmsl.f16 d16, s30, s15
+.*: fe58e83f vfmsl.f16 d30, s16, s15\[1\]
+.*: fc61f810 vfmal.f16 d31, s2, s0
+.*: fe0f2890 vfmal.f16 d2, s31, s0\[0\]
+.*: fce1f810 vfmsl.f16 d31, s2, s0
+.*: fe1f2898 vfmsl.f16 d2, s31, s0\[1\]
+.*: fc61f814 vfmal.f16 d31, s2, s8
+.*: fe0f2894 vfmal.f16 d2, s31, s8\[0\]
+.*: fce1f814 vfmsl.f16 d31, s2, s8
+.*: fe1f289c vfmsl.f16 d2, s31, s8\[1\]
+.*: fc61f837 vfmal.f16 d31, s2, s15
+.*: fe0f28b7 vfmal.f16 d2, s31, s15\[0\]
+.*: fce1f837 vfmsl.f16 d31, s2, s15
+.*: fe1f28bf vfmsl.f16 d2, s31, s15\[1\]
+.*: fc67f890 vfmal.f16 d31, s15, s0
+.*: fe0ff890 vfmal.f16 d15, s31, s0\[0\]
+.*: fce7f890 vfmsl.f16 d31, s15, s0
+.*: fe1ff898 vfmsl.f16 d15, s31, s0\[1\]
+.*: fc67f894 vfmal.f16 d31, s15, s8
+.*: fe0ff894 vfmal.f16 d15, s31, s8\[0\]
+.*: fce7f894 vfmsl.f16 d31, s15, s8
+.*: fe1ff89c vfmsl.f16 d15, s31, s8\[1\]
+.*: fc67f8b7 vfmal.f16 d31, s15, s15
+.*: fe0ff8b7 vfmal.f16 d15, s31, s15\[0\]
+.*: fce7f8b7 vfmsl.f16 d31, s15, s15
+.*: fe1ff8bf vfmsl.f16 d15, s31, s15\[1\]
+.*: fc6ff810 vfmal.f16 d31, s30, s0
+.*: fe4fe890 vfmal.f16 d30, s31, s0\[0\]
+.*: fceff810 vfmsl.f16 d31, s30, s0
+.*: fe5fe898 vfmsl.f16 d30, s31, s0\[1\]
+.*: fc6ff814 vfmal.f16 d31, s30, s8
+.*: fe4fe894 vfmal.f16 d30, s31, s8\[0\]
+.*: fceff814 vfmsl.f16 d31, s30, s8
+.*: fe5fe89c vfmsl.f16 d30, s31, s8\[1\]
+.*: fc6ff837 vfmal.f16 d31, s30, s15
+.*: fe4fe8b7 vfmal.f16 d30, s31, s15\[0\]
+.*: fceff837 vfmsl.f16 d31, s30, s15
+.*: fe5fe8bf vfmsl.f16 d30, s31, s15\[1\]
+.*: fc204850 vfmal.f16 q2, d0, d0
+.*: fe020850 vfmal.f16 q0, d2, d0\[0\]
+.*: fca04850 vfmsl.f16 q2, d0, d0
+.*: fe120878 vfmsl.f16 q0, d2, d0\[3\]
+.*: fc204857 vfmal.f16 q2, d0, d7
+.*: fe020857 vfmal.f16 q0, d2, d7\[0\]
+.*: fca04857 vfmsl.f16 q2, d0, d7
+.*: fe12087f vfmsl.f16 q0, d2, d7\[3\]
+.*: fc206850 vfmal.f16 q3, d0, d0
+.*: fe030850 vfmal.f16 q0, d3, d0\[0\]
+.*: fca06850 vfmsl.f16 q3, d0, d0
+.*: fe130878 vfmsl.f16 q0, d3, d0\[3\]
+.*: fc206857 vfmal.f16 q3, d0, d7
+.*: fe030857 vfmal.f16 q0, d3, d7\[0\]
+.*: fca06857 vfmsl.f16 q3, d0, d7
+.*: fe13087f vfmsl.f16 q0, d3, d7\[3\]
+.*: fc60a850 vfmal.f16 q13, d0, d0
+.*: fe0d0850 vfmal.f16 q0, d13, d0\[0\]
+.*: fce0a850 vfmsl.f16 q13, d0, d0
+.*: fe1d0878 vfmsl.f16 q0, d13, d0\[3\]
+.*: fc60a857 vfmal.f16 q13, d0, d7
+.*: fe0d0857 vfmal.f16 q0, d13, d7\[0\]
+.*: fce0a857 vfmsl.f16 q13, d0, d7
+.*: fe1d087f vfmsl.f16 q0, d13, d7\[3\]
+.*: fc214850 vfmal.f16 q2, d1, d0
+.*: fe022850 vfmal.f16 q1, d2, d0\[0\]
+.*: fca14850 vfmsl.f16 q2, d1, d0
+.*: fe122878 vfmsl.f16 q1, d2, d0\[3\]
+.*: fc214857 vfmal.f16 q2, d1, d7
+.*: fe022857 vfmal.f16 q1, d2, d7\[0\]
+.*: fca14857 vfmsl.f16 q2, d1, d7
+.*: fe12287f vfmsl.f16 q1, d2, d7\[3\]
+.*: fc216850 vfmal.f16 q3, d1, d0
+.*: fe032850 vfmal.f16 q1, d3, d0\[0\]
+.*: fca16850 vfmsl.f16 q3, d1, d0
+.*: fe132878 vfmsl.f16 q1, d3, d0\[3\]
+.*: fc216857 vfmal.f16 q3, d1, d7
+.*: fe032857 vfmal.f16 q1, d3, d7\[0\]
+.*: fca16857 vfmsl.f16 q3, d1, d7
+.*: fe13287f vfmsl.f16 q1, d3, d7\[3\]
+.*: fc61a850 vfmal.f16 q13, d1, d0
+.*: fe0d2850 vfmal.f16 q1, d13, d0\[0\]
+.*: fce1a850 vfmsl.f16 q13, d1, d0
+.*: fe1d2878 vfmsl.f16 q1, d13, d0\[3\]
+.*: fc61a857 vfmal.f16 q13, d1, d7
+.*: fe0d2857 vfmal.f16 q1, d13, d7\[0\]
+.*: fce1a857 vfmsl.f16 q13, d1, d7
+.*: fe1d287f vfmsl.f16 q1, d13, d7\[3\]
+.*: fc264850 vfmal.f16 q2, d6, d0
+.*: fe02c850 vfmal.f16 q6, d2, d0\[0\]
+.*: fca64850 vfmsl.f16 q2, d6, d0
+.*: fe12c878 vfmsl.f16 q6, d2, d0\[3\]
+.*: fc264857 vfmal.f16 q2, d6, d7
+.*: fe02c857 vfmal.f16 q6, d2, d7\[0\]
+.*: fca64857 vfmsl.f16 q2, d6, d7
+.*: fe12c87f vfmsl.f16 q6, d2, d7\[3\]
+.*: fc266850 vfmal.f16 q3, d6, d0
+.*: fe03c850 vfmal.f16 q6, d3, d0\[0\]
+.*: fca66850 vfmsl.f16 q3, d6, d0
+.*: fe13c878 vfmsl.f16 q6, d3, d0\[3\]
+.*: fc266857 vfmal.f16 q3, d6, d7
+.*: fe03c857 vfmal.f16 q6, d3, d7\[0\]
+.*: fca66857 vfmsl.f16 q3, d6, d7
+.*: fe13c87f vfmsl.f16 q6, d3, d7\[3\]
+.*: fc66a850 vfmal.f16 q13, d6, d0
+.*: fe0dc850 vfmal.f16 q6, d13, d0\[0\]
+.*: fce6a850 vfmsl.f16 q13, d6, d0
+.*: fe1dc878 vfmsl.f16 q6, d13, d0\[3\]
+.*: fc66a857 vfmal.f16 q13, d6, d7
+.*: fe0dc857 vfmal.f16 q6, d13, d7\[0\]
+.*: fce6a857 vfmsl.f16 q13, d6, d7
+.*: fe1dc87f vfmsl.f16 q6, d13, d7\[3\]
+.*: fc2f4850 vfmal.f16 q2, d15, d0
+.*: fe42e850 vfmal.f16 q15, d2, d0\[0\]
+.*: fcaf4850 vfmsl.f16 q2, d15, d0
+.*: fe52e878 vfmsl.f16 q15, d2, d0\[3\]
+.*: fc2f4857 vfmal.f16 q2, d15, d7
+.*: fe42e857 vfmal.f16 q15, d2, d7\[0\]
+.*: fcaf4857 vfmsl.f16 q2, d15, d7
+.*: fe52e87f vfmsl.f16 q15, d2, d7\[3\]
+.*: fc2f6850 vfmal.f16 q3, d15, d0
+.*: fe43e850 vfmal.f16 q15, d3, d0\[0\]
+.*: fcaf6850 vfmsl.f16 q3, d15, d0
+.*: fe53e878 vfmsl.f16 q15, d3, d0\[3\]
+.*: fc2f6857 vfmal.f16 q3, d15, d7
+.*: fe43e857 vfmal.f16 q15, d3, d7\[0\]
+.*: fcaf6857 vfmsl.f16 q3, d15, d7
+.*: fe53e87f vfmsl.f16 q15, d3, d7\[3\]
+.*: fc6fa850 vfmal.f16 q13, d15, d0
+.*: fe4de850 vfmal.f16 q15, d13, d0\[0\]
+.*: fcefa850 vfmsl.f16 q13, d15, d0
+.*: fe5de878 vfmsl.f16 q15, d13, d0\[3\]
+.*: fc6fa857 vfmal.f16 q13, d15, d7
+.*: fe4de857 vfmal.f16 q15, d13, d7\[0\]
+.*: fcefa857 vfmsl.f16 q13, d15, d7
+.*: fe5de87f vfmsl.f16 q15, d13, d7\[3\]
diff --git a/gas/testsuite/gas/arm/armv8_4-a-fp16.d b/gas/testsuite/gas/arm/armv8_4-a-fp16.d
new file mode 100644
index 0000000..efc8dcf
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_4-a-fp16.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.4-a+fp16 -mfpu=neon-fp-armv8
+#source: armv8_2-a-fp16.s
+#objdump: -d
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+.* <.*>:
+.*: fc210810 vfmal.f16 d0, s2, s0
+.*: fe002810 vfmal.f16 d2, s0, s0\[0\]
+.*: fca10810 vfmsl.f16 d0, s2, s0
+.*: fe102818 vfmsl.f16 d2, s0, s0\[1\]
+.*: fc210814 vfmal.f16 d0, s2, s8
+.*: fe002814 vfmal.f16 d2, s0, s8\[0\]
+.*: fca10814 vfmsl.f16 d0, s2, s8
+.*: fe10281c vfmsl.f16 d2, s0, s8\[1\]
+.*: fc210837 vfmal.f16 d0, s2, s15
+.*: fe002837 vfmal.f16 d2, s0, s15\[0\]
+.*: fca10837 vfmsl.f16 d0, s2, s15
+.*: fe10283f vfmsl.f16 d2, s0, s15\[1\]
+.*: fc270890 vfmal.f16 d0, s15, s0
+.*: fe00f810 vfmal.f16 d15, s0, s0\[0\]
+.*: fca70890 vfmsl.f16 d0, s15, s0
+.*: fe10f818 vfmsl.f16 d15, s0, s0\[1\]
+.*: fc270894 vfmal.f16 d0, s15, s8
+.*: fe00f814 vfmal.f16 d15, s0, s8\[0\]
+.*: fca70894 vfmsl.f16 d0, s15, s8
+.*: fe10f81c vfmsl.f16 d15, s0, s8\[1\]
+.*: fc2708b7 vfmal.f16 d0, s15, s15
+.*: fe00f837 vfmal.f16 d15, s0, s15\[0\]
+.*: fca708b7 vfmsl.f16 d0, s15, s15
+.*: fe10f83f vfmsl.f16 d15, s0, s15\[1\]
+.*: fc2f0810 vfmal.f16 d0, s30, s0
+.*: fe40e810 vfmal.f16 d30, s0, s0\[0\]
+.*: fcaf0810 vfmsl.f16 d0, s30, s0
+.*: fe50e818 vfmsl.f16 d30, s0, s0\[1\]
+.*: fc2f0814 vfmal.f16 d0, s30, s8
+.*: fe40e814 vfmal.f16 d30, s0, s8\[0\]
+.*: fcaf0814 vfmsl.f16 d0, s30, s8
+.*: fe50e81c vfmsl.f16 d30, s0, s8\[1\]
+.*: fc2f0837 vfmal.f16 d0, s30, s15
+.*: fe40e837 vfmal.f16 d30, s0, s15\[0\]
+.*: fcaf0837 vfmsl.f16 d0, s30, s15
+.*: fe50e83f vfmsl.f16 d30, s0, s15\[1\]
+.*: fc217810 vfmal.f16 d7, s2, s0
+.*: fe032890 vfmal.f16 d2, s7, s0\[0\]
+.*: fca17810 vfmsl.f16 d7, s2, s0
+.*: fe132898 vfmsl.f16 d2, s7, s0\[1\]
+.*: fc217814 vfmal.f16 d7, s2, s8
+.*: fe032894 vfmal.f16 d2, s7, s8\[0\]
+.*: fca17814 vfmsl.f16 d7, s2, s8
+.*: fe13289c vfmsl.f16 d2, s7, s8\[1\]
+.*: fc217837 vfmal.f16 d7, s2, s15
+.*: fe0328b7 vfmal.f16 d2, s7, s15\[0\]
+.*: fca17837 vfmsl.f16 d7, s2, s15
+.*: fe1328bf vfmsl.f16 d2, s7, s15\[1\]
+.*: fc277890 vfmal.f16 d7, s15, s0
+.*: fe03f890 vfmal.f16 d15, s7, s0\[0\]
+.*: fca77890 vfmsl.f16 d7, s15, s0
+.*: fe13f898 vfmsl.f16 d15, s7, s0\[1\]
+.*: fc277894 vfmal.f16 d7, s15, s8
+.*: fe03f894 vfmal.f16 d15, s7, s8\[0\]
+.*: fca77894 vfmsl.f16 d7, s15, s8
+.*: fe13f89c vfmsl.f16 d15, s7, s8\[1\]
+.*: fc2778b7 vfmal.f16 d7, s15, s15
+.*: fe03f8b7 vfmal.f16 d15, s7, s15\[0\]
+.*: fca778b7 vfmsl.f16 d7, s15, s15
+.*: fe13f8bf vfmsl.f16 d15, s7, s15\[1\]
+.*: fc2f7810 vfmal.f16 d7, s30, s0
+.*: fe43e890 vfmal.f16 d30, s7, s0\[0\]
+.*: fcaf7810 vfmsl.f16 d7, s30, s0
+.*: fe53e898 vfmsl.f16 d30, s7, s0\[1\]
+.*: fc2f7814 vfmal.f16 d7, s30, s8
+.*: fe43e894 vfmal.f16 d30, s7, s8\[0\]
+.*: fcaf7814 vfmsl.f16 d7, s30, s8
+.*: fe53e89c vfmsl.f16 d30, s7, s8\[1\]
+.*: fc2f7837 vfmal.f16 d7, s30, s15
+.*: fe43e8b7 vfmal.f16 d30, s7, s15\[0\]
+.*: fcaf7837 vfmsl.f16 d7, s30, s15
+.*: fe53e8bf vfmsl.f16 d30, s7, s15\[1\]
+.*: fc610810 vfmal.f16 d16, s2, s0
+.*: fe082810 vfmal.f16 d2, s16, s0\[0\]
+.*: fce10810 vfmsl.f16 d16, s2, s0
+.*: fe182818 vfmsl.f16 d2, s16, s0\[1\]
+.*: fc610814 vfmal.f16 d16, s2, s8
+.*: fe082814 vfmal.f16 d2, s16, s8\[0\]
+.*: fce10814 vfmsl.f16 d16, s2, s8
+.*: fe18281c vfmsl.f16 d2, s16, s8\[1\]
+.*: fc610837 vfmal.f16 d16, s2, s15
+.*: fe082837 vfmal.f16 d2, s16, s15\[0\]
+.*: fce10837 vfmsl.f16 d16, s2, s15
+.*: fe18283f vfmsl.f16 d2, s16, s15\[1\]
+.*: fc670890 vfmal.f16 d16, s15, s0
+.*: fe08f810 vfmal.f16 d15, s16, s0\[0\]
+.*: fce70890 vfmsl.f16 d16, s15, s0
+.*: fe18f818 vfmsl.f16 d15, s16, s0\[1\]
+.*: fc670894 vfmal.f16 d16, s15, s8
+.*: fe08f814 vfmal.f16 d15, s16, s8\[0\]
+.*: fce70894 vfmsl.f16 d16, s15, s8
+.*: fe18f81c vfmsl.f16 d15, s16, s8\[1\]
+.*: fc6708b7 vfmal.f16 d16, s15, s15
+.*: fe08f837 vfmal.f16 d15, s16, s15\[0\]
+.*: fce708b7 vfmsl.f16 d16, s15, s15
+.*: fe18f83f vfmsl.f16 d15, s16, s15\[1\]
+.*: fc6f0810 vfmal.f16 d16, s30, s0
+.*: fe48e810 vfmal.f16 d30, s16, s0\[0\]
+.*: fcef0810 vfmsl.f16 d16, s30, s0
+.*: fe58e818 vfmsl.f16 d30, s16, s0\[1\]
+.*: fc6f0814 vfmal.f16 d16, s30, s8
+.*: fe48e814 vfmal.f16 d30, s16, s8\[0\]
+.*: fcef0814 vfmsl.f16 d16, s30, s8
+.*: fe58e81c vfmsl.f16 d30, s16, s8\[1\]
+.*: fc6f0837 vfmal.f16 d16, s30, s15
+.*: fe48e837 vfmal.f16 d30, s16, s15\[0\]
+.*: fcef0837 vfmsl.f16 d16, s30, s15
+.*: fe58e83f vfmsl.f16 d30, s16, s15\[1\]
+.*: fc61f810 vfmal.f16 d31, s2, s0
+.*: fe0f2890 vfmal.f16 d2, s31, s0\[0\]
+.*: fce1f810 vfmsl.f16 d31, s2, s0
+.*: fe1f2898 vfmsl.f16 d2, s31, s0\[1\]
+.*: fc61f814 vfmal.f16 d31, s2, s8
+.*: fe0f2894 vfmal.f16 d2, s31, s8\[0\]
+.*: fce1f814 vfmsl.f16 d31, s2, s8
+.*: fe1f289c vfmsl.f16 d2, s31, s8\[1\]
+.*: fc61f837 vfmal.f16 d31, s2, s15
+.*: fe0f28b7 vfmal.f16 d2, s31, s15\[0\]
+.*: fce1f837 vfmsl.f16 d31, s2, s15
+.*: fe1f28bf vfmsl.f16 d2, s31, s15\[1\]
+.*: fc67f890 vfmal.f16 d31, s15, s0
+.*: fe0ff890 vfmal.f16 d15, s31, s0\[0\]
+.*: fce7f890 vfmsl.f16 d31, s15, s0
+.*: fe1ff898 vfmsl.f16 d15, s31, s0\[1\]
+.*: fc67f894 vfmal.f16 d31, s15, s8
+.*: fe0ff894 vfmal.f16 d15, s31, s8\[0\]
+.*: fce7f894 vfmsl.f16 d31, s15, s8
+.*: fe1ff89c vfmsl.f16 d15, s31, s8\[1\]
+.*: fc67f8b7 vfmal.f16 d31, s15, s15
+.*: fe0ff8b7 vfmal.f16 d15, s31, s15\[0\]
+.*: fce7f8b7 vfmsl.f16 d31, s15, s15
+.*: fe1ff8bf vfmsl.f16 d15, s31, s15\[1\]
+.*: fc6ff810 vfmal.f16 d31, s30, s0
+.*: fe4fe890 vfmal.f16 d30, s31, s0\[0\]
+.*: fceff810 vfmsl.f16 d31, s30, s0
+.*: fe5fe898 vfmsl.f16 d30, s31, s0\[1\]
+.*: fc6ff814 vfmal.f16 d31, s30, s8
+.*: fe4fe894 vfmal.f16 d30, s31, s8\[0\]
+.*: fceff814 vfmsl.f16 d31, s30, s8
+.*: fe5fe89c vfmsl.f16 d30, s31, s8\[1\]
+.*: fc6ff837 vfmal.f16 d31, s30, s15
+.*: fe4fe8b7 vfmal.f16 d30, s31, s15\[0\]
+.*: fceff837 vfmsl.f16 d31, s30, s15
+.*: fe5fe8bf vfmsl.f16 d30, s31, s15\[1\]
+.*: fc204850 vfmal.f16 q2, d0, d0
+.*: fe020850 vfmal.f16 q0, d2, d0\[0\]
+.*: fca04850 vfmsl.f16 q2, d0, d0
+.*: fe120878 vfmsl.f16 q0, d2, d0\[3\]
+.*: fc204857 vfmal.f16 q2, d0, d7
+.*: fe020857 vfmal.f16 q0, d2, d7\[0\]
+.*: fca04857 vfmsl.f16 q2, d0, d7
+.*: fe12087f vfmsl.f16 q0, d2, d7\[3\]
+.*: fc206850 vfmal.f16 q3, d0, d0
+.*: fe030850 vfmal.f16 q0, d3, d0\[0\]
+.*: fca06850 vfmsl.f16 q3, d0, d0
+.*: fe130878 vfmsl.f16 q0, d3, d0\[3\]
+.*: fc206857 vfmal.f16 q3, d0, d7
+.*: fe030857 vfmal.f16 q0, d3, d7\[0\]
+.*: fca06857 vfmsl.f16 q3, d0, d7
+.*: fe13087f vfmsl.f16 q0, d3, d7\[3\]
+.*: fc60a850 vfmal.f16 q13, d0, d0
+.*: fe0d0850 vfmal.f16 q0, d13, d0\[0\]
+.*: fce0a850 vfmsl.f16 q13, d0, d0
+.*: fe1d0878 vfmsl.f16 q0, d13, d0\[3\]
+.*: fc60a857 vfmal.f16 q13, d0, d7
+.*: fe0d0857 vfmal.f16 q0, d13, d7\[0\]
+.*: fce0a857 vfmsl.f16 q13, d0, d7
+.*: fe1d087f vfmsl.f16 q0, d13, d7\[3\]
+.*: fc214850 vfmal.f16 q2, d1, d0
+.*: fe022850 vfmal.f16 q1, d2, d0\[0\]
+.*: fca14850 vfmsl.f16 q2, d1, d0
+.*: fe122878 vfmsl.f16 q1, d2, d0\[3\]
+.*: fc214857 vfmal.f16 q2, d1, d7
+.*: fe022857 vfmal.f16 q1, d2, d7\[0\]
+.*: fca14857 vfmsl.f16 q2, d1, d7
+.*: fe12287f vfmsl.f16 q1, d2, d7\[3\]
+.*: fc216850 vfmal.f16 q3, d1, d0
+.*: fe032850 vfmal.f16 q1, d3, d0\[0\]
+.*: fca16850 vfmsl.f16 q3, d1, d0
+.*: fe132878 vfmsl.f16 q1, d3, d0\[3\]
+.*: fc216857 vfmal.f16 q3, d1, d7
+.*: fe032857 vfmal.f16 q1, d3, d7\[0\]
+.*: fca16857 vfmsl.f16 q3, d1, d7
+.*: fe13287f vfmsl.f16 q1, d3, d7\[3\]
+.*: fc61a850 vfmal.f16 q13, d1, d0
+.*: fe0d2850 vfmal.f16 q1, d13, d0\[0\]
+.*: fce1a850 vfmsl.f16 q13, d1, d0
+.*: fe1d2878 vfmsl.f16 q1, d13, d0\[3\]
+.*: fc61a857 vfmal.f16 q13, d1, d7
+.*: fe0d2857 vfmal.f16 q1, d13, d7\[0\]
+.*: fce1a857 vfmsl.f16 q13, d1, d7
+.*: fe1d287f vfmsl.f16 q1, d13, d7\[3\]
+.*: fc264850 vfmal.f16 q2, d6, d0
+.*: fe02c850 vfmal.f16 q6, d2, d0\[0\]
+.*: fca64850 vfmsl.f16 q2, d6, d0
+.*: fe12c878 vfmsl.f16 q6, d2, d0\[3\]
+.*: fc264857 vfmal.f16 q2, d6, d7
+.*: fe02c857 vfmal.f16 q6, d2, d7\[0\]
+.*: fca64857 vfmsl.f16 q2, d6, d7
+.*: fe12c87f vfmsl.f16 q6, d2, d7\[3\]
+.*: fc266850 vfmal.f16 q3, d6, d0
+.*: fe03c850 vfmal.f16 q6, d3, d0\[0\]
+.*: fca66850 vfmsl.f16 q3, d6, d0
+.*: fe13c878 vfmsl.f16 q6, d3, d0\[3\]
+.*: fc266857 vfmal.f16 q3, d6, d7
+.*: fe03c857 vfmal.f16 q6, d3, d7\[0\]
+.*: fca66857 vfmsl.f16 q3, d6, d7
+.*: fe13c87f vfmsl.f16 q6, d3, d7\[3\]
+.*: fc66a850 vfmal.f16 q13, d6, d0
+.*: fe0dc850 vfmal.f16 q6, d13, d0\[0\]
+.*: fce6a850 vfmsl.f16 q13, d6, d0
+.*: fe1dc878 vfmsl.f16 q6, d13, d0\[3\]
+.*: fc66a857 vfmal.f16 q13, d6, d7
+.*: fe0dc857 vfmal.f16 q6, d13, d7\[0\]
+.*: fce6a857 vfmsl.f16 q13, d6, d7
+.*: fe1dc87f vfmsl.f16 q6, d13, d7\[3\]
+.*: fc2f4850 vfmal.f16 q2, d15, d0
+.*: fe42e850 vfmal.f16 q15, d2, d0\[0\]
+.*: fcaf4850 vfmsl.f16 q2, d15, d0
+.*: fe52e878 vfmsl.f16 q15, d2, d0\[3\]
+.*: fc2f4857 vfmal.f16 q2, d15, d7
+.*: fe42e857 vfmal.f16 q15, d2, d7\[0\]
+.*: fcaf4857 vfmsl.f16 q2, d15, d7
+.*: fe52e87f vfmsl.f16 q15, d2, d7\[3\]
+.*: fc2f6850 vfmal.f16 q3, d15, d0
+.*: fe43e850 vfmal.f16 q15, d3, d0\[0\]
+.*: fcaf6850 vfmsl.f16 q3, d15, d0
+.*: fe53e878 vfmsl.f16 q15, d3, d0\[3\]
+.*: fc2f6857 vfmal.f16 q3, d15, d7
+.*: fe43e857 vfmal.f16 q15, d3, d7\[0\]
+.*: fcaf6857 vfmsl.f16 q3, d15, d7
+.*: fe53e87f vfmsl.f16 q15, d3, d7\[3\]
+.*: fc6fa850 vfmal.f16 q13, d15, d0
+.*: fe4de850 vfmal.f16 q15, d13, d0\[0\]
+.*: fcefa850 vfmsl.f16 q13, d15, d0
+.*: fe5de878 vfmsl.f16 q15, d13, d0\[3\]
+.*: fc6fa857 vfmal.f16 q13, d15, d7
+.*: fe4de857 vfmal.f16 q15, d13, d7\[0\]
+.*: fcefa857 vfmsl.f16 q13, d15, d7
+.*: fe5de87f vfmsl.f16 q15, d13, d7\[3\]
diff --git a/gas/testsuite/gas/arm/dotprod-mandatory.d b/gas/testsuite/gas/arm/dotprod-mandatory.d
new file mode 100644
index 0000000..9f85e0e
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-mandatory.d
@@ -0,0 +1,297 @@
+#as: -march=armv8.4-a -mfpu=neon-fp-armv8
+#source: dotprod.s
+#objdump: -d
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+.* <.*>:
+.*: fc220d10 vudot.u8 d0, d2, d0
+.*: fe220d10 vudot.u8 d0, d2, d0\[0\]
+.*: fc220d18 vudot.u8 d0, d2, d8
+.*: fe220d18 vudot.u8 d0, d2, d8\[0\]
+.*: fc220d1f vudot.u8 d0, d2, d15
+.*: fe220d1f vudot.u8 d0, d2, d15\[0\]
+.*: fc2f0d10 vudot.u8 d0, d15, d0
+.*: fe2f0d10 vudot.u8 d0, d15, d0\[0\]
+.*: fc2f0d18 vudot.u8 d0, d15, d8
+.*: fe2f0d18 vudot.u8 d0, d15, d8\[0\]
+.*: fc2f0d1f vudot.u8 d0, d15, d15
+.*: fe2f0d1f vudot.u8 d0, d15, d15\[0\]
+.*: fc2e0d90 vudot.u8 d0, d30, d0
+.*: fe2e0d90 vudot.u8 d0, d30, d0\[0\]
+.*: fc2e0d98 vudot.u8 d0, d30, d8
+.*: fe2e0d98 vudot.u8 d0, d30, d8\[0\]
+.*: fc2e0d9f vudot.u8 d0, d30, d15
+.*: fe2e0d9f vudot.u8 d0, d30, d15\[0\]
+.*: fc227d10 vudot.u8 d7, d2, d0
+.*: fe227d10 vudot.u8 d7, d2, d0\[0\]
+.*: fc227d18 vudot.u8 d7, d2, d8
+.*: fe227d18 vudot.u8 d7, d2, d8\[0\]
+.*: fc227d1f vudot.u8 d7, d2, d15
+.*: fe227d1f vudot.u8 d7, d2, d15\[0\]
+.*: fc2f7d10 vudot.u8 d7, d15, d0
+.*: fe2f7d10 vudot.u8 d7, d15, d0\[0\]
+.*: fc2f7d18 vudot.u8 d7, d15, d8
+.*: fe2f7d18 vudot.u8 d7, d15, d8\[0\]
+.*: fc2f7d1f vudot.u8 d7, d15, d15
+.*: fe2f7d1f vudot.u8 d7, d15, d15\[0\]
+.*: fc2e7d90 vudot.u8 d7, d30, d0
+.*: fe2e7d90 vudot.u8 d7, d30, d0\[0\]
+.*: fc2e7d98 vudot.u8 d7, d30, d8
+.*: fe2e7d98 vudot.u8 d7, d30, d8\[0\]
+.*: fc2e7d9f vudot.u8 d7, d30, d15
+.*: fe2e7d9f vudot.u8 d7, d30, d15\[0\]
+.*: fc620d10 vudot.u8 d16, d2, d0
+.*: fe620d10 vudot.u8 d16, d2, d0\[0\]
+.*: fc620d18 vudot.u8 d16, d2, d8
+.*: fe620d18 vudot.u8 d16, d2, d8\[0\]
+.*: fc620d1f vudot.u8 d16, d2, d15
+.*: fe620d1f vudot.u8 d16, d2, d15\[0\]
+.*: fc6f0d10 vudot.u8 d16, d15, d0
+.*: fe6f0d10 vudot.u8 d16, d15, d0\[0\]
+.*: fc6f0d18 vudot.u8 d16, d15, d8
+.*: fe6f0d18 vudot.u8 d16, d15, d8\[0\]
+.*: fc6f0d1f vudot.u8 d16, d15, d15
+.*: fe6f0d1f vudot.u8 d16, d15, d15\[0\]
+.*: fc6e0d90 vudot.u8 d16, d30, d0
+.*: fe6e0d90 vudot.u8 d16, d30, d0\[0\]
+.*: fc6e0d98 vudot.u8 d16, d30, d8
+.*: fe6e0d98 vudot.u8 d16, d30, d8\[0\]
+.*: fc6e0d9f vudot.u8 d16, d30, d15
+.*: fe6e0d9f vudot.u8 d16, d30, d15\[0\]
+.*: fc62fd10 vudot.u8 d31, d2, d0
+.*: fe62fd10 vudot.u8 d31, d2, d0\[0\]
+.*: fc62fd18 vudot.u8 d31, d2, d8
+.*: fe62fd18 vudot.u8 d31, d2, d8\[0\]
+.*: fc62fd1f vudot.u8 d31, d2, d15
+.*: fe62fd1f vudot.u8 d31, d2, d15\[0\]
+.*: fc6ffd10 vudot.u8 d31, d15, d0
+.*: fe6ffd10 vudot.u8 d31, d15, d0\[0\]
+.*: fc6ffd18 vudot.u8 d31, d15, d8
+.*: fe6ffd18 vudot.u8 d31, d15, d8\[0\]
+.*: fc6ffd1f vudot.u8 d31, d15, d15
+.*: fe6ffd1f vudot.u8 d31, d15, d15\[0\]
+.*: fc6efd90 vudot.u8 d31, d30, d0
+.*: fe6efd90 vudot.u8 d31, d30, d0\[0\]
+.*: fc6efd98 vudot.u8 d31, d30, d8
+.*: fe6efd98 vudot.u8 d31, d30, d8\[0\]
+.*: fc6efd9f vudot.u8 d31, d30, d15
+.*: fe6efd9f vudot.u8 d31, d30, d15\[0\]
+.*: fc220d00 vsdot.s8 d0, d2, d0
+.*: fe220d00 vsdot.s8 d0, d2, d0\[0\]
+.*: fc220d08 vsdot.s8 d0, d2, d8
+.*: fe220d08 vsdot.s8 d0, d2, d8\[0\]
+.*: fc220d0f vsdot.s8 d0, d2, d15
+.*: fe220d0f vsdot.s8 d0, d2, d15\[0\]
+.*: fc2f0d00 vsdot.s8 d0, d15, d0
+.*: fe2f0d00 vsdot.s8 d0, d15, d0\[0\]
+.*: fc2f0d08 vsdot.s8 d0, d15, d8
+.*: fe2f0d08 vsdot.s8 d0, d15, d8\[0\]
+.*: fc2f0d0f vsdot.s8 d0, d15, d15
+.*: fe2f0d0f vsdot.s8 d0, d15, d15\[0\]
+.*: fc2e0d80 vsdot.s8 d0, d30, d0
+.*: fe2e0d80 vsdot.s8 d0, d30, d0\[0\]
+.*: fc2e0d88 vsdot.s8 d0, d30, d8
+.*: fe2e0d88 vsdot.s8 d0, d30, d8\[0\]
+.*: fc2e0d8f vsdot.s8 d0, d30, d15
+.*: fe2e0d8f vsdot.s8 d0, d30, d15\[0\]
+.*: fc227d00 vsdot.s8 d7, d2, d0
+.*: fe227d00 vsdot.s8 d7, d2, d0\[0\]
+.*: fc227d08 vsdot.s8 d7, d2, d8
+.*: fe227d08 vsdot.s8 d7, d2, d8\[0\]
+.*: fc227d0f vsdot.s8 d7, d2, d15
+.*: fe227d0f vsdot.s8 d7, d2, d15\[0\]
+.*: fc2f7d00 vsdot.s8 d7, d15, d0
+.*: fe2f7d00 vsdot.s8 d7, d15, d0\[0\]
+.*: fc2f7d08 vsdot.s8 d7, d15, d8
+.*: fe2f7d08 vsdot.s8 d7, d15, d8\[0\]
+.*: fc2f7d0f vsdot.s8 d7, d15, d15
+.*: fe2f7d0f vsdot.s8 d7, d15, d15\[0\]
+.*: fc2e7d80 vsdot.s8 d7, d30, d0
+.*: fe2e7d80 vsdot.s8 d7, d30, d0\[0\]
+.*: fc2e7d88 vsdot.s8 d7, d30, d8
+.*: fe2e7d88 vsdot.s8 d7, d30, d8\[0\]
+.*: fc2e7d8f vsdot.s8 d7, d30, d15
+.*: fe2e7d8f vsdot.s8 d7, d30, d15\[0\]
+.*: fc620d00 vsdot.s8 d16, d2, d0
+.*: fe620d00 vsdot.s8 d16, d2, d0\[0\]
+.*: fc620d08 vsdot.s8 d16, d2, d8
+.*: fe620d08 vsdot.s8 d16, d2, d8\[0\]
+.*: fc620d0f vsdot.s8 d16, d2, d15
+.*: fe620d0f vsdot.s8 d16, d2, d15\[0\]
+.*: fc6f0d00 vsdot.s8 d16, d15, d0
+.*: fe6f0d00 vsdot.s8 d16, d15, d0\[0\]
+.*: fc6f0d08 vsdot.s8 d16, d15, d8
+.*: fe6f0d08 vsdot.s8 d16, d15, d8\[0\]
+.*: fc6f0d0f vsdot.s8 d16, d15, d15
+.*: fe6f0d0f vsdot.s8 d16, d15, d15\[0\]
+.*: fc6e0d80 vsdot.s8 d16, d30, d0
+.*: fe6e0d80 vsdot.s8 d16, d30, d0\[0\]
+.*: fc6e0d88 vsdot.s8 d16, d30, d8
+.*: fe6e0d88 vsdot.s8 d16, d30, d8\[0\]
+.*: fc6e0d8f vsdot.s8 d16, d30, d15
+.*: fe6e0d8f vsdot.s8 d16, d30, d15\[0\]
+.*: fc62fd00 vsdot.s8 d31, d2, d0
+.*: fe62fd00 vsdot.s8 d31, d2, d0\[0\]
+.*: fc62fd08 vsdot.s8 d31, d2, d8
+.*: fe62fd08 vsdot.s8 d31, d2, d8\[0\]
+.*: fc62fd0f vsdot.s8 d31, d2, d15
+.*: fe62fd0f vsdot.s8 d31, d2, d15\[0\]
+.*: fc6ffd00 vsdot.s8 d31, d15, d0
+.*: fe6ffd00 vsdot.s8 d31, d15, d0\[0\]
+.*: fc6ffd08 vsdot.s8 d31, d15, d8
+.*: fe6ffd08 vsdot.s8 d31, d15, d8\[0\]
+.*: fc6ffd0f vsdot.s8 d31, d15, d15
+.*: fe6ffd0f vsdot.s8 d31, d15, d15\[0\]
+.*: fc6efd80 vsdot.s8 d31, d30, d0
+.*: fe6efd80 vsdot.s8 d31, d30, d0\[0\]
+.*: fc6efd88 vsdot.s8 d31, d30, d8
+.*: fe6efd88 vsdot.s8 d31, d30, d8\[0\]
+.*: fc6efd8f vsdot.s8 d31, d30, d15
+.*: fe6efd8f vsdot.s8 d31, d30, d15\[0\]
+.*: fc240d50 vudot.u8 q0, q2, q0
+.*: fe240d70 vudot.u8 q0, q2, d0\[1\]
+.*: fc240d5e vudot.u8 q0, q2, q7
+.*: fe240d77 vudot.u8 q0, q2, d7\[1\]
+.*: fc240d7e vudot.u8 q0, q2, q15
+.*: fe240d7f vudot.u8 q0, q2, d15\[1\]
+.*: fc260d50 vudot.u8 q0, q3, q0
+.*: fe260d70 vudot.u8 q0, q3, d0\[1\]
+.*: fc260d5e vudot.u8 q0, q3, q7
+.*: fe260d77 vudot.u8 q0, q3, d7\[1\]
+.*: fc260d7e vudot.u8 q0, q3, q15
+.*: fe260d7f vudot.u8 q0, q3, d15\[1\]
+.*: fc2c0dd0 vudot.u8 q0, q14, q0
+.*: fe2c0df0 vudot.u8 q0, q14, d0\[1\]
+.*: fc2c0dde vudot.u8 q0, q14, q7
+.*: fe2c0df7 vudot.u8 q0, q14, d7\[1\]
+.*: fc2c0dfe vudot.u8 q0, q14, q15
+.*: fe2c0dff vudot.u8 q0, q14, d15\[1\]
+.*: fc242d50 vudot.u8 q1, q2, q0
+.*: fe242d70 vudot.u8 q1, q2, d0\[1\]
+.*: fc242d5e vudot.u8 q1, q2, q7
+.*: fe242d77 vudot.u8 q1, q2, d7\[1\]
+.*: fc242d7e vudot.u8 q1, q2, q15
+.*: fe242d7f vudot.u8 q1, q2, d15\[1\]
+.*: fc262d50 vudot.u8 q1, q3, q0
+.*: fe262d70 vudot.u8 q1, q3, d0\[1\]
+.*: fc262d5e vudot.u8 q1, q3, q7
+.*: fe262d77 vudot.u8 q1, q3, d7\[1\]
+.*: fc262d7e vudot.u8 q1, q3, q15
+.*: fe262d7f vudot.u8 q1, q3, d15\[1\]
+.*: fc2c2dd0 vudot.u8 q1, q14, q0
+.*: fe2c2df0 vudot.u8 q1, q14, d0\[1\]
+.*: fc2c2dde vudot.u8 q1, q14, q7
+.*: fe2c2df7 vudot.u8 q1, q14, d7\[1\]
+.*: fc2c2dfe vudot.u8 q1, q14, q15
+.*: fe2c2dff vudot.u8 q1, q14, d15\[1\]
+.*: fc24cd50 vudot.u8 q6, q2, q0
+.*: fe24cd70 vudot.u8 q6, q2, d0\[1\]
+.*: fc24cd5e vudot.u8 q6, q2, q7
+.*: fe24cd77 vudot.u8 q6, q2, d7\[1\]
+.*: fc24cd7e vudot.u8 q6, q2, q15
+.*: fe24cd7f vudot.u8 q6, q2, d15\[1\]
+.*: fc26cd50 vudot.u8 q6, q3, q0
+.*: fe26cd70 vudot.u8 q6, q3, d0\[1\]
+.*: fc26cd5e vudot.u8 q6, q3, q7
+.*: fe26cd77 vudot.u8 q6, q3, d7\[1\]
+.*: fc26cd7e vudot.u8 q6, q3, q15
+.*: fe26cd7f vudot.u8 q6, q3, d15\[1\]
+.*: fc2ccdd0 vudot.u8 q6, q14, q0
+.*: fe2ccdf0 vudot.u8 q6, q14, d0\[1\]
+.*: fc2ccdde vudot.u8 q6, q14, q7
+.*: fe2ccdf7 vudot.u8 q6, q14, d7\[1\]
+.*: fc2ccdfe vudot.u8 q6, q14, q15
+.*: fe2ccdff vudot.u8 q6, q14, d15\[1\]
+.*: fc64ad50 vudot.u8 q13, q2, q0
+.*: fe64ad70 vudot.u8 q13, q2, d0\[1\]
+.*: fc64ad5e vudot.u8 q13, q2, q7
+.*: fe64ad77 vudot.u8 q13, q2, d7\[1\]
+.*: fc64ad7e vudot.u8 q13, q2, q15
+.*: fe64ad7f vudot.u8 q13, q2, d15\[1\]
+.*: fc66ad50 vudot.u8 q13, q3, q0
+.*: fe66ad70 vudot.u8 q13, q3, d0\[1\]
+.*: fc66ad5e vudot.u8 q13, q3, q7
+.*: fe66ad77 vudot.u8 q13, q3, d7\[1\]
+.*: fc66ad7e vudot.u8 q13, q3, q15
+.*: fe66ad7f vudot.u8 q13, q3, d15\[1\]
+.*: fc6cadd0 vudot.u8 q13, q14, q0
+.*: fe6cadf0 vudot.u8 q13, q14, d0\[1\]
+.*: fc6cadde vudot.u8 q13, q14, q7
+.*: fe6cadf7 vudot.u8 q13, q14, d7\[1\]
+.*: fc6cadfe vudot.u8 q13, q14, q15
+.*: fe6cadff vudot.u8 q13, q14, d15\[1\]
+.*: fc240d40 vsdot.s8 q0, q2, q0
+.*: fe240d60 vsdot.s8 q0, q2, d0\[1\]
+.*: fc240d4e vsdot.s8 q0, q2, q7
+.*: fe240d67 vsdot.s8 q0, q2, d7\[1\]
+.*: fc240d6e vsdot.s8 q0, q2, q15
+.*: fe240d6f vsdot.s8 q0, q2, d15\[1\]
+.*: fc260d40 vsdot.s8 q0, q3, q0
+.*: fe260d60 vsdot.s8 q0, q3, d0\[1\]
+.*: fc260d4e vsdot.s8 q0, q3, q7
+.*: fe260d67 vsdot.s8 q0, q3, d7\[1\]
+.*: fc260d6e vsdot.s8 q0, q3, q15
+.*: fe260d6f vsdot.s8 q0, q3, d15\[1\]
+.*: fc2c0dc0 vsdot.s8 q0, q14, q0
+.*: fe2c0de0 vsdot.s8 q0, q14, d0\[1\]
+.*: fc2c0dce vsdot.s8 q0, q14, q7
+.*: fe2c0de7 vsdot.s8 q0, q14, d7\[1\]
+.*: fc2c0dee vsdot.s8 q0, q14, q15
+.*: fe2c0def vsdot.s8 q0, q14, d15\[1\]
+.*: fc242d40 vsdot.s8 q1, q2, q0
+.*: fe242d60 vsdot.s8 q1, q2, d0\[1\]
+.*: fc242d4e vsdot.s8 q1, q2, q7
+.*: fe242d67 vsdot.s8 q1, q2, d7\[1\]
+.*: fc242d6e vsdot.s8 q1, q2, q15
+.*: fe242d6f vsdot.s8 q1, q2, d15\[1\]
+.*: fc262d40 vsdot.s8 q1, q3, q0
+.*: fe262d60 vsdot.s8 q1, q3, d0\[1\]
+.*: fc262d4e vsdot.s8 q1, q3, q7
+.*: fe262d67 vsdot.s8 q1, q3, d7\[1\]
+.*: fc262d6e vsdot.s8 q1, q3, q15
+.*: fe262d6f vsdot.s8 q1, q3, d15\[1\]
+.*: fc2c2dc0 vsdot.s8 q1, q14, q0
+.*: fe2c2de0 vsdot.s8 q1, q14, d0\[1\]
+.*: fc2c2dce vsdot.s8 q1, q14, q7
+.*: fe2c2de7 vsdot.s8 q1, q14, d7\[1\]
+.*: fc2c2dee vsdot.s8 q1, q14, q15
+.*: fe2c2def vsdot.s8 q1, q14, d15\[1\]
+.*: fc24cd40 vsdot.s8 q6, q2, q0
+.*: fe24cd60 vsdot.s8 q6, q2, d0\[1\]
+.*: fc24cd4e vsdot.s8 q6, q2, q7
+.*: fe24cd67 vsdot.s8 q6, q2, d7\[1\]
+.*: fc24cd6e vsdot.s8 q6, q2, q15
+.*: fe24cd6f vsdot.s8 q6, q2, d15\[1\]
+.*: fc26cd40 vsdot.s8 q6, q3, q0
+.*: fe26cd60 vsdot.s8 q6, q3, d0\[1\]
+.*: fc26cd4e vsdot.s8 q6, q3, q7
+.*: fe26cd67 vsdot.s8 q6, q3, d7\[1\]
+.*: fc26cd6e vsdot.s8 q6, q3, q15
+.*: fe26cd6f vsdot.s8 q6, q3, d15\[1\]
+.*: fc2ccdc0 vsdot.s8 q6, q14, q0
+.*: fe2ccde0 vsdot.s8 q6, q14, d0\[1\]
+.*: fc2ccdce vsdot.s8 q6, q14, q7
+.*: fe2ccde7 vsdot.s8 q6, q14, d7\[1\]
+.*: fc2ccdee vsdot.s8 q6, q14, q15
+.*: fe2ccdef vsdot.s8 q6, q14, d15\[1\]
+.*: fc64ad40 vsdot.s8 q13, q2, q0
+.*: fe64ad60 vsdot.s8 q13, q2, d0\[1\]
+.*: fc64ad4e vsdot.s8 q13, q2, q7
+.*: fe64ad67 vsdot.s8 q13, q2, d7\[1\]
+.*: fc64ad6e vsdot.s8 q13, q2, q15
+.*: fe64ad6f vsdot.s8 q13, q2, d15\[1\]
+.*: fc66ad40 vsdot.s8 q13, q3, q0
+.*: fe66ad60 vsdot.s8 q13, q3, d0\[1\]
+.*: fc66ad4e vsdot.s8 q13, q3, q7
+.*: fe66ad67 vsdot.s8 q13, q3, d7\[1\]
+.*: fc66ad6e vsdot.s8 q13, q3, q15
+.*: fe66ad6f vsdot.s8 q13, q3, d15\[1\]
+.*: fc6cadc0 vsdot.s8 q13, q14, q0
+.*: fe6cade0 vsdot.s8 q13, q14, d0\[1\]
+.*: fc6cadce vsdot.s8 q13, q14, q7
+.*: fe6cade7 vsdot.s8 q13, q14, d7\[1\]
+.*: fc6cadee vsdot.s8 q13, q14, q15
+.*: fe6cadef vsdot.s8 q13, q14, d15\[1\]
diff --git a/include/ChangeLog b/include/ChangeLog
index beb08bb..36b1732 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,10 @@
+2017-11-08 Jiong Wang <jiong.wang@arm.com>
+
+ * opcode/arm.h (ARM_AEXT2_V8_4A): Include Dot Product feature.
+ (ARM_EXT2_V8_4A): New macro.
+ (ARM_AEXT2_V8_4A): Likewise.
+ (ARM_ARCH_V8_4A): Likewise.
+
2017-11-07 Palmer Dabbelt <palmer@dabbelt.com>
* opcode/riscv-opc.h (sptbr): Rename to satp.
diff --git a/include/opcode/arm.h b/include/opcode/arm.h
index 3b51aba..932bf63 100644
--- a/include/opcode/arm.h
+++ b/include/opcode/arm.h
@@ -66,6 +66,7 @@
#define ARM_EXT2_RAS 0x00000080 /* RAS extension. */
#define ARM_EXT2_V8_3A 0x00000100 /* ARM V8.3A. */
#define ARM_EXT2_V8A 0x00000200 /* ARMv8-A. */
+#define ARM_EXT2_V8_4A 0x00000400 /* ARM V8.4A. */
/* Co-processor space extensions. */
#define ARM_CEXT_XSCALE 0x00000001 /* Allow MIA etc. */
@@ -156,6 +157,7 @@
#define ARM_AEXT2_V8_1A (ARM_AEXT2_V8A | ARM_EXT2_PAN)
#define ARM_AEXT2_V8_2A (ARM_AEXT2_V8_1A | ARM_EXT2_V8_2A | ARM_EXT2_RAS)
#define ARM_AEXT2_V8_3A (ARM_AEXT2_V8_2A | ARM_EXT2_V8_3A)
+#define ARM_AEXT2_V8_4A (ARM_AEXT2_V8_3A | ARM_EXT2_V8_4A)
#define ARM_AEXT_V8M_BASE (ARM_AEXT_V6SM | ARM_EXT_DIV)
#define ARM_AEXT_V8M_MAIN ARM_AEXT_V7M
#define ARM_AEXT_V8M_MAIN_DSP ARM_AEXT_V7EM
@@ -228,8 +230,8 @@
#define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8 \
ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 | FPU_NEON_ARMV8 | FPU_VFP_ARMV8)
#define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD \
- ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 | FPU_NEON_ARMV8 | FPU_VFP_ARMV8 | \
- FPU_NEON_EXT_DOTPROD)
+ ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 | FPU_NEON_ARMV8 | FPU_VFP_ARMV8 \
+ | FPU_NEON_EXT_DOTPROD)
#define ARCH_CRC_ARMV8 ARM_FEATURE_COPROC (CRC_EXT_ARMV8)
#define FPU_ARCH_NEON_VFP_ARMV8_1 \
ARM_FEATURE_COPROC (FPU_NEON_ARMV8 \
@@ -287,6 +289,9 @@
CRC_EXT_ARMV8 | FPU_NEON_EXT_RDMA)
#define ARM_ARCH_V8_3A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_3A, \
CRC_EXT_ARMV8 | FPU_NEON_EXT_RDMA)
+#define ARM_ARCH_V8_4A ARM_FEATURE (ARM_AEXT_V8A, ARM_AEXT2_V8_4A, \
+ CRC_EXT_ARMV8 | FPU_NEON_EXT_RDMA \
+ | FPU_NEON_EXT_DOTPROD)
#define ARM_ARCH_V8M_BASE ARM_FEATURE_CORE (ARM_AEXT_V8M_BASE, ARM_AEXT2_V8M)
#define ARM_ARCH_V8M_MAIN ARM_FEATURE_CORE (ARM_AEXT_V8M_MAIN, \
ARM_AEXT2_V8M_MAIN)
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 70f146f..7dcc29e 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,9 @@
+2017-11-08 Jiong Wang <jiong.wang@arm.com>
+ Tamar Christina <tamar.christina@arm.com>
+
+ * arm-dis.c (coprocessor_opcodes): New entries for ARMv8.2-A new
+ FP16 instructions, including vfmal.f16 and vfmsl.f16.
+
2017-11-07 Andrew Burgess <andrew.burgess@embecosm.com>
* arc-nps400-tbl.h: Change incorrect use of NONE to MISC.
diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c
index 59a5978..d5a20cb 100644
--- a/opcodes/arm-dis.c
+++ b/opcodes/arm-dis.c
@@ -912,6 +912,24 @@ static const struct opcode32 coprocessor_opcodes[] =
{ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
0xfe000d00, 0xff000f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3D[%5?10]"},
+ /* ARMv8.2 FMAC Long instructions in the space of coprocessor 8. */
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfc200810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfca00810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-3d"},
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfc200850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfca00850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-3,5d"},
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfe000810, 0xffb00f50, "vfmal.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfe100810, 0xffb00f50, "vfmsl.f16\t%12-15,22D, s%7,16-19d, s%5,0-2d[%3d]"},
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfe000850, 0xffb00f50, "vfmal.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
+ {ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+ 0xfe100850, 0xffb00f50, "vfmsl.f16\t%12-15,22Q, d%16-19,7d, d%0-2d[%3,5d]"},
+
/* V5 coprocessor instructions. */
{ARM_FEATURE_CORE_LOW (ARM_EXT_V5),
0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},