[Patch AArch64 2/3] Rework the code to print extension strings (pr70133)
authorJames Greenhalgh <james.greenhalgh@arm.com>
Mon, 11 Apr 2016 10:14:59 +0000 (10:14 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Mon, 11 Apr 2016 10:14:59 +0000 (10:14 +0000)
gcc/

PR target/70133
* config/aarch64/aarch64-common.c (aarch64_option_extension): Keep
track of a canonical flag name.
(all_extensions): Likewise.
(arch_to_arch_name): Also track extension flags enabled by the arch.
(all_architectures): Likewise.
(aarch64_parse_extension): Move to here.
(aarch64_get_extension_string_for_isa_flags): Take a new argument,
rework.
(aarch64_rewrite_selected_cpu): Update for above change.
* config/aarch64/aarch64-option-extensions.def: Rework the way flags
are handled, such that the single explicit value enabled by an
extension is kept seperate from the implicit values it also enables.
* config/aarch64/aarch64-protos.h (aarch64_parse_opt_result): Move
to here.
(aarch64_parse_extension): New.
* config/aarch64/aarch64.c (aarch64_parse_opt_result): Move from
here to config/aarch64/aarch64-protos.h.
(aarch64_parse_extension): Move from here to
common/config/aarch64/aarch64-common.c.
(aarch64_option_print): Update.
(aarch64_declare_function_name): Likewise.
(aarch64_start_file): Likewise.
* config/aarch64/driver-aarch64.c (arch_extension): Keep track of
the canonical flag for extensions.
* config.gcc (aarch64*-*-*): Extend regex for capturing extension
flags.

gcc/testsuite/

PR target/70133
* gcc.target/aarch64/mgeneral-regs_4.c: Fix expected output.
* gcc.target/aarch64/target_attr_15.c: Likewise.

From-SVN: r234876

gcc/ChangeLog
gcc/common/config/aarch64/aarch64-common.c
gcc/config.gcc
gcc/config/aarch64/aarch64-option-extensions.def
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/driver-aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/mgeneral-regs_4.c
gcc/testsuite/gcc.target/aarch64/target_attr_15.c

index e30ddc38d2fff5d20a41bd3510d732881f03d448..fe431824ca253738d78dbb35b5e261dccb8b537b 100644 (file)
@@ -1,3 +1,33 @@
+2016-04-11  James Greenhalgh  <james.greenhalgh@arm.com>
+
+       PR target/70133
+       * config/aarch64/aarch64-common.c (aarch64_option_extension): Keep
+       track of a canonical flag name.
+       (all_extensions): Likewise.
+       (arch_to_arch_name): Also track extension flags enabled by the arch.
+       (all_architectures): Likewise.
+       (aarch64_parse_extension): Move to here.
+       (aarch64_get_extension_string_for_isa_flags): Take a new argument,
+       rework.
+       (aarch64_rewrite_selected_cpu): Update for above change.
+       * config/aarch64/aarch64-option-extensions.def: Rework the way flags
+       are handled, such that the single explicit value enabled by an
+       extension is kept seperate from the implicit values it also enables.
+       * config/aarch64/aarch64-protos.h (aarch64_parse_opt_result): Move
+       to here.
+       (aarch64_parse_extension): New.
+       * config/aarch64/aarch64.c (aarch64_parse_opt_result): Move from
+       here to config/aarch64/aarch64-protos.h.
+       (aarch64_parse_extension): Move from here to
+       common/config/aarch64/aarch64-common.c.
+       (aarch64_option_print): Update.
+       (aarch64_declare_function_name): Likewise.
+       (aarch64_start_file): Likewise.
+       * config/aarch64/driver-aarch64.c (arch_extension): Keep track of
+       the canonical flag for extensions.
+       * config.gcc (aarch64*-*-*): Extend regex for capturing extension
+       flags.
+
 2016-04-11  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/aarch64.h (AARCH64_FL_FOR_ARCH8_1): Also add
index 4969f07fef4c1c7d3bd7e5fa03149a4945e30b23..08e795934207d015d9fa22c3822930af4a21c93a 100644 (file)
@@ -112,6 +112,7 @@ struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
 struct aarch64_option_extension
 {
   const char *const name;
+  const unsigned long flag_canonical;
   const unsigned long flags_on;
   const unsigned long flags_off;
 };
@@ -119,11 +120,11 @@ struct aarch64_option_extension
 /* ISA extensions in AArch64.  */
 static const struct aarch64_option_extension all_extensions[] =
 {
-#define AARCH64_OPT_EXTENSION(NAME, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \
-  {NAME, FLAGS_ON, FLAGS_OFF},
+#define AARCH64_OPT_EXTENSION(NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, Z) \
+  {NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF},
 #include "config/aarch64/aarch64-option-extensions.def"
 #undef AARCH64_OPT_EXTENSION
-  {NULL, 0, 0}
+  {NULL, 0, 0, 0}
 };
 
 struct processor_name_to_arch
@@ -137,6 +138,7 @@ struct arch_to_arch_name
 {
   const enum aarch64_arch arch;
   const std::string arch_name;
+  const unsigned long flags;
 };
 
 /* Map processor names to the architecture revision they implement and
@@ -155,26 +157,111 @@ static const struct processor_name_to_arch all_cores[] =
 static const struct arch_to_arch_name all_architectures[] =
 {
 #define AARCH64_ARCH(NAME, CORE, ARCH_IDENT, ARCH, FLAGS) \
-  {AARCH64_ARCH_##ARCH_IDENT, NAME},
+  {AARCH64_ARCH_##ARCH_IDENT, NAME, FLAGS},
 #include "config/aarch64/aarch64-arches.def"
 #undef AARCH64_ARCH
-  {aarch64_no_arch, ""}
+  {aarch64_no_arch, "", 0}
 };
 
-/* Return a string representation of ISA_FLAGS.  */
+/* Parse the architecture extension string STR and update ISA_FLAGS
+   with the architecture features turned on or off.  Return a
+   aarch64_parse_opt_result describing the result.  */
+
+enum aarch64_parse_opt_result
+aarch64_parse_extension (const char *str, unsigned long *isa_flags)
+{
+  /* The extension string is parsed left to right.  */
+  const struct aarch64_option_extension *opt = NULL;
+
+  /* Flag to say whether we are adding or removing an extension.  */
+  int adding_ext = -1;
+
+  while (str != NULL && *str != 0)
+    {
+      const char *ext;
+      size_t len;
+
+      str++;
+      ext = strchr (str, '+');
+
+      if (ext != NULL)
+       len = ext - str;
+      else
+       len = strlen (str);
+
+      if (len >= 2 && strncmp (str, "no", 2) == 0)
+       {
+         adding_ext = 0;
+         len -= 2;
+         str += 2;
+       }
+      else if (len > 0)
+       adding_ext = 1;
+
+      if (len == 0)
+       return AARCH64_PARSE_MISSING_ARG;
+
+
+      /* Scan over the extensions table trying to find an exact match.  */
+      for (opt = all_extensions; opt->name != NULL; opt++)
+       {
+         if (strlen (opt->name) == len && strncmp (opt->name, str, len) == 0)
+           {
+             /* Add or remove the extension.  */
+             if (adding_ext)
+               *isa_flags |= (opt->flags_on | opt->flag_canonical);
+             else
+               *isa_flags &= ~(opt->flags_off | opt->flag_canonical);
+             break;
+           }
+       }
+
+      if (opt->name == NULL)
+       {
+         /* Extension not found in list.  */
+         return AARCH64_PARSE_INVALID_FEATURE;
+       }
+
+      str = ext;
+    };
+
+  return AARCH64_PARSE_OK;
+}
+
+/* Return a string representation of ISA_FLAGS.  DEFAULT_ARCH_FLAGS
+   gives the default set of flags which are implied by whatever -march
+   we'd put out.  Our job is to figure out the minimal set of "+" and
+   "+no" feature flags to put out, and to put them out grouped such
+   that all the "+" flags come before the "+no" flags.  */
 
 std::string
-aarch64_get_extension_string_for_isa_flags (unsigned long isa_flags)
+aarch64_get_extension_string_for_isa_flags (unsigned long isa_flags,
+                                           unsigned long default_arch_flags)
 {
   const struct aarch64_option_extension *opt = NULL;
   std::string outstr = "";
 
+  /* Pass one: Find all the things we need to turn on.  As a special case,
+     we always want to put out +crc if it is enabled.  */
   for (opt = all_extensions; opt->name != NULL; opt++)
-    if ((isa_flags & opt->flags_on) == opt->flags_on)
+    if ((isa_flags & opt->flag_canonical
+        && !(default_arch_flags & opt->flag_canonical))
+       || (default_arch_flags & opt->flag_canonical
+            && opt->flag_canonical == AARCH64_ISA_CRC))
       {
        outstr += "+";
        outstr += opt->name;
       }
+
+  /* Pass two: Find all the things we need to turn off.  */
+  for (opt = all_extensions; opt->name != NULL; opt++)
+    if ((~isa_flags) & opt->flag_canonical
+       && !((~default_arch_flags) & opt->flag_canonical))
+      {
+       outstr += "+no";
+       outstr += opt->name;
+      }
+
   return outstr;
 }
 
@@ -186,7 +273,7 @@ const char *
 aarch64_rewrite_selected_cpu (const char *name)
 {
   std::string original_string (name);
-  std::string extensions;
+  std::string extension_str;
   std::string processor;
   size_t extension_pos = original_string.find_first_of ('+');
 
@@ -194,8 +281,8 @@ aarch64_rewrite_selected_cpu (const char *name)
   if (extension_pos != std::string::npos)
     {
       processor = original_string.substr (0, extension_pos);
-      extensions = original_string.substr (extension_pos,
-                                       std::string::npos);
+      extension_str = original_string.substr (extension_pos,
+                                             std::string::npos);
     }
   else
     {
@@ -227,9 +314,12 @@ aarch64_rewrite_selected_cpu (const char *name)
       || a_to_an->arch == aarch64_no_arch)
     fatal_error (input_location, "unknown value %qs for -mcpu", name);
 
+  unsigned long extensions = p_to_a->flags;
+  aarch64_parse_extension (extension_str.c_str (), &extensions);
+
   std::string outstr = a_to_an->arch_name
-       + aarch64_get_extension_string_for_isa_flags (p_to_a->flags)
-       + extensions;
+       + aarch64_get_extension_string_for_isa_flags (extensions,
+                                                     a_to_an->flags);
 
   /* We are going to memory leak here, nobody elsewhere
      in the callchain is going to clean up after us.  The alternative is
index 67222601e1c1d294499112f3c6906280ddb379f3..f66e48cd1caacb9d1d4258146a2afe3dc2d1b424 100644 (file)
@@ -3620,22 +3620,28 @@ case "${target}" in
                                    ${srcdir}/config/aarch64/aarch64-option-extensions.def \
                                    > /dev/null; then
 
-                                 ext_on=`grep "^AARCH64_OPT_EXTENSION(\"$base_ext\"," \
+                                 ext_canon=`grep "^AARCH64_OPT_EXTENSION(\"$base_ext\"," \
                                        ${srcdir}/config/aarch64/aarch64-option-extensions.def | \
                                        sed -e 's/^[^,]*,[      ]*//' | \
                                        sed -e 's/,.*$//'`
-                                 ext_off=`grep "^AARCH64_OPT_EXTENSION(\"$base_ext\"," \
+                                 ext_on=`grep "^AARCH64_OPT_EXTENSION(\"$base_ext\"," \
                                        ${srcdir}/config/aarch64/aarch64-option-extensions.def | \
                                        sed -e 's/^[^,]*,[      ]*[^,]*,[       ]*//' | \
                                        sed -e 's/,.*$//' | \
                                        sed -e 's/).*$//'`
+                                 ext_off=`grep "^AARCH64_OPT_EXTENSION(\"$base_ext\"," \
+                                       ${srcdir}/config/aarch64/aarch64-option-extensions.def | \
+                                       sed -e 's/^[^,]*,[      ]*[^,]*,[       ]*[^,]*,[       ]*//' | \
+                                       sed -e 's/,.*$//' | \
+                                       sed -e 's/).*$//'`
+
 
                                  if [ $ext = $base_ext ]; then
                                        # Adding extension
-                                       ext_mask="("$ext_mask") | ("$ext_on")"
+                                       ext_mask="("$ext_mask") | ("$ext_on" | "$ext_canon")"
                                  else
                                        # Removing extension
-                                       ext_mask="("$ext_mask") & ~("$ext_off")"
+                                       ext_mask="("$ext_mask") & ~("$ext_off" | "$ext_canon")"
                                  fi
 
                                  true
index fbf9a53283ca34a2feaf93c943164668399ca4a8..e8706d1c2e798872b8028cce1d9d193df8fef0be 100644 (file)
 
    Before using #include to read this file, define a macro:
 
-      AARCH64_OPT_EXTENSION(EXT_NAME, FLAGS_ON, FLAGS_OFF, FEATURE_STRING)
+      AARCH64_OPT_EXTENSION(EXT_NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, FEATURE_STRING)
 
    EXT_NAME is the name of the extension, represented as a string constant.
-   FLAGS_ON are the bitwise-or of the features that the extension adds.
-   FLAGS_OFF are the bitwise-or of the features that the extension removes.
+   FLAGS_CANONICAL is the canonical internal name for this flag.
+   FLAGS_ON are the bitwise-or of the features that enabling the extension
+   adds, or zero if enabling this extension has no effect on other features.
+   FLAGS_OFF are the bitwise-or of the features that disabling the extension
+   removes, or zero if disabling this extension has no effect on other
+   features.
    FEAT_STRING is a string containing the entries in the 'Features' field of
    /proc/cpuinfo on a GNU/Linux system that correspond to this architecture
    extension being available.  Sometimes multiple entries are needed to enable
    the extension (for example, the 'crypto' extension depends on four
    entries: aes, pmull, sha1, sha2 being present).  In that case this field
-   should contain a whitespace-separated list of the strings in 'Features'
+   should contain a space (" ") separated list of the strings in 'Features'
    that are required.  Their order is not important.  */
 
-AARCH64_OPT_EXTENSION ("fp", AARCH64_FL_FP,
-                      AARCH64_FL_FPSIMD | AARCH64_FL_CRYPTO, "fp")
-AARCH64_OPT_EXTENSION ("simd", AARCH64_FL_FPSIMD,
-                      AARCH64_FL_SIMD | AARCH64_FL_CRYPTO, "asimd")
-AARCH64_OPT_EXTENSION("crypto",        AARCH64_FL_CRYPTO | AARCH64_FL_FPSIMD,  AARCH64_FL_CRYPTO,   "aes pmull sha1 sha2")
-AARCH64_OPT_EXTENSION("crc",   AARCH64_FL_CRC,                         AARCH64_FL_CRC,                        "crc32")
-AARCH64_OPT_EXTENSION("lse",   AARCH64_FL_LSE,                         AARCH64_FL_LSE,                        "atomics")
+/* Enabling "fp" just enables "fp".
+   Disabling "fp" also disables "simd", "crypto".  */
+AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, 0, AARCH64_FL_SIMD | AARCH64_FL_CRYPTO, "fp")
+
+/* Enabling "simd" also enables "fp".
+   Disabling "simd" also disables "crypto".  */
+AARCH64_OPT_EXTENSION("simd", AARCH64_FL_SIMD, AARCH64_FL_FP, AARCH64_FL_CRYPTO, "asimd")
+
+/* Enabling "crypto" also enables "fp", "simd".
+   Disabling "crypto" just disables "crypto".  */
+AARCH64_OPT_EXTENSION("crypto", AARCH64_FL_CRYPTO, AARCH64_FL_FP | AARCH64_FL_SIMD, 0, "aes pmull sha1 sha2")
+
+/* Enabling or disabling "crc" only changes "crc".  */
+AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, 0, 0, "crc32")
+
+/* Enabling or disabling "lse" only changes "lse".  */
+AARCH64_OPT_EXTENSION("lse", AARCH64_FL_LSE, 0, 0, "atomics")
index 58c9d0d01d8eb273eb6bbb167177107dcd1b4b9d..f22a31c28307e22f79e393441c59ec9c0a47d8b3 100644 (file)
@@ -263,6 +263,18 @@ enum aarch64_extra_tuning_flags
 };
 #undef AARCH64_EXTRA_TUNING_OPTION
 
+/* Enum describing the various ways that the
+   aarch64_parse_{arch,tune,cpu,extension} functions can fail.
+   This way their callers can choose what kind of error to give.  */
+
+enum aarch64_parse_opt_result
+{
+  AARCH64_PARSE_OK,                    /* Parsing was successful.  */
+  AARCH64_PARSE_MISSING_ARG,           /* Missing argument.  */
+  AARCH64_PARSE_INVALID_FEATURE,       /* Invalid feature modifier.  */
+  AARCH64_PARSE_INVALID_ARG            /* Invalid arch, tune, cpu arg.  */
+};
+
 extern struct tune_params aarch64_tune_params;
 
 HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned, unsigned);
@@ -280,8 +292,6 @@ bool aarch64_float_const_zero_rtx_p (rtx);
 bool aarch64_function_arg_regno_p (unsigned);
 bool aarch64_gen_movmemqi (rtx *);
 bool aarch64_gimple_fold_builtin (gimple_stmt_iterator *);
-bool aarch64_handle_option (struct gcc_options *, struct gcc_options *,
-                            const struct cl_decoded_option *, location_t);
 bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx);
 bool aarch64_is_long_call_p (rtx);
 bool aarch64_is_noplt_call_p (rtx);
@@ -315,7 +325,6 @@ bool aarch64_uimm12_shift (HOST_WIDE_INT);
 bool aarch64_use_return_insn_p (void);
 const char *aarch64_mangle_builtin_type (const_tree);
 const char *aarch64_output_casesi (rtx *);
-const char *aarch64_rewrite_selected_cpu (const char *name);
 
 enum aarch64_symbol_type aarch64_classify_symbol (rtx, rtx);
 enum aarch64_symbol_type aarch64_classify_tls_symbol (rtx);
@@ -338,7 +347,6 @@ rtx aarch64_simd_gen_const_vector_dup (machine_mode, int);
 bool aarch64_simd_mem_operand_p (rtx);
 rtx aarch64_simd_vect_par_cnst_half (machine_mode, bool);
 rtx aarch64_tls_get_addr (void);
-std::string aarch64_get_extension_string_for_isa_flags (unsigned long);
 tree aarch64_fold_builtin (tree, int, tree *, bool);
 unsigned aarch64_dbx_register_number (unsigned);
 unsigned aarch64_trampoline_size (void);
@@ -433,4 +441,13 @@ extern bool aarch64_nopcrelative_literal_loads;
 extern void aarch64_asm_output_pool_epilogue (FILE *, const char *,
                                              tree, HOST_WIDE_INT);
 
+/* Defined in common/config/aarch64-common.c.  */
+bool aarch64_handle_option (struct gcc_options *, struct gcc_options *,
+                            const struct cl_decoded_option *, location_t);
+const char *aarch64_rewrite_selected_cpu (const char *name);
+enum aarch64_parse_opt_result aarch64_parse_extension (const char *,
+                                                      unsigned long *);
+std::string aarch64_get_extension_string_for_isa_flags (unsigned long,
+                                                       unsigned long);
+
 #endif /* GCC_AARCH64_PROTOS_H */
index b7086dd46679f3acdf494afbd21bdf1eb1bb1c34..999549426e6b13bc952b5b3acc0c54ad7e978aab 100644 (file)
@@ -666,7 +666,7 @@ struct aarch64_option_extension
 /* ISA extensions in AArch64.  */
 static const struct aarch64_option_extension all_extensions[] =
 {
-#define AARCH64_OPT_EXTENSION(NAME, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \
+#define AARCH64_OPT_EXTENSION(NAME, X, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \
   {NAME, FLAGS_ON, FLAGS_OFF},
 #include "aarch64-option-extensions.def"
 #undef AARCH64_OPT_EXTENSION
@@ -7673,83 +7673,6 @@ aarch64_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind,
 
 static void initialize_aarch64_code_model (struct gcc_options *);
 
-/* Enum describing the various ways that the
-   aarch64_parse_{arch,tune,cpu,extension} functions can fail.
-   This way their callers can choose what kind of error to give.  */
-
-enum aarch64_parse_opt_result
-{
-  AARCH64_PARSE_OK,                    /* Parsing was successful.  */
-  AARCH64_PARSE_MISSING_ARG,           /* Missing argument.  */
-  AARCH64_PARSE_INVALID_FEATURE,       /* Invalid feature modifier.  */
-  AARCH64_PARSE_INVALID_ARG            /* Invalid arch, tune, cpu arg.  */
-};
-
-/* Parse the architecture extension string STR and update ISA_FLAGS
-   with the architecture features turned on or off.  Return a
-   aarch64_parse_opt_result describing the result.  */
-
-static enum aarch64_parse_opt_result
-aarch64_parse_extension (char *str, unsigned long *isa_flags)
-{
-  /* The extension string is parsed left to right.  */
-  const struct aarch64_option_extension *opt = NULL;
-
-  /* Flag to say whether we are adding or removing an extension.  */
-  int adding_ext = -1;
-
-  while (str != NULL && *str != 0)
-    {
-      char *ext;
-      size_t len;
-
-      str++;
-      ext = strchr (str, '+');
-
-      if (ext != NULL)
-       len = ext - str;
-      else
-       len = strlen (str);
-
-      if (len >= 2 && strncmp (str, "no", 2) == 0)
-       {
-         adding_ext = 0;
-         len -= 2;
-         str += 2;
-       }
-      else if (len > 0)
-       adding_ext = 1;
-
-      if (len == 0)
-       return AARCH64_PARSE_MISSING_ARG;
-
-
-      /* Scan over the extensions table trying to find an exact match.  */
-      for (opt = all_extensions; opt->name != NULL; opt++)
-       {
-         if (strlen (opt->name) == len && strncmp (opt->name, str, len) == 0)
-           {
-             /* Add or remove the extension.  */
-             if (adding_ext)
-               *isa_flags |= opt->flags_on;
-             else
-               *isa_flags &= ~(opt->flags_off);
-             break;
-           }
-       }
-
-      if (opt->name == NULL)
-       {
-         /* Extension not found in list.  */
-         return AARCH64_PARSE_INVALID_FEATURE;
-       }
-
-      str = ext;
-    };
-
-  return AARCH64_PARSE_OK;
-}
-
 /* Parse the TO_PARSE string and put the architecture struct that it
    selects into RES and the architectural features into ISA_FLAGS.
    Return an aarch64_parse_opt_result describing the parse result.
@@ -8550,7 +8473,7 @@ aarch64_option_print (FILE *file, int indent, struct cl_target_option *ptr)
   unsigned long isa_flags = ptr->x_aarch64_isa_flags;
   const struct processor *arch = aarch64_get_arch (ptr->x_explicit_arch);
   std::string extension
-    = aarch64_get_extension_string_for_isa_flags (isa_flags);
+    = aarch64_get_extension_string_for_isa_flags (isa_flags, arch->flags);
 
   fprintf (file, "%*sselected tune = %s\n", indent, "", cpu->name);
   fprintf (file, "%*sselected arch = %s%s\n", indent, "",
@@ -11213,7 +11136,8 @@ aarch64_declare_function_name (FILE *stream, const char* name,
 
   unsigned long isa_flags = targ_options->x_aarch64_isa_flags;
   std::string extension
-    = aarch64_get_extension_string_for_isa_flags (isa_flags);
+    = aarch64_get_extension_string_for_isa_flags (isa_flags,
+                                                 this_arch->flags);
   /* Only update the assembler .arch string if it is distinct from the last
      such string we printed.  */
   std::string to_print = this_arch->name + extension;
@@ -11253,7 +11177,8 @@ aarch64_start_file (void)
     = aarch64_get_arch (default_options->x_explicit_arch);
   unsigned long default_isa_flags = default_options->x_aarch64_isa_flags;
   std::string extension
-    = aarch64_get_extension_string_for_isa_flags (default_isa_flags);
+    = aarch64_get_extension_string_for_isa_flags (default_isa_flags,
+                                                 default_arch->flags);
 
    aarch64_last_printed_arch_string = default_arch->name + extension;
    aarch64_last_printed_tune_string = "";
index 317a8a9872e49fb47ae5b50a39e1dec2e07e72e2..8925ec12667cde0b2e2121c4d1bf585bbb0476ea 100644 (file)
 struct arch_extension
 {
   const char *ext;
+  unsigned int flag;
   const char *feat_string;
 };
 
-#define AARCH64_OPT_EXTENSION(EXT_NAME, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \
-  { EXT_NAME, FEATURE_STRING },
+#define AARCH64_OPT_EXTENSION(EXT_NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \
+  { EXT_NAME, FLAG_CANONICAL, FEATURE_STRING },
 static struct arch_extension ext_to_feat_string[] =
 {
 #include "aarch64-option-extensions.def"
index 77b614b2db7331c36341808b99abd699fdb579a2..3a0f142021b0fa5ba12adfa674f3b3ffc5c0abed 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-11  James Greenhalgh  <james.greenhalgh@arm.com>
+
+       PR target/70133
+       * gcc.target/aarch64/mgeneral-regs_4.c: Fix expected output.
+       * gcc.target/aarch64/target_attr_15.c: Likewise.
+
 2016-04-10  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/69066
index 8eb50aafa2b71fe936c1113b80b55e10f80f9721..49b74d9e265c883ff7852d2db2529b68e3c9d9e6 100644 (file)
@@ -6,4 +6,4 @@ test (void)
   return 1;
 }
 
-/* { dg-final { scan-assembler "\.arch.*fp.*simd" } } */
+/* { dg-final { scan-assembler-times "\\.arch armv8-a\n" 1 } } */
index f72bec878bf635429d67d441f0ec168839ff9888..2d8c7b955ce3f7adb75e73f7c93e6c2f8772f133 100644 (file)
@@ -10,4 +10,4 @@ foo (int a)
   return a + 1;
 }
 
-/* { dg-final { scan-assembler-times "\\.arch armv8-a\n" 1 } } */
+/* { dg-final { scan-assembler-times "\\.arch armv8-a\\+nofp\\+nosimd\n" 1 } } */