new file mode 100644
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-O3 -mdejagnu-cpu=power9 -funroll-loops" } */
+
+/* This test confirms that the dform instructions are selected in the
+ translation of this main program. */
+
+extern void first_dummy ();
+extern void dummy (double sacc, int n);
+extern void other_dummy ();
+
+extern float opt_value;
+extern char *opt_desc;
+
+#define M 128
+#define N 512
+
+double x [N];
+double y [N];
+
+int main (int argc, char *argv []) {
+ double sacc;
+
+ first_dummy ();
+ for (int j = 0; j < M; j++) {
+
+ sacc = 0.00;
+ for (unsigned long long int i = 0; i < N; i++) {
+ sacc += x[i] * y[i];
+ }
+ dummy (sacc, N);
+ }
+ opt_value = ((float) N) * 2 * ((float) M);
+ opt_desc = "flops";
+ other_dummy ();
+}
+
+/* At time the dform optimization pass was merged with trunk, 12
+ lxv instructions were emitted in place of the same number of lxvx
+ instructions. No need to require exactly this number, as it may
+ change when other optimization passes evolve. */
+
+/* { dg-final { scan-assembler {\mlxv\M} } } */
+/* { dg-final { scan-assembler-not {\mlxvx\M} } } */
new file mode 100644
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-O3 -mdejagnu-cpu=power9 -funroll-loops" } */
+
+/* This test confirms that the dform instructions are selected in the
+ translation of this main program. */
+
+extern void first_dummy ();
+extern void dummy (double sacc, int n);
+extern void other_dummy ();
+
+extern float opt_value;
+extern char *opt_desc;
+
+#define M 128
+#define N 512
+
+double x [N];
+double y [N];
+double z [N];
+
+int main (int argc, char *argv []) {
+ double sacc;
+
+ first_dummy ();
+ for (int j = 0; j < M; j++) {
+
+ sacc = 0.00;
+ for (unsigned long long int i = 0; i < N; i++) {
+ z[i] = x[i] * y[i];
+ sacc += z[i];
+ }
+ dummy (sacc, N);
+ }
+ opt_value = ((float) N) * 2 * ((float) M);
+ opt_desc = "flops";
+ other_dummy ();
+}
+
+
+
+/* At time the dform optimization pass was merged with trunk, 12
+ lxv instructions were emitted in place of the same number of lxvx
+ instructions. No need to require exactly this number, as it may
+ change when other optimization passes evolve. */
+
+/* { dg-final { scan-assembler {\mlxv\M} } } */
+/* { dg-final { scan-assembler-not {\mlxvx\M} } } */
+
+/* At time the dform optimization pass was merged with trunk, 6
+ stxv instructions were emitted in place of the same number of stxvx
+ instructions. No need to require exactly this number, as it may
+ change when other optimization passes evolve. */
+
+/* { dg-final { scan-assembler {\mstxv\M} } } */
+/* { dg-final { scan-assembler-not {\mstxvx\M} } } */
+
new file mode 100644
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-O3 -mdejagnu-cpu=power9 -funroll-loops" } */
+
+#define TYPE int
+#include "p9-dform-generic.h"
+
+/* The precise number of lxv and stxv instructions may be impacted by
+ complex interactions between optimization passes, but we expect at
+ least one of each. */
+/* { dg-final { scan-assembler {\mlxv\M} } } */
+/* { dg-final { scan-assembler {\mstxv\M} } } */
+/* { dg-final { scan-assembler-not {\mlxvx\M} } } */
+/* { dg-final { scan-assembler-not {\mstxvx\M} } } */
new file mode 100644
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-O3 -mdejagnu-cpu=power9 -funroll-loops" } */
+
+#define TYPE double
+#include "p9-dform-generic.h"
+
+/* At time the dform optimization pass was merged with trunk, 6
+ lxv instructions were emitted in place of the same number of lxvx
+ instructions and 8 stxv instructions replace the same number of
+ stxvx instructions. No need to require exactly this number, as it
+ may change when other optimization passes evolve. */
+
+/* { dg-final { scan-assembler {\mlxv\M} } } */
+/* { dg-final { scan-assembler {\mstxv\M} } } */
+/* { dg-final { scan-assembler-not {\mlxvx\M} } } */
+/* { dg-final { scan-assembler-not {\mstxvx\M} } } */
new file mode 100644
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-O2 -mdejagnu-cpu=power9 -funroll-loops -mfloat128" } */
+
+#define TYPE __float128
+#include "p9-dform-generic.h"
+
+/* The precise number of lxv and stxv instructions may be impacted by
+ complex interactions between optimization passes, but we expect at
+ least one of each. */
+/* { dg-final { scan-assembler {\mlxv\M} } } */
+/* { dg-final { scan-assembler {\mstxv\M} } } */
+/* { dg-final { scan-assembler-not {\mlxvx\M} } } */
+/* { dg-final { scan-assembler-not {\mstxvx\M} } } */
new file mode 100644
@@ -0,0 +1,34 @@
+
+#define ITERATIONS 1000000
+
+#define SIZE (16384/sizeof(TYPE))
+
+static TYPE x[SIZE] __attribute__ ((aligned (16)));
+static TYPE y[SIZE] __attribute__ ((aligned (16)));
+static TYPE a;
+
+void obfuscate(void *a, ...);
+
+static void __attribute__((noinline)) do_one(void)
+{
+ unsigned long i;
+
+ obfuscate(x, y, &a);
+
+ for (i = 0; i < SIZE; i++)
+ y[i] = a * x[i];
+
+ obfuscate(x, y, &a);
+
+}
+
+int main(void)
+{
+ unsigned long i;
+
+ for (i = 0; i < ITERATIONS; i++)
+ do_one();
+
+ return 0;
+
+}