mirror of git://gcc.gnu.org/git/gcc.git
[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
This commit is contained in:
parent
a60fd657ad
commit
04a99ebece
|
|
@ -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>
|
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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
/* 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
|
||||||
{
|
{
|
||||||
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[] =
|
||||||
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 *
|
||||||
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)
|
||||||
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)
|
||||||
|| 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
|
||||||
${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 @@
|
||||||
|
|
||||||
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
|
||||||
};
|
};
|
||||||
#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);
|
||||||
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);
|
||||||
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);
|
||||||
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;
|
||||||
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
|
||||||
/* 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,
|
||||||
|
|
||||||
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)
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
= 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 @@
|
||||||
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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
2016-04-10 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/69066
|
PR c++/69066
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
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 } } */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue