[v2] arm: Add +nomve and +nomve.fp options to -mcpu=cortex-m55

Message ID 1597853502-23228-1-git-send-email-joe.ramsay@arm.com
State New
Headers show
Series
  • [v2] arm: Add +nomve and +nomve.fp options to -mcpu=cortex-m55
Related show

Commit Message

Joe Ramsay Aug. 19, 2020, 4:11 p.m.
From: Joe Ramsay <Joe.Ramsay@arm.com>


Hi all,

This patch rearranges feature bits for MVE and FP to implement the
following flags for -mcpu=cortex-m55.

  - +nomve:    equivalent to armv8.1-m.main+fp.dp+dsp.
  - +nomve.fp: equivalent to armv8.1-m.main+mve+fp.dp (+dsp is implied by +mve).
  - +nofp:     equivalent to armv8.1-m.main+mve (+dsp is implied by +mve).
  - +nodsp:    equivalent to armv8.1-m.main+fp.dp.

Combinations of the above:

  - +nomve+nofp: equivalent to armv8.1-m.main+dsp.
  - +nodsp+nofp: equivalent to armv8.1-m.main.

Due to MVE and FP sharing vfp_base, some new syntax was required in the CPU
description to implement the concept of 'implied bits'. These are non-named
features added to the ISA late, depending on whether one or more features which
depend on them are present. This means vfp_base can be present when only one of
MVE and FP is removed, but absent when both are removed.

Bootstrapped and tested on arm-none-eabi. OK for master?

Thanks,
Joe

gcc/ChangeLog:

2020-07-31  Joe Ramsay  <joe.ramsay@arm.com>

	* config/arm/arm-cpus.in:
	(ALL_FPU_INTERNAL): Remove vfp_base.
	(VFPv2): Remove vfp_base.
	(MVE): Remove vfp_base.
	(vfp_base): Redefine as implied bit dependent on MVE or FP
	(cortex-m55): Add flags to disable MVE, MVE FP, FP and DSP extensions.
	* config/arm/arm.c (arm_configure_build_target): Add implied bits to ISA.
	* config/arm/parsecpu.awk:
	(gen_isa): Print implied bits and their dependencies to ISA header.
	(gen_data): Add parsing for implied feature bits.

gcc/testsuite/ChangeLog:

2020-07-31  Joe Ramsay  <joe.ramsay@arm.com>

	* gcc.target/arm/multilib.exp: Add tests for -mcpu=cortex-m55.
	* gcc.target/arm/cortex-m55-nodsp-flag.c: New test.
	* gcc.target/arm/cortex-m55-nodsp-nofp-flag.c: New test.
	* gcc.target/arm/cortex-m55-nofp-flag.c: New test.
	* gcc.target/arm/cortex-m55-nofp-nomve-flag.c: New test.
	* gcc.target/arm/cortex-m55-nomve-flag.c: New test.
	* gcc.target/arm/cortex-m55-nomve.fp-flag.c: New test.
---
 gcc/config/arm/arm-cpus.in                         | 26 ++++++++---
 gcc/config/arm/arm.c                               | 14 ++++++
 gcc/config/arm/parsecpu.awk                        | 51 ++++++++++++++++++++++
 .../gcc.target/arm/cortex-m55-nodsp-flag-hard.c    | 15 +++++++
 .../gcc.target/arm/cortex-m55-nodsp-flag-softfp.c  | 15 +++++++
 .../arm/cortex-m55-nodsp-nofp-flag-softfp.c        | 15 +++++++
 .../gcc.target/arm/cortex-m55-nofp-flag-hard.c     | 15 +++++++
 .../gcc.target/arm/cortex-m55-nofp-flag-softfp.c   | 15 +++++++
 .../arm/cortex-m55-nofp-nomve-flag-softfp.c        | 15 +++++++
 .../gcc.target/arm/cortex-m55-nomve-flag-hard.c    | 15 +++++++
 .../gcc.target/arm/cortex-m55-nomve-flag-softfp.c  | 15 +++++++
 .../gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c | 15 +++++++
 .../arm/cortex-m55-nomve.fp-flag-softfp.c          | 15 +++++++
 gcc/testsuite/gcc.target/arm/multilib.exp          | 16 +++++++
 14 files changed, 250 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-hard.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-softfp.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-flag-softfp.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-hard.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-softfp.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nofp-nomve-flag-softfp.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-hard.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-softfp.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c
 create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-softfp.c

