2015-07-04 Marc Glisse <marc.glisse@inria.fr>
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / simd-3.C
blob195261d820ea3887823c4da42736b41a831819cc
1 // { dg-do run }
2 // { dg-additional-options "-msse2" { target sse2_runtime } }
3 // { dg-additional-options "-mavx" { target avx_runtime } }
5 extern "C" void abort ();
6 int a[1024] __attribute__((aligned (32))) = { 1 };
7 int b[1024] __attribute__((aligned (32))) = { 1 };
8 unsigned char c[1024] __attribute__((aligned (32))) = { 1 };
9 int k, m;
10 __UINTPTR_TYPE__ u, u2, u3;
12 __attribute__((noinline, noclone)) int
13 foo (int *p)
15   int i, s = 0, s2 = 0, t, t2;
16   #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s) \
17                    lastprivate (t2)
18   for (i = 0; i < 512; i++)
19     {
20       a[i] *= p[i];
21       t2 = k + p[i];
22       k += m + 1;
23       s += p[i] + k;
24       c[i]++;
25     }
26   #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s2) \
27                    lastprivate (t, u, u2, u3)
28   for (i = 512; i < 1024; i++)
29     {
30       a[i] *= p[i];
31       k += m + 1;
32       t = k + p[i];
33       u = (__UINTPTR_TYPE__) &k;
34       u2 = (__UINTPTR_TYPE__) &s2;
35       u3 = (__UINTPTR_TYPE__) &t;
36       s2 += t;
37       c[i]++;
38     }
39   return s + s2 + t + t2;
42 __attribute__((noinline, noclone)) long int
43 bar (int *p, long int n, long int o)
45   long int i, s = 0, s2 = 0, t, t2;
46   #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s) \
47                    lastprivate (t2)
48   for (i = 0; i < n; i++)
49     {
50       a[i] *= p[i];
51       t2 = k + p[i];
52       k += m + 1;
53       s += p[i] + k;
54       c[i]++;
55     }
56   #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s2) \
57                    lastprivate (t, u, u2, u3)
58   for (i = n; i < o; i++)
59     {
60       a[i] *= p[i];
61       k += m + 1;
62       t = k + p[i];
63       u = (__UINTPTR_TYPE__) &k;
64       u2 = (__UINTPTR_TYPE__) &s2;
65       u3 = (__UINTPTR_TYPE__) &t;
66       s2 += t;
67       c[i]++;
68     }
69   return s + s2 + t + t2;
72 int
73 main ()
75 #if __SIZEOF_INT__ >= 4
76   int i;
77   k = 4;
78   m = 2;
79   for (i = 0; i < 1024; i++)
80     {
81       a[i] = i - 512;
82       b[i] = (i - 51) % 39;
83       c[i] = (unsigned char) i;
84     }
85   int s = foo (b);
86   for (i = 0; i < 1024; i++)
87     {
88       if (b[i] != (i - 51) % 39
89           || a[i] != (i - 512) * b[i]
90           || c[i] != (unsigned char) (i + 1))
91         abort ();
92       a[i] = i - 512;
93     }
94   if (k != 4 + 3 * 1024
95       || s != 1596127 + (4 + 3 * 511 + b[511]) + (4 + 3 * 1024 + b[1023]))
96     abort ();
97   k = 4;
98   s = bar (b, 512, 1024);
99   for (i = 0; i < 1024; i++)
100     {
101       if (b[i] != (i - 51) % 39
102           || a[i] != (i - 512) * b[i]
103           || c[i] != (unsigned char) (i + 2))
104         abort ();
105       a[i] = i - 512;
106     }
107   if (k != 4 + 3 * 1024
108       || s != 1596127 + (4 + 3 * 511 + b[511]) + (4 + 3 * 1024 + b[1023]))
109     abort ();
110   k = 4;
111   s = bar (b, 511, 1021);
112   for (i = 0; i < 1021; i++)
113     {
114       if (b[i] != (i - 51) % 39
115           || a[i] != (i - 512) * b[i]
116           || c[i] != (unsigned char) (i + 3))
117         abort ();
118       a[i] = i - 512;
119     }
120   for (i = 1021; i < 1024; i++)
121     if (b[i] != (i - 51) % 39
122         || a[i] != i - 512
123         || c[i] != (unsigned char) (i + 2))
124       abort ();
125   if (k != 4 + 3 * 1021
126       || s != 1586803 + (4 + 3 * 510 + b[510]) + (4 + 3 * 1021 + b[1020]))
127     abort ();
128 #endif
129   return 0;