On 01/06/2021 18:08, Srinath Parvathaneni via Gcc-patches wrote:
Hi All,

On passing +cdecp[0-7] extension to the -march string in command line options,
multilib linking is failing as mentioned in PR100856. This patch fixes this
issue by generating a separate -march string only for multilib comparison.

Regression tested on arm-none-eabi and found no regressions.

Ok for master?

Not as it stands.  More comments below.

Regards,
Srinath.

gcc/ChangeLog:

2021-06-01  Srinath Parvathaneni  <srinath.parvathan...@arm.com>

        PR target/100856
        * common/config/arm/arm-common.c (arm_canon_arch_option): Modify
        function to generate canonical march string after removing cde related
        compiler extensions.
        (arm_canon_arch_multilib_option): Define function.
        * config/arm/arm-cpus.in (CDE_LIST): Define fgroup.
        * config/arm/arm.h (arm_canon_arch_multilib_option): Define macro.
        (CANON_ARCH_MULTILIB_SPEC_FUNCTION): Define macro.
        (ARCH_CANONICAL_MULTILIB_SPECS): Define macro.
        (TARGET_MULTLILIB_ARCH): Define macro.
        * gcc.c (used_arg_t::operator ()): Add condition to generate separate
        march string for multilib matching.

gcc/testsuite/ChangeLog:

2021-06-01  Srinath Parvathaneni  <srinath.parvathan...@arm.com>

        PR target/100856
        * gcc.target/arm/acle/pr100856.c: New test.
        * gcc.target/arm/multilib.exp: Modify.



###############     Attachment also inlined for ease of reply    ###############


diff --git a/gcc/common/config/arm/arm-common.c 
b/gcc/common/config/arm/arm-common.c
index 
9980af6885c3dfe68f61fa0f39b23022b4e59c19..7d8c6e5253f3f1683eed99f479a09186a46c2d22
 100644
--- a/gcc/common/config/arm/arm-common.c
+++ b/gcc/common/config/arm/arm-common.c
@@ -616,6 +616,8 @@ public:
      }
  };
+static int multilib_arch = 0;

Please, no!  Instead...

+
  /* Generate a canonical representation of the -march option from the
     current -march string (if given) and other options on the command
     line that might affect the architecture.  This aids multilib selection
@@ -703,6 +705,14 @@ arm_canon_arch_option (int argc, const char **argv)

This function should be renamed arm_canon_arch_option_1 and given an extra (bool) parameter to control the behaviour. Then arm_canon_arch_option can call it with the parameter false to maintain the existing behaviour and arm_canon_arch_multilib_option can pass true.

        arm_initialize_isa (target_isa, selected_arch->common.isa_bits);
        arm_parse_option_features (target_isa, &selected_arch->common,
                                 strchr (arch, '+'));
+      if (multilib_arch == 1)
+       {
+         const enum isa_feature cde_bitlist[] = {ISA_ALL_CDE, isa_nobit};

This is too specific, but that's mostly a naming problem. Instead we need a new feature group IGNORE_FOR_MULTILIB (which at present just contains ALL_CDE).

+         sbitmap isa_cdebits = sbitmap_alloc (isa_num_bits);
+         arm_initialize_isa (isa_cdebits, cde_bitlist);
+         bitmap_and_compl (target_isa, target_isa, isa_cdebits);
+       }
+
        if (fpu && strcmp (fpu, "auto") != 0)
        {
          /* We assume that architectures do not have any FPU bits
@@ -786,18 +796,27 @@ arm_canon_arch_option (int argc, const char **argv)
arm_initialize_isa (base_isa, selected_arch->common.isa_bits); - /* Architecture has no extension options, so just return the canonical
-     architecture name.  */
-  if (selected_arch->common.extensions == NULL)
-    return selected_arch->common.name;
-
    /* We're only interested in extension bits.  */
    bitmap_and_compl (target_isa, target_isa, base_isa);
+ /* Architecture has no extension options, so just return the canonical
+     architecture name.  */
+  if (multilib_arch == 0 && selected_arch->common.extensions == NULL)
+    return selected_arch->common.name;
    /* There are no extensions needed.  Just return the canonical architecture
       name.  */
-  if (bitmap_empty_p (target_isa))
+  else if (multilib_arch == 0 && bitmap_empty_p (target_isa))
      return selected_arch->common.name;