-- 
2.7.4

Comments

Jakub Jelinek via Gcc-patches Oct. 2, 2020, 2:15 p.m. | #1
Hi Joe,

> -----Original Message-----

> From: Gcc-patches <gcc-patches-bounces@gcc.gnu.org> On Behalf Of Joe

> Ramsay

> Sent: 19 August 2020 17:12

> To: gcc-patches@gcc.gnu.org

> Subject: [PATCH v2][GCC] arm: Add +nomve and +nomve.fp options to -

> mcpu=cortex-m55

> 

> From: Joe Ramsay <Joe.Ramsay@arm.com>

> 

> Hi all,

> 

> This patch rearranges feature bits for MVE and FP to implement the

> following flags for -mcpu=cortex-m55.

> 

>   - +nomve:    equivalent to armv8.1-m.main+fp.dp+dsp.

>   - +nomve.fp: equivalent to armv8.1-m.main+mve+fp.dp (+dsp is implied by

> +mve).

>   - +nofp:     equivalent to armv8.1-m.main+mve (+dsp is implied by +mve).

>   - +nodsp:    equivalent to armv8.1-m.main+fp.dp.

> 

> Combinations of the above:

> 

>   - +nomve+nofp: equivalent to armv8.1-m.main+dsp.

>   - +nodsp+nofp: equivalent to armv8.1-m.main.

> 

> Due to MVE and FP sharing vfp_base, some new syntax was required in the

> CPU

> description to implement the concept of 'implied bits'. These are non-named

> features added to the ISA late, depending on whether one or more features

> which

> depend on them are present. This means vfp_base can be present when only

> one of

> MVE and FP is removed, but absent when both are removed.

> 

> Bootstrapped and tested on arm-none-eabi. OK for master?


Ok, since Richard reviewed the code and his requested extra testing looks ok to me.
Thanks,
Kyrill

> 

> Thanks,

> Joe

> 

> gcc/ChangeLog:

> 

> 2020-07-31  Joe Ramsay  <joe.ramsay@arm.com>

> 

> 	* config/arm/arm-cpus.in:

> 	(ALL_FPU_INTERNAL): Remove vfp_base.

> 	(VFPv2): Remove vfp_base.

> 	(MVE): Remove vfp_base.

> 	(vfp_base): Redefine as implied bit dependent on MVE or FP

> 	(cortex-m55): Add flags to disable MVE, MVE FP, FP and DSP

> extensions.

> 	* config/arm/arm.c (arm_configure_build_target): Add implied bits

> to ISA.

> 	* config/arm/parsecpu.awk:

> 	(gen_isa): Print implied bits and their dependencies to ISA header.

> 	(gen_data): Add parsing for implied feature bits.

> 

> gcc/testsuite/ChangeLog:

> 

> 2020-07-31  Joe Ramsay  <joe.ramsay@arm.com>

> 

> 	* gcc.target/arm/multilib.exp: Add tests for -mcpu=cortex-m55.

> 	* gcc.target/arm/cortex-m55-nodsp-flag.c: New test.

> 	* gcc.target/arm/cortex-m55-nodsp-nofp-flag.c: New test.

> 	* gcc.target/arm/cortex-m55-nofp-flag.c: New test.

> 	* gcc.target/arm/cortex-m55-nofp-nomve-flag.c: New test.

> 	* gcc.target/arm/cortex-m55-nomve-flag.c: New test.

> 	* gcc.target/arm/cortex-m55-nomve.fp-flag.c: New test.

> ---

>  gcc/config/arm/arm-cpus.in                         | 26 ++++++++---

>  gcc/config/arm/arm.c                               | 14 ++++++

>  gcc/config/arm/parsecpu.awk                        | 51 ++++++++++++++++++++++

>  .../gcc.target/arm/cortex-m55-nodsp-flag-hard.c    | 15 +++++++

>  .../gcc.target/arm/cortex-m55-nodsp-flag-softfp.c  | 15 +++++++

>  .../arm/cortex-m55-nodsp-nofp-flag-softfp.c        | 15 +++++++

>  .../gcc.target/arm/cortex-m55-nofp-flag-hard.c     | 15 +++++++

>  .../gcc.target/arm/cortex-m55-nofp-flag-softfp.c   | 15 +++++++

