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]

[ARM] Assembler and disassembler support Dot Product Extension


Hi,

  This patch add assembler and disassembler support for new Dot Product
  Extension.

  The support can be enabled through the new "+dotprod" extension.

  OK for master?

include/
2017-06-28  Jiong Wang  <jiong.wang@arm.com>

        * opcode/arm.h (FPU_NEON_EXT_DOTPROD): New macro.
        (FPU_ARCH_DOTPROD_NEON_VFP_ARMV8): New macro.

gas/
2017-06-28  Jiong Wang  <jiong.wang@arm.com>

        * config/tc-arm.c (fpu_neon_ext_dotprod): New variable.
        (neon_scalar_for_mul): Improve comments.
        (do_neon_dotproduct): New function to encode Dot Product instructions.
        (do_neon_dotproduct_s): Wrapper function for signed Dot Product
        instructions.
        (do_neon_dotproduct_u): Wrapper function for unsigned Dot Product
        instructions.
        (insns): New entries for vsdot and vudot.
        (arm_extensions): New entry for "dotprod".
        * doc/c-arm.texi: Document new "dotprod" extension.
        * testsuite/gas/arm/dotprod.s: New test source.
        * testsuite/gas/arm/dotprod-illegal.s: New test source.
        * testsuite/gas/arm/dotprod.d: New test.
        * testsuite/gas/arm/dotprod-thumb2.d: New test.
        * testsuite/gas/arm/dotprod-illegal.d: New test.
        * testsuite/gas/arm/dotprod-legacy-arch.d: New test.
        * testsuite/gas/arm/dotprod-illegal.l: New error file.
        * testsuite/gas/arm/dotprod-legacy-arch.l: New error file.

opcodes/
2017-06-28  Jiong Wang  <jiong.wang@arm.com>

        * arm-dis.c (coprocessor_opcodes): New entries for vsdot and vudot.

diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index f0b11f4f2c772b57ab72f8736780738b2ae63253..f1d8fd09d9007f9dc9bf8ed42e921d4817ae82f2 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -294,6 +294,8 @@ static const arm_feature_set crc_ext_armv8 =
   ARM_FEATURE_COPROC (CRC_EXT_ARMV8);
 static const arm_feature_set fpu_neon_ext_v8_1 =
   ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA);
+static const arm_feature_set fpu_neon_ext_dotprod =
+  ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD);
 
 static int mfloat_abi_opt = -1;
 /* Record user cpu selection for object attributes.  */
@@ -15023,7 +15025,14 @@ do_neon_ceq (void)
    scalars, which are encoded in 5 bits, M : Rm.
    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
-   index in M.  */
+   index in M.
+
+   Dot Product instructions are similar to multiply instructions except elsize
+   should always be 32.
+
+   This function translates SCALAR, which is GAS's internal encoding of indexed
+   scalar register, to raw encoding.  There is also register and index range
+   check based on ELSIZE.  */
 
 static unsigned
 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
@@ -17365,6 +17374,79 @@ do_vcadd (void)
   inst.instruction |= (size == 32) << 20;
 }
 
+/* Dot Product instructions encoding support.  */
+
+static void
+do_neon_dotproduct (int unsigned_p)
+{
+  enum neon_shape rs;
+  unsigned scalar_oprd2 = 0;
+  int high8;
+
+  if (inst.cond != COND_ALWAYS)
+    as_warn (_("Dot Product instructions cannot be conditional,  the behaviour "
+	       "is UNPREDICTABLE"));
+
+  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
+	      _(BAD_FPU));
+
+  /* Dot Product instructions are in three-same D/Q register format or the third
+     operand can be a scalar index register.  */
+  if (inst.operands[2].isscalar)
+    {
+      scalar_oprd2 = neon_scalar_for_mul (inst.operands[2].reg, 32);
+      high8 = 0xfe000000;
+      rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
+    }
+  else
+    {
+      high8 = 0xfc000000;
+      rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
+    }
+
+  if (unsigned_p)
+    neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_U8);
+  else
+    neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_S8);
+
+  /* The "U" bit in traditional Three Same encoding is fixed to 0 for Dot
+     Product instruction, so we pass 0 as the "ubit" parameter.  And the
+     "Size" field are fixed to 0x2, so we pass 32 as the "size" parameter.  */
+  neon_three_same (neon_quad (rs), 0, 32);
+
+  /* Undo neon_dp_fixup.  Dot Product instructions are using a slightly
+     different NEON three-same encoding.  */
+  inst.instruction &= 0x00ffffff;
+  inst.instruction |= high8;
+  /* Encode 'U' bit which indicates signedness.  */
+  inst.instruction |= (unsigned_p ? 1 : 0) << 4;
+  /* Re-encode operand2 if it's indexed scalar operand.  What has been encoded
+     from inst.operand[2].reg in neon_three_same is GAS's internal encoding, not
+     the instruction encoding.  */
+  if (inst.operands[2].isscalar)
+    {
+      inst.instruction &= 0xffffffd0;
+      inst.instruction |= LOW4 (scalar_oprd2);
+      inst.instruction |= HI1 (scalar_oprd2) << 5;
+    }
+}
+
+/* Dot Product instructions for signed integer.  */
+
+static void
+do_neon_dotproduct_s (void)
+{
+  return do_neon_dotproduct (0);
+}
+
+/* Dot Product instructions for unsigned integer.  */
+
+static void
+do_neon_dotproduct_u (void)
+{
+  return do_neon_dotproduct (1);
+}
+
 /* Crypto v1 instructions.  */
 static void
 do_crypto_2op_1 (unsigned elttype, int op)