+  else if (multilib_arch == 1
+          && (selected_arch->common.extensions == NULL
+              || bitmap_empty_p (target_isa)))
+    {
+      canonical_arch = (char *) xmalloc (strlen (selected_arch->common.name)
+                                        + strlen ("march="));
+      strcpy (canonical_arch, "march=");

Prepending "march=" only for the multilib_arch variant confuses the purpose of this routine, which is to generate a suitable arch string. I think this should be pushed up, perhaps as far as the specs strings themselves. Then most of this hunk just disappears as completely redundant.

+      strcat (canonical_arch, selected_arch->common.name);
+      return canonical_arch;
+    }
/* What is left is the architecture that the compiler will target. We
       now need to map that back into a suitable option+features list.
@@ -899,10 +918,20 @@ arm_canon_arch_option (int argc, const char **argv)
        }
      }
- canonical_arch
-    = (char *) xmalloc (len + strlen (selected_arch->common.name));
-
-  strcpy (canonical_arch, selected_arch->common.name);
+  if (multilib_arch == 1)
+    {
+      canonical_arch
+       = (char *) xmalloc (len + strlen (selected_arch->common.name)
+                           + strlen ("march="));
+      strcpy (canonical_arch, "march=");
+      strcat (canonical_arch, selected_arch->common.name);
+    }
+  else
+    {
+      canonical_arch
+       = (char *) xmalloc (len + strlen (selected_arch->common.name));
+      strcpy (canonical_arch, selected_arch->common.name);
+    }

Likewise.

for (std::list<candidate_extension *>::iterator iter = extensions.begin ();
         iter != extensions.end (); ++iter)
@@ -1069,3 +1098,15 @@ arm_asm_auto_mfpu (int argc, const char **argv)
  #define TARGET_EXCEPT_UNWIND_INFO  arm_except_unwind_info
struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
+
+/* This function returns the canonical -march string after removing the 
compiler
+   extension options which are not required for multilib linking.  */
+const char *
+arm_canon_arch_multilib_option (int argc, const char **argv)
+{
+  char const *multilib_option = NULL;
+  multilib_arch = 1;
+  multilib_option = arm_canon_arch_option ( argc, argv);

remove white space before argc.

+  multilib_arch = 0;

See comment earlier.  This function should just be

const char *
arm_canon_arch_multilib_option (int argc, const char **argv)
{
  return arm_canon_arch_option_1 (argc, argv, true);
}

+  return multilib_option;
+}
diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in
index 
0becb4385b675d0e08ea08c97785cabfa8cf7026..00944f8e9071d6097f703843fee8822d0ee08d6a
 100644
--- a/gcc/config/arm/arm-cpus.in
+++ b/gcc/config/arm/arm-cpus.in
@@ -324,6 +324,8 @@ define implied vfp_base MVE MVE_FP ALL_FP
  # need to ignore it for matching purposes.
  define fgroup ALL_QUIRKS   quirk_no_volatile_ce quirk_armv6kz quirk_cm3_ldrd 
xscale quirk_no_asmcpu
+define fgroup ALL_CDE cdecp0 cdecp1 cdecp2 cdecp3 cdecp4 cdecp5 cdecp6 cdecp7
+
  # Architecture entries
  # format:
  # begin arch <name>
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 
8e5bd5793237e531aa83d998f5756b459dbcb6a7..0859c2dc1d60b98935242fce56b17f5f67fd1509
 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -2444,10 +2444,14 @@ extern const char *host_detect_local_cpu (int argc, 
const char **argv);
  #endif
const char *arm_canon_arch_option (int argc, const char **argv);
+const char *arm_canon_arch_multilib_option (int argc, const char **argv);
#define CANON_ARCH_SPEC_FUNCTION \
    { "canon_arch", arm_canon_arch_option },
+#define CANON_ARCH_MULTILIB_SPEC_FUNCTION \
+  { "canon_arch_multilib", arm_canon_arch_multilib_option },
+
  const char *arm_be8_option (int argc, const char **argv);
  #define BE8_SPEC_FUNCTION                     \
    { "be8_linkopt", arm_be8_option },
@@ -2456,6 +2460,7 @@ const char *arm_be8_option (int argc, const char **argv);
    MCPU_MTUNE_NATIVE_FUNCTIONS                 \
    ASM_CPU_SPEC_FUNCTIONS                      \
    CANON_ARCH_SPEC_FUNCTION                    \
+  CANON_ARCH_MULTILIB_SPEC_FUNCTION            \
    TARGET_MODE_SPEC_FUNCTIONS                  \
    BE8_SPEC_FUNCTION
@@ -2476,6 +2481,15 @@ const char *arm_be8_option (int argc, const char **argv);
    "                     %{mfloat-abi=*: abi %*}"    \
    "                     %<march=*) "
+/* Generate a canonical string without compiler extension which are not needed
+   for multilib linking.  */
+#define ARCH_CANONICAL_MULTILIB_SPECS  \
+  "%{mcpu=*: cpu %*} "                       \
+  "%{march=*: arch %*} "             \
+  "%{mfpu=*: fpu %*} "                       \
+  "%{mfloat-abi=*: abi %*}"          \
+  "%<march=*) "
+
  /* Complete set of specs for the driver.  Commas separate the
     individual rules so that any option suppression (%<opt...)is
     completed before starting subsequent rules.  */