>  .../arm/cortex-m55-nofp-nomve-flag-softfp.c        | 15 +++++++

>  .../gcc.target/arm/cortex-m55-nomve-flag-hard.c    | 15 +++++++

>  .../gcc.target/arm/cortex-m55-nomve-flag-softfp.c  | 15 +++++++

>  .../gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c | 15 +++++++

>  .../arm/cortex-m55-nomve.fp-flag-softfp.c          | 15 +++++++

>  gcc/testsuite/gcc.target/arm/multilib.exp          | 16 +++++++

>  14 files changed, 250 insertions(+), 7 deletions(-)

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-

> hard.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-

> softfp.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-

> flag-softfp.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-

> hard.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-

> softfp.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nofp-

> nomve-flag-softfp.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-

> hard.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-

> softfp.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-

> flag-hard.c

>  create mode 100644 gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-

> flag-softfp.c

> 

> diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in

> index c98f8ed..5083028 100644

> --- a/gcc/config/arm/arm-cpus.in

> +++ b/gcc/config/arm/arm-cpus.in

> @@ -135,10 +135,6 @@ define feature armv8_1m_main

>  # Floating point and Neon extensions.

>  # VFPv1 is not supported in GCC.

> 

> -# This feature bit is enabled for all VFP, MVE and

> -# MVE with floating point extensions.

> -define feature vfp_base

> -

>  # Vector floating point v2.

>  define feature vfpv2

> 

> @@ -251,7 +247,7 @@ define fgroup ALL_SIMD

> 	ALL_SIMD_INTERNAL ALL_SIMD_EXTERNAL

> 

>  # List of all FPU bits to strip out if -mfpu is used to override the

>  # default.  fp16 is deliberately missing from this list.

> -define fgroup ALL_FPU_INTERNAL	vfp_base vfpv2 vfpv3 vfpv4 fpv5

> fp16conv fp_dbl ALL_SIMD_INTERNAL

> +define fgroup ALL_FPU_INTERNAL	vfpv2 vfpv3 vfpv4 fpv5 fp16conv

> fp_dbl ALL_SIMD_INTERNAL

>  # Similarly, but including fp16 and other extensions that aren't part of

>  # -mfpu support.

>  define fgroup ALL_FPU_EXTERNAL fp16 bf16

> @@ -296,11 +292,11 @@ define fgroup ARMv8r      ARMv8a

>  define fgroup ARMv8_1m_main ARMv8m_main armv8_1m_main

> 

>  # Useful combinations.

> -define fgroup VFPv2	vfp_base vfpv2

> +define fgroup VFPv2	vfpv2

>  define fgroup VFPv3	VFPv2 vfpv3

>  define fgroup VFPv4	VFPv3 vfpv4 fp16conv

>  define fgroup FPv5	VFPv4 fpv5

> -define fgroup MVE      mve vfp_base armv7em

> +define fgroup MVE      mve armv7em

>  define fgroup MVE_FP   MVE FPv5 fp16 mve_float

> 

>  define fgroup FP_DBL	fp_dbl

> @@ -310,6 +306,18 @@ define fgroup NEON	FP_D32 neon

>  define fgroup CRYPTO	NEON crypto

>  define fgroup DOTPROD	NEON dotprod

> 

> +# Implied feature bits.  These are for non-named features shared between

> fgroups.

> +# Shared feature f belonging to fgroups A and B will be erroneously

> removed if:

> +# A and B are enabled by default AND A is disabled by a removal flag.

> +# To ensure that f is retained, we must add such bits to the ISA after

> +# processing the removal flags.  This is implemented by 'implied bits':

> +# define implied <name> [<feature-or-fgroup>]+

> +# This indicates that, if any of the listed features are enabled, or if any

> +# member of a listed fgroup is enabled, then <name> will be implicitly

> enabled.

> +

> +# Enabled for all VFP, MVE and MVE with floating point extensions.

> +define implied vfp_base MVE MVE_FP ALL_FP

> +

>  # List of all quirk bits to strip out when comparing CPU features with

>  # architectures.

>  # xscale isn't really a 'quirk', but it isn't an architecture either and we

> @@ -1508,6 +1516,10 @@ begin cpu cortex-m55

>   cname cortexm55

>   tune flags LDSCHED

>   architecture armv8.1-m.main+mve.fp+fp.dp

