aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNaveen H.S <Naveen.Hurugalawadi@cavium.com>2016-12-07 03:10:59 +0000
committerNaveen H.S <naveenh@gcc.gnu.org>2016-12-07 03:10:59 +0000
commit7df767471109ff30770dfb9aeea46f52d7c85d20 (patch)
treec525d354525d998c03167aace8eacfee5eba3568 /gcc
parentfd1c9a07d46aeece59c452105e3f2ece665bd7b8 (diff)
downloadgcc-7df767471109ff30770dfb9aeea46f52d7c85d20.zip
gcc-7df767471109ff30770dfb9aeea46f52d7c85d20.tar.gz
gcc-7df767471109ff30770dfb9aeea46f52d7c85d20.tar.bz2
2016-12-07 Naveen H.S <Naveen.Hurugalawadi@cavium.com>
gcc * config/aarch64/aarch64.c (aarch64_builtin_support_vector_misalignment): New. (TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT): Define. gcc/testsuite * gcc.target/aarch64/pr71727.c : New Testcase. From-SVN: r243333
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/aarch64/aarch64.c39
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr71727.c33
4 files changed, 82 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d30345f..c1c148a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-07 Naveen H.S <Naveen.Hurugalawadi@cavium.com>
+
+ * config/aarch64/aarch64.c
+ (aarch64_builtin_support_vector_misalignment): New.
+ (TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT): Define.
+
2016-12-06 David Malcolm <dmalcolm@redhat.com>
PR bootstrap/78705
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index af3aa0b..dab46b5 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -141,6 +141,10 @@ static bool aarch64_vector_mode_supported_p (machine_mode);
static bool aarch64_vectorize_vec_perm_const_ok (machine_mode vmode,
const unsigned char *sel);
static int aarch64_address_cost (rtx, machine_mode, addr_space_t, bool);
+static bool aarch64_builtin_support_vector_misalignment (machine_mode mode,
+ const_tree type,
+ int misalignment,
+ bool is_packed);
/* Major revision number of the ARM Architecture implemented by the target. */
unsigned aarch64_architecture_version;
@@ -11412,6 +11416,37 @@ aarch64_simd_vector_alignment_reachable (const_tree type, bool is_packed)
return true;
}
+/* Return true if the vector misalignment factor is supported by the
+ target. */
+static bool
+aarch64_builtin_support_vector_misalignment (machine_mode mode,
+ const_tree type, int misalignment,
+ bool is_packed)
+{
+ if (TARGET_SIMD && STRICT_ALIGNMENT)
+ {
+ /* Return if movmisalign pattern is not supported for this mode. */
+ if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
+ return false;
+
+ if (misalignment == -1)
+ {
+ /* Misalignment factor is unknown at compile time but we know
+ it's word aligned. */
+ if (aarch64_simd_vector_alignment_reachable (type, is_packed))
+ {
+ int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
+
+ if (element_size != 64)
+ return true;
+ }
+ return false;
+ }
+ }
+ return default_builtin_support_vector_misalignment (mode, type, misalignment,
+ is_packed);
+}
+
/* If VALS is a vector constant that can be loaded into a register
using DUP, generate instructions to do so and return an RTX to
assign to the register. Otherwise return NULL_RTX. */
@@ -14824,6 +14859,10 @@ aarch64_libgcc_floating_mode_supported_p
#undef TARGET_VECTOR_MODE_SUPPORTED_P
#define TARGET_VECTOR_MODE_SUPPORTED_P aarch64_vector_mode_supported_p
+#undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
+#define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT \
+ aarch64_builtin_support_vector_misalignment
+
#undef TARGET_ARRAY_MODE_SUPPORTED_P
#define TARGET_ARRAY_MODE_SUPPORTED_P aarch64_array_mode_supported_p
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6090a96..60f239f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-12-07 Naveen H.S <Naveen.Hurugalawadi@cavium.com>
+
+ * gcc.target/aarch64/pr71727.c : New Testcase.
+
2016-12-06 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/67955
diff --git a/gcc/testsuite/gcc.target/aarch64/pr71727.c b/gcc/testsuite/gcc.target/aarch64/pr71727.c
new file mode 100644
index 0000000..05eef3e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr71727.c
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-mstrict-align -O3" } */
+
+struct test_struct_s
+{
+ long a;
+ long b;
+ long c;
+ long d;
+ unsigned long e;
+};
+
+
+char _a;
+struct test_struct_s xarray[128];
+
+void
+_start (void)
+{
+ struct test_struct_s *new_entry;
+
+ new_entry = &xarray[0];
+ new_entry->a = 1;
+ new_entry->b = 2;
+ new_entry->c = 3;
+ new_entry->d = 4;
+ new_entry->e = 5;
+
+ return;
+}
+
+/* { dg-final { scan-assembler-times "mov\tx" 5 {target lp64} } } */
+/* { dg-final { scan-assembler-not "add\tx0, x0, :" {target lp64} } } */