Add missing function in 20_util/exchange/1.cc.
[official-gcc.git] / libgomp / testsuite / libgomp.c / simd-3.c
blob34a388301434a07dc09dd6273a6c4ccdb038b275
1 /* { dg-do run } */
2 /* { dg-options "-O2" } */
3 /* { dg-additional-options "-msse2" { target sse2_runtime } } */
4 /* { dg-additional-options "-mavx" { target avx_runtime } } */
6 extern void abort ();
7 int a[1024] __attribute__((aligned (32))) = { 1 };
8 int b[1024] __attribute__((aligned (32))) = { 1 };
9 unsigned char c[1024] __attribute__((aligned (32))) = { 1 };
10 int k, m;
11 __UINTPTR_TYPE__ u, u2, u3;
13 __attribute__((noinline, noclone)) int
14 foo (int *p)
16 int i, s = 0, s2 = 0, t, t2;
17 #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s) \
18 lastprivate (t2)
19 for (i = 0; i < 512; i++)
21 a[i] *= p[i];
22 t2 = k + p[i];
23 k += m + 1;
24 s += p[i] + k;
25 c[i]++;
27 #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s2) \
28 lastprivate (t, u, u2, u3)
29 for (i = 512; i < 1024; i++)
31 a[i] *= p[i];
32 k += m + 1;
33 t = k + p[i];
34 u = (__UINTPTR_TYPE__) &k;
35 u2 = (__UINTPTR_TYPE__) &s2;
36 u3 = (__UINTPTR_TYPE__) &t;
37 s2 += t;
38 c[i]++;
40 return s + s2 + t + t2;
43 __attribute__((noinline, noclone)) long int
44 bar (int *p, long int n, long int o)
46 long int i, s = 0, s2 = 0, t, t2;
47 #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s) \
48 lastprivate (t2)
49 for (i = 0; i < n; i++)
51 a[i] *= p[i];
52 t2 = k + p[i];
53 k += m + 1;
54 s += p[i] + k;
55 c[i]++;
57 #pragma omp simd aligned(a, b, p : 32) linear(k: m + 1) reduction(+:s2) \
58 lastprivate (t, u, u2, u3)
59 for (i = n; i < o; i++)
61 a[i] *= p[i];
62 k += m + 1;
63 t = k + p[i];
64 u = (__UINTPTR_TYPE__) &k;
65 u2 = (__UINTPTR_TYPE__) &s2;
66 u3 = (__UINTPTR_TYPE__) &t;
67 s2 += t;
68 c[i]++;
70 return s + s2 + t + t2;
73 int
74 main ()
76 #if __SIZEOF_INT__ >= 4
77 int i;
78 k = 4;
79 m = 2;
80 for (i = 0; i < 1024; i++)
82 a[i] = i - 512;
83 b[i] = (i - 51) % 39;
84 c[i] = (unsigned char) i;
86 int s = foo (b);
87 for (i = 0; i < 1024; i++)
89 if (b[i] != (i - 51) % 39
90 || a[i] != (i - 512) * b[i]
91 || c[i] != (unsigned char) (i + 1))
92 abort ();
93 a[i] = i - 512;
95 if (k != 4 + 3 * 1024
96 || s != 1596127 + (4 + 3 * 511 + b[511]) + (4 + 3 * 1024 + b[1023]))
97 abort ();
98 k = 4;
99 s = bar (b, 512, 1024);
100 for (i = 0; i < 1024; i++)
102 if (b[i] != (i - 51) % 39
103 || a[i] != (i - 512) * b[i]
104 || c[i] != (unsigned char) (i + 2))
105 abort ();
106 a[i] = i - 512;
108 if (k != 4 + 3 * 1024
109 || s != 1596127 + (4 + 3 * 511 + b[511]) + (4 + 3 * 1024 + b[1023]))
110 abort ();
111 k = 4;
112 s = bar (b, 511, 1021);
113 for (i = 0; i < 1021; i++)
115 if (b[i] != (i - 51) % 39
116 || a[i] != (i - 512) * b[i]
117 || c[i] != (unsigned char) (i + 3))
118 abort ();
119 a[i] = i - 512;
121 for (i = 1021; i < 1024; i++)
122 if (b[i] != (i - 51) % 39
123 || a[i] != i - 512
124 || c[i] != (unsigned char) (i + 2))
125 abort ();
126 if (k != 4 + 3 * 1021
127 || s != 1586803 + (4 + 3 * 510 + b[510]) + (4 + 3 * 1021 + b[1020]))
128 abort ();
129 #endif
130 return 0;