+2020-03-13  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+
+       PR 25660
+       *  config/tc-arm.c (operand_parse_code): Add OP_RNSDMQR and OP_oRNSDMQ.
+       (parse_operands): Handle new operand codes.
+       (do_neon_dyadic_long): Make shape check accept the scalar variants.
+       (asm_opcode_insns): Fix operand codes for vaddl and vsubl.
+       * testsuite/gas/arm/mve-vaddsub-it.s: New test.
+       * testsuite/gas/arm/mve-vaddsub-it.d: New test.
+       * testsuite/gas/arm/mve-vaddsub-it-bad.s: New test.
+       * testsuite/gas/arm/mve-vaddsub-it-bad.l: New test.
+       * testsuite/gas/arm/mve-vaddsub-it-bad.d: New test.
+       * testsuite/gas/arm/nomve-vaddsub-it.d: New test.
+
 2020-03-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * NEWS: Mention x86 assembler options for CVE-2020-0551.
 
   OP_RNDMQ,     /* Neon double precision (0..31) or MVE vector register.  */
   OP_RNDMQR,    /* Neon double precision (0..31), MVE vector or ARM register.
                 */
+  OP_RNSDMQR,    /* Neon single or double precision, MVE vector or ARM register.
+                */
   OP_RNQ,      /* Neon quad precision register */
   OP_RNQMQ,    /* Neon quad or MVE vector register.  */
   OP_RVSD,     /* VFP single or double precision register */
   OP_oRNSDQ,    /* Optional single, double or quad precision vector register */
   OP_oRNSDQMQ,  /* Optional single, double or quad register or MVE vector
                    register.  */
+  OP_oRNSDMQ,   /* Optional single, double register or MVE vector
+                   register.  */
   OP_oSHll,     /* LSL immediate */
   OP_oSHar,     /* ASR immediate */
   OP_oSHllar,   /* LSL or ASR immediate */
        case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
        case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
        case OP_oRND:
+       case OP_RNSDMQR:
+         po_reg_or_goto (REG_TYPE_VFS, try_rndmqr);
+         break;
+       try_rndmqr:
        case OP_RNDMQR:
          po_reg_or_goto (REG_TYPE_RN, try_rndmq);
          break;
        case OP_RVSD_COND:
          po_reg_or_goto (REG_TYPE_VFSD, try_cond);
          break;
+       case OP_oRNSDMQ:
        case OP_RNSDMQ:
          po_reg_or_goto (REG_TYPE_NSD, try_mq2);
          break;
 static void
 do_neon_dyadic_long (void)
 {
-  enum neon_shape rs = neon_select_shape (NS_QDD, NS_QQQ, NS_QQR, NS_NULL);
+  enum neon_shape rs = neon_select_shape (NS_QDD, NS_HHH, NS_FFF, NS_DDD, NS_NULL);
   if (rs == NS_QDD)
     {
       if (vfp_or_neon_is_neon (NEON_CHECK_ARCH | NEON_CHECK_CC) == FAIL)
 #define ARM_VARIANT & fpu_neon_ext_v1
  mnUF(vabd,      _vabd,                  3, (RNDQMQ, oRNDQMQ, RNDQMQ), neon_dyadic_if_su),
  mnUF(vabdl,     _vabdl,         3, (RNQMQ, RNDMQ, RNDMQ),   neon_dyadic_long),
- mnUF(vaddl,     _vaddl,         3, (RNQMQ, RNDMQ, RNDMQR),  neon_dyadic_long),
- mnUF(vsubl,     _vsubl,         3, (RNQMQ, RNDMQ, RNDMQR),  neon_dyadic_long),
+ mnUF(vaddl,     _vaddl,         3, (RNSDQMQ, oRNSDMQ, RNSDMQR),  neon_dyadic_long),
+ mnUF(vsubl,     _vsubl,         3, (RNSDQMQ, oRNSDMQ, RNSDMQR),  neon_dyadic_long),
  mnUF(vand,      _vand,                  3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
  mnUF(vbic,      _vbic,                  3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
  mnUF(vorr,      _vorr,                  3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
 
--- /dev/null
+# name: Armv8.1-M Mainline vadd/vsub instructions in it blocks (with MVE)
+# as: -march=armv8.1-m.main+mve.fp+fp.dp
+# objdump: -dr --prefix-addresses --show-raw-insn -marmv8.1-m.main
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+[^>]*> bfdc            itt     le
+[^>]*> ee72 1aa3       vaddle.f32      s3, s5, s7
+[^>]*> ee34 7b06       vaddle.f64      d7, d4, d6
+[^>]*> bfbc            itt     lt
+[^>]*> ee72 1aa3       vaddlt.f32      s3, s5, s7
+[^>]*> ee34 7b06       vaddlt.f64      d7, d4, d6
+[^>]*> bfdc            itt     le
+[^>]*> ee72 1ae3       vsuble.f32      s3, s5, s7
+[^>]*> ee34 7b46       vsuble.f64      d7, d4, d6
+[^>]*> bfbc            itt     lt
+[^>]*> ee72 1ae3       vsublt.f32      s3, s5, s7
+[^>]*> ee34 7b46       vsublt.f64      d7, d4, d6
+[^>]*> bfdc            itt     le
+[^>]*> ee30 0a06       vaddle.f32      s0, s0, s12
+[^>]*> ee30 0b41       vsuble.f64      d0, d0, d1
+#...
 
--- /dev/null
+# name: Armv8.1-M Mainline vadd/vsub instructions in it blocks (without MVE)
+# as: -march=armv8.1-m.main+fp.dp
+# source: mve-vaddsub-it.s
+# objdump: -dr --prefix-addresses --show-raw-insn -marmv8.1-m.main
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+[^>]*> bfdc            itt     le
+[^>]*> ee72 1aa3       vaddle.f32      s3, s5, s7
+[^>]*> ee34 7b06       vaddle.f64      d7, d4, d6
+[^>]*> bfbc            itt     lt
+[^>]*> ee72 1aa3       vaddlt.f32      s3, s5, s7
+[^>]*> ee34 7b06       vaddlt.f64      d7, d4, d6
+[^>]*> bfdc            itt     le
+[^>]*> ee72 1ae3       vsuble.f32      s3, s5, s7
+[^>]*> ee34 7b46       vsuble.f64      d7, d4, d6
+[^>]*> bfbc            itt     lt
+[^>]*> ee72 1ae3       vsublt.f32      s3, s5, s7
+[^>]*> ee34 7b46       vsublt.f64      d7, d4, d6
+[^>]*> bfdc            itt     le
+[^>]*> ee30 0a06       vaddle.f32      s0, s0, s12
+[^>]*> ee30 0b41       vsuble.f64      d0, d0, d1
+#...