Imported Upstream version 4.7.3
[platform/upstream/gcc48.git] / gcc / testsuite / gcc.dg / vect / vect-widen-shift-s16.c
1 /* { dg-require-effective-target vect_int } */
2 /* { dg-require-effective-target vect_shift } */
3
4 #include <stdarg.h>
5 #include "tree-vect.h"
6
7 #define N 64
8 #define C 16
9
10 __attribute__ ((noinline)) void
11 foo (short *src, int *dst)
12 {
13   int i;
14   short b, b0, b1, b2, b3, *s = src;
15   int *d = dst;
16
17   for (i = 0; i < N/4; i++)
18     {
19       b0 = *s++;
20       b1 = *s++;
21       b2 = *s++;
22       b3 = *s++;
23       *d = b0 << C;
24       d++;
25       *d = b1 << C;
26       d++;
27       *d = b2 << C;
28       d++;
29       *d = b3 << C;
30       d++;
31     }
32
33   s = src;
34   d = dst;
35   for (i = 0; i < N; i++)
36     {
37       b = *s++;
38       if (*d != b << C)
39         abort ();
40       d++;
41     }
42
43   s = src;
44   d = dst;
45   for (i = 0; i < N/4; i++)
46     {
47       b0 = *s++;
48       b1 = *s++;
49       b2 = *s++;
50       b3 = *s++;
51       *d = b0 << C;
52       d++;
53       *d = b1 << C;
54       d++;
55       *d = b2 << C;
56       d++;
57       *d = b3 << 6;
58       d++;
59     }
60
61   s = src;
62   d = dst;
63   for (i = 0; i < N/4; i++)
64     {
65       b = *s++;
66       if (*d != b << C)
67         abort ();
68       d++;
69       b = *s++;
70       if (*d != b << C)
71         abort ();
72       d++;
73       b = *s++;
74       if (*d != b << C)
75         abort ();
76       d++;
77       b = *s++;
78       if (*d != b << 6)
79         abort ();
80       d++;
81     }
82 }
83
84 int main (void)
85 {
86   int i;
87   short in[N];
88   int out[N];
89
90   check_vect ();
91
92   for (i = 0; i < N; i++)
93     {
94       in[i] = i;
95       out[i] = 255;
96       __asm__ volatile ("");
97     }
98
99   foo (in, out);
100
101   return 0;
102 }
103
104 /* { dg-final { scan-tree-dump-times "vect_recog_widen_shift_pattern: detected" 8 "vect" { target vect_widen_shift } } } */
105 /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
106 /* { dg-final { cleanup-tree-dump "vect" } } */
107