PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse2-mul-1.c
blob9cdc12763b0b97cdcff6aacba82d4f5f3095d29b
1 /* { dg-do run } */
2 /* { dg-require-effective-target sse2 } */
3 /* { dg-options "-O3 -msse2" } */
5 #ifndef CHECK_H
6 #define CHECK_H "sse2-check.h"
7 #endif
9 #ifndef TEST
10 #define TEST sse2_test
11 #endif
13 #include CHECK_H
15 #include <stdlib.h>
17 /* mingw runtime don't provide random(). */
18 #ifdef __MINGW32__
19 #define random rand
20 #endif
22 #define N 512
23 static short a1[N], a2[N], a3[N];
24 static unsigned short b1[N], b2[N], b3[N];
25 static int c1[N], c2[N], c3[N];
26 static unsigned int d1[N], d2[N], d3[N];
27 static long long e1[N], e2[N], e3[N];
28 static unsigned long long g1[N], g2[N], g3[N];
30 __attribute__((noinline, noclone)) void
31 f1 (void)
33 int i;
34 for (i = 0; i < N; ++i)
35 a1[i] = a2[i] * a3[i];
38 __attribute__((noinline, noclone)) void
39 f2 (void)
41 int i;
42 for (i = 0; i < N; ++i)
43 b1[i] = b2[i] * b3[i];
46 __attribute__((noinline, noclone)) void
47 f3 (void)
49 int i;
50 for (i = 0; i < N; ++i)
51 c1[i] = c2[i] * c3[i];
54 __attribute__((noinline, noclone)) void
55 f4 (void)
57 int i;
58 for (i = 0; i < N; ++i)
59 d1[i] = d2[i] * d3[i];
62 __attribute__((noinline, noclone)) void
63 f5 (void)
65 int i;
66 for (i = 0; i < N; ++i)
67 e1[i] = e2[i] * e3[i];
70 __attribute__((noinline, noclone)) void
71 f6 (void)
73 int i;
74 for (i = 0; i < N; ++i)
75 g1[i] = g2[i] * g3[i];
78 __attribute__((noinline, noclone)) void
79 f7 (void)
81 int i;
82 for (i = 0; i < N; ++i)
83 c1[i] = a2[i] * a3[i];
86 __attribute__((noinline, noclone)) void
87 f8 (void)
89 int i;
90 for (i = 0; i < N; ++i)
91 d1[i] = (unsigned int) b2[i] * b3[i];
94 __attribute__((noinline, noclone)) void
95 f9 (void)
97 int i;
98 for (i = 0; i < N; ++i)
99 e1[i] = (long long) c2[i] * (long long) c3[i];
102 __attribute__((noinline, noclone)) void
103 f10 (void)
105 int i;
106 for (i = 0; i < N; ++i)
107 g1[i] = (unsigned long long) d2[i] * (unsigned long long) d3[i];
110 __attribute__((noinline, noclone)) int
111 f11 (void)
113 int i, r = 0;
114 for (i = 0; i < N; ++i)
115 r += a2[i] * a3[i];
116 return r;
119 __attribute__((noinline, noclone)) unsigned int
120 f12 (void)
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;
129 __attribute__((noinline, noclone)) long long
130 f13 (void)
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;
139 __attribute__((noinline, noclone)) unsigned long long
140 f14 (void)
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;
149 static void
150 TEST (void)
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)
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];
176 f1 ();
177 f2 ();
178 f3 ();
179 f4 ();
180 f5 ();
181 f6 ();
182 for (i = 0; i < N; ++i)
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 ();
197 f7 ();
198 f8 ();
199 f9 ();
200 f10 ();
201 for (i = 0; i < N; ++i)
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 ();
212 if (f11 () != s1 || f12 () != s2 || f13 () != s3 || f14 () != s4)
213 abort ();