@@ -2484,6 +2498,8 @@ const char *arm_be8_option (int argc, const char **argv);
    TARGET_MODE_SPECS,                          \
    ARCH_CANONICAL_SPECS
+#define TARGET_MULTLILIB_ARCH 1
+

This isn't documented. But it's no-longer the way we do things anyway. What's needed these days is a hook.

  #define TARGET_SUPPORTS_WIDE_INT 1
/* For switching between functions with different target attributes. */
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 
4c1a659d5e8929ed2267694c0d62ce476a099bf5..7984806f5fe0e65021daffaa055793890db23228
 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -9414,9 +9414,27 @@ used_arg_t::operator () (const char *p, int len)
        if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
          {
            int xlen = strlen (switches[i].part1);
+#ifdef TARGET_MULTLILIB_ARCH
+           const char *arch_multilib = NULL;
+           if (!strncmp (switches[i].part1, "march=", strlen ("march=")))
+             {
+               arch_multilib
+                 = eval_spec_function ("canon_arch_multilib",
+                                       ARCH_CANONICAL_MULTILIB_SPECS, NULL);
+               xlen = strlen (arch_multilib);
+             }
+           for (j = 0; j < cnt; j++)
+             if (xlen == matches[j].len
+                 && ((arch_multilib != NULL
+                      && !strncmp (arch_multilib, matches[j].str, xlen))
+                     || (arch_multilib == NULL
+                         && !strncmp (switches[i].part1, matches[j].str,
+                                      xlen))))
+#else

This just won't fly. Firstly, we don't use ifdefs this way in the main code base anymore (it needs to be done through hooks if it can't be made completely generic). Secondly, it makes reference to a machine-specific switch name directly from machine-independent code. I don't currently have a strong suggestion to make at this point, though, sorry. Perhaps someone else can suggest a way forward.

            for (j = 0; j < cnt; j++)
              if (xlen == matches[j].len
                  && ! strncmp (switches[i].part1, matches[j].str, xlen))
+#endif
                {
                  mswitches[n_mswitches].str = matches[j].replace;
                  mswitches[n_mswitches].len = matches[j].rep_len;
@@ -9425,6 +9443,10 @@ used_arg_t::operator () (const char *p, int len)
                  n_mswitches++;
                  break;
                }
+#ifdef TARGET_MULTLILIB_ARCH
+           if (arch_multilib != NULL)
+             free (CONST_CAST (char *, arch_multilib));
+#endif
          }
/* Add MULTILIB_DEFAULTS switches too, as long as they were not present
diff --git a/gcc/testsuite/gcc.target/arm/acle/pr100856.c 
b/gcc/testsuite/gcc.target/arm/acle/pr100856.c
new file mode 100644
index 
0000000000000000000000000000000000000000..5bc030e2e46bf89dfe7f3b9d0dab1e07947e8d5e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/acle/pr100856.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-require-effective-target arm_v8_1m_main_cde_mve_ok } */
+/* { dg-add-options arm_v8_1m_main_cde_mve } */
+
+#include "arm_cde.h"
+
+int main()
+{
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/arm/multilib.exp 
b/gcc/testsuite/gcc.target/arm/multilib.exp
index 
46f2d86de3c05c184b2ec12af53e2053ddc3b157..4b30025db8cbdcd37bbb3a0be6c345b9d48818c4
 100644
--- a/gcc/testsuite/gcc.target/arm/multilib.exp
+++ b/gcc/testsuite/gcc.target/arm/multilib.exp
@@ -840,6 +840,119 @@ if {[multilib_config "rmprofile"] } {
        {-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"
+       {-march=armv8-m.main+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8-m.main+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main/nofp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=vfpv3xd-fp16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-sp-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp.dp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8-m.main+fp.dp+dsp+cdecp0 -mfpu=fpv5-d16 -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8.1-m.main+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+dsp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+dsp+fp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+dsp+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+dsp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+dsp+fp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8.1-m.main+dsp+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8.1-m.main+dsp+fp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8.1-m.main+dsp+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8.1-m.main+mve+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+mve.fp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+mve+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+mve.fp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8.1-m.main+mve+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8.1-m.main+mve/hard"
+       {-march=armv8.1-m.main+mve+fp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8.1-m.main+mve+fp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+fp/softfp"
+       {-march=armv8.1-m.main+mve.fp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+fp/hard"
+       {-march=armv8.1-m.main+mve+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+mve.fp+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=soft} 
"thumb/v8-m.main/nofp"
+       {-march=armv8.1-m.main+mve+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8.1-m.main+mve.fp+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=softfp} 
"thumb/v8-m.main+dp/softfp"
+       {-march=armv8.1-m.main+mve+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
+       {-march=armv8.1-m.main+mve.fp+fp.dp+cdecp0 -mfpu=auto -mfloat-abi=hard} 
"thumb/v8-m.main+dp/hard"
      } {
        check_multi_dir $opts $dir
      }

Reply via email to