> + option nomve.fp remove mve_float

> + option nomve remove mve mve_float

> + option nofp remove ALL_FP mve_float

> + option nodsp remove MVE mve_float

>   isa quirk_no_asmcpu

>   costs v7m

>   vendor 41

> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c

> index dd78141..dc03c7a 100644

> --- a/gcc/config/arm/arm.c

> +++ b/gcc/config/arm/arm.c

> @@ -3410,6 +3410,20 @@ arm_configure_build_target (struct

> arm_build_target *target,

>        bitmap_ior (target->isa, target->isa, fpu_bits);

>      }

> 

> +  /* There may be implied bits which we still need to enable. These are

> +     non-named features which are needed to complete other sets of

> features,

> +     but cannot be enabled from arm-cpus.in due to being shared between

> +     multiple fgroups. Each entry in all_implied_fbits is of the form

> +     ante -> cons, meaning that if the feature "ante" is enabled, we should

> +     implicitly enable "cons".  */

> +  const struct fbit_implication *impl = all_implied_fbits;

> +  while (impl->ante)

> +    {

> +      if (bitmap_bit_p (target->isa, impl->ante))

> +	bitmap_set_bit (target->isa, impl->cons);

> +      impl++;

> +    }

> +

>    if (!arm_selected_tune)

>      arm_selected_tune = arm_selected_cpu;

>    else /* Validate the features passed to -mtune.  */

> diff --git a/gcc/config/arm/parsecpu.awk b/gcc/config/arm/parsecpu.awk

> index 7fc3754..9423e8a 100644

> --- a/gcc/config/arm/parsecpu.awk

> +++ b/gcc/config/arm/parsecpu.awk

> @@ -190,6 +190,23 @@ function gen_isa () {

>  	ORS = z

>  	print "\n"

>      }

> +

> +    print "struct fbit_implication {"

> +    print "  /* Represents a feature implication, where:"

> +    print "     ante IMPLIES cons"

> +    print "     meaning that if ante is enabled then we should"

> +    print "     also implicitly enable cons.  */"

> +    print "  enum isa_feature ante;"

> +    print "  enum isa_feature cons;"

> +    print "};\n"

> +    print "static const struct fbit_implication all_implied_fbits[] ="

> +    print "{"

> +    for (impl in implied_bits) {

> +      split (impl, impl_parts, SUBSEP)

> +      print "  { isa_bit_" impl_parts[2] ", isa_bit_" impl_parts[1] " },"

> +    }

> +    print "  { isa_nobit, isa_nobit }"

> +    print "};\n"

>  }

> 

