This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][GAS][ARM] Assembeler and disassembler support for new FP16 instructions [Patch (3/3)]


Hi All,

This patch add assembler and disassembler support for new FP16 instructions
introduced in Armv8.4-A and back-ported as optional extensions from Armv8.2-A.

  These new instructions also require FP16 extension enabled.

  For example, the support can be enabled through the following option:

     -march=armv8.2-a+fp16".

Checked with check-gas on arm-none-eabi, armeb-none-eabi, no regressions.

Ok for master?

Ps. I do not have commit access so if OK can someone apply for me?

Thanks,
Tamar

gas/
2017-11-08  Jiong Wang  <jiong.wang@arm.com>
	    Tamar Christina <tamar.christina@arm.com>

        * config/tc-arm.c (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.
        * 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/
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.

-- 
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index a718a105eca1afe3aaff07205e300ae84b4119c6..2b0a455c1f2d9148344542b3606fa346fa50f7ff 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);
 static const arm_feature_set arm_ext_v8_4 =
@@ -581,6 +583,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,
@@ -621,6 +624,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"),
@@ -1508,6 +1512,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;
@@ -1531,7 +1537,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;
@@ -1627,8 +1635,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;
@@ -6488,6 +6500,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] */
@@ -6514,6 +6527,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.  */
@@ -6775,6 +6789,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;
@@ -6832,6 +6847,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);
@@ -13425,7 +13452,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
@@ -16135,6 +16164,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)
 {
@@ -20646,6 +20802,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
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 0000000000000000000000000000000000000000..745ae052bcad9d5ab41794441085dceb60419042
--- /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 0000000000000000000000000000000000000000..b407d6c339018e089b59deb136b5fcf063fd320a
--- /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 0000000000000000000000000000000000000000..740dd5cefd119240ef70854a35eda4be38632153
--- /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 0000000000000000000000000000000000000000..b03a8ae01222e0519c80e72f6417b1f99a066629
--- /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 0000000000000000000000000000000000000000..9f99828d02ed2b4020a52f62922bf446cbd32dad
--- /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 0000000000000000000000000000000000000000..0adbd42e06e6bc722e10215d9cf1bfb1bc4bff19
--- /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 0000000000000000000000000000000000000000..545275a82ade99142922a3bda7cf43f9629c54aa
--- /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 0000000000000000000000000000000000000000..efc8dcfcc47b18a3d640df54f068e38d8d60fea7
--- /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/opcodes/arm-dis.c b/opcodes/arm-dis.c
index 59a5978984cc1c1f4aba79993917befa5d141a28..d5a20cb888ca2beed575ee168fc554c8f4a36d68 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"},


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]