1/* { dg-do run } */
2/* { dg-require-effective-target sse2 } */
3/* { dg-options "-O3 -msse2" } */
4
5#ifndef CHECK_H
6#define CHECK_H "sse2-check.h"
7#endif
8
9#ifndef TEST
10#define TEST sse2_test
11#endif
12
13#include CHECK_H
14
15#include <stdlib.h>
16
17/* mingw runtime don't provide random().  */
18#ifdef __MINGW32__
19#define random rand
20#endif
21
22#define N 512
23static short a1[N], a2[N], a3[N];
24static unsigned short b1[N], b2[N], b3[N];
25static int c1[N], c2[N], c3[N];
26static unsigned int d1[N], d2[N], d3[N];
27static long long e1[N], e2[N], e3[N];
28static unsigned long long g1[N], g2[N], g3[N];
29
30__attribute__((noinline, noclone)) void
31f1 (void)
32{
33  int i;
34  for (i = 0; i < N; ++i)
35    a1[i] = a2[i] * a3[i];
36}
37
38__attribute__((noinline, noclone)) void
39f2 (void)
40{
41  int i;
42  for (i = 0; i < N; ++i)
43    b1[i] = b2[i] * b3[i];
44}
45
46__attribute__((noinline, noclone)) void
47f3 (void)
48{
49  int i;
50  for (i = 0; i < N; ++i)
51    c1[i] = c2[i] * c3[i];
52}
53
54__attribute__((noinline, noclone)) void
55f4 (void)
56{
57  int i;
58  for (i = 0; i < N; ++i)
59    d1[i] = d2[i] * d3[i];
60}
61
62__attribute__((noinline, noclone)) void
63f5 (void)
64{
65  int i;
66  for (i = 0; i < N; ++i)
67    e1[i] = e2[i] * e3[i];
68}
69
70__attribute__((noinline, noclone)) void
71f6 (void)
72{
73  int i;
74  for (i = 0; i < N; ++i)
75    g1[i] = g2[i] * g3[i];
76}
77
78__attribute__((noinline, noclone)) void
79f7 (void)
80{
81  int i;
82  for (i = 0; i < N; ++i)
83    c1[i] = a2[i] * a3[i];
84}
85
86__attribute__((noinline, noclone)) void
87f8 (void)
88{
89  int i;
90  for (i = 0; i < N; ++i)
91    d1[i] = (unsigned int) b2[i] * b3[i];
92}
93
94__attribute__((noinline, noclone)) void
95f9 (void)
96{
97  int i;
98  for (i = 0; i < N; ++i)
99    e1[i] = (long long) c2[i] * (long long) c3[i];
100}
101
102__attribute__((noinline, noclone)) void
103f10 (void)
104{
105  int i;
106  for (i = 0; i < N; ++i)
107    g1[i] = (unsigned long long) d2[i] * (unsigned long long) d3[i];
108}
109
110__attribute__((noinline, noclone)) int
111f11 (void)
112{
113  int i, r = 0;
114  for (i = 0; i < N; ++i)
115    r += a2[i] * a3[i];
116  return r;
117}
118
119__attribute__((noinline, noclone)) unsigned int
120f12 (void)
121{
122  int i;
123  unsigned r = 0;
124  for (i = 0; i < N; ++i)
125    r += (unsigned int) b2[i] * b3[i];
126  return r;
127}
128
129__attribute__((noinline, noclone)) long long
130f13 (void)
131{
132  int i;
133  long long r = 0;
134  for (i = 0; i < N; ++i)
135    r += (long long) c2[i] * (long long) c3[i];
136  return r;
137}
138
139__attribute__((noinline, noclone)) unsigned long long
140f14 (void)
141{
142  int i;
143  unsigned long long r = 0;
144  for (i = 0; i < N; ++i)
145    r += (unsigned long long) d2[i] * (unsigned long long) d3[i];
146  return r;
147}
148
149static void
150TEST (void)
151{
152  int i;
153  int s1 = 0;
154  unsigned int s2 = 0;
155  long long s3 = 0;
156  unsigned long long s4 = 0;
157  for (i = 0; i < N; ++i)
158    {
159      asm volatile ("" : : "r" (&s1) : "memory");
160      asm volatile ("" : : "r" (&s2) : "memory");
161      asm volatile ("" : : "r" (&s3) : "memory");
162      asm volatile ("" : : "r" (&s4) : "memory");
163      b2[i] = (int) random ();
164      b3[i] = (int) random ();
165      a2[i] = b2[i];
166      a3[i] = b3[i];
167      d2[i] = (((int) random ()) << 16) | b2[i];
168      d3[i] = (((int) random ()) << 16) | b3[i];
169      c2[i] = d2[i];
170      c3[i] = d3[i];
171      s1 += a2[i] * a3[i];
172      s2 += (unsigned int) b2[i] * b3[i];
173      s3 += (long long) c2[i] * (long long) c3[i];
174      s4 += (unsigned long long) d2[i] * (unsigned long long) d3[i];
175    }
176  f1 ();
177  f2 ();
178  f3 ();
179  f4 ();
180  f5 ();
181  f6 ();
182  for (i = 0; i < N; ++i)
183    {
184      if (a1[i] != (short) (a2[i] * a3[i]))
185	abort ();
186      if (b1[i] != (unsigned short) (b2[i] * b3[i]))
187	abort ();
188      if (c1[i] != c2[i] * c3[i])
189	abort ();
190      if (d1[i] != d2[i] * d3[i])
191	abort ();
192      if (e1[i] != e2[i] * e3[i])
193	abort ();
194      if (g1[i] != g2[i] * g3[i])
195	abort ();
196    }
197  f7 ();
198  f8 ();
199  f9 ();
200  f10 ();
201  for (i = 0; i < N; ++i)
202    {
203      if (c1[i] != a2[i] * a3[i])
204	abort ();
205      if (d1[i] != b2[i] * b3[i])
206	abort ();
207      if (e1[i] != (long long) c2[i] * (long long) c3[i])
208	abort ();
209      if (g1[i] != (unsigned long long) d2[i] * (unsigned long long) d3[i])
210	abort ();
211    }
212  if (f11 () != s1 || f12 () != s2 || f13 () != s3 || f14 () != s4)
213    abort ();
214}
215