aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2016-02-11 13:27:28 +0000
committerKyrylo Tkachov <kyrylo.tkachov@arm.com>2016-02-11 13:27:28 +0000
commit1cf0136701e95d614705377b55b3e1feaff9ddd0 (patch)
treed5fac32fbeb9acfc78bd5ffd4b90be9fe208e2f0
parent54b1c3e038878a8e9efea0c4baf72c7792c9c7c8 (diff)
[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: https://gcc.gnu.org/svn/gcc/trunk@233342 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config/aarch64/aarch64.c51
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.target/aarch64/assembler_arch_1.c20
-rw-r--r--gcc/testsuite/gcc.target/aarch64/target_attr_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/target_attr_15.c4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/target_attr_7.c2
7 files changed, 86 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6e12c86a9a3..4c17a5caf5d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2016-02-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * 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 <dmalcolm@redhat.com>
PR plugins/69758
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index cb0892e8b54..a2d880de9ac 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 1689735b41a..d0277a8403d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-02-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * 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 <paolo.carlini@oracle.com>
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 00000000000..901e50a178d
--- /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 852ce1e9f06..0527d0c3d61 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 02091c6c542..f72bec878bf 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 32a840378ab..818d327705f 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. */