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

Kyrylo Tkachov Kyrylo.Tkachov@arm.com
Fri Oct 2 14:15:24 GMT 2020


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



More information about the Gcc-patches mailing list