aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog61
-rw-r--r--gas/config/tc-arm.c316
-rw-r--r--gas/doc/c-arm.texi167
-rw-r--r--gas/testsuite/gas/arm/armv8-2-fp16-scalar-bad-ext.d4
-rw-r--r--gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d75
-rw-r--r--gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d75
-rw-r--r--gas/testsuite/gas/arm/armv8-2-fp16-simd-ext.d159
-rw-r--r--gas/testsuite/gas/arm/armv8-2-fp16-simd-thumb-ext.d159
-rw-r--r--gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-ext.d4
-rw-r--r--gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-thumb-ext.d4
-rw-r--r--gas/testsuite/gas/arm/armv8_2+rdma-ext.d79
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2-ext.d249
-rw-r--r--gas/testsuite/gas/arm/armv8_2-a-fp16_ext.d249
-rw-r--r--gas/testsuite/gas/arm/armv8_3-a-fp-bad-ext.d3
-rw-r--r--gas/testsuite/gas/arm/armv8_3-a-fp-ext.d16
-rw-r--r--gas/testsuite/gas/arm/armv8_3-a-fp16-ext.d249
-rw-r--r--gas/testsuite/gas/arm/armv8_3-a-simd-bad-ext.d3
-rw-r--r--gas/testsuite/gas/arm/armv8_4-a-fp16-ext.d249
-rw-r--r--gas/testsuite/gas/arm/armv8m.main+fp.d32
-rw-r--r--gas/testsuite/gas/arm/armv8m.main+fp.dp.d63
-rw-r--r--gas/testsuite/gas/arm/attr-ext-fpv5-d16.d14
-rw-r--r--gas/testsuite/gas/arm/attr-ext-fpv5.d15
-rw-r--r--gas/testsuite/gas/arm/attr-ext-idiv.d15
-rw-r--r--gas/testsuite/gas/arm/attr-ext-mp.d15
-rw-r--r--gas/testsuite/gas/arm/attr-ext-neon-fp16.d20
-rw-r--r--gas/testsuite/gas/arm/attr-ext-neon-vfpv3.d16
-rw-r--r--gas/testsuite/gas/arm/attr-ext-neon-vfpv4.d19
-rw-r--r--gas/testsuite/gas/arm/attr-ext-sec.d15
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv3-d16-fp16.d21
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv3-d16.d14
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv3-fp16.d20
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv3.d15
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv3xd-fp.d17
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv3xd.d16
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv4-d16.d18
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv4-sp-d16.d15
-rw-r--r--gas/testsuite/gas/arm/attr-ext-vfpv4.d18
-rw-r--r--gas/testsuite/gas/arm/attr-mfpu-neon-fp16.d8
-rw-r--r--gas/testsuite/gas/arm/dotprod-mandatory-ext.d297
-rw-r--r--gas/testsuite/gas/arm/fpv5-d16.s58
-rw-r--r--gas/testsuite/gas/arm/fpv5-sp-d16.s27
41 files changed, 2843 insertions, 46 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 69c1952..0e7a07c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,64 @@
+2019-04-01 Andre Vieira <andre.simoesdiasvieira@arm.com>
+
+ * config/tc-arm.c (arm_ext_table): New struct type.
+ (arm_arch_option_table): Add new 'arm_ext_table' field.
+ (ARM_EXT,ARM_ADD,ARM_REMOVE, ALL_FP): New macros.
+ (armv5te_ext_table, armv7ve_ext_table, armv7a_ext_table,
+ armv7r_ext_table, armv7em_ext_table, armv8a_ext_table,
+ armv81a_ext_table, armv82a_ext_table, armv84a_ext_table,
+ armv85a_ext_table, armv8m_main_ext_table,
+ armv8r_ext_table): New architecture extension tables.
+ (ARM_ARCH_OPT): Add new default field.
+ (ARM_ARCH_OPT2): New macro.
+ (arm_archs): Extend some architectures with the new architecture
+ extension tables mentioned above.
+ (arm_extensions): Add DEPRECATED comment with instructions to
+ use new table.
+ (arm_parse_extension): Change to use new extension tables.
+ (arm_parse_cpu): Don't change existing behavior.
+ (arm_parse_arch): Change to use new extension tables.
+ * doc/c-arm.texi: Document new architecture extensions.
+ * testsuite/gas/arm/attr-mfpu-neon-fp16.d: Change test to use new
+ extension option rather than -mfpu and change expected behaviour to
+ sane outputs.
+ * testsuite/gas/arm/armv8-2-fp16-scalar-bad-ext.d: New.
+ * testsuite/gas/arm/armv8-2-fp16-scalar-ext.d: New.
+ * testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d: New.
+ * testsuite/gas/arm/armv8-2-fp16-simd-ext.d: New.
+ * testsuite/gas/arm/armv8-2-fp16-simd-thumb-ext.d: New.
+ * testsuite/gas/arm/armv8-2-fp16-simd-warning-ext.d: New.
+ * testsuite/gas/arm/armv8-2-fp16-simd-warning-thumb-ext.d: New.
+ * testsuite/gas/arm/armv8_2+rdma-ext.d: New.
+ * testsuite/gas/arm/armv8_2-a-fp16-thumb2-ext.d: New.
+ * testsuite/gas/arm/armv8_2-a-fp16_ext.d: New.
+ * testsuite/gas/arm/armv8_3-a-fp-bad-ext.d: New.
+ * testsuite/gas/arm/armv8_3-a-fp-ext.d: New.
+ * testsuite/gas/arm/armv8_3-a-fp16-ext.d: New.
+ * testsuite/gas/arm/armv8_3-a-simd-bad-ext.d: New.
+ * testsuite/gas/arm/armv8_4-a-fp16-ext.d: New.
+ * testsuite/gas/arm/armv8m.main+fp.d: New.
+ * testsuite/gas/arm/armv8m.main+fp.dp.d: New.
+ * testsuite/gas/arm/attr-ext-fpv5-d16.d: New.
+ * testsuite/gas/arm/attr-ext-fpv5.d: New.
+ * testsuite/gas/arm/attr-ext-idiv.d: New.
+ * testsuite/gas/arm/attr-ext-mp.d: New.
+ * testsuite/gas/arm/attr-ext-neon-fp16.d: New.
+ * testsuite/gas/arm/attr-ext-neon-vfpv3.d: New.
+ * testsuite/gas/arm/attr-ext-neon-vfpv4.d: New.
+ * testsuite/gas/arm/attr-ext-sec.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv3-d16-fp16.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv3-d16.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv3-fp16.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv3.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv3xd-fp.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv3xd.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv4-d16.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv4-sp-d16.d: New.
+ * testsuite/gas/arm/attr-ext-vfpv4.d: New.
+ * testsuite/gas/arm/dotprod-mandatory-ext.d: New.
+ * testsuite/gas/arm/fpv5-d16.s: New.
+ * testsuite/gas/arm/fpv5-sp-d16.s: New.
+
2019-03-28 Alan Modra <amodra@gmail.com>
PR 24390
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 5bcd88b..4218d05 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -26308,17 +26308,217 @@ static const struct arm_cpu_option_table arm_cpus[] =
};
#undef ARM_CPU_OPT
+struct arm_ext_table
+{
+ const char * name;
+ size_t name_len;
+ const arm_feature_set merge;
+ const arm_feature_set clear;
+};
+
struct arm_arch_option_table
{
- const char * name;
- size_t name_len;
- const arm_feature_set value;
- const arm_feature_set default_fpu;
+ const char * name;
+ size_t name_len;
+ const arm_feature_set value;
+ const arm_feature_set default_fpu;
+ const struct arm_ext_table * ext_table;
+};
+
+/* Used to add support for +E and +noE extension. */
+#define ARM_EXT(E, M, C) { E, sizeof (E) - 1, M, C }
+/* Used to add support for a +E extension. */
+#define ARM_ADD(E, M) { E, sizeof(E) - 1, M, ARM_ARCH_NONE }
+/* Used to add support for a +noE extension. */
+#define ARM_REMOVE(E, C) { E, sizeof(E) -1, ARM_ARCH_NONE, C }
+
+#define ALL_FP ARM_FEATURE (0, ARM_EXT2_FP16_INST | ARM_EXT2_FP16_FML, \
+ ~0 & ~FPU_ENDIAN_PURE)
+
+static const struct arm_ext_table armv5te_ext_table[] =
+{
+ ARM_EXT ("fp", FPU_ARCH_VFP_V2, ALL_FP),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv7_ext_table[] =
+{
+ ARM_EXT ("fp", FPU_ARCH_VFP_V3D16, ALL_FP),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv7ve_ext_table[] =
+{
+ ARM_EXT ("fp", FPU_ARCH_VFP_V4D16, ALL_FP),
+ ARM_ADD ("vfpv3-d16", FPU_ARCH_VFP_V3D16),
+ ARM_ADD ("vfpv3", FPU_ARCH_VFP_V3),
+ ARM_ADD ("vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16),
+ ARM_ADD ("vfpv3-fp16", FPU_ARCH_VFP_V3_FP16),
+ ARM_ADD ("vfpv4-d16", FPU_ARCH_VFP_V4D16), /* Alias for +fp. */
+ ARM_ADD ("vfpv4", FPU_ARCH_VFP_V4),
+
+ ARM_EXT ("simd", FPU_ARCH_NEON_VFP_V4,
+ ARM_FEATURE_COPROC (FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA)),
+
+ /* Aliases for +simd. */
+ ARM_ADD ("neon-vfpv4", FPU_ARCH_NEON_VFP_V4),
+
+ ARM_ADD ("neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
+ ARM_ADD ("neon-vfpv3", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
+ ARM_ADD ("neon-fp16", FPU_ARCH_NEON_FP16),
+
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv7a_ext_table[] =
+{
+ ARM_EXT ("fp", FPU_ARCH_VFP_V3D16, ALL_FP),
+ ARM_ADD ("vfpv3-d16", FPU_ARCH_VFP_V3D16), /* Alias for +fp. */
+ ARM_ADD ("vfpv3", FPU_ARCH_VFP_V3),
+ ARM_ADD ("vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16),
+ ARM_ADD ("vfpv3-fp16", FPU_ARCH_VFP_V3_FP16),
+ ARM_ADD ("vfpv4-d16", FPU_ARCH_VFP_V4D16),
+ ARM_ADD ("vfpv4", FPU_ARCH_VFP_V4),
+
+ ARM_EXT ("simd", FPU_ARCH_VFP_V3_PLUS_NEON_V1,
+ ARM_FEATURE_COPROC (FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA)),
+
+ /* Aliases for +simd. */
+ ARM_ADD ("neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
+ ARM_ADD ("neon-vfpv3", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
+
+ ARM_ADD ("neon-fp16", FPU_ARCH_NEON_FP16),
+ ARM_ADD ("neon-vfpv4", FPU_ARCH_NEON_VFP_V4),
+
+ ARM_ADD ("mp", ARM_FEATURE_CORE_LOW (ARM_EXT_MP)),
+ ARM_ADD ("sec", ARM_FEATURE_CORE_LOW (ARM_EXT_SEC)),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv7r_ext_table[] =
+{
+ ARM_ADD ("fp.sp", FPU_ARCH_VFP_V3xD),
+ ARM_ADD ("vfpv3xd", FPU_ARCH_VFP_V3xD), /* Alias for +fp.sp. */
+ ARM_EXT ("fp", FPU_ARCH_VFP_V3D16, ALL_FP),
+ ARM_ADD ("vfpv3-d16", FPU_ARCH_VFP_V3D16), /* Alias for +fp. */
+ ARM_ADD ("vfpv3xd-fp16", FPU_ARCH_VFP_V3xD_FP16),
+ ARM_ADD ("vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16),
+ ARM_EXT ("idiv", ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
+ ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV)),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv7em_ext_table[] =
+{
+ ARM_EXT ("fp", FPU_ARCH_VFP_V4_SP_D16, ALL_FP),
+ /* Alias for +fp, used to be known as fpv4-sp-d16. */
+ ARM_ADD ("vfpv4-sp-d16", FPU_ARCH_VFP_V4_SP_D16),
+ ARM_ADD ("fpv5", FPU_ARCH_VFP_V5_SP_D16),
+ ARM_ADD ("fp.dp", FPU_ARCH_VFP_V5D16),
+ ARM_ADD ("fpv5-d16", FPU_ARCH_VFP_V5D16),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv8a_ext_table[] =
+{
+ ARM_ADD ("crc", ARCH_CRC_ARMV8),
+ ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8),
+ ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
+ ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
+
+ /* Armv8-a does not allow an FP implementation without SIMD, so the user
+ should use the +simd option to turn on FP. */
+ ARM_REMOVE ("fp", ALL_FP),
+ ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
+ ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+
+static const struct arm_ext_table armv81a_ext_table[] =
+{
+ ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8_1),
+ ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1,
+ ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
+
+ /* Armv8-a does not allow an FP implementation without SIMD, so the user
+ should use the +simd option to turn on FP. */
+ ARM_REMOVE ("fp", ALL_FP),
+ ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
+ ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv82a_ext_table[] =
+{
+ ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8_1),
+ ARM_ADD ("fp16", FPU_ARCH_NEON_VFP_ARMV8_2_FP16),
+ ARM_ADD ("fp16fml", FPU_ARCH_NEON_VFP_ARMV8_2_FP16FML),
+ ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1,
+ ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
+ ARM_ADD ("dotprod", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8),
+
+ /* Armv8-a does not allow an FP implementation without SIMD, so the user
+ should use the +simd option to turn on FP. */
+ ARM_REMOVE ("fp", ALL_FP),
+ ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
+ ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv84a_ext_table[] =
+{
+ ARM_ADD ("simd", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8),
+ ARM_ADD ("fp16", FPU_ARCH_NEON_VFP_ARMV8_4_FP16FML),
+ ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_4,
+ ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
+
+ /* Armv8-a does not allow an FP implementation without SIMD, so the user
+ should use the +simd option to turn on FP. */
+ ARM_REMOVE ("fp", ALL_FP),
+ ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
+ ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv85a_ext_table[] =
+{
+ ARM_ADD ("simd", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8),
+ ARM_ADD ("fp16", FPU_ARCH_NEON_VFP_ARMV8_4_FP16FML),
+ ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_4,
+ ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
+
+ /* Armv8-a does not allow an FP implementation without SIMD, so the user
+ should use the +simd option to turn on FP. */
+ ARM_REMOVE ("fp", ALL_FP),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv8m_main_ext_table[] =
+{
+ ARM_EXT ("dsp", ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
+ ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP)),
+ ARM_EXT ("fp", FPU_ARCH_VFP_V5_SP_D16, ALL_FP),
+ ARM_ADD ("fp.dp", FPU_ARCH_VFP_V5D16),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+};
+
+static const struct arm_ext_table armv8r_ext_table[] =
+{
+ ARM_ADD ("crc", ARCH_CRC_ARMV8),
+ ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8),
+ ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
+ ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
+ ARM_REMOVE ("fp", ALL_FP),
+ ARM_ADD ("fp.sp", FPU_ARCH_VFP_V5_SP_D16),
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
};
/* This list should, at a minimum, contain all the architecture names
recognized by GCC. */
-#define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
+#define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF, NULL }
+#define ARM_ARCH_OPT2(N, V, DF, ext) \
+ { N, sizeof (N) - 1, V, DF, ext##_ext_table }
static const struct arm_arch_option_table arm_archs[] =
{
@@ -26336,50 +26536,51 @@ static const struct arm_arch_option_table arm_archs[] =
ARM_ARCH_OPT ("armv5", ARM_ARCH_V5, FPU_ARCH_VFP),
ARM_ARCH_OPT ("armv5t", ARM_ARCH_V5T, FPU_ARCH_VFP),
ARM_ARCH_OPT ("armv5txm", ARM_ARCH_V5TxM, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv5te", ARM_ARCH_V5TE, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv5texp", ARM_ARCH_V5TExP, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv5tej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6", ARM_ARCH_V6, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6j", ARM_ARCH_V6, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6k", ARM_ARCH_V6K, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6z", ARM_ARCH_V6Z, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv5te", ARM_ARCH_V5TE, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv5texp", ARM_ARCH_V5TExP, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv5tej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6", ARM_ARCH_V6, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6j", ARM_ARCH_V6, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6k", ARM_ARCH_V6K, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6z", ARM_ARCH_V6Z, FPU_ARCH_VFP, armv5te),
/* The official spelling of this variant is ARMv6KZ, the name "armv6zk" is
kept to preserve existing behaviour. */
- ARM_ARCH_OPT ("armv6kz", ARM_ARCH_V6KZ, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6zk", ARM_ARCH_V6KZ, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6t2", ARM_ARCH_V6T2, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6kt2", ARM_ARCH_V6KT2, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6zt2", ARM_ARCH_V6ZT2, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv6kz", ARM_ARCH_V6KZ, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6zk", ARM_ARCH_V6KZ, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6t2", ARM_ARCH_V6T2, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6kt2", ARM_ARCH_V6KT2, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6zt2", ARM_ARCH_V6ZT2, FPU_ARCH_VFP, armv5te),
/* The official spelling of this variant is ARMv6KZ, the name "armv6zkt2" is
kept to preserve existing behaviour. */
- ARM_ARCH_OPT ("armv6kzt2", ARM_ARCH_V6KZT2, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv6zkt2", ARM_ARCH_V6KZT2, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv6kzt2", ARM_ARCH_V6KZT2, FPU_ARCH_VFP, armv5te),
+ ARM_ARCH_OPT2 ("armv6zkt2", ARM_ARCH_V6KZT2, FPU_ARCH_VFP, armv5te),
ARM_ARCH_OPT ("armv6-m", ARM_ARCH_V6M, FPU_ARCH_VFP),
ARM_ARCH_OPT ("armv6s-m", ARM_ARCH_V6SM, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv7", ARM_ARCH_V7, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv7", ARM_ARCH_V7, FPU_ARCH_VFP, armv7),
/* The official spelling of the ARMv7 profile variants is the dashed form.
Accept the non-dashed form for compatibility with old toolchains. */
- ARM_ARCH_OPT ("armv7a", ARM_ARCH_V7A, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv7ve", ARM_ARCH_V7VE, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv7r", ARM_ARCH_V7R, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv7a", ARM_ARCH_V7A, FPU_ARCH_VFP, armv7a),
+ ARM_ARCH_OPT2 ("armv7ve", ARM_ARCH_V7VE, FPU_ARCH_VFP, armv7ve),
+ ARM_ARCH_OPT2 ("armv7r", ARM_ARCH_V7R, FPU_ARCH_VFP, armv7r),
ARM_ARCH_OPT ("armv7m", ARM_ARCH_V7M, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv7-a", ARM_ARCH_V7A, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv7-r", ARM_ARCH_V7R, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv7-a", ARM_ARCH_V7A, FPU_ARCH_VFP, armv7a),
+ ARM_ARCH_OPT2 ("armv7-r", ARM_ARCH_V7R, FPU_ARCH_VFP, armv7r),
ARM_ARCH_OPT ("armv7-m", ARM_ARCH_V7M, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv7e-m", ARM_ARCH_V7EM, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv7e-m", ARM_ARCH_V7EM, FPU_ARCH_VFP, armv7em),
ARM_ARCH_OPT ("armv8-m.base", ARM_ARCH_V8M_BASE, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8-m.main", ARM_ARCH_V8M_MAIN, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8-a", ARM_ARCH_V8A, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8.1-a", ARM_ARCH_V8_1A, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8.2-a", ARM_ARCH_V8_2A, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8.3-a", ARM_ARCH_V8_3A, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8-r", ARM_ARCH_V8R, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8.4-a", ARM_ARCH_V8_4A, FPU_ARCH_VFP),
- ARM_ARCH_OPT ("armv8.5-a", ARM_ARCH_V8_5A, FPU_ARCH_VFP),
+ ARM_ARCH_OPT2 ("armv8-m.main", ARM_ARCH_V8M_MAIN, FPU_ARCH_VFP,
+ armv8m_main),
+ ARM_ARCH_OPT2 ("armv8-a", ARM_ARCH_V8A, FPU_ARCH_VFP, armv8a),
+ ARM_ARCH_OPT2 ("armv8.1-a", ARM_ARCH_V8_1A, FPU_ARCH_VFP, armv81a),
+ ARM_ARCH_OPT2 ("armv8.2-a", ARM_ARCH_V8_2A, FPU_ARCH_VFP, armv82a),
+ ARM_ARCH_OPT2 ("armv8.3-a", ARM_ARCH_V8_3A, FPU_ARCH_VFP, armv82a),
+ ARM_ARCH_OPT2 ("armv8-r", ARM_ARCH_V8R, FPU_ARCH_VFP, armv8r),
+ ARM_ARCH_OPT2 ("armv8.4-a", ARM_ARCH_V8_4A, FPU_ARCH_VFP, armv84a),
+ ARM_ARCH_OPT2 ("armv8.5-a", ARM_ARCH_V8_5A, FPU_ARCH_VFP, armv85a),
ARM_ARCH_OPT ("xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP),
ARM_ARCH_OPT ("iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
ARM_ARCH_OPT ("iwmmxt2", ARM_ARCH_IWMMXT2, FPU_ARCH_VFP),
- { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
+ { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
};
#undef ARM_ARCH_OPT
@@ -26402,6 +26603,8 @@ struct arm_option_extension_value_table
#define ARM_EXT_OPT(N, M, C, AA) { N, sizeof (N) - 1, M, C, { AA, ARM_ANY } }
#define ARM_EXT_OPT2(N, M, C, AA1, AA2) { N, sizeof (N) - 1, M, C, {AA1, AA2} }
+/* DEPRECATED: Refrain from using this table to add any new extensions, instead
+ use the context sensitive approach using arm_ext_table's. */
static const struct arm_option_extension_value_table arm_extensions[] =
{
ARM_EXT_OPT ("crc", ARCH_CRC_ARMV8, ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
@@ -26574,7 +26777,8 @@ struct arm_long_option_table
static bfd_boolean
arm_parse_extension (const char *str, const arm_feature_set *opt_set,
- arm_feature_set *ext_set)
+ arm_feature_set *ext_set,
+ const struct arm_ext_table *ext_table)
{
/* We insist on extensions being specified in alphabetical order, and with
extensions being added before being removed. We achieve this by having
@@ -26640,6 +26844,41 @@ arm_parse_extension (const char *str, const arm_feature_set *opt_set,
gas_assert (adding_value != -1);
gas_assert (opt != NULL);
+ if (ext_table != NULL)
+ {
+ const struct arm_ext_table * ext_opt = ext_table;
+ bfd_boolean found = FALSE;
+ for (; ext_opt->name != NULL; ext_opt++)
+ if (ext_opt->name_len == len
+ && strncmp (ext_opt->name, str, len) == 0)
+ {
+ if (adding_value)
+ {
+ if (ARM_FEATURE_ZERO (ext_opt->merge))
+ /* TODO: Option not supported. When we remove the
+ legacy table this case should error out. */
+ continue;
+
+ ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, ext_opt->merge);
+ }
+ else
+ {
+ if (ARM_FEATURE_ZERO (ext_opt->clear))
+ /* TODO: Option not supported. When we remove the
+ legacy table this case should error out. */
+ continue;
+ ARM_CLEAR_FEATURE (*ext_set, *ext_set, ext_opt->clear);
+ }
+ found = TRUE;
+ break;
+ }
+ if (found)
+ {
+ str = ext;
+ continue;
+ }
+ }
+
/* Scan over the options table trying to find an exact match. */
for (; opt->name != NULL; opt++)
if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
@@ -26748,7 +26987,7 @@ arm_parse_cpu (const char *str)
}
if (ext != NULL)
- return arm_parse_extension (ext, mcpu_cpu_opt, mcpu_ext_opt);
+ return arm_parse_extension (ext, mcpu_cpu_opt, mcpu_ext_opt, NULL);
return TRUE;
}
@@ -26786,7 +27025,8 @@ arm_parse_arch (const char *str)
strcpy (selected_cpu_name, opt->name);
if (ext != NULL)
- return arm_parse_extension (ext, march_cpu_opt, march_ext_opt);
+ return arm_parse_extension (ext, march_cpu_opt, march_ext_opt,
+ opt->ext_table);
return TRUE;
}
diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi
index 4fb6cad..184d716 100644
--- a/gas/doc/c-arm.texi
+++ b/gas/doc/c-arm.texi
@@ -248,7 +248,9 @@ names are recognized:
@code{armv8-r},
@code{armv8.4-a},
@code{armv8.5-a},
-@code{iwmmxt}
+@code{armv8-m.base},
+@code{armv8-m.main},
+@code{iwmmxt},
@code{iwmmxt2}
and
@code{xscale}.
@@ -256,8 +258,167 @@ If both @code{-mcpu} and
@code{-march} are specified, the assembler will use
the setting for @code{-mcpu}.
-The architecture option can be extended with the same instruction set
-extension options as the @code{-mcpu} option.
+The architecture option can be extended with a set extension options. These
+extensions are context sensitive, i.e. the same extension may mean different
+things when used with different architectures. When used together with a
+@code{-mfpu} option, the union of both feature enablement is taken.
+See their availability and meaning below:
+
+For @code{armv5te}, @code{armv5texp}, @code{armv5tej}, @code{armv6}, @code{armv6j}, @code{armv6k}, @code{armv6z}, @code{armv6kz}, @code{armv6zk}, @code{armv6t2}, @code{armv6kt2} and @code{armv6zt2}:
+
+@code{+fp}: Enables VFPv2 instructions.
+@code{+nofp}: Disables all FPU instrunctions.
+
+For @code{armv7}:
+
+@code{+fp}: Enables VFPv3 instructions with 16 double-word registers.
+@code{+nofp}: Disables all FPU instructions.
+
+For @code{armv7-a}:
+
+@code{+fp}: Enables VFPv3 instructions with 16 double-word registers.
+@code{+vfpv3-d16}: Alias for @code{+fp}.
+@code{+vfpv3}: Enables VFPv3 instructions with 32 double-word registers.
+@code{+vfpv3-d16-fp16}: Enables VFPv3 with half precision floating-point
+conversion instructions and 16 double-word registers.
+@code{+vfpv3-fp16}: Enables VFPv3 with half precision floating-point conversion
+instructions and 32 double-word registers.
+@code{+vfpv4-d16}: Enables VFPv4 instructions with 16 double-word registers.
+@code{+vfpv4}: Enables VFPv4 instructions with 32 double-word registers.
+@code{+simd}: Enables VFPv3 and NEONv1 instructions with 32 double-word
+registers.
+@code{+neon}: Alias for @code{+simd}.
+@code{+neon-vfpv3}: Alias for @code{+simd}.
+@code{+neon-fp16}: Enables VFPv3, half precision floating-point conversion and
+NEONv1 instructions with 32 double-word registers.
+@code{+neon-vfpv4}: Enables VFPv4 and NEONv1 with Fused-MAC instructions and 32
+double-word registers.
+@code{+mp}: Enables Multiprocessing Extensions.
+@code{+sec}: Enables Security Extensions.
+@code{+nofp}: Disables all FPU and NEON instructions.
+@code{+nosimd}: Disables all NEON instructions.
+
+For @code{armv7ve}:
+
+@code{+fp}: Enables VFPv4 instructions with 16 double-word registers.
+@code{+vfpv4-d16}: Alias for @code{+fp}.
+@code{+vfpv3-d16}: Enables VFPv3 instructions with 16 double-word registers.
+@code{+vfpv3}: Enables VFPv3 instructions with 32 double-word registers.
+@code{+vfpv3-d16-fp16}: Enables VFPv3 with half precision floating-point
+conversion instructions and 16 double-word registers.
+@code{+vfpv3-fp16}: Enables VFPv3 with half precision floating-point conversion
+instructions and 32 double-word registers.
+@code{+vfpv4}: Enables VFPv4 instructions with 32 double-word registers.
+@code{+simd}: Enables VFPv4 and NEONv1 with Fused-MAC instructions and 32
+double-word registers.
+@code{+neon-vfpv4}: Alias for @code{+simd}.
+@code{+neon}: Enables VFPv3 and NEONv1 instructions with 32 double-word
+registers.
+@code{+neon-vfpv3}: Alias for @code{+neon}.
+@code{+neon-fp16}: Enables VFPv3, half precision floating-point conversion and
+NEONv1 instructions with 32 double-word registers.
+double-word registers.
+@code{+nofp}: Disables all FPU and NEON instructions.
+@code{+nosimd}: Disables all NEON instructions.
+
+For @code{armv7-r}:
+
+@code{+fp.sp}: Enables single-precision only VFPv3 instructions with 16
+double-word registers.
+@code{+vfpv3xd}: Alias for @code{+fp.sp}.
+@code{+fp}: Enables VFPv3 instructions with 16 double-word registers.
+@code{+vfpv3-d16}: Alias for @code{+fp}.
+@code{+vfpv3xd-fp16}: Enables single-precision only VFPv3 and half
+floating-point conversion instructions with 16 double-word registers.
+@code{+vfpv3-d16-fp16}: Enables VFPv3 and half precision floating-point
+conversion instructions with 16 double-word registers.
+@code{+idiv}: Enables integer division instructions in ARM mode.
+@code{+nofp}: Disables all FPU instructions.
+
+For @code{armv7e-m}:
+
+@code{+fp}: Enables single-precision only VFPv4 instructions with 16
+double-word registers.
+@code{+vfpvf4-sp-d16}: Alias for @code{+fp}.
+@code{+fpv5}: Enables single-precision only VFPv5 instructions with 16
+double-word registers.
+@code{+fp.dp}: Enables VFPv5 instructions with 16 double-word registers.
+@code{+fpv5-d16"}: Alias for @code{+fp.dp}.
+@code{+nofp}: Disables all FPU instructions.
+
+For @code{armv8-m.main}:
+
+@code{+dsp}: Enables DSP Extension.
+@code{+fp}: Enables single-precision only VFPv5 instructions with 16
+double-word registers.
+@code{+fp.dp}: Enables VFPv5 instructions with 16 double-word registers.
+@code{+nofp}: Disables all FPU instructions.
+@code{+nodsp}: Disables DSP Extension.
+
+For @code{armv8-a}:
+
+@code{+crc}: Enables CRC32 Extension.
+@code{+simd}: Enables VFP and NEON for Armv8-A.
+@code{+crypto}: Enables Cryptography Extensions for Armv8-A, implies
+@code{+simd}.
+@code{+sb}: Enables Speculation Barrier Instruction for Armv8-A.
+@code{+predres}: Enables Execution and Data Prediction Restriction Instruction
+for Armv8-A.
+@code{+nofp}: Disables all FPU, NEON and Cryptography Extensions.
+@code{+nocrypto}: Disables Cryptography Extensions.
+
+For @code{armv8.1-a}:
+
+@code{+simd}: Enables VFP and NEON for Armv8.1-A.
+@code{+crypto}: Enables Cryptography Extensions for Armv8-A, implies
+@code{+simd}.
+@code{+sb}: Enables Speculation Barrier Instruction for Armv8-A.
+@code{+predres}: Enables Execution and Data Prediction Restriction Instruction
+for Armv8-A.
+@code{+nofp}: Disables all FPU, NEON and Cryptography Extensions.
+@code{+nocrypto}: Disables Cryptography Extensions.
+
+For @code{armv8.2-a} and @code{armv8.3-a}:
+
+@code{+simd}: Enables VFP and NEON for Armv8.1-A.
+@code{+fp16}: Enables FP16 Extension for Armv8.2-A, implies @code{+simd}.
+@code{+fp16fml}: Enables FP16 Floating Point Multiplication Variant Extensions
+for Armv8.2-A, implies @code{+fp16}.
+@code{+crypto}: Enables Cryptography Extensions for Armv8-A, implies
+@code{+simd}.
+@code{+dotprod}: Enables Dot Product Extensions for Armv8.2-A, implies
+@code{+simd}.
+@code{+sb}: Enables Speculation Barrier Instruction for Armv8-A.
+@code{+predres}: Enables Execution and Data Prediction Restriction Instruction
+for Armv8-A.
+@code{+nofp}: Disables all FPU, NEON, Cryptography and Dot Product Extensions.
+@code{+nocrypto}: Disables Cryptography Extensions.
+
+For @code{armv8.4-a}:
+
+@code{+simd}: Enables VFP and NEON for Armv8.1-A and Dot Product Extensions for
+Armv8.2-A.
+@code{+fp16}: Enables FP16 Floating Point and Floating Point Multiplication
+Variant Extensions for Armv8.2-A, implies @code{+simd}.
+@code{+crypto}: Enables Cryptography Extensions for Armv8-A, implies
+@code{+simd}.
+@code{+sb}: Enables Speculation Barrier Instruction for Armv8-A.
+@code{+predres}: Enables Execution and Data Prediction Restriction Instruction
+for Armv8-A.
+@code{+nofp}: Disables all FPU, NEON, Cryptography and Dot Product Extensions.
+@code{+nocryptp}: Disables Cryptography Extensions.
+
+For @code{armv8.5-a}:
+
+@code{+simd}: Enables VFP and NEON for Armv8.1-A and Dot Product Extensions for
+Armv8.2-A.
+@code{+fp16}: Enables FP16 Floating Point and Floating Point Multiplication
+Variant Extensions for Armv8.2-A, implies @code{+simd}.
+@code{+crypto}: Enables Cryptography Extensions for Armv8-A, implies
+@code{+simd}.
+@code{+nofp}: Disables all FPU, NEON, Cryptography and Dot Product Extensions.
+@code{+nocryptp}: Disables Cryptography Extensions.
+
@cindex @code{-mfpu=} command-line option, ARM
@item -mfpu=@var{floating-point-format}
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-bad-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-bad-ext.d
new file mode 100644
index 0000000..b98e7cf
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-bad-ext.d
@@ -0,0 +1,4 @@
+#name: Invalid armv8.2-a scalar fp16
+#source: armv8-2-fp16-scalar-bad.s
+#as: -march=armv8.2-a+fp16
+#error_output: armv8-2-fp16-scalar-bad.l
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d
new file mode 100644
index 0000000..0b5e4e4
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d
@@ -0,0 +1,75 @@
+#name: ARM v8.2 FP16 support on scalar
+#source: armv8-2-fp16-scalar.s
+#objdump: -d
+#as: -march=armv8.2-a+fp16
+#skip: *-*-pe *-*-wince
+
+.*: +file format .*arm.*
+Disassembly of section .text:
+
+00000000 <label-0xc>:
+ 0: ee001910 vmov.f16 s0, r1
+ 4: ee100990 vmov.f16 r0, s1
+ 8: eeb00900 vmov.f16 s0, #0 ; 0x40000000 2.0
+
+0000000c <label>:
+ c: 00000ffe .word 0x00000ffe
+ 10: ed5f1906 vldr.16 s3, \[pc, #-12\] ; c <label>
+ 14: ed1f3902 vldr.16 s6, \[pc, #-4\] ; 18 <label\+0xc>
+ 18: eddf1902 vldr.16 s3, \[pc, #4\] ; 24 <label\+0x18>
+ 1c: edd00902 vldr.16 s1, \[r0, #4\]
+ 20: ed101902 vldr.16 s2, \[r0, #-4\]
+ 24: ed803902 vstr.16 s6, \[r0, #4\]
+ 28: ed405902 vstr.16 s11, \[r0, #-4\]
+ 2c: eec6298c vdiv.f16 s5, s13, s24
+ 30: eee6298c vfma.f16 s5, s13, s24
+ 34: eee629cc vfms.f16 s5, s13, s24
+ 38: eed629cc vfnma.f16 s5, s13, s24
+ 3c: eed6298c vfnms.f16 s5, s13, s24
+ 40: fec6298c vmaxnm.f16 s5, s13, s24
+ 44: fec629cc vminnm.f16 s5, s13, s24
+ 48: ee46298c vmla.f16 s5, s13, s24
+ 4c: ee4629cc vmls.f16 s5, s13, s24
+ 50: ee66298c vmul.f16 s5, s13, s24
+ 54: ee5629cc vnmla.f16 s5, s13, s24
+ 58: ee56298c vnmls.f16 s5, s13, s24
+ 5c: ee6629cc vnmul.f16 s5, s13, s24
+ 60: ee7629cc vsub.f16 s5, s13, s24
+ 64: eef029c6 vabs.f16 s5, s12
+ 68: ee722986 vadd.f16 s5, s5, s12
+ 6c: eef129c6 vsqrt.f16 s5, s12
+ 70: eef12946 vneg.f16 s5, s12
+ 74: eeb51940 vcmp.f16 s2, #0.0
+ 78: eeb519c0 vcmpe.f16 s2, #0.0
+ 7c: eef42966 vcmp.f16 s5, s13
+ 80: eef429e6 vcmpe.f16 s5, s13
+ 84: fe4629ab vseleq.f16 s5, s13, s23
+ 88: fe6629ab vselge.f16 s5, s13, s23
+ 8c: fe5629ab vselvs.f16 s5, s13, s23
+ 90: eefd19c4 vcvt.s32.f16 s3, s8
+ 94: eefc19c4 vcvt.u32.f16 s3, s8
+ 98: eef819c4 vcvt.f16.s32 s3, s8
+ 9c: eef81944 vcvt.f16.u32 s3, s8
+ a0: eefa39e1 vcvt.f16.s32 s7, s7, #29
+ a4: eefb39e1 vcvt.f16.u32 s7, s7, #29
+ a8: eefe39e1 vcvt.s32.f16 s7, s7, #29
+ ac: eeff39e1 vcvt.u32.f16 s7, s7, #29
+ b0: fefc29c5 vcvta.s32.f16 s5, s10
+ b4: fefc2945 vcvta.u32.f16 s5, s10
+ b8: feff29c5 vcvtm.s32.f16 s5, s10
+ bc: feff2945 vcvtm.u32.f16 s5, s10
+ c0: fefd29c5 vcvtn.s32.f16 s5, s10
+ c4: fefd2945 vcvtn.u32.f16 s5, s10
+ c8: fefe29c5 vcvtp.s32.f16 s5, s10
+ cc: fefe2945 vcvtp.u32.f16 s5, s10
+ d0: eefc2945 vcvtr.u32.f16 s5, s10
+ d4: eefd2945 vcvtr.s32.f16 s5, s10
+ d8: fef81965 vrinta.f16 s3, s11
+ dc: fefb1965 vrintm.f16 s3, s11
+ e0: fef91965 vrintn.f16 s3, s11
+ e4: fefa1965 vrintp.f16 s3, s11
+ e8: eef61965 vrintr.f16 s3, s11
+ ec: eef71965 vrintx.f16 s3, s11
+ f0: eef619e5 vrintz.f16 s3, s11
+ f4: fef02ae4 vins.f16 s5, s9
+ f8: fef02a64 vmovx.f16 s5, s9
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d
new file mode 100644
index 0000000..9b1ab0a
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d
@@ -0,0 +1,75 @@
+#name: ARM v8.2 FP16 support on scalar (Thumb)
+#source: armv8-2-fp16-scalar.s
+#objdump: -d
+#as: -march=armv8.2-a+fp16 -mthumb
+#skip: *-*-pe *-*-wince
+
+.*: +file format .*arm.*
+Disassembly of section .text:
+
+00000000 <label-0xc>:
+ 0: ee00 1910 vmov.f16 s0, r1
+ 4: ee10 0990 vmov.f16 r0, s1
+ 8: eeb0 0900 vmov.f16 s0, #0 ; 0x40000000 2.0
+
+0000000c <label>:
+ c: 00000ffe .word 0x00000ffe
+ 10: ed5f 1904 vldr.16 s3, \[pc, #-8\] ; c <label>
+ 14: ed1f 3902 vldr.16 s6, \[pc, #-4\] ; 14 <label\+0x8>
+ 18: eddf 1902 vldr.16 s3, \[pc, #4\] ; 20 <label\+0x14>
+ 1c: edd0 0902 vldr.16 s1, \[r0, #4\]
+ 20: ed10 1902 vldr.16 s2, \[r0, #-4\]
+ 24: ed80 3902 vstr.16 s6, \[r0, #4\]
+ 28: ed40 5902 vstr.16 s11, \[r0, #-4\]
+ 2c: eec6 298c vdiv.f16 s5, s13, s24
+ 30: eee6 298c vfma.f16 s5, s13, s24
+ 34: eee6 29cc vfms.f16 s5, s13, s24
+ 38: eed6 29cc vfnma.f16 s5, s13, s24
+ 3c: eed6 298c vfnms.f16 s5, s13, s24
+ 40: fec6 298c vmaxnm.f16 s5, s13, s24
+ 44: fec6 29cc vminnm.f16 s5, s13, s24
+ 48: ee46 298c vmla.f16 s5, s13, s24
+ 4c: ee46 29cc vmls.f16 s5, s13, s24
+ 50: ee66 298c vmul.f16 s5, s13, s24
+ 54: ee56 29cc vnmla.f16 s5, s13, s24
+ 58: ee56 298c vnmls.f16 s5, s13, s24
+ 5c: ee66 29cc vnmul.f16 s5, s13, s24
+ 60: ee76 29cc vsub.f16 s5, s13, s24
+ 64: eef0 29c6 vabs.f16 s5, s12
+ 68: ee72 2986 vadd.f16 s5, s5, s12
+ 6c: eef1 29c6 vsqrt.f16 s5, s12
+ 70: eef1 2946 vneg.f16 s5, s12
+ 74: eeb5 1940 vcmp.f16 s2, #0.0
+ 78: eeb5 19c0 vcmpe.f16 s2, #0.0
+ 7c: eef4 2966 vcmp.f16 s5, s13
+ 80: eef4 29e6 vcmpe.f16 s5, s13
+ 84: fe46 29ab vseleq.f16 s5, s13, s23
+ 88: fe66 29ab vselge.f16 s5, s13, s23
+ 8c: fe56 29ab vselvs.f16 s5, s13, s23
+ 90: eefd 19c4 vcvt.s32.f16 s3, s8
+ 94: eefc 19c4 vcvt.u32.f16 s3, s8
+ 98: eef8 19c4 vcvt.f16.s32 s3, s8
+ 9c: eef8 1944 vcvt.f16.u32 s3, s8
+ a0: eefa 39e1 vcvt.f16.s32 s7, s7, #29
+ a4: eefb 39e1 vcvt.f16.u32 s7, s7, #29
+ a8: eefe 39e1 vcvt.s32.f16 s7, s7, #29
+ ac: eeff 39e1 vcvt.u32.f16 s7, s7, #29
+ b0: fefc 29c5 vcvta.s32.f16 s5, s10
+ b4: fefc 2945 vcvta.u32.f16 s5, s10
+ b8: feff 29c5 vcvtm.s32.f16 s5, s10
+ bc: feff 2945 vcvtm.u32.f16 s5, s10
+ c0: fefd 29c5 vcvtn.s32.f16 s5, s10
+ c4: fefd 2945 vcvtn.u32.f16 s5, s10
+ c8: fefe 29c5 vcvtp.s32.f16 s5, s10
+ cc: fefe 2945 vcvtp.u32.f16 s5, s10
+ d0: eefc 2945 vcvtr.u32.f16 s5, s10
+ d4: eefd 2945 vcvtr.s32.f16 s5, s10
+ d8: fef8 1965 vrinta.f16 s3, s11
+ dc: fefb 1965 vrintm.f16 s3, s11
+ e0: fef9 1965 vrintn.f16 s3, s11
+ e4: fefa 1965 vrintp.f16 s3, s11
+ e8: eef6 1965 vrintr.f16 s3, s11
+ ec: eef7 1965 vrintx.f16 s3, s11
+ f0: eef6 19e5 vrintz.f16 s3, s11
+ f4: fef0 2ae4 vins.f16 s5, s9
+ f8: fef0 2a64 vmovx.f16 s5, s9
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-simd-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-simd-ext.d
new file mode 100644
index 0000000..d551234
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-simd-ext.d
@@ -0,0 +1,159 @@
+#name: ARM v8.2 FP16 support on SIMD
+#source: armv8-2-fp16-simd.s
+#objdump: -d
+#as: -march=armv8.2-a+fp16
+#skip: *-*-pe *-*-wince
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+00000000 <func>:
+ 0: f3342d0e vabd.f16 d2, d4, d14
+ 4: f3384d6c vabd.f16 q2, q4, q14
+ 8: f2142f0e vmax.f16 d2, d4, d14
+ c: f2184f6c vmax.f16 q2, q4, q14
+ 10: f2342f0e vmin.f16 d2, d4, d14
+ 14: f2384f6c vmin.f16 q2, q4, q14
+ 18: f3300dec vabd.f16 q0, q8, q14
+ 1c: f2100fec vmax.f16 q0, q8, q14
+ 20: f2300fec vmin.f16 q0, q8, q14
+ 24: f3331d0f vabd.f16 d1, d3, d15
+ 28: f3310d08 vabd.f16 d0, d1, d8
+ 2c: f3b50708 vabs.f16 d0, d8
+ 30: f3b50760 vabs.f16 q0, q8
+ 34: f3b50788 vneg.f16 d0, d8
+ 38: f3b507e0 vneg.f16 q0, q8
+ 3c: f3b5474c vabs.f16 q2, q6
+ 40: f3b547cc vneg.f16 q2, q6
+ 44: f3b57703 vabs.f16 d7, d3
+ 48: f3b59781 vneg.f16 d9, d1
+ 4c: f3142e1e vacge.f16 d2, d4, d14
+ 50: f3184e7c vacge.f16 q2, q4, q14
+ 54: f3342e1e vacgt.f16 d2, d4, d14
+ 58: f3384e7c vacgt.f16 q2, q4, q14
+ 5c: f33e2e14 vacgt.f16 d2, d14, d4
+ 60: f33c4ed8 vacgt.f16 q2, q14, q4
+ 64: f31e2e14 vacge.f16 d2, d14, d4
+ 68: f31c4ed8 vacge.f16 q2, q14, q4
+ 6c: f2142e0e vceq.f16 d2, d4, d14
+ 70: f2184e6c vceq.f16 q2, q4, q14
+ 74: f3142e0e vcge.f16 d2, d4, d14
+ 78: f3184e6c vcge.f16 q2, q4, q14
+ 7c: f3342e0e vcgt.f16 d2, d4, d14
+ 80: f3384e6c vcgt.f16 q2, q4, q14
+ 84: f31e2e04 vcge.f16 d2, d14, d4
+ 88: f31c4ec8 vcge.f16 q2, q14, q4
+ 8c: f33e2e04 vcgt.f16 d2, d14, d4
+ 90: f33c4ec8 vcgt.f16 q2, q14, q4
+ 94: f3100efc vacge.f16 q0, q8, q14
+ 98: f3300efc vacgt.f16 q0, q8, q14
+ 9c: f33c0ef0 vacgt.f16 q0, q14, q8
+ a0: f31c0ef0 vacge.f16 q0, q14, q8
+ a4: f2100eec vceq.f16 q0, q8, q14
+ a8: f3100eec vcge.f16 q0, q8, q14
+ ac: f3300eec vcgt.f16 q0, q8, q14
+ b0: f31c0ee0 vcge.f16 q0, q14, q8
+ b4: f33c0ee0 vcgt.f16 q0, q14, q8
+ b8: f2142d0e vadd.f16 d2, d4, d14
+ bc: f2184d6c vadd.f16 q2, q4, q14
+ c0: f2342d0e vsub.f16 d2, d4, d14
+ c4: f2384d6c vsub.f16 q2, q4, q14
+ c8: f2100dec vadd.f16 q0, q8, q14
+ cc: f2300dec vsub.f16 q0, q8, q14
+ d0: f3142f1e vmaxnm.f16 d2, d4, d14
+ d4: f3184f7c vmaxnm.f16 q2, q4, q14
+ d8: f3342f1e vminnm.f16 d2, d4, d14
+ dc: f3384f7c vminnm.f16 q2, q4, q14
+ e0: f2142c1e vfma.f16 d2, d4, d14
+ e4: f2184c7c vfma.f16 q2, q4, q14
+ e8: f2342c1e vfms.f16 d2, d4, d14
+ ec: f2384c7c vfms.f16 q2, q4, q14
+ f0: f2142d1e vmla.f16 d2, d4, d14
+ f4: f2184d7c vmla.f16 q2, q4, q14
+ f8: f2342d1e vmls.f16 d2, d4, d14
+ fc: f2384d7c vmls.f16 q2, q4, q14
+ 100: f3b6458e vrintz.f16 d4, d14
+ 104: f3b685ec vrintz.f16 q4, q14
+ 108: f3b6448e vrintx.f16 d4, d14
+ 10c: f3b684ec vrintx.f16 q4, q14
+ 110: f3b6450e vrinta.f16 d4, d14
+ 114: f3b6856c vrinta.f16 q4, q14
+ 118: f3b6440e vrintn.f16 d4, d14
+ 11c: f3b6846c vrintn.f16 q4, q14
+ 120: f3b6478e vrintp.f16 d4, d14
+ 124: f3b687ec vrintp.f16 q4, q14
+ 128: f3b6468e vrintm.f16 d4, d14
+ 12c: f3b686ec vrintm.f16 q4, q14
+ 130: f3184d0e vpadd.f16 d4, d8, d14
+ 134: f3b74508 vrecpe.f16 d4, d8
+ 138: f3b78560 vrecpe.f16 q4, q8
+ 13c: f3b74588 vrsqrte.f16 d4, d8
+ 140: f3b785e0 vrsqrte.f16 q4, q8
+ 144: f3b70564 vrecpe.f16 q0, q10
+ 148: f3b705e4 vrsqrte.f16 q0, q10
+ 14c: f21a8f1c vrecps.f16 d8, d10, d12
+ 150: f2540ff8 vrecps.f16 q8, q10, q12
+ 154: f23a8f1c vrsqrts.f16 d8, d10, d12
+ 158: f2740ff8 vrsqrts.f16 q8, q10, q12
+ 15c: f2104f58 vrecps.f16 q2, q0, q4
+ 160: f2304f58 vrsqrts.f16 q2, q0, q4
+ 164: f3184f0e vpmax.f16 d4, d8, d14
+ 168: f338af02 vpmin.f16 d10, d8, d2
+ 16c: f3184d1e vmul.f16 d4, d8, d14
+ 170: f3107d11 vmul.f16 d7, d0, d1
+ 174: f3104dd0 vmul.f16 q2, q8, q0
+ 178: f3b7600c vcvta.s16.f16 d6, d12
+ 17c: f3b7c068 vcvta.s16.f16 q6, q12
+ 180: f3b7630c vcvtm.s16.f16 d6, d12
+ 184: f3b7c368 vcvtm.s16.f16 q6, q12
+ 188: f3b7610c vcvtn.s16.f16 d6, d12
+ 18c: f3b7c168 vcvtn.s16.f16 q6, q12
+ 190: f3b7620c vcvtp.s16.f16 d6, d12
+ 194: f3b7c268 vcvtp.s16.f16 q6, q12
+ 198: f3b7608c vcvta.u16.f16 d6, d12
+ 19c: f3b7c0e8 vcvta.u16.f16 q6, q12
+ 1a0: f3b7638c vcvtm.u16.f16 d6, d12
+ 1a4: f3b7c3e8 vcvtm.u16.f16 q6, q12
+ 1a8: f3b7618c vcvtn.u16.f16 d6, d12
+ 1ac: f3b7c1e8 vcvtn.u16.f16 q6, q12
+ 1b0: f3b7628c vcvtp.u16.f16 d6, d12
+ 1b4: f3b7c2e8 vcvtp.u16.f16 q6, q12
+ 1b8: f3b7e700 vcvt.s16.f16 d14, d0
+ 1bc: f3f7c740 vcvt.s16.f16 q14, q0
+ 1c0: f3b7e780 vcvt.u16.f16 d14, d0
+ 1c4: f3f7c7c0 vcvt.u16.f16 q14, q0
+ 1c8: f3b7e600 vcvt.f16.s16 d14, d0
+ 1cc: f3f7c640 vcvt.f16.s16 q14, q0
+ 1d0: f3b7e680 vcvt.f16.u16 d14, d0
+ 1d4: f3f7c6c0 vcvt.f16.u16 q14, q0
+ 1d8: f2bded10 vcvt.s16.f16 d14, d0, #3
+ 1dc: f2fdcd50 vcvt.s16.f16 q14, q0, #3
+ 1e0: f3bded10 vcvt.u16.f16 d14, d0, #3
+ 1e4: f3fdcd50 vcvt.u16.f16 q14, q0, #3
+ 1e8: f2bdec10 vcvt.f16.s16 d14, d0, #3
+ 1ec: f2fdcc50 vcvt.f16.s16 q14, q0, #3
+ 1f0: f3bdec10 vcvt.f16.u16 d14, d0, #3
+ 1f4: f3fdcc50 vcvt.f16.u16 q14, q0, #3
+ 1f8: f3b5e502 vceq.f16 d14, d2, #0
+ 1fc: f3f5c544 vceq.f16 q14, q2, #0
+ 200: f3b5e482 vcge.f16 d14, d2, #0
+ 204: f3f5c4c4 vcge.f16 q14, q2, #0
+ 208: f3b5e402 vcgt.f16 d14, d2, #0
+ 20c: f3f5c444 vcgt.f16 q14, q2, #0
+ 210: f3b5e582 vcle.f16 d14, d2, #0
+ 214: f3f5c5c4 vcle.f16 q14, q2, #0
+ 218: f3b5e602 vclt.f16 d14, d2, #0
+ 21c: f3f5c644 vclt.f16 q14, q2, #0
+ 220: f2907941 vmul.f16 d7, d0, d1\[0\]
+ 224: f2984966 vmul.f16 d4, d8, d6\[2\]
+ 228: f39049c8 vmul.f16 q2, q8, d0\[1\]
+ 22c: f39049ef vmul.f16 q2, q8, d7\[3\]
+ 230: f2942141 vmla.f16 d2, d4, d1\[0\]
+ 234: f3984141 vmla.f16 q2, q4, d1\[0\]
+ 238: f2942541 vmls.f16 d2, d4, d1\[0\]
+ 23c: f3984541 vmls.f16 q2, q4, d1\[0\]
+ 240: f298116f vmla.f16 d1, d8, d7\[3\]
+ 244: f39021ef vmla.f16 q1, q8, d7\[3\]
+ 248: f298156f vmls.f16 d1, d8, d7\[3\]
+ 24c: f39025ef vmls.f16 q1, q8, d7\[3\]
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-simd-thumb-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-simd-thumb-ext.d
new file mode 100644
index 0000000..5385fe3
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-simd-thumb-ext.d
@@ -0,0 +1,159 @@
+#name: ARM v8.2 FP16 support on SIMD (Thumb)
+#source: armv8-2-fp16-simd.s
+#objdump: -d
+#as: -march=armv8.2-a+fp16 -mthumb
+#skip: *-*-pe *-*-wince
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+00000000 <func>:
+ 0: ff34 2d0e vabd.f16 d2, d4, d14
+ 4: ff38 4d6c vabd.f16 q2, q4, q14
+ 8: ef14 2f0e vmax.f16 d2, d4, d14
+ c: ef18 4f6c vmax.f16 q2, q4, q14
+ 10: ef34 2f0e vmin.f16 d2, d4, d14
+ 14: ef38 4f6c vmin.f16 q2, q4, q14
+ 18: ff30 0dec vabd.f16 q0, q8, q14
+ 1c: ef10 0fec vmax.f16 q0, q8, q14
+ 20: ef30 0fec vmin.f16 q0, q8, q14
+ 24: ff33 1d0f vabd.f16 d1, d3, d15
+ 28: ff31 0d08 vabd.f16 d0, d1, d8
+ 2c: ffb5 0708 vabs.f16 d0, d8
+ 30: ffb5 0760 vabs.f16 q0, q8
+ 34: ffb5 0788 vneg.f16 d0, d8
+ 38: ffb5 07e0 vneg.f16 q0, q8
+ 3c: ffb5 474c vabs.f16 q2, q6
+ 40: ffb5 47cc vneg.f16 q2, q6
+ 44: ffb5 7703 vabs.f16 d7, d3
+ 48: ffb5 9781 vneg.f16 d9, d1
+ 4c: ff14 2e1e vacge.f16 d2, d4, d14
+ 50: ff18 4e7c vacge.f16 q2, q4, q14
+ 54: ff34 2e1e vacgt.f16 d2, d4, d14
+ 58: ff38 4e7c vacgt.f16 q2, q4, q14
+ 5c: ff3e 2e14 vacgt.f16 d2, d14, d4
+ 60: ff3c 4ed8 vacgt.f16 q2, q14, q4
+ 64: ff1e 2e14 vacge.f16 d2, d14, d4
+ 68: ff1c 4ed8 vacge.f16 q2, q14, q4
+ 6c: ef14 2e0e vceq.f16 d2, d4, d14
+ 70: ef18 4e6c vceq.f16 q2, q4, q14
+ 74: ff14 2e0e vcge.f16 d2, d4, d14
+ 78: ff18 4e6c vcge.f16 q2, q4, q14
+ 7c: ff34 2e0e vcgt.f16 d2, d4, d14
+ 80: ff38 4e6c vcgt.f16 q2, q4, q14
+ 84: ff1e 2e04 vcge.f16 d2, d14, d4
+ 88: ff1c 4ec8 vcge.f16 q2, q14, q4
+ 8c: ff3e 2e04 vcgt.f16 d2, d14, d4
+ 90: ff3c 4ec8 vcgt.f16 q2, q14, q4
+ 94: ff10 0efc vacge.f16 q0, q8, q14
+ 98: ff30 0efc vacgt.f16 q0, q8, q14
+ 9c: ff3c 0ef0 vacgt.f16 q0, q14, q8
+ a0: ff1c 0ef0 vacge.f16 q0, q14, q8
+ a4: ef10 0eec vceq.f16 q0, q8, q14
+ a8: ff10 0eec vcge.f16 q0, q8, q14
+ ac: ff30 0eec vcgt.f16 q0, q8, q14
+ b0: ff1c 0ee0 vcge.f16 q0, q14, q8
+ b4: ff3c 0ee0 vcgt.f16 q0, q14, q8
+ b8: ef14 2d0e vadd.f16 d2, d4, d14
+ bc: ef18 4d6c vadd.f16 q2, q4, q14
+ c0: ef34 2d0e vsub.f16 d2, d4, d14
+ c4: ef38 4d6c vsub.f16 q2, q4, q14
+ c8: ef10 0dec vadd.f16 q0, q8, q14
+ cc: ef30 0dec vsub.f16 q0, q8, q14
+ d0: ff14 2f1e vmaxnm.f16 d2, d4, d14
+ d4: ff18 4f7c vmaxnm.f16 q2, q4, q14
+ d8: ff34 2f1e vminnm.f16 d2, d4, d14
+ dc: ff38 4f7c vminnm.f16 q2, q4, q14
+ e0: ef14 2c1e vfma.f16 d2, d4, d14
+ e4: ef18 4c7c vfma.f16 q2, q4, q14
+ e8: ef34 2c1e vfms.f16 d2, d4, d14
+ ec: ef38 4c7c vfms.f16 q2, q4, q14
+ f0: ef14 2d1e vmla.f16 d2, d4, d14
+ f4: ef18 4d7c vmla.f16 q2, q4, q14
+ f8: ef34 2d1e vmls.f16 d2, d4, d14
+ fc: ef38 4d7c vmls.f16 q2, q4, q14
+ 100: ffb6 458e vrintz.f16 d4, d14
+ 104: ffb6 85ec vrintz.f16 q4, q14
+ 108: ffb6 448e vrintx.f16 d4, d14
+ 10c: ffb6 84ec vrintx.f16 q4, q14
+ 110: ffb6 450e vrinta.f16 d4, d14
+ 114: ffb6 856c vrinta.f16 q4, q14
+ 118: ffb6 440e vrintn.f16 d4, d14
+ 11c: ffb6 846c vrintn.f16 q4, q14
+ 120: ffb6 478e vrintp.f16 d4, d14
+ 124: ffb6 87ec vrintp.f16 q4, q14
+ 128: ffb6 468e vrintm.f16 d4, d14
+ 12c: ffb6 86ec vrintm.f16 q4, q14
+ 130: ff18 4d0e vpadd.f16 d4, d8, d14
+ 134: ffb7 4508 vrecpe.f16 d4, d8
+ 138: ffb7 8560 vrecpe.f16 q4, q8
+ 13c: ffb7 4588 vrsqrte.f16 d4, d8
+ 140: ffb7 85e0 vrsqrte.f16 q4, q8
+ 144: ffb7 0564 vrecpe.f16 q0, q10
+ 148: ffb7 05e4 vrsqrte.f16 q0, q10
+ 14c: ef1a 8f1c vrecps.f16 d8, d10, d12
+ 150: ef54 0ff8 vrecps.f16 q8, q10, q12
+ 154: ef3a 8f1c vrsqrts.f16 d8, d10, d12
+ 158: ef74 0ff8 vrsqrts.f16 q8, q10, q12
+ 15c: ef10 4f58 vrecps.f16 q2, q0, q4
+ 160: ef30 4f58 vrsqrts.f16 q2, q0, q4
+ 164: ff18 4f0e vpmax.f16 d4, d8, d14
+ 168: ff38 af02 vpmin.f16 d10, d8, d2
+ 16c: ff18 4d1e vmul.f16 d4, d8, d14
+ 170: ff10 7d11 vmul.f16 d7, d0, d1
+ 174: ff10 4dd0 vmul.f16 q2, q8, q0
+ 178: ffb7 600c vcvta.s16.f16 d6, d12
+ 17c: ffb7 c068 vcvta.s16.f16 q6, q12
+ 180: ffb7 630c vcvtm.s16.f16 d6, d12
+ 184: ffb7 c368 vcvtm.s16.f16 q6, q12
+ 188: ffb7 610c vcvtn.s16.f16 d6, d12
+ 18c: ffb7 c168 vcvtn.s16.f16 q6, q12
+ 190: ffb7 620c vcvtp.s16.f16 d6, d12
+ 194: ffb7 c268 vcvtp.s16.f16 q6, q12
+ 198: ffb7 608c vcvta.u16.f16 d6, d12
+ 19c: ffb7 c0e8 vcvta.u16.f16 q6, q12
+ 1a0: ffb7 638c vcvtm.u16.f16 d6, d12
+ 1a4: ffb7 c3e8 vcvtm.u16.f16 q6, q12
+ 1a8: ffb7 618c vcvtn.u16.f16 d6, d12
+ 1ac: ffb7 c1e8 vcvtn.u16.f16 q6, q12
+ 1b0: ffb7 628c vcvtp.u16.f16 d6, d12
+ 1b4: ffb7 c2e8 vcvtp.u16.f16 q6, q12
+ 1b8: ffb7 e700 vcvt.s16.f16 d14, d0
+ 1bc: fff7 c740 vcvt.s16.f16 q14, q0
+ 1c0: ffb7 e780 vcvt.u16.f16 d14, d0
+ 1c4: fff7 c7c0 vcvt.u16.f16 q14, q0
+ 1c8: ffb7 e600 vcvt.f16.s16 d14, d0
+ 1cc: fff7 c640 vcvt.f16.s16 q14, q0
+ 1d0: ffb7 e680 vcvt.f16.u16 d14, d0
+ 1d4: fff7 c6c0 vcvt.f16.u16 q14, q0
+ 1d8: efbd ed10 vcvt.s16.f16 d14, d0, #3
+ 1dc: effd cd50 vcvt.s16.f16 q14, q0, #3
+ 1e0: ffbd ed10 vcvt.u16.f16 d14, d0, #3
+ 1e4: fffd cd50 vcvt.u16.f16 q14, q0, #3
+ 1e8: efbd ec10 vcvt.f16.s16 d14, d0, #3
+ 1ec: effd cc50 vcvt.f16.s16 q14, q0, #3
+ 1f0: ffbd ec10 vcvt.f16.u16 d14, d0, #3
+ 1f4: fffd cc50 vcvt.f16.u16 q14, q0, #3
+ 1f8: ffb5 e502 vceq.f16 d14, d2, #0
+ 1fc: fff5 c544 vceq.f16 q14, q2, #0
+ 200: ffb5 e482 vcge.f16 d14, d2, #0
+ 204: fff5 c4c4 vcge.f16 q14, q2, #0
+ 208: ffb5 e402 vcgt.f16 d14, d2, #0
+ 20c: fff5 c444 vcgt.f16 q14, q2, #0
+ 210: ffb5 e582 vcle.f16 d14, d2, #0
+ 214: fff5 c5c4 vcle.f16 q14, q2, #0
+ 218: ffb5 e602 vclt.f16 d14, d2, #0
+ 21c: fff5 c644 vclt.f16 q14, q2, #0
+ 220: ef90 7941 vmul.f16 d7, d0, d1\[0\]
+ 224: ef98 4966 vmul.f16 d4, d8, d6\[2\]
+ 228: ff90 49c8 vmul.f16 q2, q8, d0\[1\]
+ 22c: ff90 49ef vmul.f16 q2, q8, d7\[3\]
+ 230: ef94 2141 vmla.f16 d2, d4, d1\[0\]
+ 234: ff98 4141 vmla.f16 q2, q4, d1\[0\]
+ 238: ef94 2541 vmls.f16 d2, d4, d1\[0\]
+ 23c: ff98 4541 vmls.f16 q2, q4, d1\[0\]
+ 240: ef98 116f vmla.f16 d1, d8, d7\[3\]
+ 244: ff90 21ef vmla.f16 q1, q8, d7\[3\]
+ 248: ef98 156f vmls.f16 d1, d8, d7\[3\]
+ 24c: ff90 25ef vmls.f16 q1, q8, d7\[3\]
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-ext.d
new file mode 100644
index 0000000..abaeb43
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-ext.d
@@ -0,0 +1,4 @@
+#name: Reject ARM v8.2 FP16 SIMD instruction for early arch
+#source: armv8-2-fp16-simd.s
+#as: -march=armv8.2-a+simd
+#error_output: armv8-2-fp16-simd-warning.l
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-thumb-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-thumb-ext.d
new file mode 100644
index 0000000..8f92525
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-simd-warning-thumb-ext.d
@@ -0,0 +1,4 @@
+#name: Reject ARM v8.2 FP16 SIMD instruction for early arch (Thumb)
+#source: armv8-2-fp16-simd.s
+#as: -march=armv8.2-a+simd -mthumb
+#error_output: armv8-2-fp16-simd-warning.l
diff --git a/gas/testsuite/gas/arm/armv8_2+rdma-ext.d b/gas/testsuite/gas/arm/armv8_2+rdma-ext.d
new file mode 100644
index 0000000..159a530
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2+rdma-ext.d
@@ -0,0 +1,79 @@
+#name: Valid ARMv8.2-A with ARMv8.1-A NEON instructions.
+#as: -march=armv8.2-a+simd
+#objdump: -dr
+#skip: *-*-pe *-*-wince
+#source: armv8-a+rdma.s
+
+.*: +file format .*arm.*
+
+
+Disassembly of section .text:
+
+00000000 <.*>:
+ 0: f3110b12 vqrdmlah.s16 d0, d1, d2
+ 4: f3120b54 vqrdmlah.s16 q0, q1, q2
+ 8: f3210b12 vqrdmlah.s32 d0, d1, d2
+ c: f3220b54 vqrdmlah.s32 q0, q1, q2
+ 10: f3110c12 vqrdmlsh.s16 d0, d1, d2
+ 14: f3120c54 vqrdmlsh.s16 q0, q1, q2
+ 18: f3210c12 vqrdmlsh.s32 d0, d1, d2
+ 1c: f3220c54 vqrdmlsh.s32 q0, q1, q2
+ 20: f2910e42 vqrdmlah.s16 d0, d1, d2\[0\]
+ 24: f2910e4a vqrdmlah.s16 d0, d1, d2\[1\]
+ 28: f2910e62 vqrdmlah.s16 d0, d1, d2\[2\]
+ 2c: f2910e6a vqrdmlah.s16 d0, d1, d2\[3\]
+ 30: f3920e42 vqrdmlah.s16 q0, q1, d2\[0\]
+ 34: f3920e4a vqrdmlah.s16 q0, q1, d2\[1\]
+ 38: f3920e62 vqrdmlah.s16 q0, q1, d2\[2\]
+ 3c: f3920e6a vqrdmlah.s16 q0, q1, d2\[3\]
+ 40: f2a10e42 vqrdmlah.s32 d0, d1, d2\[0\]
+ 44: f2a10e62 vqrdmlah.s32 d0, d1, d2\[1\]
+ 48: f3a20e42 vqrdmlah.s32 q0, q1, d2\[0\]
+ 4c: f3a20e62 vqrdmlah.s32 q0, q1, d2\[1\]
+ 50: f2910f42 vqrdmlsh.s16 d0, d1, d2\[0\]
+ 54: f2910f4a vqrdmlsh.s16 d0, d1, d2\[1\]
+ 58: f2910f62 vqrdmlsh.s16 d0, d1, d2\[2\]
+ 5c: f2910f6a vqrdmlsh.s16 d0, d1, d2\[3\]
+ 60: f3920f42 vqrdmlsh.s16 q0, q1, d2\[0\]
+ 64: f3920f4a vqrdmlsh.s16 q0, q1, d2\[1\]
+ 68: f3920f62 vqrdmlsh.s16 q0, q1, d2\[2\]
+ 6c: f3920f6a vqrdmlsh.s16 q0, q1, d2\[3\]
+ 70: f2a10f42 vqrdmlsh.s32 d0, d1, d2\[0\]
+ 74: f2a10f62 vqrdmlsh.s32 d0, d1, d2\[1\]
+ 78: f3a20f42 vqrdmlsh.s32 q0, q1, d2\[0\]
+ 7c: f3a20f62 vqrdmlsh.s32 q0, q1, d2\[1\]
+
+00000080 <.*>:
+ 80: ff11 0b12 vqrdmlah.s16 d0, d1, d2
+ 84: ff12 0b54 vqrdmlah.s16 q0, q1, q2
+ 88: ff21 0b12 vqrdmlah.s32 d0, d1, d2
+ 8c: ff22 0b54 vqrdmlah.s32 q0, q1, q2
+ 90: ff11 0c12 vqrdmlsh.s16 d0, d1, d2
+ 94: ff12 0c54 vqrdmlsh.s16 q0, q1, q2
+ 98: ff21 0c12 vqrdmlsh.s32 d0, d1, d2
+ 9c: ff22 0c54 vqrdmlsh.s32 q0, q1, q2
+ a0: ef91 0e42 vqrdmlah.s16 d0, d1, d2\[0\]
+ a4: ef91 0e4a vqrdmlah.s16 d0, d1, d2\[1\]
+ a8: ef91 0e62 vqrdmlah.s16 d0, d1, d2\[2\]
+ ac: ef91 0e6a vqrdmlah.s16 d0, d1, d2\[3\]
+ b0: ff92 0e42 vqrdmlah.s16 q0, q1, d2\[0\]
+ b4: ff92 0e4a vqrdmlah.s16 q0, q1, d2\[1\]
+ b8: ff92 0e62 vqrdmlah.s16 q0, q1, d2\[2\]
+ bc: ff92 0e6a vqrdmlah.s16 q0, q1, d2\[3\]
+ c0: efa1 0e42 vqrdmlah.s32 d0, d1, d2\[0\]
+ c4: efa1 0e62 vqrdmlah.s32 d0, d1, d2\[1\]
+ c8: ffa2 0e42 vqrdmlah.s32 q0, q1, d2\[0\]
+ cc: ffa2 0e62 vqrdmlah.s32 q0, q1, d2\[1\]
+ d0: ef91 0f42 vqrdmlsh.s16 d0, d1, d2\[0\]
+ d4: ef91 0f4a vqrdmlsh.s16 d0, d1, d2\[1\]
+ d8: ef91 0f62 vqrdmlsh.s16 d0, d1, d2\[2\]
+ dc: ef91 0f6a vqrdmlsh.s16 d0, d1, d2\[3\]
+ e0: ff92 0f42 vqrdmlsh.s16 q0, q1, d2\[0\]
+ e4: ff92 0f4a vqrdmlsh.s16 q0, q1, d2\[1\]
+ e8: ff92 0f62 vqrdmlsh.s16 q0, q1, d2\[2\]
+ ec: ff92 0f6a vqrdmlsh.s16 q0, q1, d2\[3\]
+ f0: efa1 0f42 vqrdmlsh.s32 d0, d1, d2\[0\]
+ f4: efa1 0f62 vqrdmlsh.s32 d0, d1, d2\[1\]
+ f8: ffa2 0f42 vqrdmlsh.s32 q0, q1, d2\[0\]
+ fc: ffa2 0f62 vqrdmlsh.s32 q0, q1, d2\[1\]
+
diff --git a/gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2-ext.d b/gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2-ext.d
new file mode 100644
index 0000000..4b7783a
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16-thumb2-ext.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.2-a+fp16fml -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_ext.d b/gas/testsuite/gas/arm/armv8_2-a-fp16_ext.d
new file mode 100644
index 0000000..836ecfc
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_2-a-fp16_ext.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.2-a+fp16fml
+#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_3-a-fp-bad-ext.d b/gas/testsuite/gas/arm/armv8_3-a-fp-bad-ext.d
new file mode 100644
index 0000000..3b1e299
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_3-a-fp-bad-ext.d
@@ -0,0 +1,3 @@
+#as: -march=armv8.3-a+simd
+#source: armv8_3-a-fp-bad.s
+#error_output: armv8_3-a-fp-bad.l
diff --git a/gas/testsuite/gas/arm/armv8_3-a-fp-ext.d b/gas/testsuite/gas/arm/armv8_3-a-fp-ext.d
new file mode 100644
index 0000000..81710e3
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_3-a-fp-ext.d
@@ -0,0 +1,16 @@
+#as: -march=armv8.3-a+simd
+#source: armv8_3-a-fp.s
+#objdump: -dr
+#skip: *-*-pe *-wince-*
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+[0-9a-f]+ <.*>:
+ [0-9a-f]+: eef90bc7 vjcvt.s32.f64 s1, d7
+ [0-9a-f]+: eef90bc7 vjcvt.s32.f64 s1, d7
+
+[0-9a-f]+ <.*>:
+ [0-9a-f]+: eef9 0bc7 vjcvt.s32.f64 s1, d7
+
diff --git a/gas/testsuite/gas/arm/armv8_3-a-fp16-ext.d b/gas/testsuite/gas/arm/armv8_3-a-fp16-ext.d
new file mode 100644
index 0000000..80716b5
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_3-a-fp16-ext.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.3-a+fp16fml
+#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_3-a-simd-bad-ext.d b/gas/testsuite/gas/arm/armv8_3-a-simd-bad-ext.d
new file mode 100644
index 0000000..a212367
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_3-a-simd-bad-ext.d
@@ -0,0 +1,3 @@
+#as: -march=armv8.3-a+fp16
+#source: armv8_3-a-simd-bad.s
+#error_output: armv8_3-a-simd-bad.l
diff --git a/gas/testsuite/gas/arm/armv8_4-a-fp16-ext.d b/gas/testsuite/gas/arm/armv8_4-a-fp16-ext.d
new file mode 100644
index 0000000..5746bbf
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8_4-a-fp16-ext.d
@@ -0,0 +1,249 @@
+#as: -march=armv8.4-a+fp16
+#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/armv8m.main+fp.d b/gas/testsuite/gas/arm/armv8m.main+fp.d
new file mode 100644
index 0000000..cc318e2
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8m.main+fp.d
@@ -0,0 +1,32 @@
+#name: Valid armv8-m.main+fp
+#as: -march=armv8-m.main+fp
+#source: fpv5-sp-d16.s
+#objdump: -dr --prefix-addresses --show-raw-insn
+#skip: *-*-pe *-wince-*
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+0[0-9a-f]+ <[^>]+> fe00 0a00 vseleq.f32 s0, s0, s0
+0[0-9a-f]+ <[^>]+> fe50 0aa0 vselvs.f32 s1, s1, s1
+0[0-9a-f]+ <[^>]+> fe2f fa0f vselge.f32 s30, s30, s30
+0[0-9a-f]+ <[^>]+> fe7f faaf vselgt.f32 s31, s31, s31
+0[0-9a-f]+ <[^>]+> fe80 0a00 vmaxnm.f32 s0, s0, s0
+0[0-9a-f]+ <[^>]+> fec0 0aa0 vmaxnm.f32 s1, s1, s1
+0[0-9a-f]+ <[^>]+> fe8f fa0f vmaxnm.f32 s30, s30, s30
+0[0-9a-f]+ <[^>]+> fecf faaf vmaxnm.f32 s31, s31, s31
+0[0-9a-f]+ <[^>]+> fe80 0a40 vminnm.f32 s0, s0, s0
+0[0-9a-f]+ <[^>]+> fec0 0ae0 vminnm.f32 s1, s1, s1
+0[0-9a-f]+ <[^>]+> fe8f fa4f vminnm.f32 s30, s30, s30
+0[0-9a-f]+ <[^>]+> fecf faef vminnm.f32 s31, s31, s31
+0[0-9a-f]+ <[^>]+> febc 0ac0 vcvta.s32.f32 s0, s0
+0[0-9a-f]+ <[^>]+> fefd 0ae0 vcvtn.s32.f32 s1, s1
+0[0-9a-f]+ <[^>]+> febe fa4f vcvtp.u32.f32 s30, s30
+0[0-9a-f]+ <[^>]+> feff fa6f vcvtm.u32.f32 s31, s31
+0[0-9a-f]+ <[^>]+> eeb6 0ac0 vrintz.f32 s0, s0
+0[0-9a-f]+ <[^>]+> eef7 0a60 vrintx.f32 s1, s1
+0[0-9a-f]+ <[^>]+> eeb6 fa4f vrintr.f32 s30, s30
+0[0-9a-f]+ <[^>]+> feb8 0a40 vrinta.f32 s0, s0
+0[0-9a-f]+ <[^>]+> fef9 0a60 vrintn.f32 s1, s1
+0[0-9a-f]+ <[^>]+> feba fa4f vrintp.f32 s30, s30
+0[0-9a-f]+ <[^>]+> fefb fa6f vrintm.f32 s31, s31
diff --git a/gas/testsuite/gas/arm/armv8m.main+fp.dp.d b/gas/testsuite/gas/arm/armv8m.main+fp.dp.d
new file mode 100644
index 0000000..aef8119
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8m.main+fp.dp.d
@@ -0,0 +1,63 @@
+#name: Valid armv8-m.main+fp.dp
+#as: -march=armv8-m.main+fp.dp
+#source: fpv5-d16.s
+#objdump: -dr --prefix-addresses --show-raw-insn
+#skip: *-*-pe *-wince-*
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+0[0-9a-f]+ <[^>]+> fe00 0a00 vseleq.f32 s0, s0, s0
+0[0-9a-f]+ <[^>]+> fe50 0aa0 vselvs.f32 s1, s1, s1
+0[0-9a-f]+ <[^>]+> fe2f fa0f vselge.f32 s30, s30, s30
+0[0-9a-f]+ <[^>]+> fe7f faaf vselgt.f32 s31, s31, s31
+0[0-9a-f]+ <[^>]+> fe00 0b00 vseleq.f64 d0, d0, d0
+0[0-9a-f]+ <[^>]+> fe18 8b08 vselvs.f64 d8, d8, d8
+0[0-9a-f]+ <[^>]+> fe2f fb0f vselge.f64 d15, d15, d15
+0[0-9a-f]+ <[^>]+> fe3a ab0a vselgt.f64 d10, d10, d10
+0[0-9a-f]+ <[^>]+> fe80 0a00 vmaxnm.f32 s0, s0, s0
+0[0-9a-f]+ <[^>]+> fec0 0aa0 vmaxnm.f32 s1, s1, s1
+0[0-9a-f]+ <[^>]+> fe8f fa0f vmaxnm.f32 s30, s30, s30
+0[0-9a-f]+ <[^>]+> fecf faaf vmaxnm.f32 s31, s31, s31
+0[0-9a-f]+ <[^>]+> fe80 0b00 vmaxnm.f64 d0, d0, d0
+0[0-9a-f]+ <[^>]+> fe88 8b08 vmaxnm.f64 d8, d8, d8
+0[0-9a-f]+ <[^>]+> fe8f fb0f vmaxnm.f64 d15, d15, d15
+0[0-9a-f]+ <[^>]+> fe8a ab0a vmaxnm.f64 d10, d10, d10
+0[0-9a-f]+ <[^>]+> fe80 0a40 vminnm.f32 s0, s0, s0
+0[0-9a-f]+ <[^>]+> fec0 0ae0 vminnm.f32 s1, s1, s1
+0[0-9a-f]+ <[^>]+> fe8f fa4f vminnm.f32 s30, s30, s30
+0[0-9a-f]+ <[^>]+> fecf faef vminnm.f32 s31, s31, s31
+0[0-9a-f]+ <[^>]+> fe80 0b40 vminnm.f64 d0, d0, d0
+0[0-9a-f]+ <[^>]+> fe88 8b48 vminnm.f64 d8, d8, d8
+0[0-9a-f]+ <[^>]+> fe8f fb4f vminnm.f64 d15, d15, d15
+0[0-9a-f]+ <[^>]+> fe8a ab4a vminnm.f64 d10, d10, d10
+0[0-9a-f]+ <[^>]+> febc 0ac0 vcvta.s32.f32 s0, s0
+0[0-9a-f]+ <[^>]+> fefd 0ae0 vcvtn.s32.f32 s1, s1
+0[0-9a-f]+ <[^>]+> febe fa4f vcvtp.u32.f32 s30, s30
+0[0-9a-f]+ <[^>]+> feff fa6f vcvtm.u32.f32 s31, s31
+0[0-9a-f]+ <[^>]+> febc 0bc0 vcvta.s32.f64 s0, d0
+0[0-9a-f]+ <[^>]+> fefd 0bc8 vcvtn.s32.f64 s1, d8
+0[0-9a-f]+ <[^>]+> febe fb4f vcvtp.u32.f64 s30, d15
+0[0-9a-f]+ <[^>]+> feff fb4a vcvtm.u32.f64 s31, d10
+0[0-9a-f]+ <[^>]+> eeb6 0ac0 vrintz.f32 s0, s0
+0[0-9a-f]+ <[^>]+> eef7 0a60 vrintx.f32 s1, s1
+0[0-9a-f]+ <[^>]+> eeb6 fa4f vrintr.f32 s30, s30
+0[0-9a-f]+ <[^>]+> feb8 0a40 vrinta.f32 s0, s0
+0[0-9a-f]+ <[^>]+> fef9 0a60 vrintn.f32 s1, s1
+0[0-9a-f]+ <[^>]+> feba fa4f vrintp.f32 s30, s30
+0[0-9a-f]+ <[^>]+> fefb fa6f vrintm.f32 s31, s31
+0[0-9a-f]+ <[^>]+> eeb6 0bc0 vrintz.f64 d0, d0
+0[0-9a-f]+ <[^>]+> eeb7 1b41 vrintx.f64 d1, d1
+0[0-9a-f]+ <[^>]+> eeb6 ab4a vrintr.f64 d10, d10
+0[0-9a-f]+ <[^>]+> feb8 0b40 vrinta.f64 d0, d0
+0[0-9a-f]+ <[^>]+> feb9 1b41 vrintn.f64 d1, d1
+0[0-9a-f]+ <[^>]+> feba ab4a vrintp.f64 d10, d10
+0[0-9a-f]+ <[^>]+> febb ab4a vrintm.f64 d10, d10
+0[0-9a-f]+ <[^>]+> eeb3 0bc0 vcvtt.f16.f64 s0, d0
+0[0-9a-f]+ <[^>]+> eef3 0b48 vcvtb.f16.f64 s1, d8
+0[0-9a-f]+ <[^>]+> eeb3 fbcf vcvtt.f16.f64 s30, d15
+0[0-9a-f]+ <[^>]+> eef3 fb4a vcvtb.f16.f64 s31, d10
+0[0-9a-f]+ <[^>]+> eeb2 0bc0 vcvtt.f64.f16 d0, s0
+0[0-9a-f]+ <[^>]+> eeb2 8b60 vcvtb.f64.f16 d8, s1
+0[0-9a-f]+ <[^>]+> eeb2 fbcf vcvtt.f64.f16 d15, s30
+0[0-9a-f]+ <[^>]+> eeb2 ab6f vcvtb.f64.f16 d10, s31
diff --git a/gas/testsuite/gas/arm/attr-ext-fpv5-d16.d b/gas/testsuite/gas/arm/attr-ext-fpv5-d16.d
new file mode 100644
index 0000000..eb09cd2
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-fpv5-d16.d
@@ -0,0 +1,14 @@
+# name: attributes for fpv5-d16 using architecture extensions
+# source: blank.s
+# as: -march=armv7e-m+fp.dp
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7E-M"
+ Tag_CPU_arch: v7E-M
+ Tag_CPU_arch_profile: Microcontroller
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: FPv5/FP-D16 for ARMv8
diff --git a/gas/testsuite/gas/arm/attr-ext-fpv5.d b/gas/testsuite/gas/arm/attr-ext-fpv5.d
new file mode 100644
index 0000000..e671e32
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-fpv5.d
@@ -0,0 +1,15 @@
+# name: attributes for fpv5 using architecture extensions
+# source: blank.s
+# as: -march=armv7e-m+fpv5
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7E-M"
+ Tag_CPU_arch: v7E-M
+ Tag_CPU_arch_profile: Microcontroller
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: FPv5/FP-D16 for ARMv8
+ Tag_ABI_HardFP_use: SP only
diff --git a/gas/testsuite/gas/arm/attr-ext-idiv.d b/gas/testsuite/gas/arm/attr-ext-idiv.d
new file mode 100644
index 0000000..2be50d5
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-idiv.d
@@ -0,0 +1,15 @@
+# name: attributes for idiv using architecture extensions
+# source: blank.s
+# as: -march=armv7-r+idiv
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7-R"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Realtime
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_DIV_use: Allowed in v7-A with integer division extension
diff --git a/gas/testsuite/gas/arm/attr-ext-mp.d b/gas/testsuite/gas/arm/attr-ext-mp.d
new file mode 100644
index 0000000..cc3972d
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-mp.d
@@ -0,0 +1,15 @@
+# name: attributes for mp using architecture extensions
+# source: blank.s
+# as: -march=armv7-a+mp
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7-A"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_MPextension_use: Allowed
diff --git a/gas/testsuite/gas/arm/attr-ext-neon-fp16.d b/gas/testsuite/gas/arm/attr-ext-neon-fp16.d
new file mode 100644
index 0000000..b35305f
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-neon-fp16.d
@@ -0,0 +1,20 @@
+# name: attributes for neon-fp16 using architecture extensions
+# source: blank.s
+# as: -march=armv7ve+neon-fp16
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7VE"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3
+ Tag_Advanced_SIMD_arch: NEONv1
+ Tag_FP_HP_extension: Allowed
+ Tag_MPextension_use: Allowed
+ Tag_DIV_use: Allowed in v7-A with integer division extension
+ Tag_Virtualization_use: TrustZone and Virtualization Extensions
diff --git a/gas/testsuite/gas/arm/attr-ext-neon-vfpv3.d b/gas/testsuite/gas/arm/attr-ext-neon-vfpv3.d
new file mode 100644
index 0000000..3a5017e
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-neon-vfpv3.d
@@ -0,0 +1,16 @@
+# name: attributes for neon-vfpv3 using architecture extensions
+# source: blank.s
+# as: -march=armv7-a+simd
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7-A"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3
+ Tag_Advanced_SIMD_arch: NEONv1
diff --git a/gas/testsuite/gas/arm/attr-ext-neon-vfpv4.d b/gas/testsuite/gas/arm/attr-ext-neon-vfpv4.d
new file mode 100644
index 0000000..a41b079
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-neon-vfpv4.d
@@ -0,0 +1,19 @@
+# name: attributes for neon-vfpv4 using architecture extensions
+# source: blank.s
+# as: -march=armv7ve+simd
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7VE"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv4
+ Tag_Advanced_SIMD_arch: NEONv1 with Fused-MAC
+ Tag_MPextension_use: Allowed
+ Tag_DIV_use: Allowed in v7-A with integer division extension
+ Tag_Virtualization_use: TrustZone and Virtualization Extensions
diff --git a/gas/testsuite/gas/arm/attr-ext-sec.d b/gas/testsuite/gas/arm/attr-ext-sec.d
new file mode 100644
index 0000000..0e48879
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-sec.d
@@ -0,0 +1,15 @@
+# name: attributes for sec using architecture extensions
+# source: blank.s
+# as: -march=armv7-a+sec
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7-A"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_Virtualization_use: TrustZone
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv3-d16-fp16.d b/gas/testsuite/gas/arm/attr-ext-vfpv3-d16-fp16.d
new file mode 100644
index 0000000..f7150b9
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv3-d16-fp16.d
@@ -0,0 +1,21 @@
+# name: attributes for architecture extension vfpv3-d16-fp16
+# source: blank.s
+# as: -march=armv7ve+vfpv3-d16-fp16
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7VE"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3-D16
+ Tag_FP_HP_extension: Allowed
+ Tag_MPextension_use: Allowed
+ Tag_DIV_use: Allowed in v7-A with integer division extension
+ Tag_Virtualization_use: TrustZone and Virtualization Extensions
+
+
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv3-d16.d b/gas/testsuite/gas/arm/attr-ext-vfpv3-d16.d
new file mode 100644
index 0000000..90799e6
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv3-d16.d
@@ -0,0 +1,14 @@
+# name: attributes for architecture extension vfpv3-d16
+# source: blank.s
+# as: -march=armv7+fp
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7"
+ Tag_CPU_arch: v7
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3-D16
+
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv3-fp16.d b/gas/testsuite/gas/arm/attr-ext-vfpv3-fp16.d
new file mode 100644
index 0000000..1341231
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv3-fp16.d
@@ -0,0 +1,20 @@
+# name: attributes for architecture extension vfpv3-fp16
+# source: blank.s
+# as: -march=armv7ve+vfpv3-fp16
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7VE"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3
+ Tag_FP_HP_extension: Allowed
+ Tag_MPextension_use: Allowed
+ Tag_DIV_use: Allowed in v7-A with integer division extension
+ Tag_Virtualization_use: TrustZone and Virtualization Extensions
+
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv3.d b/gas/testsuite/gas/arm/attr-ext-vfpv3.d
new file mode 100644
index 0000000..7c7ed53
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv3.d
@@ -0,0 +1,15 @@
+# name: attributes for architecture extension vfpv3
+# source: blank.s
+# as: -march=armv7a+vfpv3
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7A"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv3xd-fp.d b/gas/testsuite/gas/arm/attr-ext-vfpv3xd-fp.d
new file mode 100644
index 0000000..bd51056
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv3xd-fp.d
@@ -0,0 +1,17 @@
+# name: attributes for vfpv3xd-fp16 using architecture extensions
+# source: blank.s
+# as: -march=armv7-r+vfpv3xd-fp16
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7-R"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Realtime
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3-D16
+ Tag_ABI_HardFP_use: SP only
+ Tag_FP_HP_extension: Allowed
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv3xd.d b/gas/testsuite/gas/arm/attr-ext-vfpv3xd.d
new file mode 100644
index 0000000..3ced819
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv3xd.d
@@ -0,0 +1,16 @@
+# name: attributes for vfpv3xd using architecture extensions
+# source: blank.s
+# as: -march=armv7-r+fp.sp
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7-R"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Realtime
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv3-D16
+ Tag_ABI_HardFP_use: SP only
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv4-d16.d b/gas/testsuite/gas/arm/attr-ext-vfpv4-d16.d
new file mode 100644
index 0000000..6e1a160
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv4-d16.d
@@ -0,0 +1,18 @@
+# name: attributes for vfpv4-d16 using architecture extensions
+# source: blank.s
+# as: -march=armv7ve+fp
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7VE"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv4-D16
+ Tag_MPextension_use: Allowed
+ Tag_DIV_use: Allowed in v7-A with integer division extension
+ Tag_Virtualization_use: TrustZone and Virtualization Extensions
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv4-sp-d16.d b/gas/testsuite/gas/arm/attr-ext-vfpv4-sp-d16.d
new file mode 100644
index 0000000..06bb494
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv4-sp-d16.d
@@ -0,0 +1,15 @@
+# name: attributes for vfpv4-sp-d16 using architecture extensions
+# source: blank.s
+# as: -march=armv7e-m+fp
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7E-M"
+ Tag_CPU_arch: v7E-M
+ Tag_CPU_arch_profile: Microcontroller
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv4-D16
+ Tag_ABI_HardFP_use: SP only
diff --git a/gas/testsuite/gas/arm/attr-ext-vfpv4.d b/gas/testsuite/gas/arm/attr-ext-vfpv4.d
new file mode 100644
index 0000000..397fba3
--- /dev/null
+++ b/gas/testsuite/gas/arm/attr-ext-vfpv4.d
@@ -0,0 +1,18 @@
+# name: attributes for vfpv4 using architecture extensions
+# source: blank.s
+# as: -march=armv7ve+vfpv4
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+ Tag_CPU_name: "7VE"
+ Tag_CPU_arch: v7
+ Tag_CPU_arch_profile: Application
+ Tag_ARM_ISA_use: Yes
+ Tag_THUMB_ISA_use: Thumb-2
+ Tag_FP_arch: VFPv4
+ Tag_MPextension_use: Allowed
+ Tag_DIV_use: Allowed in v7-A with integer division extension
+ Tag_Virtualization_use: TrustZone and Virtualization Extensions
diff --git a/gas/testsuite/gas/arm/attr-mfpu-neon-fp16.d b/gas/testsuite/gas/arm/attr-mfpu-neon-fp16.d
index ab72945..9a6369a 100644
--- a/gas/testsuite/gas/arm/attr-mfpu-neon-fp16.d
+++ b/gas/testsuite/gas/arm/attr-mfpu-neon-fp16.d
@@ -1,14 +1,12 @@
# name: attributes for -mfpu=neon-fp16
# source: blank.s
-# as: -mfpu=neon-fp16
+# as: -march=armv7-a+neon-fp16
# readelf: -A
# This test is only valid on EABI based ports.
# target: *-*-*eabi* *-*-nacl*
-
-Attribute Section: aeabi
-File Attributes
+#...
Tag_ARM_ISA_use: Yes
- Tag_THUMB_ISA_use: Thumb-1
+ Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3
Tag_Advanced_SIMD_arch: NEONv1
Tag_FP_HP_extension: Allowed
diff --git a/gas/testsuite/gas/arm/dotprod-mandatory-ext.d b/gas/testsuite/gas/arm/dotprod-mandatory-ext.d
new file mode 100644
index 0000000..34f6a69
--- /dev/null
+++ b/gas/testsuite/gas/arm/dotprod-mandatory-ext.d
@@ -0,0 +1,297 @@
+#as: -march=armv8.4-a+simd
+#source: dotprod.s
+#objdump: -d
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+.* <.*>:
+.*: fc220d10 vudot.u8 d0, d2, d0
+.*: fe220d10 vudot.u8 d0, d2, d0\[0\]
+.*: fc220d18 vudot.u8 d0, d2, d8
+.*: fe220d18 vudot.u8 d0, d2, d8\[0\]
+.*: fc220d1f vudot.u8 d0, d2, d15
+.*: fe220d1f vudot.u8 d0, d2, d15\[0\]
+.*: fc2f0d10 vudot.u8 d0, d15, d0
+.*: fe2f0d10 vudot.u8 d0, d15, d0\[0\]
+.*: fc2f0d18 vudot.u8 d0, d15, d8
+.*: fe2f0d18 vudot.u8 d0, d15, d8\[0\]
+.*: fc2f0d1f vudot.u8 d0, d15, d15
+.*: fe2f0d1f vudot.u8 d0, d15, d15\[0\]
+.*: fc2e0d90 vudot.u8 d0, d30, d0
+.*: fe2e0d90 vudot.u8 d0, d30, d0\[0\]
+.*: fc2e0d98 vudot.u8 d0, d30, d8
+.*: fe2e0d98 vudot.u8 d0, d30, d8\[0\]
+.*: fc2e0d9f vudot.u8 d0, d30, d15
+.*: fe2e0d9f vudot.u8 d0, d30, d15\[0\]
+.*: fc227d10 vudot.u8 d7, d2, d0
+.*: fe227d10 vudot.u8 d7, d2, d0\[0\]
+.*: fc227d18 vudot.u8 d7, d2, d8
+.*: fe227d18 vudot.u8 d7, d2, d8\[0\]
+.*: fc227d1f vudot.u8 d7, d2, d15
+.*: fe227d1f vudot.u8 d7, d2, d15\[0\]
+.*: fc2f7d10 vudot.u8 d7, d15, d0
+.*: fe2f7d10 vudot.u8 d7, d15, d0\[0\]
+.*: fc2f7d18 vudot.u8 d7, d15, d8
+.*: fe2f7d18 vudot.u8 d7, d15, d8\[0\]
+.*: fc2f7d1f vudot.u8 d7, d15, d15
+.*: fe2f7d1f vudot.u8 d7, d15, d15\[0\]
+.*: fc2e7d90 vudot.u8 d7, d30, d0
+.*: fe2e7d90 vudot.u8 d7, d30, d0\[0\]
+.*: fc2e7d98 vudot.u8 d7, d30, d8
+.*: fe2e7d98 vudot.u8 d7, d30, d8\[0\]
+.*: fc2e7d9f vudot.u8 d7, d30, d15
+.*: fe2e7d9f vudot.u8 d7, d30, d15\[0\]
+.*: fc620d10 vudot.u8 d16, d2, d0
+.*: fe620d10 vudot.u8 d16, d2, d0\[0\]
+.*: fc620d18 vudot.u8 d16, d2, d8
+.*: fe620d18 vudot.u8 d16, d2, d8\[0\]
+.*: fc620d1f vudot.u8 d16, d2, d15
+.*: fe620d1f vudot.u8 d16, d2, d15\[0\]
+.*: fc6f0d10 vudot.u8 d16, d15, d0
+.*: fe6f0d10 vudot.u8 d16, d15, d0\[0\]
+.*: fc6f0d18 vudot.u8 d16, d15, d8
+.*: fe6f0d18 vudot.u8 d16, d15, d8\[0\]
+.*: fc6f0d1f vudot.u8 d16, d15, d15
+.*: fe6f0d1f vudot.u8 d16, d15, d15\[0\]
+.*: fc6e0d90 vudot.u8 d16, d30, d0
+.*: fe6e0d90 vudot.u8 d16, d30, d0\[0\]
+.*: fc6e0d98 vudot.u8 d16, d30, d8
+.*: fe6e0d98 vudot.u8 d16, d30, d8\[0\]
+.*: fc6e0d9f vudot.u8 d16, d30, d15
+.*: fe6e0d9f vudot.u8 d16, d30, d15\[0\]
+.*: fc62fd10 vudot.u8 d31, d2, d0
+.*: fe62fd10 vudot.u8 d31, d2, d0\[0\]
+.*: fc62fd18 vudot.u8 d31, d2, d8
+.*: fe62fd18 vudot.u8 d31, d2, d8\[0\]
+.*: fc62fd1f vudot.u8 d31, d2, d15
+.*: fe62fd1f vudot.u8 d31, d2, d15\[0\]
+.*: fc6ffd10 vudot.u8 d31, d15, d0
+.*: fe6ffd10 vudot.u8 d31, d15, d0\[0\]
+.*: fc6ffd18 vudot.u8 d31, d15, d8
+.*: fe6ffd18 vudot.u8 d31, d15, d8\[0\]
+.*: fc6ffd1f vudot.u8 d31, d15, d15
+.*: fe6ffd1f vudot.u8 d31, d15, d15\[0\]
+.*: fc6efd90 vudot.u8 d31, d30, d0
+.*: fe6efd90 vudot.u8 d31, d30, d0\[0\]
+.*: fc6efd98 vudot.u8 d31, d30, d8
+.*: fe6efd98 vudot.u8 d31, d30, d8\[0\]
+.*: fc6efd9f vudot.u8 d31, d30, d15
+.*: fe6efd9f vudot.u8 d31, d30, d15\[0\]
+.*: fc220d00 vsdot.s8 d0, d2, d0
+.*: fe220d00 vsdot.s8 d0, d2, d0\[0\]
+.*: fc220d08 vsdot.s8 d0, d2, d8
+.*: fe220d08 vsdot.s8 d0, d2, d8\[0\]
+.*: fc220d0f vsdot.s8 d0, d2, d15
+.*: fe220d0f vsdot.s8 d0, d2, d15\[0\]
+.*: fc2f0d00 vsdot.s8 d0, d15, d0
+.*: fe2f0d00 vsdot.s8 d0, d15, d0\[0\]
+.*: fc2f0d08 vsdot.s8 d0, d15, d8
+.*: fe2f0d08 vsdot.s8 d0, d15, d8\[0\]
+.*: fc2f0d0f vsdot.s8 d0, d15, d15
+.*: fe2f0d0f vsdot.s8 d0, d15, d15\[0\]
+.*: fc2e0d80 vsdot.s8 d0, d30, d0
+.*: fe2e0d80 vsdot.s8 d0, d30, d0\[0\]
+.*: fc2e0d88 vsdot.s8 d0, d30, d8
+.*: fe2e0d88 vsdot.s8 d0, d30, d8\[0\]
+.*: fc2e0d8f vsdot.s8 d0, d30, d15
+.*: fe2e0d8f vsdot.s8 d0, d30, d15\[0\]
+.*: fc227d00 vsdot.s8 d7, d2, d0
+.*: fe227d00 vsdot.s8 d7, d2, d0\[0\]
+.*: fc227d08 vsdot.s8 d7, d2, d8
+.*: fe227d08 vsdot.s8 d7, d2, d8\[0\]
+.*: fc227d0f vsdot.s8 d7, d2, d15
+.*: fe227d0f vsdot.s8 d7, d2, d15\[0\]
+.*: fc2f7d00 vsdot.s8 d7, d15, d0
+.*: fe2f7d00 vsdot.s8 d7, d15, d0\[0\]
+.*: fc2f7d08 vsdot.s8 d7, d15, d8
+.*: fe2f7d08 vsdot.s8 d7, d15, d8\[0\]
+.*: fc2f7d0f vsdot.s8 d7, d15, d15
+.*: fe2f7d0f vsdot.s8 d7, d15, d15\[0\]
+.*: fc2e7d80 vsdot.s8 d7, d30, d0
+.*: fe2e7d80 vsdot.s8 d7, d30, d0\[0\]
+.*: fc2e7d88 vsdot.s8 d7, d30, d8
+.*: fe2e7d88 vsdot.s8 d7, d30, d8\[0\]
+.*: fc2e7d8f vsdot.s8 d7, d30, d15
+.*: fe2e7d8f vsdot.s8 d7, d30, d15\[0\]
+.*: fc620d00 vsdot.s8 d16, d2, d0
+.*: fe620d00 vsdot.s8 d16, d2, d0\[0\]
+.*: fc620d08 vsdot.s8 d16, d2, d8
+.*: fe620d08 vsdot.s8 d16, d2, d8\[0\]
+.*: fc620d0f vsdot.s8 d16, d2, d15
+.*: fe620d0f vsdot.s8 d16, d2, d15\[0\]
+.*: fc6f0d00 vsdot.s8 d16, d15, d0
+.*: fe6f0d00 vsdot.s8 d16, d15, d0\[0\]
+.*: fc6f0d08 vsdot.s8 d16, d15, d8
+.*: fe6f0d08 vsdot.s8 d16, d15, d8\[0\]
+.*: fc6f0d0f vsdot.s8 d16, d15, d15
+.*: fe6f0d0f vsdot.s8 d16, d15, d15\[0\]
+.*: fc6e0d80 vsdot.s8 d16, d30, d0
+.*: fe6e0d80 vsdot.s8 d16, d30, d0\[0\]
+.*: fc6e0d88 vsdot.s8 d16, d30, d8
+.*: fe6e0d88 vsdot.s8 d16, d30, d8\[0\]
+.*: fc6e0d8f vsdot.s8 d16, d30, d15
+.*: fe6e0d8f vsdot.s8 d16, d30, d15\[0\]
+.*: fc62fd00 vsdot.s8 d31, d2, d0
+.*: fe62fd00 vsdot.s8 d31, d2, d0\[0\]
+.*: fc62fd08 vsdot.s8 d31, d2, d8
+.*: fe62fd08 vsdot.s8 d31, d2, d8\[0\]
+.*: fc62fd0f vsdot.s8 d31, d2, d15
+.*: fe62fd0f vsdot.s8 d31, d2, d15\[0\]
+.*: fc6ffd00 vsdot.s8 d31, d15, d0
+.*: fe6ffd00 vsdot.s8 d31, d15, d0\[0\]
+.*: fc6ffd08 vsdot.s8 d31, d15, d8
+.*: fe6ffd08 vsdot.s8 d31, d15, d8\[0\]
+.*: fc6ffd0f vsdot.s8 d31, d15, d15
+.*: fe6ffd0f vsdot.s8 d31, d15, d15\[0\]
+.*: fc6efd80 vsdot.s8 d31, d30, d0
+.*: fe6efd80 vsdot.s8 d31, d30, d0\[0\]
+.*: fc6efd88 vsdot.s8 d31, d30, d8
+.*: fe6efd88 vsdot.s8 d31, d30, d8\[0\]
+.*: fc6efd8f vsdot.s8 d31, d30, d15
+.*: fe6efd8f vsdot.s8 d31, d30, d15\[0\]
+.*: fc240d50 vudot.u8 q0, q2, q0
+.*: fe240d70 vudot.u8 q0, q2, d0\[1\]
+.*: fc240d5e vudot.u8 q0, q2, q7
+.*: fe240d77 vudot.u8 q0, q2, d7\[1\]
+.*: fc240d7e vudot.u8 q0, q2, q15
+.*: fe240d7f vudot.u8 q0, q2, d15\[1\]
+.*: fc260d50 vudot.u8 q0, q3, q0
+.*: fe260d70 vudot.u8 q0, q3, d0\[1\]
+.*: fc260d5e vudot.u8 q0, q3, q7
+.*: fe260d77 vudot.u8 q0, q3, d7\[1\]
+.*: fc260d7e vudot.u8 q0, q3, q15
+.*: fe260d7f vudot.u8 q0, q3, d15\[1\]
+.*: fc2c0dd0 vudot.u8 q0, q14, q0
+.*: fe2c0df0 vudot.u8 q0, q14, d0\[1\]
+.*: fc2c0dde vudot.u8 q0, q14, q7
+.*: fe2c0df7 vudot.u8 q0, q14, d7\[1\]
+.*: fc2c0dfe vudot.u8 q0, q14, q15
+.*: fe2c0dff vudot.u8 q0, q14, d15\[1\]
+.*: fc242d50 vudot.u8 q1, q2, q0
+.*: fe242d70 vudot.u8 q1, q2, d0\[1\]
+.*: fc242d5e vudot.u8 q1, q2, q7
+.*: fe242d77 vudot.u8 q1, q2, d7\[1\]
+.*: fc242d7e vudot.u8 q1, q2, q15
+.*: fe242d7f vudot.u8 q1, q2, d15\[1\]
+.*: fc262d50 vudot.u8 q1, q3, q0
+.*: fe262d70 vudot.u8 q1, q3, d0\[1\]
+.*: fc262d5e vudot.u8 q1, q3, q7
+.*: fe262d77 vudot.u8 q1, q3, d7\[1\]
+.*: fc262d7e vudot.u8 q1, q3, q15
+.*: fe262d7f vudot.u8 q1, q3, d15\[1\]
+.*: fc2c2dd0 vudot.u8 q1, q14, q0
+.*: fe2c2df0 vudot.u8 q1, q14, d0\[1\]
+.*: fc2c2dde vudot.u8 q1, q14, q7
+.*: fe2c2df7 vudot.u8 q1, q14, d7\[1\]
+.*: fc2c2dfe vudot.u8 q1, q14, q15
+.*: fe2c2dff vudot.u8 q1, q14, d15\[1\]
+.*: fc24cd50 vudot.u8 q6, q2, q0
+.*: fe24cd70 vudot.u8 q6, q2, d0\[1\]
+.*: fc24cd5e vudot.u8 q6, q2, q7
+.*: fe24cd77 vudot.u8 q6, q2, d7\[1\]
+.*: fc24cd7e vudot.u8 q6, q2, q15
+.*: fe24cd7f vudot.u8 q6, q2, d15\[1\]
+.*: fc26cd50 vudot.u8 q6, q3, q0
+.*: fe26cd70 vudot.u8 q6, q3, d0\[1\]
+.*: fc26cd5e vudot.u8 q6, q3, q7
+.*: fe26cd77 vudot.u8 q6, q3, d7\[1\]
+.*: fc26cd7e vudot.u8 q6, q3, q15
+.*: fe26cd7f vudot.u8 q6, q3, d15\[1\]
+.*: fc2ccdd0 vudot.u8 q6, q14, q0
+.*: fe2ccdf0 vudot.u8 q6, q14, d0\[1\]
+.*: fc2ccdde vudot.u8 q6, q14, q7
+.*: fe2ccdf7 vudot.u8 q6, q14, d7\[1\]
+.*: fc2ccdfe vudot.u8 q6, q14, q15
+.*: fe2ccdff vudot.u8 q6, q14, d15\[1\]
+.*: fc64ad50 vudot.u8 q13, q2, q0
+.*: fe64ad70 vudot.u8 q13, q2, d0\[1\]
+.*: fc64ad5e vudot.u8 q13, q2, q7
+.*: fe64ad77 vudot.u8 q13, q2, d7\[1\]
+.*: fc64ad7e vudot.u8 q13, q2, q15
+.*: fe64ad7f vudot.u8 q13, q2, d15\[1\]
+.*: fc66ad50 vudot.u8 q13, q3, q0
+.*: fe66ad70 vudot.u8 q13, q3, d0\[1\]
+.*: fc66ad5e vudot.u8 q13, q3, q7
+.*: fe66ad77 vudot.u8 q13, q3, d7\[1\]
+.*: fc66ad7e vudot.u8 q13, q3, q15
+.*: fe66ad7f vudot.u8 q13, q3, d15\[1\]
+.*: fc6cadd0 vudot.u8 q13, q14, q0
+.*: fe6cadf0 vudot.u8 q13, q14, d0\[1\]
+.*: fc6cadde vudot.u8 q13, q14, q7
+.*: fe6cadf7 vudot.u8 q13, q14, d7\[1\]
+.*: fc6cadfe vudot.u8 q13, q14, q15
+.*: fe6cadff vudot.u8 q13, q14, d15\[1\]
+.*: fc240d40 vsdot.s8 q0, q2, q0
+.*: fe240d60 vsdot.s8 q0, q2, d0\[1\]
+.*: fc240d4e vsdot.s8 q0, q2, q7
+.*: fe240d67 vsdot.s8 q0, q2, d7\[1\]
+.*: fc240d6e vsdot.s8 q0, q2, q15
+.*: fe240d6f vsdot.s8 q0, q2, d15\[1\]
+.*: fc260d40 vsdot.s8 q0, q3, q0
+.*: fe260d60 vsdot.s8 q0, q3, d0\[1\]
+.*: fc260d4e vsdot.s8 q0, q3, q7
+.*: fe260d67 vsdot.s8 q0, q3, d7\[1\]
+.*: fc260d6e vsdot.s8 q0, q3, q15
+.*: fe260d6f vsdot.s8 q0, q3, d15\[1\]
+.*: fc2c0dc0 vsdot.s8 q0, q14, q0
+.*: fe2c0de0 vsdot.s8 q0, q14, d0\[1\]
+.*: fc2c0dce vsdot.s8 q0, q14, q7
+.*: fe2c0de7 vsdot.s8 q0, q14, d7\[1\]
+.*: fc2c0dee vsdot.s8 q0, q14, q15
+.*: fe2c0def vsdot.s8 q0, q14, d15\[1\]
+.*: fc242d40 vsdot.s8 q1, q2, q0
+.*: fe242d60 vsdot.s8 q1, q2, d0\[1\]
+.*: fc242d4e vsdot.s8 q1, q2, q7
+.*: fe242d67 vsdot.s8 q1, q2, d7\[1\]
+.*: fc242d6e vsdot.s8 q1, q2, q15
+.*: fe242d6f vsdot.s8 q1, q2, d15\[1\]
+.*: fc262d40 vsdot.s8 q1, q3, q0
+.*: fe262d60 vsdot.s8 q1, q3, d0\[1\]
+.*: fc262d4e vsdot.s8 q1, q3, q7
+.*: fe262d67 vsdot.s8 q1, q3, d7\[1\]
+.*: fc262d6e vsdot.s8 q1, q3, q15
+.*: fe262d6f vsdot.s8 q1, q3, d15\[1\]
+.*: fc2c2dc0 vsdot.s8 q1, q14, q0
+.*: fe2c2de0 vsdot.s8 q1, q14, d0\[1\]
+.*: fc2c2dce vsdot.s8 q1, q14, q7
+.*: fe2c2de7 vsdot.s8 q1, q14, d7\[1\]
+.*: fc2c2dee vsdot.s8 q1, q14, q15
+.*: fe2c2def vsdot.s8 q1, q14, d15\[1\]
+.*: fc24cd40 vsdot.s8 q6, q2, q0
+.*: fe24cd60 vsdot.s8 q6, q2, d0\[1\]
+.*: fc24cd4e vsdot.s8 q6, q2, q7
+.*: fe24cd67 vsdot.s8 q6, q2, d7\[1\]
+.*: fc24cd6e vsdot.s8 q6, q2, q15
+.*: fe24cd6f vsdot.s8 q6, q2, d15\[1\]
+.*: fc26cd40 vsdot.s8 q6, q3, q0
+.*: fe26cd60 vsdot.s8 q6, q3, d0\[1\]
+.*: fc26cd4e vsdot.s8 q6, q3, q7
+.*: fe26cd67 vsdot.s8 q6, q3, d7\[1\]
+.*: fc26cd6e vsdot.s8 q6, q3, q15
+.*: fe26cd6f vsdot.s8 q6, q3, d15\[1\]
+.*: fc2ccdc0 vsdot.s8 q6, q14, q0
+.*: fe2ccde0 vsdot.s8 q6, q14, d0\[1\]
+.*: fc2ccdce vsdot.s8 q6, q14, q7
+.*: fe2ccde7 vsdot.s8 q6, q14, d7\[1\]
+.*: fc2ccdee vsdot.s8 q6, q14, q15
+.*: fe2ccdef vsdot.s8 q6, q14, d15\[1\]
+.*: fc64ad40 vsdot.s8 q13, q2, q0
+.*: fe64ad60 vsdot.s8 q13, q2, d0\[1\]
+.*: fc64ad4e vsdot.s8 q13, q2, q7
+.*: fe64ad67 vsdot.s8 q13, q2, d7\[1\]
+.*: fc64ad6e vsdot.s8 q13, q2, q15
+.*: fe64ad6f vsdot.s8 q13, q2, d15\[1\]
+.*: fc66ad40 vsdot.s8 q13, q3, q0
+.*: fe66ad60 vsdot.s8 q13, q3, d0\[1\]
+.*: fc66ad4e vsdot.s8 q13, q3, q7
+.*: fe66ad67 vsdot.s8 q13, q3, d7\[1\]
+.*: fc66ad6e vsdot.s8 q13, q3, q15
+.*: fe66ad6f vsdot.s8 q13, q3, d15\[1\]
+.*: fc6cadc0 vsdot.s8 q13, q14, q0
+.*: fe6cade0 vsdot.s8 q13, q14, d0\[1\]
+.*: fc6cadce vsdot.s8 q13, q14, q7
+.*: fe6cade7 vsdot.s8 q13, q14, d7\[1\]
+.*: fc6cadee vsdot.s8 q13, q14, q15
+.*: fe6cadef vsdot.s8 q13, q14, d15\[1\]
diff --git a/gas/testsuite/gas/arm/fpv5-d16.s b/gas/testsuite/gas/arm/fpv5-d16.s
new file mode 100644
index 0000000..9d9d4d6
--- /dev/null
+++ b/gas/testsuite/gas/arm/fpv5-d16.s
@@ -0,0 +1,58 @@
+ .syntax unified
+ .text
+
+ .thumb
+ vseleq.f32 s0, s0, s0
+ vselvs.f32 s1, s1, s1
+ vselge.f32 s30, s30, s30
+ vselgt.f32 s31, s31, s31
+ vseleq.f64 d0, d0, d0
+ vselvs.f64 d8, d8, d8
+ vselge.f64 d15, d15, d15
+ vselgt.f64 d10, d10, d10
+ vmaxnm.f32 s0, s0, s0
+ vmaxnm.f32 s1, s1, s1
+ vmaxnm.f32 s30, s30, s30
+ vmaxnm.f32 s31, s31, s31
+ vmaxnm.f64 d0, d0, d0
+ vmaxnm.f64 d8, d8, d8
+ vmaxnm.f64 d15, d15, d15
+ vmaxnm.f64 d10, d10, d10
+ vminnm.f32 s0, s0, s0
+ vminnm.f32 s1, s1, s1
+ vminnm.f32 s30, s30, s30
+ vminnm.f32 s31, s31, s31
+ vminnm.f64 d0, d0, d0
+ vminnm.f64 d8, d8, d8
+ vminnm.f64 d15, d15, d15
+ vminnm.f64 d10, d10, d10
+ vcvta.s32.f32 s0, s0
+ vcvtn.s32.f32 s1, s1
+ vcvtp.u32.f32 s30, s30
+ vcvtm.u32.f32 s31, s31
+ vcvta.s32.f64 s0, d0
+ vcvtn.s32.f64 s1, d8
+ vcvtp.u32.f64 s30, d15
+ vcvtm.u32.f64 s31, d10
+ vrintz.f32 s0, s0
+ vrintx.f32 s1, s1
+ vrintr.f32 s30, s30
+ vrinta.f32 s0, s0
+ vrintn.f32 s1, s1
+ vrintp.f32 s30, s30
+ vrintm.f32 s31, s31
+ vrintz.f64 d0, d0
+ vrintx.f64 d1, d1
+ vrintr.f64 d10, d10
+ vrinta.f64 d0, d0
+ vrintn.f64 d1, d1
+ vrintp.f64 d10, d10
+ vrintm.f64 d10, d10
+ vcvtt.f16.f64 s0, d0
+ vcvtb.f16.f64 s1, d8
+ vcvtt.f16.f64 s30, d15
+ vcvtb.f16.f64 s31, d10
+ vcvtt.f64.f16 d0, s0
+ vcvtb.f64.f16 d8, s1
+ vcvtt.f64.f16 d15, s30
+ vcvtb.f64.f16 d10, s31
diff --git a/gas/testsuite/gas/arm/fpv5-sp-d16.s b/gas/testsuite/gas/arm/fpv5-sp-d16.s
new file mode 100644
index 0000000..1d9e243
--- /dev/null
+++ b/gas/testsuite/gas/arm/fpv5-sp-d16.s
@@ -0,0 +1,27 @@
+ .syntax unified
+ .text
+
+ .thumb
+ vseleq.f32 s0, s0, s0
+ vselvs.f32 s1, s1, s1
+ vselge.f32 s30, s30, s30
+ vselgt.f32 s31, s31, s31
+ vmaxnm.f32 s0, s0, s0
+ vmaxnm.f32 s1, s1, s1
+ vmaxnm.f32 s30, s30, s30
+ vmaxnm.f32 s31, s31, s31
+ vminnm.f32 s0, s0, s0
+ vminnm.f32 s1, s1, s1
+ vminnm.f32 s30, s30, s30
+ vminnm.f32 s31, s31, s31
+ vcvta.s32.f32 s0, s0
+ vcvtn.s32.f32 s1, s1
+ vcvtp.u32.f32 s30, s30
+ vcvtm.u32.f32 s31, s31
+ vrintz.f32 s0, s0
+ vrintx.f32 s1, s1
+ vrintr.f32 s30, s30
+ vrinta.f32 s0, s0
+ vrintn.f32 s1, s1
+ vrintp.f32 s30, s30
+ vrintm.f32 s31, s31