@@ -19914,6 +19996,13 @@ static const struct asm_opcode insns[] =
  NUF (vcadd, 0, 4, (RNDQ, RNDQ, RNDQ, EXPi), vcadd),
 
 #undef  ARM_VARIANT
+#define ARM_VARIANT   & fpu_neon_ext_dotprod
+#undef  THUMB_VARIANT
+#define THUMB_VARIANT & fpu_neon_ext_dotprod
+ NUF (vsdot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_s),
+ NUF (vudot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_u),
+
+#undef  ARM_VARIANT
 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
 #undef  THUMB_VARIANT
 #define THUMB_VARIANT NULL
@@ -25950,6 +26039,9 @@ static const struct arm_option_extension_value_table arm_extensions[] =
   ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
 			 ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8),
 				   ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
+  ARM_EXT_OPT ("dotprod", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8,
+			  ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
+			  ARM_ARCH_V8_2A),
   ARM_EXT_OPT ("dsp",	ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
 			ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
 			ARM_FEATURE_CORE (ARM_EXT_V7M, ARM_EXT2_V8M)),
diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi
index 31a012ea1b754b1a1c4f7ac8c2a2ee129abfe208..15c3acd8d8173245bcf4d6e885652d7c6d238571 100644
--- a/gas/doc/c-arm.texi
+++ b/gas/doc/c-arm.texi
@@ -174,6 +174,7 @@ been added, again in ascending alphabetical order.  For example,
 The following extensions are currently supported:
 @code{crc}
 @code{crypto} (Cryptography Extensions for v8-A architecture, implies @code{fp+simd}),
+@code{dotprod} (Dot Product Extensions for v8.2-A architecture, implies @code{fp+simd}),
 @code{fp} (Floating Point Extensions for v8-A architecture),
 @code{idiv} (Integer Divide Extensions for v7-A and v7-R architectures),
 @code{iwmmxt},
