From 6defe3c55ed95d2c83dadfaaed6a397fe71d9d5d Mon Sep 17 00:00:00 2001 From: ktkachov Date: Thu, 11 Feb 2016 13:27:28 +0000 Subject: [PATCH] [AArch64] Only update assembler .arch directive when necessary * config/aarch64/aarch64.c (aarch64_last_printed_arch_string): New variable. (aarch64_last_printed_tune_string): Likewise. (aarch64_declare_function_name): Only output .arch assembler directive if it will be different from the previously output directive. Same for .tune comment but only if -dA is set. (aarch64_start_file): New function. (TARGET_ASM_FILE_START): Define. * gcc.target/aarch64/target_attr_15.c: Scan assembly for .arch armv8-a\n. Add -dA to dg-options. * gcc.target/aarch64/assembler_arch_1.c: New test. * gcc.target/aarch64/target_attr_7.c: Add -dA to dg-options. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233342 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 11 +++++ gcc/config/aarch64/aarch64.c | 51 +++++++++++++++++++--- gcc/testsuite/ChangeLog | 7 +++ .../gcc.target/aarch64/assembler_arch_1.c | 20 +++++++++ gcc/testsuite/gcc.target/aarch64/target_attr_1.c | 2 +- gcc/testsuite/gcc.target/aarch64/target_attr_15.c | 4 +- gcc/testsuite/gcc.target/aarch64/target_attr_7.c | 2 +- 7 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/assembler_arch_1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e12c86..4c17a5c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2016-02-11 Kyrylo Tkachov + + * config/aarch64/aarch64.c (aarch64_last_printed_arch_string): + New variable. + (aarch64_last_printed_tune_string): Likewise. + (aarch64_declare_function_name): Only output .arch assembler + directive if it will be different from the previously output + directive. Same for .tune comment but only if -dA is set. + (aarch64_start_file): New function. + (TARGET_ASM_FILE_START): Define. + 2016-02-11 David Malcolm PR plugins/69758 diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index cb0892e..a2d880d 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -11181,6 +11181,10 @@ aarch64_asm_preferred_eh_data_format (int code ATTRIBUTE_UNUSED, int global) return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type; } +/* The last .arch and .tune assembly strings that we printed. */ +static std::string aarch64_last_printed_arch_string; +static std::string aarch64_last_printed_tune_string; + /* Implement ASM_DECLARE_FUNCTION_NAME. Output the ISA features used by the function fndecl. */ @@ -11203,23 +11207,55 @@ 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); - asm_fprintf (asm_out_file, "\t.arch %s%s\n", - this_arch->name, extension.c_str ()); + /* 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; + if (to_print != aarch64_last_printed_arch_string) + { + asm_fprintf (asm_out_file, "\t.arch %s\n", to_print.c_str ()); + aarch64_last_printed_arch_string = to_print; + } /* Print the cpu name we're tuning for in the comments, might be - useful to readers of the generated asm. */ - + useful to readers of the generated asm. Do it only when it changes + from function to function and verbose assembly is requested. */ const struct processor *this_tune = aarch64_get_tune_cpu (targ_options->x_explicit_tune_core); - asm_fprintf (asm_out_file, "\t" ASM_COMMENT_START ".tune %s\n", - this_tune->name); + if (flag_debug_asm && aarch64_last_printed_tune_string != this_tune->name) + { + asm_fprintf (asm_out_file, "\t" ASM_COMMENT_START ".tune %s\n", + this_tune->name); + aarch64_last_printed_tune_string = this_tune->name; + } /* Don't forget the type directive for ELF. */ ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function"); ASM_OUTPUT_LABEL (stream, name); } +/* Implements TARGET_ASM_FILE_START. Output the assembly header. */ + +static void +aarch64_start_file (void) +{ + struct cl_target_option *default_options + = TREE_TARGET_OPTION (target_option_default_node); + + const struct processor *default_arch + = 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_last_printed_arch_string = default_arch->name + extension; + aarch64_last_printed_tune_string = ""; + asm_fprintf (asm_out_file, "\t.arch %s\n", + aarch64_last_printed_arch_string.c_str ()); + + default_file_start (); +} + /* Emit load exclusive. */ static void @@ -13957,6 +13993,9 @@ aarch64_optab_supported_p (int op, machine_mode, machine_mode, #define TARGET_ASM_CAN_OUTPUT_MI_THUNK \ hook_bool_const_tree_hwi_hwi_const_tree_true +#undef TARGET_ASM_FILE_START +#define TARGET_ASM_FILE_START aarch64_start_file + #undef TARGET_ASM_OUTPUT_MI_THUNK #define TARGET_ASM_OUTPUT_MI_THUNK aarch64_output_mi_thunk diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1689735..d0277a8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-02-11 Kyrylo Tkachov + + * gcc.target/aarch64/target_attr_15.c: Scan assembly for + .arch armv8-a\n. Add -dA to dg-options. + * gcc.target/aarch64/assembler_arch_1.c: New test. + * gcc.target/aarch64/target_attr_7.c: Add -dA to dg-options. + 2016-02-11 Paolo Carlini PR c++/68726 diff --git a/gcc/testsuite/gcc.target/aarch64/assembler_arch_1.c b/gcc/testsuite/gcc.target/aarch64/assembler_arch_1.c new file mode 100644 index 0000000..901e50a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/assembler_arch_1.c @@ -0,0 +1,20 @@ +/* { dg-do assemble } */ +/* { dg-options "-march=armv8-a" } */ + +/* Make sure that the function header in assembly doesn't override + user asm arch_extension directives. */ + +__asm__ (".arch_extension lse"); + +void +foo (int i, int *v) +{ + register int w0 asm ("w0") = i; + register int *x1 asm ("x1") = v; + + asm volatile ( + "\tstset %w[i], %[v]\n" + : [i] "+r" (w0), [v] "+Q" (v) + : "r" (x1) + : "x30"); +} diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_1.c b/gcc/testsuite/gcc.target/aarch64/target_attr_1.c index 852ce1e..0527d0c 100644 --- a/gcc/testsuite/gcc.target/aarch64/target_attr_1.c +++ b/gcc/testsuite/gcc.target/aarch64/target_attr_1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -mcpu=thunderx -save-temps" } */ +/* { dg-options "-O2 -mcpu=thunderx -dA" } */ /* Test that cpu attribute overrides the command-line -mcpu. */ diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_15.c b/gcc/testsuite/gcc.target/aarch64/target_attr_15.c index 02091c6..f72bec8 100644 --- a/gcc/testsuite/gcc.target/aarch64/target_attr_15.c +++ b/gcc/testsuite/gcc.target/aarch64/target_attr_15.c @@ -10,6 +10,4 @@ foo (int a) return a + 1; } -/* { dg-final { scan-assembler-not "\\+fp" } } */ -/* { dg-final { scan-assembler-not "\\+crypto" } } */ -/* { dg-final { scan-assembler-not "\\+simd" } } */ +/* { dg-final { scan-assembler-times "\\.arch armv8-a\n" 1 } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_7.c b/gcc/testsuite/gcc.target/aarch64/target_attr_7.c index 32a8403..818d327 100644 --- a/gcc/testsuite/gcc.target/aarch64/target_attr_7.c +++ b/gcc/testsuite/gcc.target/aarch64/target_attr_7.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -mcpu=thunderx -save-temps" } */ +/* { dg-options "-O2 -mcpu=thunderx -dA" } */ /* Make sure that #pragma overrides command line option and target attribute overrides the pragma. */ -- 2.7.4