111
|
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
|