diff --git a/gas/testsuite/gas/arm/dotprod-illegal.d b/gas/testsuite/gas/arm/dotprod-illegal.d
new file mode 100644
index 0000000000000000000000000000000000000000..f75450cda3acbbc25178c110b938e393e1fd3286
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-illegal.d
@@ -0,0 +1,2 @@
+#as: -march=armv8.2-a+dotprod -mfpu=neon-fp-armv8
+#error-output: dotprod-illegal.l
diff --git a/gas/testsuite/gas/arm/dotprod-illegal.l b/gas/testsuite/gas/arm/dotprod-illegal.l
new file mode 100644
index 0000000000000000000000000000000000000000..5b88bc3002b9516956822f5604e33261d164722b
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-illegal.l
@@ -0,0 +1,10 @@
+[^:]*: Assembler messages:
+[^:]*:4: Error: bad type in Neon instruction -- `vudot.s8 d0,d2,d5'
+[^:]*:6: Error: bad type in Neon instruction -- `vudot.u16 d0,d2,d5'
+[^:]*:7: Error: bad type in Neon instruction -- `vsdot.s16 d1,d12,d18'
+[^:]*:9: Error: bad type in Neon instruction -- `vudot.u32 d2,d22,d1'
+[^:]*:10: Error: bad type in Neon instruction -- `vsdot.s32 d3,d30,d9'
+[^:]*:12: Error: scalar out of range for multiply instruction -- `vudot.u8 d31,d2,d16\[0\]'
+[^:]*:13: Error: scalar out of range for multiply instruction -- `vsdot.s8 q13,q14,d22\[1\]'
+[^:]*:15: Error: scalar out of range for multiply instruction -- `vudot.u8 d1,d8,d15\[2\]'
+[^:]*:16: Error: scalar out of range for multiply instruction -- `vsdot.s8 q14,q7,d15\[3\]'
diff --git a/gas/testsuite/gas/arm/dotprod-illegal.s b/gas/testsuite/gas/arm/dotprod-illegal.s
new file mode 100644
index 0000000000000000000000000000000000000000..8b785911174a6d0e4a87f0c504efbd2ac1f2bfcd
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-illegal.s
@@ -0,0 +1,16 @@
+	.text
+func:
+	# name and suffix mismatch.
+	vudot.s8	d0, d2, d5
+	# No .*16 suffix support.
+	vudot.u16	d0, d2, d5
+	vsdot.s16	d1, d12, d18
+	# No .*32 suffix support.
+	vudot.u32	d2, d22, d1
+	vsdot.s32	d3, d30, d9
+	# Scalar base register out of bound
+	vudot.u8	d31, d2, d16[0]
+	vsdot.s8	q13, q14, d22[1]
+	# Scalar index out of bound
+	vudot.u8	d1, d8, d15[2]
+	vsdot.s8	q14, q7, d15[3]
diff --git a/gas/testsuite/gas/arm/dotprod-legacy-arch.d b/gas/testsuite/gas/arm/dotprod-legacy-arch.d
new file mode 100644
index 0000000000000000000000000000000000000000..9f8750361f1f51e0ddfa33ed23efa8018e7b8aac
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-legacy-arch.d
@@ -0,0 +1,3 @@
+#as: -march=armv8.1-a+dotprod -mfpu=neon-fp-armv8
+#source: dotprod.s
+#error-output: dotprod-legacy-arch.l
diff --git a/gas/testsuite/gas/arm/dotprod-legacy-arch.l b/gas/testsuite/gas/arm/dotprod-legacy-arch.l
new file mode 100644
index 0000000000000000000000000000000000000000..a627a36fb12b0e698a90d91da6506627c93ea45b
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-legacy-arch.l
@@ -0,0 +1,3 @@
+Assembler messages:
+[^:]*: extension does not apply to the base architecture
+[^:]*: unrecognized option -march=armv8.1-a\+dotprod
diff --git a/gas/testsuite/gas/arm/dotprod-thumb2.d b/gas/testsuite/gas/arm/dotprod-thumb2.d
new file mode 100644
index 0000000000000000000000000000000000000000..9b558a65aa49f8263914476f11a5978880e0c9ad
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-thumb2.d
@@ -0,0 +1,297 @@
+#as: -march=armv8.2-a+dotprod -mfpu=neon-fp-armv8 -mthumb
+#source: dotprod.s
+#objdump: -d
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+.* <.*>:
+.*:	fc22 0d10 	vudot.u8	d0, d2, d0
+.*:	fe22 0d10 	vudot.u8	d0, d2, d0\[0\]
+.*:	fc22 0d18 	vudot.u8	d0, d2, d8
+.*:	fe22 0d18 	vudot.u8	d0, d2, d8\[0\]
+.*:	fc22 0d1f 	vudot.u8	d0, d2, d15
+.*:	fe22 0d1f 	vudot.u8	d0, d2, d15\[0\]
+.*:	fc2f 0d10 	vudot.u8	d0, d15, d0
+.*:	fe2f 0d10 	vudot.u8	d0, d15, d0\[0\]
+.*:	fc2f 0d18 	vudot.u8	d0, d15, d8
+.*:	fe2f 0d18 	vudot.u8	d0, d15, d8\[0\]
+.*:	fc2f 0d1f 	vudot.u8	d0, d15, d15
+.*:	fe2f 0d1f 	vudot.u8	d0, d15, d15\[0\]
+.*:	fc2e 0d90 	vudot.u8	d0, d30, d0
+.*:	fe2e 0d90 	vudot.u8	d0, d30, d0\[0\]
+.*:	fc2e 0d98 	vudot.u8	d0, d30, d8
+.*:	fe2e 0d98 	vudot.u8	d0, d30, d8\[0\]
+.*:	fc2e 0d9f 	vudot.u8	d0, d30, d15
+.*:	fe2e 0d9f 	vudot.u8	d0, d30, d15\[0\]
+.*:	fc22 7d10 	vudot.u8	d7, d2, d0
+.*:	fe22 7d10 	vudot.u8	d7, d2, d0\[0\]
+.*:	fc22 7d18 	vudot.u8	d7, d2, d8
+.*:	fe22 7d18 	vudot.u8	d7, d2, d8\[0\]
+.*:	fc22 7d1f 	vudot.u8	d7, d2, d15
+.*:	fe22 7d1f 	vudot.u8	d7, d2, d15\[0\]
+.*:	fc2f 7d10 	vudot.u8	d7, d15, d0
+.*:	fe2f 7d10 	vudot.u8	d7, d15, d0\[0\]
+.*:	fc2f 7d18 	vudot.u8	d7, d15, d8
+.*:	fe2f 7d18 	vudot.u8	d7, d15, d8\[0\]
+.*:	fc2f 7d1f 	vudot.u8	d7, d15, d15
+.*:	fe2f 7d1f 	vudot.u8	d7, d15, d15\[0\]
+.*:	fc2e 7d90 	vudot.u8	d7, d30, d0
+.*:	fe2e 7d90 	vudot.u8	d7, d30, d0\[0\]
+.*:	fc2e 7d98 	vudot.u8	d7, d30, d8
+.*:	fe2e 7d98 	vudot.u8	d7, d30, d8\[0\]
+.*:	fc2e 7d9f 	vudot.u8	d7, d30, d15
+.*:	fe2e 7d9f 	vudot.u8	d7, d30, d15\[0\]
+.*:	fc62 0d10 	vudot.u8	d16, d2, d0
+.*:	fe62 0d10 	vudot.u8	d16, d2, d0\[0\]
+.*:	fc62 0d18 	vudot.u8	d16, d2, d8
+.*:	fe62 0d18 	vudot.u8	d16, d2, d8\[0\]
+.*:	fc62 0d1f 	vudot.u8	d16, d2, d15
+.*:	fe62 0d1f 	vudot.u8	d16, d2, d15\[0\]
+.*:	fc6f 0d10 	vudot.u8	d16, d15, d0
+.*:	fe6f 0d10 	vudot.u8	d16, d15, d0\[0\]
+.*:	fc6f 0d18 	vudot.u8	d16, d15, d8
+.*:	fe6f 0d18 	vudot.u8	d16, d15, d8\[0\]
+.*:	fc6f 0d1f 	vudot.u8	d16, d15, d15
+.*:	fe6f 0d1f 	vudot.u8	d16, d15, d15\[0\]
+.*:	fc6e 0d90 	vudot.u8	d16, d30, d0
+.*:	fe6e 0d90 	vudot.u8	d16, d30, d0\[0\]
+.*:	fc6e 0d98 	vudot.u8	d16, d30, d8
+.*:	fe6e 0d98 	vudot.u8	d16, d30, d8\[0\]
+.*:	fc6e 0d9f 	vudot.u8	d16, d30, d15
+.*:	fe6e 0d9f 	vudot.u8	d16, d30, d15\[0\]
+.*:	fc62 fd10 	vudot.u8	d31, d2, d0
+.*:	fe62 fd10 	vudot.u8	d31, d2, d0\[0\]
+.*:	fc62 fd18 	vudot.u8	d31, d2, d8
+.*:	fe62 fd18 	vudot.u8	d31, d2, d8\[0\]
+.*:	fc62 fd1f 	vudot.u8	d31, d2, d15
+.*:	fe62 fd1f 	vudot.u8	d31, d2, d15\[0\]
+.*:	fc6f fd10 	vudot.u8	d31, d15, d0
+.*:	fe6f fd10 	vudot.u8	d31, d15, d0\[0\]
+.*:	fc6f fd18 	vudot.u8	d31, d15, d8
+.*:	fe6f fd18 	vudot.u8	d31, d15, d8\[0\]
+.*:	fc6f fd1f 	vudot.u8	d31, d15, d15
+.*:	fe6f fd1f 	vudot.u8	d31, d15, d15\[0\]
+.*:	fc6e fd90 	vudot.u8	d31, d30, d0
+.*:	fe6e fd90 	vudot.u8	d31, d30, d0\[0\]
+.*:	fc6e fd98 	vudot.u8	d31, d30, d8
+.*:	fe6e fd98 	vudot.u8	d31, d30, d8\[0\]
+.*:	fc6e fd9f 	vudot.u8	d31, d30, d15
+.*:	fe6e fd9f 	vudot.u8	d31, d30, d15\[0\]
+.*:	fc22 0d00 	vsdot.s8	d0, d2, d0
+.*:	fe22 0d00 	vsdot.s8	d0, d2, d0\[0\]
+.*:	fc22 0d08 	vsdot.s8	d0, d2, d8
+.*:	fe22 0d08 	vsdot.s8	d0, d2, d8\[0\]
+.*:	fc22 0d0f 	vsdot.s8	d0, d2, d15
+.*:	fe22 0d0f 	vsdot.s8	d0, d2, d15\[0\]
+.*:	fc2f 0d00 	vsdot.s8	d0, d15, d0
+.*:	fe2f 0d00 	vsdot.s8	d0, d15, d0\[0\]
+.*:	fc2f 0d08 	vsdot.s8	d0, d15, d8
+.*:	fe2f 0d08 	vsdot.s8	d0, d15, d8\[0\]
+.*:	fc2f 0d0f 	vsdot.s8	d0, d15, d15
+.*:	fe2f 0d0f 	vsdot.s8	d0, d15, d15\[0\]
+.*:	fc2e 0d80 	vsdot.s8	d0, d30, d0
+.*:	fe2e 0d80 	vsdot.s8	d0, d30, d0\[0\]
+.*:	fc2e 0d88 	vsdot.s8	d0, d30, d8
+.*:	fe2e 0d88 	vsdot.s8	d0, d30, d8\[0\]
+.*:	fc2e 0d8f 	vsdot.s8	d0, d30, d15
+.*:	fe2e 0d8f 	vsdot.s8	d0, d30, d15\[0\]
+.*:	fc22 7d00 	vsdot.s8	d7, d2, d0
+.*:	fe22 7d00 	vsdot.s8	d7, d2, d0\[0\]
+.*:	fc22 7d08 	vsdot.s8	d7, d2, d8
+.*:	fe22 7d08 	vsdot.s8	d7, d2, d8\[0\]
+.*:	fc22 7d0f 	vsdot.s8	d7, d2, d15
+.*:	fe22 7d0f 	vsdot.s8	d7, d2, d15\[0\]
+.*:	fc2f 7d00 	vsdot.s8	d7, d15, d0
+.*:	fe2f 7d00 	vsdot.s8	d7, d15, d0\[0\]
+.*:	fc2f 7d08 	vsdot.s8	d7, d15, d8
+.*:	fe2f 7d08 	vsdot.s8	d7, d15, d8\[0\]
+.*:	fc2f 7d0f 	vsdot.s8	d7, d15, d15
+.*:	fe2f 7d0f 	vsdot.s8	d7, d15, d15\[0\]
+.*:	fc2e 7d80 	vsdot.s8	d7, d30, d0
+.*:	fe2e 7d80 	vsdot.s8	d7, d30, d0\[0\]
+.*:	fc2e 7d88 	vsdot.s8	d7, d30, d8
+.*:	fe2e 7d88 	vsdot.s8	d7, d30, d8\[0\]
+.*:	fc2e 7d8f 	vsdot.s8	d7, d30, d15
+.*:	fe2e 7d8f 	vsdot.s8	d7, d30, d15\[0\]
+.*:	fc62 0d00 	vsdot.s8	d16, d2, d0
+.*:	fe62 0d00 	vsdot.s8	d16, d2, d0\[0\]
+.*:	fc62 0d08 	vsdot.s8	d16, d2, d8
+.*:	fe62 0d08 	vsdot.s8	d16, d2, d8\[0\]
+.*:	fc62 0d0f 	vsdot.s8	d16, d2, d15
+.*:	fe62 0d0f 	vsdot.s8	d16, d2, d15\[0\]
+.*:	fc6f 0d00 	vsdot.s8	d16, d15, d0
+.*:	fe6f 0d00 	vsdot.s8	d16, d15, d0\[0\]
+.*:	fc6f 0d08 	vsdot.s8	d16, d15, d8
+.*:	fe6f 0d08 	vsdot.s8	d16, d15, d8\[0\]
+.*:	fc6f 0d0f 	vsdot.s8	d16, d15, d15
+.*:	fe6f 0d0f 	vsdot.s8	d16, d15, d15\[0\]
+.*:	fc6e 0d80 	vsdot.s8	d16, d30, d0
+.*:	fe6e 0d80 	vsdot.s8	d16, d30, d0\[0\]
+.*:	fc6e 0d88 	vsdot.s8	d16, d30, d8
+.*:	fe6e 0d88 	vsdot.s8	d16, d30, d8\[0\]
+.*:	fc6e 0d8f 	vsdot.s8	d16, d30, d15
+.*:	fe6e 0d8f 	vsdot.s8	d16, d30, d15\[0\]
+.*:	fc62 fd00 	vsdot.s8	d31, d2, d0
+.*:	fe62 fd00 	vsdot.s8	d31, d2, d0\[0\]
+.*:	fc62 fd08 	vsdot.s8	d31, d2, d8
+.*:	fe62 fd08 	vsdot.s8	d31, d2, d8\[0\]
+.*:	fc62 fd0f 	vsdot.s8	d31, d2, d15
+.*:	fe62 fd0f 	vsdot.s8	d31, d2, d15\[0\]
+.*:	fc6f fd00 	vsdot.s8	d31, d15, d0
+.*:	fe6f fd00 	vsdot.s8	d31, d15, d0\[0\]
+.*:	fc6f fd08 	vsdot.s8	d31, d15, d8
+.*:	fe6f fd08 	vsdot.s8	d31, d15, d8\[0\]
+.*:	fc6f fd0f 	vsdot.s8	d31, d15, d15
+.*:	fe6f fd0f 	vsdot.s8	d31, d15, d15\[0\]
+.*:	fc6e fd80 	vsdot.s8	d31, d30, d0
+.*:	fe6e fd80 	vsdot.s8	d31, d30, d0\[0\]
+.*:	fc6e fd88 	vsdot.s8	d31, d30, d8
+.*:	fe6e fd88 	vsdot.s8	d31, d30, d8\[0\]
+.*:	fc6e fd8f 	vsdot.s8	d31, d30, d15
+.*:	fe6e fd8f 	vsdot.s8	d31, d30, d15\[0\]
+.*:	fc24 0d50 	vudot.u8	q0, q2, q0
+.*:	fe24 0d70 	vudot.u8	q0, q2, d0\[1\]
+.*:	fc24 0d5e 	vudot.u8	q0, q2, q7
+.*:	fe24 0d77 	vudot.u8	q0, q2, d7\[1\]
+.*:	fc24 0d7e 	vudot.u8	q0, q2, q15
+.*:	fe24 0d7f 	vudot.u8	q0, q2, d15\[1\]
+.*:	fc26 0d50 	vudot.u8	q0, q3, q0
+.*:	fe26 0d70 	vudot.u8	q0, q3, d0\[1\]
+.*:	fc26 0d5e 	vudot.u8	q0, q3, q7
+.*:	fe26 0d77 	vudot.u8	q0, q3, d7\[1\]
+.*:	fc26 0d7e 	vudot.u8	q0, q3, q15
+.*:	fe26 0d7f 	vudot.u8	q0, q3, d15\[1\]
+.*:	fc2c 0dd0 	vudot.u8	q0, q14, q0
+.*:	fe2c 0df0 	vudot.u8	q0, q14, d0\[1\]
+.*:	fc2c 0dde 	vudot.u8	q0, q14, q7
+.*:	fe2c 0df7 	vudot.u8	q0, q14, d7\[1\]
+.*:	fc2c 0dfe 	vudot.u8	q0, q14, q15
+.*:	fe2c 0dff 	vudot.u8	q0, q14, d15\[1\]
+.*:	fc24 2d50 	vudot.u8	q1, q2, q0
+.*:	fe24 2d70 	vudot.u8	q1, q2, d0\[1\]
+.*:	fc24 2d5e 	vudot.u8	q1, q2, q7
+.*:	fe24 2d77 	vudot.u8	q1, q2, d7\[1\]
+.*:	fc24 2d7e 	vudot.u8	q1, q2, q15
+.*:	fe24 2d7f 	vudot.u8	q1, q2, d15\[1\]
+.*:	fc26 2d50 	vudot.u8	q1, q3, q0
+.*:	fe26 2d70 	vudot.u8	q1, q3, d0\[1\]
+.*:	fc26 2d5e 	vudot.u8	q1, q3, q7
+.*:	fe26 2d77 	vudot.u8	q1, q3, d7\[1\]
+.*:	fc26 2d7e 	vudot.u8	q1, q3, q15
+.*:	fe26 2d7f 	vudot.u8	q1, q3, d15\[1\]
+.*:	fc2c 2dd0 	vudot.u8	q1, q14, q0
+.*:	fe2c 2df0 	vudot.u8	q1, q14, d0\[1\]
+.*:	fc2c 2dde 	vudot.u8	q1, q14, q7
+.*:	fe2c 2df7 	vudot.u8	q1, q14, d7\[1\]
+.*:	fc2c 2dfe 	vudot.u8	q1, q14, q15
+.*:	fe2c 2dff 	vudot.u8	q1, q14, d15\[1\]
+.*:	fc24 cd50 	vudot.u8	q6, q2, q0
+.*:	fe24 cd70 	vudot.u8	q6, q2, d0\[1\]
+.*:	fc24 cd5e 	vudot.u8	q6, q2, q7
+.*:	fe24 cd77 	vudot.u8	q6, q2, d7\[1\]
+.*:	fc24 cd7e 	vudot.u8	q6, q2, q15
+.*:	fe24 cd7f 	vudot.u8	q6, q2, d15\[1\]
+.*:	fc26 cd50 	vudot.u8	q6, q3, q0
+.*:	fe26 cd70 	vudot.u8	q6, q3, d0\[1\]
+.*:	fc26 cd5e 	vudot.u8	q6, q3, q7
+.*:	fe26 cd77 	vudot.u8	q6, q3, d7\[1\]
+.*:	fc26 cd7e 	vudot.u8	q6, q3, q15
+.*:	fe26 cd7f 	vudot.u8	q6, q3, d15\[1\]
+.*:	fc2c cdd0 	vudot.u8	q6, q14, q0
+.*:	fe2c cdf0 	vudot.u8	q6, q14, d0\[1\]
+.*:	fc2c cdde 	vudot.u8	q6, q14, q7
+.*:	fe2c cdf7 	vudot.u8	q6, q14, d7\[1\]
+.*:	fc2c cdfe 	vudot.u8	q6, q14, q15
+.*:	fe2c cdff 	vudot.u8	q6, q14, d15\[1\]
+.*:	fc64 ad50 	vudot.u8	q13, q2, q0
+.*:	fe64 ad70 	vudot.u8	q13, q2, d0\[1\]
+.*:	fc64 ad5e 	vudot.u8	q13, q2, q7
+.*:	fe64 ad77 	vudot.u8	q13, q2, d7\[1\]
+.*:	fc64 ad7e 	vudot.u8	q13, q2, q15
+.*:	fe64 ad7f 	vudot.u8	q13, q2, d15\[1\]
+.*:	fc66 ad50 	vudot.u8	q13, q3, q0
+.*:	fe66 ad70 	vudot.u8	q13, q3, d0\[1\]
+.*:	fc66 ad5e 	vudot.u8	q13, q3, q7
+.*:	fe66 ad77 	vudot.u8	q13, q3, d7\[1\]
+.*:	fc66 ad7e 	vudot.u8	q13, q3, q15
+.*:	fe66 ad7f 	vudot.u8	q13, q3, d15\[1\]
+.*:	fc6c add0 	vudot.u8	q13, q14, q0
+.*:	fe6c adf0 	vudot.u8	q13, q14, d0\[1\]
+.*:	fc6c adde 	vudot.u8	q13, q14, q7
+.*:	fe6c adf7 	vudot.u8	q13, q14, d7\[1\]
+.*:	fc6c adfe 	vudot.u8	q13, q14, q15
+.*:	fe6c adff 	vudot.u8	q13, q14, d15\[1\]
+.*:	fc24 0d40 	vsdot.s8	q0, q2, q0
+.*:	fe24 0d60 	vsdot.s8	q0, q2, d0\[1\]
+.*:	fc24 0d4e 	vsdot.s8	q0, q2, q7
+.*:	fe24 0d67 	vsdot.s8	q0, q2, d7\[1\]
+.*:	fc24 0d6e 	vsdot.s8	q0, q2, q15
+.*:	fe24 0d6f 	vsdot.s8	q0, q2, d15\[1\]
+.*:	fc26 0d40 	vsdot.s8	q0, q3, q0
+.*:	fe26 0d60 	vsdot.s8	q0, q3, d0\[1\]
+.*:	fc26 0d4e 	vsdot.s8	q0, q3, q7
+.*:	fe26 0d67 	vsdot.s8	q0, q3, d7\[1\]
+.*:	fc26 0d6e 	vsdot.s8	q0, q3, q15
+.*:	fe26 0d6f 	vsdot.s8	q0, q3, d15\[1\]
+.*:	fc2c 0dc0 	vsdot.s8	q0, q14, q0
+.*:	fe2c 0de0 	vsdot.s8	q0, q14, d0\[1\]
+.*:	fc2c 0dce 	vsdot.s8	q0, q14, q7
+.*:	fe2c 0de7 	vsdot.s8	q0, q14, d7\[1\]
+.*:	fc2c 0dee 	vsdot.s8	q0, q14, q15
+.*:	fe2c 0def 	vsdot.s8	q0, q14, d15\[1\]
+.*:	fc24 2d40 	vsdot.s8	q1, q2, q0
+.*:	fe24 2d60 	vsdot.s8	q1, q2, d0\[1\]
+.*:	fc24 2d4e 	vsdot.s8	q1, q2, q7
+.*:	fe24 2d67 	vsdot.s8	q1, q2, d7\[1\]
+.*:	fc24 2d6e 	vsdot.s8	q1, q2, q15
+.*:	fe24 2d6f 	vsdot.s8	q1, q2, d15\[1\]
+.*:	fc26 2d40 	vsdot.s8	q1, q3, q0
+.*:	fe26 2d60 	vsdot.s8	q1, q3, d0\[1\]
+.*:	fc26 2d4e 	vsdot.s8	q1, q3, q7
+.*:	fe26 2d67 	vsdot.s8	q1, q3, d7\[1\]
+.*:	fc26 2d6e 	vsdot.s8	q1, q3, q15
+.*:	fe26 2d6f 	vsdot.s8	q1, q3, d15\[1\]
+.*:	fc2c 2dc0 	vsdot.s8	q1, q14, q0
+.*:	fe2c 2de0 	vsdot.s8	q1, q14, d0\[1\]
+.*:	fc2c 2dce 	vsdot.s8	q1, q14, q7
+.*:	fe2c 2de7 	vsdot.s8	q1, q14, d7\[1\]
+.*:	fc2c 2dee 	vsdot.s8	q1, q14, q15
+.*:	fe2c 2def 	vsdot.s8	q1, q14, d15\[1\]
+.*:	fc24 cd40 	vsdot.s8	q6, q2, q0
+.*:	fe24 cd60 	vsdot.s8	q6, q2, d0\[1\]
+.*:	fc24 cd4e 	vsdot.s8	q6, q2, q7
+.*:	fe24 cd67 	vsdot.s8	q6, q2, d7\[1\]
+.*:	fc24 cd6e 	vsdot.s8	q6, q2, q15
+.*:	fe24 cd6f 	vsdot.s8	q6, q2, d15\[1\]
+.*:	fc26 cd40 	vsdot.s8	q6, q3, q0
+.*:	fe26 cd60 	vsdot.s8	q6, q3, d0\[1\]
+.*:	fc26 cd4e 	vsdot.s8	q6, q3, q7
+.*:	fe26 cd67 	vsdot.s8	q6, q3, d7\[1\]
+.*:	fc26 cd6e 	vsdot.s8	q6, q3, q15
+.*:	fe26 cd6f 	vsdot.s8	q6, q3, d15\[1\]
+.*:	fc2c cdc0 	vsdot.s8	q6, q14, q0
+.*:	fe2c cde0 	vsdot.s8	q6, q14, d0\[1\]
+.*:	fc2c cdce 	vsdot.s8	q6, q14, q7
+.*:	fe2c cde7 	vsdot.s8	q6, q14, d7\[1\]
+.*:	fc2c cdee 	vsdot.s8	q6, q14, q15
+.*:	fe2c cdef 	vsdot.s8	q6, q14, d15\[1\]
+.*:	fc64 ad40 	vsdot.s8	q13, q2, q0
+.*:	fe64 ad60 	vsdot.s8	q13, q2, d0\[1\]
+.*:	fc64 ad4e 	vsdot.s8	q13, q2, q7
+.*:	fe64 ad67 	vsdot.s8	q13, q2, d7\[1\]
+.*:	fc64 ad6e 	vsdot.s8	q13, q2, q15
+.*:	fe64 ad6f 	vsdot.s8	q13, q2, d15\[1\]
+.*:	fc66 ad40 	vsdot.s8	q13, q3, q0
+.*:	fe66 ad60 	vsdot.s8	q13, q3, d0\[1\]
+.*:	fc66 ad4e 	vsdot.s8	q13, q3, q7
+.*:	fe66 ad67 	vsdot.s8	q13, q3, d7\[1\]
+.*:	fc66 ad6e 	vsdot.s8	q13, q3, q15
+.*:	fe66 ad6f 	vsdot.s8	q13, q3, d15\[1\]
+.*:	fc6c adc0 	vsdot.s8	q13, q14, q0
+.*:	fe6c ade0 	vsdot.s8	q13, q14, d0\[1\]
+.*:	fc6c adce 	vsdot.s8	q13, q14, q7
+.*:	fe6c ade7 	vsdot.s8	q13, q14, d7\[1\]
+.*:	fc6c adee 	vsdot.s8	q13, q14, q15
+.*:	fe6c adef 	vsdot.s8	q13, q14, d15\[1\]
diff --git a/gas/testsuite/gas/arm/dotprod.d b/gas/testsuite/gas/arm/dotprod.d
new file mode 100644
index 0000000000000000000000000000000000000000..c927f0b09f3f78e895426fe524a2e49f0379d0a3
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod.d
@@ -0,0 +1,297 @@
+#no fpu options passed, we expect dotprod to imply simd+fp
+#as: -march=armv8.2-a+dotprod
+#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/gas/testsuite/gas/arm/dotprod.s b/gas/testsuite/gas/arm/dotprod.s
new file mode 100644
index 0000000000000000000000000000000000000000..575a515d5045d5bff29feb9e52e0867e2201b193
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod.s
@@ -0,0 +1,44 @@
+	.macro dotprod_iter_d_n op, d, n
+	.irp m, 0, 8, 15
+		\op d\d, d\n, d\m
+		\op d\d, d\n, d\m[0]
+	.endr
+	.endm
+
+	.macro dotprod_iter_d op, d
+	.irp n, 2, 15, 30
+		dotprod_iter_d_n \op, \d, \n
+	.endr
+	.endm
+
+	.macro dotprod_iter op
+	.irp d, 0, 7, 16, 31
+		dotprod_iter_d \op, \d
+	.endr
+	.endm
+
+	.macro dotprod_q_iter_d_n op, d, n
+	.irp m, 0, 7, 15
+		\op q\d, q\n, q\m
+		\op q\d, q\n, d\m[1]
+	.endr
+	.endm
+
+	.macro dotprod_q_iter_d op, d
+	.irp n, 2, 3, 14
+		dotprod_q_iter_d_n \op, \d, \n
+	.endr
+	.endm
+
+	.macro dotprod_q_iter op
+	.irp d, 0, 1, 6, 13
+		dotprod_q_iter_d \op, \d
+	.endr
+	.endm
+
+	.text
+func:
+	dotprod_iter vudot.u8
+	dotprod_iter vsdot.s8
+	dotprod_q_iter vudot.u8
+	dotprod_q_iter vsdot.s8
diff --git a/include/opcode/arm.h b/include/opcode/arm.h
index e2049a03a806df897a9dbc6cacee513fb83f3660..e11ac7c40bc3495888fbc502eef070320e30a92a 100644
--- a/include/opcode/arm.h
+++ b/include/opcode/arm.h
@@ -93,7 +93,8 @@
 #define FPU_CRYPTO_EXT_ARMV8 0x00008000	/* Crypto for ARMv8.  */
 #define CRC_EXT_ARMV8	 0x00004000	/* CRC32 for ARMv8.  */
 #define FPU_VFP_EXT_ARMV8xD 0x00002000	/* Single-precision FP for ARMv8.  */
-#define FPU_NEON_EXT_RDMA 0x00001000     /* v8.1 Adv.SIMD extensions.  */
+#define FPU_NEON_EXT_RDMA 0x00001000	/* v8.1 Adv.SIMD extensions.  */
+#define FPU_NEON_EXT_DOTPROD 0x00000800	/* Dot Product extension.  */
 
 /* Architectures are the sum of the base and extensions.  The ARM ARM (rev E)
    defines the following: ARMv3, ARMv3M, ARMv4xM, ARMv4, ARMv4TxM, ARMv4T,
@@ -234,6 +235,8 @@
 #define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1 \
   ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8 | FPU_NEON_ARMV8 | FPU_VFP_ARMV8 \
 		      | FPU_NEON_EXT_RDMA)
+#define FPU_ARCH_DOTPROD_NEON_VFP_ARMV8 \
+  ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD | FPU_NEON_ARMV8 | FPU_VFP_ARMV8)
 
 
 #define FPU_ARCH_ENDIAN_PURE ARM_FEATURE_COPROC (FPU_ENDIAN_PURE)
diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c
index a30afb9a7ee482cb9204cdac6faf5dc9e59a09c1..582383440192a1cd38bd4c508703b4ccc38df7c4 100644
--- a/opcodes/arm-dis.c
+++ b/opcodes/arm-dis.c
@@ -902,6 +902,12 @@ static const struct opcode32 coprocessor_opcodes[] =
   {ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A),
     0xfea00800, 0xffa00f10, "vcmla%c.f32\t%12-15,22V, %16-19,7V, %0-3,5D[0], #%20?21%20?780"},
 
+  /* Dot Product instructions in the space of coprocessor 13.  */
+  {ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
+    0xfc200d00, 0xffb00f00, "v%4?usdot.%4?us8\t%12-15,22V, %16-19,7V, %0-3,5V"},
+  {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]"},
+
   /* 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]