aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c36
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c32
-rw-r--r--gcc/testsuite/lib/target-supports.exp16
4 files changed, 92 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9e7330b..92efa6ef 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2014-09-22 Alan Lawrence <alan.lawrence@arm.com>
+
+ * lib/target-supports.exp (check_effective_target_whole_vector_shift):
+ New.
+
+ * gcc.dg/vect/vect-reduc-mul_1.c: New test.
+ * gcc.dg/vect/vect-reduc-mul_2.c: New test.
+
2014-09-22 Jakub Jelinek <jakub@redhat.com>
PR debug/63328
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c
new file mode 100644
index 0000000..44f026f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c
@@ -0,0 +1,36 @@
+/* { dg-require-effective-target vect_int_mult } */
+/* { dg-require-effective-target whole_vector_shift } */
+
+/* Write a reduction loop to be reduced using vector shifts. */
+
+extern void abort(void);
+
+unsigned char in[16];
+
+int
+main (unsigned char argc, char **argv)
+{
+ unsigned char i = 0;
+ unsigned char sum = 1;
+
+ for (i = 0; i < 16; i++)
+ in[i] = i + i + 1;
+
+ /* Prevent constant propagation of the entire loop below. */
+ asm volatile ("" : : : "memory");
+
+ for (i = 0; i < 16; i++)
+ sum *= in[i];
+
+ if (sum != 33)
+ {
+ __builtin_printf("Failed %d\n", sum);
+ abort();
+ }
+
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "Reduce using vector shifts" "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c
new file mode 100644
index 0000000..414fba7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c
@@ -0,0 +1,32 @@
+/* { dg-require-effective-target vect_int_mult } */
+/* { dg-require-effective-target whole_vector_shift } */
+
+/* Write a reduction loop to be reduced using vector shifts and folded. */
+
+extern void abort(void);
+
+int
+main (unsigned char argc, char **argv)
+{
+ unsigned char in[16];
+ unsigned char i = 0;
+ unsigned char sum = 1;
+
+ for (i = 0; i < 16; i++)
+ in[i] = i + i + 1;
+
+ for (i = 0; i < 16; i++)
+ sum *= in[i];
+
+ if (sum != 33)
+ {
+ __builtin_printf("Failed %d\n", sum);
+ abort();
+ }
+
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "Reduce using vector shifts" "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 52929b9..a916ca5 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -3324,6 +3324,22 @@ proc check_effective_target_vect_shift { } {
return $et_vect_shift_saved
}
+proc check_effective_target_whole_vector_shift { } {
+ if { [istarget x86_64-*-*]
+ || [istarget ia64-*-*]
+ || ([check_effective_target_arm32]
+ && [check_effective_target_arm_little_endian])
+ || ([istarget mips*-*-*]
+ && [check_effective_target_mips_loongson]) } {
+ set answer 1
+ } else {
+ set answer 0
+ }
+
+ verbose "check_effective_target_vect_long: returning $answer" 2
+ return $answer
+}
+
# Return 1 if the target supports vector bswap operations.
proc check_effective_target_vect_bswap { } {