i386: Adjust rtx cost for imulq and imulw [PR115749]
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / pr92420.c
blobe56eb0e12fbec55b16785e244f3a24b889af784d
1 /* { dg-additional-options "-mavx2" { target avx_runtime } } */
3 #include "tree-vect.h"
5 #define N 16
6 struct C { int r, i; };
7 struct C a[N], b[N], c[N], d[N], e[N];
9 __attribute__((noipa)) static void
10 foo (struct C *__restrict x, struct C *__restrict y, struct C *__restrict z, int w)
12 int i;
13 for (int i = 0; i < w; i++)
15 z[i].r = x[i].r * y[-1 - i].r - x[i].i * y[-1 - i].i;
16 z[i].i = x[i].i * y[-1 - i].r + x[i].r * y[-1 - i].i;
20 __attribute__((noipa)) static void
21 bar (struct C *__restrict x, struct C *__restrict y, struct C *__restrict z, int w)
23 int i;
24 for (int i = 0; i < w; i++)
26 z[i].r = x[i].r * y[i].r - x[i].i * y[i].i;
27 z[i].i = x[i].i * y[i].r + x[i].r * y[i].i;
31 int
32 main ()
34 check_vect ();
35 int i;
36 for (i = 0; i < N; ++i)
38 a[i].r = N - i; a[i].i = i - N;
39 b[i].r = i - N; b[i].i = i + N;
40 c[i].r = -1 - i; c[i].i = 2 * N - 1 - i;
42 foo (a, b + N, d, N);
43 bar (a, c, e, N);
44 #pragma GCC novector
45 for (i = 0; i < N; ++i)
46 if (d[i].r != e[i].r || d[i].i != e[i].i)
47 __builtin_abort ();
48 return 0;