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