>  function gen_data () {

> @@ -600,6 +617,40 @@ BEGIN {

>      parse_ok = 1

>  }

> 

> +/^define implied / {

> +  if (NF < 4) fatal("syntax: define implied <name> [<feature-or-fgroup>]+\n"

> \

> +		    "Implied bits must be defined with at least one

> antecedent.")

> +  toplevel()

> +  fbit = $3

> +  if (fbit in features) fatal("implied feature " fbit " aliases a real feature")

> +  if (fbit in fgroup) fatal("implied feature " fbit " aliases a feature group")

> +  fcount = NF

> +  features[fbit] = 1

> +  for (n = 4; n <= fcount; n++) {

> +    ante = $n

> +    if (fbit == ante) fatal("feature cannot imply itself")

> +    else if (ante in features) {

> +      for (impl in implied_bits) {

> +	split(impl, impl_sep, SUBSEP)

> +	if (ante == impl_sep[1])

> +	  fatal(ante " implies implied bit " fbit		\

> +		". Chained implications not currently supported")

> +      }

> +      implied_bits[fbit, ante] = 1

> +    } else if (ante in fgroup) {

> +      for (bitcomb in fgrp_bits) {

> +	split(bitcomb, bitsep, SUBSEP)

> +	if (bitsep[1] == ante) {

> +	  implied_bits[fbit, bitsep[2]] = 1

> +	}

> +      }

> +    } else {

> +      fatal("implied bit antecedent " ante " unrecognized")

> +    }

> +  }

> +  parse_ok = 1

> +}

> +

>  /^begin fpu / {

>      if (NF != 3) fatal("syntax: begin fpu <name>")

>      toplevel()

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-hard.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-hard.c

> new file mode 100644

> index 0000000..b3c7fd0

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-hard.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nodsp -mfloat-abi=hard -

> mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-softfp.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-softfp.c

> new file mode 100644

> index 0000000..3806554

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-softfp.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nodsp -mfloat-abi=softfp -

> mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-flag-

> softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-flag-

> softfp.c

> new file mode 100644

> index 0000000..d22eb4e

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-flag-softfp.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nodsp+nofp -mfloat-

> abi=softfp -mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler "\.fpu softvfp" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-hard.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-hard.c

> new file mode 100644

> index 0000000..da1cc25

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-hard.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nofp -mfloat-abi=hard -

> mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler-not "\.fpu" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-softfp.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-softfp.c

> new file mode 100644

> index 0000000..0a4fb14

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-softfp.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nofp -mfloat-abi=softfp -

> mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler-not "\.fpu" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-nomve-flag-

> softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-nomve-flag-

> softfp.c

> new file mode 100644

> index 0000000..2ae7f34

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-nomve-flag-softfp.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nomve+nofp -mfloat-

> abi=softfp -mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler-not "\.fpu" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-hard.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-hard.c

> new file mode 100644

> index 0000000..a6ccd7b

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-hard.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nomve -mfloat-abi=hard -

> mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-softfp.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-softfp.c

> new file mode 100644

> index 0000000..2ad976a

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-softfp.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nomve -mfloat-abi=softfp -

> mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c

> new file mode 100644

> index 0000000..40d54b8

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nomve.fp -mfloat-abi=hard

> -mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-softfp.c

> b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-softfp.c

> new file mode 100644

> index 0000000..c726803

> --- /dev/null

> +++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-softfp.c

> @@ -0,0 +1,15 @@

> +/* { dg-do assemble } */

> +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */

> +/* { dg-additional-options "-mcpu=cortex-m55+nomve.fp -mfloat-

> abi=softfp -mfpu=auto --save-temps" } */

> +/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension mve" } } */

> +/* { dg-final { scan-assembler "\.arch_extension dsp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp" } } */

> +/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */

> +/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */

> +

> +int

> +f ()

> +{

> +  return 1;

> +}

> diff --git a/gcc/testsuite/gcc.target/arm/multilib.exp

> b/gcc/testsuite/gcc.target/arm/multilib.exp

> index c5f3c02..6aba29e 100644

> --- a/gcc/testsuite/gcc.target/arm/multilib.exp

> +++ b/gcc/testsuite/gcc.target/arm/multilib.exp

> @@ -824,6 +824,22 @@ if {[multilib_config "rmprofile"] } {

>  	{-march=armv8.1-m.main+mve.fp+fp.dp -mfpu=auto -mfloat-

> abi=softfp} "thumb/v8-m.main+dp/softfp"

>  	{-march=armv8.1-m.main+mve+fp.dp -mfpu=auto -mfloat-abi=hard}

> "thumb/v8-m.main+dp/hard"

>  	{-march=armv8.1-m.main+mve.fp+fp.dp -mfpu=auto -mfloat-

> abi=hard} "thumb/v8-m.main+dp/hard"

> +	{-mcpu=cortex-m55+nomve -mfpu=auto -mfloat-abi=soft}

> "thumb/v8-m.main/nofp"

> +	{-mcpu=cortex-m55+nomve -mfpu=auto -mfloat-abi=softfp}

> "thumb/v8-m.main+dp/softfp"

> +	{-mcpu=cortex-m55+nomve -mfpu=auto -mfloat-abi=hard}

> "thumb/v8-m.main+dp/hard"

> +	{-mcpu=cortex-m55+nomve.fp -mfpu=auto -mfloat-abi=soft}

> "thumb/v8-m.main/nofp"

> +	{-mcpu=cortex-m55+nomve.fp -mfpu=auto -mfloat-abi=softfp}

> "thumb/v8-m.main+dp/softfp"

> +	{-mcpu=cortex-m55+nomve.fp -mfpu=auto -mfloat-abi=hard}

> "thumb/v8-m.main+dp/hard"

> +	{-mcpu=cortex-m55+nofp -mfpu=auto -mfloat-abi=soft} "thumb/v8-

> m.main/nofp"

> +	{-mcpu=cortex-m55+nofp -mfpu=auto -mfloat-abi=softfp}

> "thumb/v8-m.main/nofp"

> +	{-mcpu=cortex-m55+nofp -mfpu=auto -mfloat-abi=hard}

> "thumb/v8.1-m.main+mve/hard"

> +	{-mcpu=cortex-m55+nodsp -mfpu=auto -mfloat-abi=soft}

> "thumb/v8-m.main/nofp"

> +	{-mcpu=cortex-m55+nodsp -mfpu=auto -mfloat-abi=softfp}

> "thumb/v8-m.main+dp/softfp"

> +	{-mcpu=cortex-m55+nodsp -mfpu=auto -mfloat-abi=hard}

> "thumb/v8-m.main+dp/hard"

> +	{-mcpu=cortex-m55+nomve+nofp -mfpu=auto -mfloat-abi=soft}

> "thumb/v8-m.main/nofp"

> +	{-mcpu=cortex-m55+nomve+nofp -mfpu=auto -mfloat-abi=softfp}

> "thumb/v8-m.main/nofp"

> +	{-mcpu=cortex-m55+nodsp+nofp -mfpu=auto -mfloat-abi=soft}

> "thumb/v8-m.main/nofp"

> +	{-mcpu=cortex-m55+nodsp+nofp -mfpu=auto -mfloat-abi=softfp}

> "thumb/v8-m.main/nofp"

>      } {

>  	check_multi_dir $opts $dir

>      }

> --

> 2.7.4

Patch

diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in
index c98f8ed..5083028 100644
--- a/gcc/config/arm/arm-cpus.in
+++ b/gcc/config/arm/arm-cpus.in
@@ -135,10 +135,6 @@  define feature armv8_1m_main
 # Floating point and Neon extensions.
 # VFPv1 is not supported in GCC.
 
-# This feature bit is enabled for all VFP, MVE and
-# MVE with floating point extensions.
-define feature vfp_base
-
 # Vector floating point v2.
 define feature vfpv2
 
@@ -251,7 +247,7 @@  define fgroup ALL_SIMD	ALL_SIMD_INTERNAL ALL_SIMD_EXTERNAL
 
 # List of all FPU bits to strip out if -mfpu is used to override the
 # default.  fp16 is deliberately missing from this list.
-define fgroup ALL_FPU_INTERNAL	vfp_base vfpv2 vfpv3 vfpv4 fpv5 fp16conv fp_dbl ALL_SIMD_INTERNAL
+define fgroup ALL_FPU_INTERNAL	vfpv2 vfpv3 vfpv4 fpv5 fp16conv fp_dbl ALL_SIMD_INTERNAL
 # Similarly, but including fp16 and other extensions that aren't part of
 # -mfpu support.
 define fgroup ALL_FPU_EXTERNAL fp16 bf16
@@ -296,11 +292,11 @@  define fgroup ARMv8r      ARMv8a
 define fgroup ARMv8_1m_main ARMv8m_main armv8_1m_main
 
 # Useful combinations.
-define fgroup VFPv2	vfp_base vfpv2
+define fgroup VFPv2	vfpv2
 define fgroup VFPv3	VFPv2 vfpv3
 define fgroup VFPv4	VFPv3 vfpv4 fp16conv
 define fgroup FPv5	VFPv4 fpv5
-define fgroup MVE      mve vfp_base armv7em
+define fgroup MVE      mve armv7em
 define fgroup MVE_FP   MVE FPv5 fp16 mve_float
 
 define fgroup FP_DBL	fp_dbl
@@ -310,6 +306,18 @@  define fgroup NEON	FP_D32 neon
 define fgroup CRYPTO	NEON crypto
 define fgroup DOTPROD	NEON dotprod
 
+# Implied feature bits.  These are for non-named features shared between fgroups.
+# Shared feature f belonging to fgroups A and B will be erroneously removed if:
+# A and B are enabled by default AND A is disabled by a removal flag.
+# To ensure that f is retained, we must add such bits to the ISA after
+# processing the removal flags.  This is implemented by 'implied bits':
+# define implied <name> [<feature-or-fgroup>]+
+# This indicates that, if any of the listed features are enabled, or if any
+# member of a listed fgroup is enabled, then <name> will be implicitly enabled.
+
+# Enabled for all VFP, MVE and MVE with floating point extensions.
+define implied vfp_base MVE MVE_FP ALL_FP
+
 # List of all quirk bits to strip out when comparing CPU features with
 # architectures.
 # xscale isn't really a 'quirk', but it isn't an architecture either and we
@@ -1508,6 +1516,10 @@  begin cpu cortex-m55
  cname cortexm55
  tune flags LDSCHED
  architecture armv8.1-m.main+mve.fp+fp.dp
+ option nomve.fp remove mve_float
+ option nomve remove mve mve_float
+ option nofp remove ALL_FP mve_float
+ option nodsp remove MVE mve_float
  isa quirk_no_asmcpu
  costs v7m
  vendor 41
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index dd78141..dc03c7a 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3410,6 +3410,20 @@  arm_configure_build_target (struct arm_build_target *target,
       bitmap_ior (target->isa, target->isa, fpu_bits);
     }
 
+  /* There may be implied bits which we still need to enable. These are
+     non-named features which are needed to complete other sets of features,
+     but cannot be enabled from arm-cpus.in due to being shared between
+     multiple fgroups. Each entry in all_implied_fbits is of the form
+     ante -> cons, meaning that if the feature "ante" is enabled, we should
+     implicitly enable "cons".  */
+  const struct fbit_implication *impl = all_implied_fbits;
+  while (impl->ante)
+    {
+      if (bitmap_bit_p (target->isa, impl->ante))
+	bitmap_set_bit (target->isa, impl->cons);
+      impl++;
+    }
+
   if (!arm_selected_tune)
     arm_selected_tune = arm_selected_cpu;
   else /* Validate the features passed to -mtune.  */
diff --git a/gcc/config/arm/parsecpu.awk b/gcc/config/arm/parsecpu.awk
index 7fc3754..9423e8a 100644
--- a/gcc/config/arm/parsecpu.awk
+++ b/gcc/config/arm/parsecpu.awk
@@ -190,6 +190,23 @@  function gen_isa () {
 	ORS = z
 	print "\n"
     }
+
+    print "struct fbit_implication {"
+    print "  /* Represents a feature implication, where:"
+    print "     ante IMPLIES cons"
+    print "     meaning that if ante is enabled then we should"
+    print "     also implicitly enable cons.  */"
+    print "  enum isa_feature ante;"
+    print "  enum isa_feature cons;"
+    print "};\n"
+    print "static const struct fbit_implication all_implied_fbits[] ="
+    print "{"
+    for (impl in implied_bits) {
+      split (impl, impl_parts, SUBSEP)
+      print "  { isa_bit_" impl_parts[2] ", isa_bit_" impl_parts[1] " },"
+    }
+    print "  { isa_nobit, isa_nobit }"
+    print "};\n"
 }
 
 function gen_data () {
@@ -600,6 +617,40 @@  BEGIN {
     parse_ok = 1
 }
 
+/^define implied / {
+  if (NF < 4) fatal("syntax: define implied <name> [<feature-or-fgroup>]+\n" \
+		    "Implied bits must be defined with at least one antecedent.")
+  toplevel()
+  fbit = $3
+  if (fbit in features) fatal("implied feature " fbit " aliases a real feature")
+  if (fbit in fgroup) fatal("implied feature " fbit " aliases a feature group")
+  fcount = NF
+  features[fbit] = 1
+  for (n = 4; n <= fcount; n++) {
+    ante = $n
+    if (fbit == ante) fatal("feature cannot imply itself")
+    else if (ante in features) {
+      for (impl in implied_bits) {
+	split(impl, impl_sep, SUBSEP)
+	if (ante == impl_sep[1])
+	  fatal(ante " implies implied bit " fbit		\
+		". Chained implications not currently supported")
+      }
+      implied_bits[fbit, ante] = 1
+    } else if (ante in fgroup) {
+      for (bitcomb in fgrp_bits) {
+	split(bitcomb, bitsep, SUBSEP)
+	if (bitsep[1] == ante) {
+	  implied_bits[fbit, bitsep[2]] = 1
+	}
+      }
+    } else {
+      fatal("implied bit antecedent " ante " unrecognized")
+    }
+  }
+  parse_ok = 1
+}
+
 /^begin fpu / {
     if (NF != 3) fatal("syntax: begin fpu <name>")
     toplevel()
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-hard.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-hard.c
new file mode 100644
index 0000000..b3c7fd0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-hard.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nodsp -mfloat-abi=hard -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-softfp.c
new file mode 100644
index 0000000..3806554
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-flag-softfp.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nodsp -mfloat-abi=softfp -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-flag-softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-flag-softfp.c
new file mode 100644
index 0000000..d22eb4e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nodsp-nofp-flag-softfp.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nodsp+nofp -mfloat-abi=softfp -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler "\.fpu softvfp" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-hard.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-hard.c
new file mode 100644
index 0000000..da1cc25
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-hard.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nofp -mfloat-abi=hard -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler-not "\.fpu" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-softfp.c
new file mode 100644
index 0000000..0a4fb14
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-flag-softfp.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nofp -mfloat-abi=softfp -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler-not "\.fpu" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-nomve-flag-softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-nomve-flag-softfp.c
new file mode 100644
index 0000000..2ae7f34
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nofp-nomve-flag-softfp.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nomve+nofp -mfloat-abi=softfp -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler-not "\.fpu" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-hard.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-hard.c
new file mode 100644
index 0000000..a6ccd7b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-hard.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nomve -mfloat-abi=hard -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-softfp.c
new file mode 100644
index 0000000..2ad976a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve-flag-softfp.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nomve -mfloat-abi=softfp -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c
new file mode 100644
index 0000000..40d54b8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-hard.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nomve.fp -mfloat-abi=hard -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-softfp.c b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-softfp.c
new file mode 100644
index 0000000..c726803
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/cortex-m55-nomve.fp-flag-softfp.c
@@ -0,0 +1,15 @@ 
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-additional-options "-mcpu=cortex-m55+nomve.fp -mfloat-abi=softfp -mfpu=auto --save-temps" } */
+/* { dg-final { scan-assembler-not "\.arch_extension mve.fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension mve" } } */
+/* { dg-final { scan-assembler "\.arch_extension dsp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp" } } */
+/* { dg-final { scan-assembler "\.arch_extension fp.dp" } } */
+/* { dg-final { scan-assembler "\.fpu fpv5-d16" } } */
+
+int
+f ()
+{
+  return 1;
+}
diff --git a/gcc/testsuite/gcc.target/arm/multilib.exp b/gcc/testsuite/gcc.target/arm/multilib.exp
index c5f3c02..6aba29e 100644
--- a/gcc/testsuite/gcc.target/arm/multilib.exp
+++ b/gcc/testsuite/gcc.target/arm/multilib.exp
@@ -824,6 +824,22 @@  if {[multilib_config "rmprofile"] } {
 	{-march=armv8.1-m.main+mve.fp+fp.dp -mfpu=auto -mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
 	{-march=armv8.1-m.main+mve+fp.dp -mfpu=auto -mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
 	{-march=armv8.1-m.main+mve.fp+fp.dp -mfpu=auto -mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
+	{-mcpu=cortex-m55+nomve -mfpu=auto -mfloat-abi=soft} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nomve -mfpu=auto -mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
+	{-mcpu=cortex-m55+nomve -mfpu=auto -mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
+	{-mcpu=cortex-m55+nomve.fp -mfpu=auto -mfloat-abi=soft} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nomve.fp -mfpu=auto -mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
+	{-mcpu=cortex-m55+nomve.fp -mfpu=auto -mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
+	{-mcpu=cortex-m55+nofp -mfpu=auto -mfloat-abi=soft} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nofp -mfpu=auto -mfloat-abi=softfp} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nofp -mfpu=auto -mfloat-abi=hard} "thumb/v8.1-m.main+mve/hard"
+	{-mcpu=cortex-m55+nodsp -mfpu=auto -mfloat-abi=soft} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nodsp -mfpu=auto -mfloat-abi=softfp} "thumb/v8-m.main+dp/softfp"
+	{-mcpu=cortex-m55+nodsp -mfpu=auto -mfloat-abi=hard} "thumb/v8-m.main+dp/hard"
+	{-mcpu=cortex-m55+nomve+nofp -mfpu=auto -mfloat-abi=soft} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nomve+nofp -mfpu=auto -mfloat-abi=softfp} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nodsp+nofp -mfpu=auto -mfloat-abi=soft} "thumb/v8-m.main/nofp"
+	{-mcpu=cortex-m55+nodsp+nofp -mfpu=auto -mfloat-abi=softfp} "thumb/v8-m.main/nofp"
     } {
 	check_multi_dir $opts $dir
     }