Commit 04a99ebe by James Greenhalgh Committed by James Greenhalgh

[Patch AArch64 2/3] Rework the code to print extension strings (pr70133)

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
parent a60fd657
2016-04-11 James Greenhalgh <james.greenhalgh@arm.com> 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 * config/aarch64/aarch64.h (AARCH64_FL_FOR_ARCH8_1): Also add
AARCH64_FL_CRC. AARCH64_FL_CRC.
......
...@@ -112,6 +112,7 @@ struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER; ...@@ -112,6 +112,7 @@ struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
struct aarch64_option_extension struct aarch64_option_extension
{ {
const char *const name; const char *const name;
const unsigned long flag_canonical;
const unsigned long flags_on; const unsigned long flags_on;
const unsigned long flags_off; const unsigned long flags_off;
}; };
...@@ -119,11 +120,11 @@ struct aarch64_option_extension ...@@ -119,11 +120,11 @@ struct aarch64_option_extension
/* ISA extensions in AArch64. */ /* ISA extensions in AArch64. */
static const struct aarch64_option_extension all_extensions[] = static const struct aarch64_option_extension all_extensions[] =
{ {
#define AARCH64_OPT_EXTENSION(NAME, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \ #define AARCH64_OPT_EXTENSION(NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, Z) \
{NAME, FLAGS_ON, FLAGS_OFF}, {NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF},
#include "config/aarch64/aarch64-option-extensions.def" #include "config/aarch64/aarch64-option-extensions.def"
#undef AARCH64_OPT_EXTENSION #undef AARCH64_OPT_EXTENSION
{NULL, 0, 0} {NULL, 0, 0, 0}
}; };
struct processor_name_to_arch struct processor_name_to_arch
...@@ -137,6 +138,7 @@ struct arch_to_arch_name ...@@ -137,6 +138,7 @@ struct arch_to_arch_name
{ {
const enum aarch64_arch arch; const enum aarch64_arch arch;
const std::string arch_name; const std::string arch_name;
const unsigned long flags;
}; };
/* Map processor names to the architecture revision they implement and /* Map processor names to the architecture revision they implement and
...@@ -155,26 +157,111 @@ static const struct processor_name_to_arch all_cores[] = ...@@ -155,26 +157,111 @@ static const struct processor_name_to_arch all_cores[] =
static const struct arch_to_arch_name all_architectures[] = static const struct arch_to_arch_name all_architectures[] =
{ {
#define AARCH64_ARCH(NAME, CORE, ARCH_IDENT, ARCH, FLAGS) \ #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" #include "config/aarch64/aarch64-arches.def"
#undef AARCH64_ARCH #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 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; const struct aarch64_option_extension *opt = NULL;
std::string outstr = ""; 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++) 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 += "+";
outstr += opt->name; 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; return outstr;
} }
...@@ -186,7 +273,7 @@ const char * ...@@ -186,7 +273,7 @@ const char *
aarch64_rewrite_selected_cpu (const char *name) aarch64_rewrite_selected_cpu (const char *name)
{ {
std::string original_string (name); std::string original_string (name);
std::string extensions; std::string extension_str;
std::string processor; std::string processor;
size_t extension_pos = original_string.find_first_of ('+'); size_t extension_pos = original_string.find_first_of ('+');
...@@ -194,8 +281,8 @@ aarch64_rewrite_selected_cpu (const char *name) ...@@ -194,8 +281,8 @@ aarch64_rewrite_selected_cpu (const char *name)
if (extension_pos != std::string::npos) if (extension_pos != std::string::npos)
{ {
processor = original_string.substr (0, extension_pos); processor = original_string.substr (0, extension_pos);
extensions = original_string.substr (extension_pos, extension_str = original_string.substr (extension_pos,
std::string::npos); std::string::npos);
} }
else else
{ {
...@@ -227,9 +314,12 @@ aarch64_rewrite_selected_cpu (const char *name) ...@@ -227,9 +314,12 @@ aarch64_rewrite_selected_cpu (const char *name)
|| a_to_an->arch == aarch64_no_arch) || a_to_an->arch == aarch64_no_arch)
fatal_error (input_location, "unknown value %qs for -mcpu", name); 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 std::string outstr = a_to_an->arch_name
+ aarch64_get_extension_string_for_isa_flags (p_to_a->flags) + aarch64_get_extension_string_for_isa_flags (extensions,
+ extensions; a_to_an->flags);
/* We are going to memory leak here, nobody elsewhere /* We are going to memory leak here, nobody elsewhere
in the callchain is going to clean up after us. The alternative is in the callchain is going to clean up after us. The alternative is
......
...@@ -3620,22 +3620,28 @@ case "${target}" in ...@@ -3620,22 +3620,28 @@ case "${target}" in
${srcdir}/config/aarch64/aarch64-option-extensions.def \ ${srcdir}/config/aarch64/aarch64-option-extensions.def \
> /dev/null; then > /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 | \ ${srcdir}/config/aarch64/aarch64-option-extensions.def | \
sed -e 's/^[^,]*,[ ]*//' | \ sed -e 's/^[^,]*,[ ]*//' | \
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 | \ ${srcdir}/config/aarch64/aarch64-option-extensions.def | \
sed -e 's/^[^,]*,[ ]*[^,]*,[ ]*//' | \ sed -e 's/^[^,]*,[ ]*[^,]*,[ ]*//' | \
sed -e 's/,.*$//' | \ 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 if [ $ext = $base_ext ]; then
# Adding extension # Adding extension
ext_mask="("$ext_mask") | ("$ext_on")" ext_mask="("$ext_mask") | ("$ext_on" | "$ext_canon")"
else else
# Removing extension # Removing extension
ext_mask="("$ext_mask") & ~("$ext_off")" ext_mask="("$ext_mask") & ~("$ext_off" | "$ext_canon")"
fi fi
true true
......
...@@ -21,23 +21,37 @@ ...@@ -21,23 +21,37 @@
Before using #include to read this file, define a macro: 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. 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_CANONICAL is the canonical internal name for this flag.
FLAGS_OFF are the bitwise-or of the features that the extension removes. 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 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 /proc/cpuinfo on a GNU/Linux system that correspond to this architecture
extension being available. Sometimes multiple entries are needed to enable extension being available. Sometimes multiple entries are needed to enable
the extension (for example, the 'crypto' extension depends on four the extension (for example, the 'crypto' extension depends on four
entries: aes, pmull, sha1, sha2 being present). In that case this field 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. */ that are required. Their order is not important. */
AARCH64_OPT_EXTENSION ("fp", AARCH64_FL_FP, /* Enabling "fp" just enables "fp".
AARCH64_FL_FPSIMD | AARCH64_FL_CRYPTO, "fp") Disabling "fp" also disables "simd", "crypto". */
AARCH64_OPT_EXTENSION ("simd", AARCH64_FL_FPSIMD, AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, 0, AARCH64_FL_SIMD | AARCH64_FL_CRYPTO, "fp")
AARCH64_FL_SIMD | AARCH64_FL_CRYPTO, "asimd")
AARCH64_OPT_EXTENSION("crypto", AARCH64_FL_CRYPTO | AARCH64_FL_FPSIMD, AARCH64_FL_CRYPTO, "aes pmull sha1 sha2") /* Enabling "simd" also enables "fp".
AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, AARCH64_FL_CRC, "crc32") Disabling "simd" also disables "crypto". */
AARCH64_OPT_EXTENSION("lse", AARCH64_FL_LSE, AARCH64_FL_LSE, "atomics") 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")
...@@ -263,6 +263,18 @@ enum aarch64_extra_tuning_flags ...@@ -263,6 +263,18 @@ enum aarch64_extra_tuning_flags
}; };
#undef AARCH64_EXTRA_TUNING_OPTION #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; extern struct tune_params aarch64_tune_params;
HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned, unsigned); HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned, unsigned);
...@@ -280,8 +292,6 @@ bool aarch64_float_const_zero_rtx_p (rtx); ...@@ -280,8 +292,6 @@ bool aarch64_float_const_zero_rtx_p (rtx);
bool aarch64_function_arg_regno_p (unsigned); bool aarch64_function_arg_regno_p (unsigned);
bool aarch64_gen_movmemqi (rtx *); bool aarch64_gen_movmemqi (rtx *);
bool aarch64_gimple_fold_builtin (gimple_stmt_iterator *); 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_extend_from_extract (machine_mode, rtx, rtx);
bool aarch64_is_long_call_p (rtx); bool aarch64_is_long_call_p (rtx);
bool aarch64_is_noplt_call_p (rtx); bool aarch64_is_noplt_call_p (rtx);
...@@ -315,7 +325,6 @@ bool aarch64_uimm12_shift (HOST_WIDE_INT); ...@@ -315,7 +325,6 @@ bool aarch64_uimm12_shift (HOST_WIDE_INT);
bool aarch64_use_return_insn_p (void); bool aarch64_use_return_insn_p (void);
const char *aarch64_mangle_builtin_type (const_tree); const char *aarch64_mangle_builtin_type (const_tree);
const char *aarch64_output_casesi (rtx *); 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_symbol (rtx, rtx);
enum aarch64_symbol_type aarch64_classify_tls_symbol (rtx); enum aarch64_symbol_type aarch64_classify_tls_symbol (rtx);
...@@ -338,7 +347,6 @@ rtx aarch64_simd_gen_const_vector_dup (machine_mode, int); ...@@ -338,7 +347,6 @@ rtx aarch64_simd_gen_const_vector_dup (machine_mode, int);
bool aarch64_simd_mem_operand_p (rtx); bool aarch64_simd_mem_operand_p (rtx);
rtx aarch64_simd_vect_par_cnst_half (machine_mode, bool); rtx aarch64_simd_vect_par_cnst_half (machine_mode, bool);
rtx aarch64_tls_get_addr (void); 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); tree aarch64_fold_builtin (tree, int, tree *, bool);
unsigned aarch64_dbx_register_number (unsigned); unsigned aarch64_dbx_register_number (unsigned);
unsigned aarch64_trampoline_size (void); unsigned aarch64_trampoline_size (void);
...@@ -433,4 +441,13 @@ extern bool aarch64_nopcrelative_literal_loads; ...@@ -433,4 +441,13 @@ extern bool aarch64_nopcrelative_literal_loads;
extern void aarch64_asm_output_pool_epilogue (FILE *, const char *, extern void aarch64_asm_output_pool_epilogue (FILE *, const char *,
tree, HOST_WIDE_INT); 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 */ #endif /* GCC_AARCH64_PROTOS_H */
...@@ -666,7 +666,7 @@ struct aarch64_option_extension ...@@ -666,7 +666,7 @@ struct aarch64_option_extension
/* ISA extensions in AArch64. */ /* ISA extensions in AArch64. */
static const struct aarch64_option_extension all_extensions[] = 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}, {NAME, FLAGS_ON, FLAGS_OFF},
#include "aarch64-option-extensions.def" #include "aarch64-option-extensions.def"
#undef AARCH64_OPT_EXTENSION #undef AARCH64_OPT_EXTENSION
...@@ -7673,83 +7673,6 @@ aarch64_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind, ...@@ -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 *); 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 /* Parse the TO_PARSE string and put the architecture struct that it
selects into RES and the architectural features into ISA_FLAGS. selects into RES and the architectural features into ISA_FLAGS.
Return an aarch64_parse_opt_result describing the parse result. 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) ...@@ -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; unsigned long isa_flags = ptr->x_aarch64_isa_flags;
const struct processor *arch = aarch64_get_arch (ptr->x_explicit_arch); const struct processor *arch = aarch64_get_arch (ptr->x_explicit_arch);
std::string extension 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 tune = %s\n", indent, "", cpu->name);
fprintf (file, "%*sselected arch = %s%s\n", indent, "", fprintf (file, "%*sselected arch = %s%s\n", indent, "",
...@@ -11213,7 +11136,8 @@ aarch64_declare_function_name (FILE *stream, const char* name, ...@@ -11213,7 +11136,8 @@ aarch64_declare_function_name (FILE *stream, const char* name,
unsigned long isa_flags = targ_options->x_aarch64_isa_flags; unsigned long isa_flags = targ_options->x_aarch64_isa_flags;
std::string extension 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 /* Only update the assembler .arch string if it is distinct from the last
such string we printed. */ such string we printed. */
std::string to_print = this_arch->name + extension; std::string to_print = this_arch->name + extension;
...@@ -11253,7 +11177,8 @@ aarch64_start_file (void) ...@@ -11253,7 +11177,8 @@ aarch64_start_file (void)
= aarch64_get_arch (default_options->x_explicit_arch); = aarch64_get_arch (default_options->x_explicit_arch);
unsigned long default_isa_flags = default_options->x_aarch64_isa_flags; unsigned long default_isa_flags = default_options->x_aarch64_isa_flags;
std::string extension 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_arch_string = default_arch->name + extension;
aarch64_last_printed_tune_string = ""; aarch64_last_printed_tune_string = "";
......
...@@ -23,11 +23,12 @@ ...@@ -23,11 +23,12 @@
struct arch_extension struct arch_extension
{ {
const char *ext; const char *ext;
unsigned int flag;
const char *feat_string; const char *feat_string;
}; };
#define AARCH64_OPT_EXTENSION(EXT_NAME, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \ #define AARCH64_OPT_EXTENSION(EXT_NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \
{ EXT_NAME, FEATURE_STRING }, { EXT_NAME, FLAG_CANONICAL, FEATURE_STRING },
static struct arch_extension ext_to_feat_string[] = static struct arch_extension ext_to_feat_string[] =
{ {
#include "aarch64-option-extensions.def" #include "aarch64-option-extensions.def"
......
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> 2016-04-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/69066 PR c++/69066
......
...@@ -6,4 +6,4 @@ test (void) ...@@ -6,4 +6,4 @@ test (void)
return 1; return 1;
} }
/* { dg-final { scan-assembler "\.arch.*fp.*simd" } } */ /* { dg-final { scan-assembler-times "\\.arch armv8-a\n" 1 } } */
...@@ -10,4 +10,4 @@ foo (int a) ...@@ -10,4 +10,4 @@ foo (int a)
return a + 1; 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 } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment