Daily bump.
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / vect-over-widen-2.c
blobad423f133c0bc25dfad42e30c34eceb5a8b852ab
1 /* { dg-require-effective-target vect_int } */
2 /* { dg-require-effective-target vect_shift } */
4 #include <stdarg.h>
5 #include "tree-vect.h"
7 #define N 64
9 /* Modified rgb to rgb conversion from FFmpeg. */
10 __attribute__ ((noinline)) void
11 foo (unsigned char *src, unsigned char *dst)
13 unsigned char *s = src;
14 int *d = (int *)dst;
15 int i;
17 for (i = 0; i < N/4; i++)
19 const int b = *s++;
20 const int g = *s++;
21 const int r = *s++;
22 const int a = *s++;
23 *d = ((b>>3) | ((g&0xFC)<<3) | ((r&0xF8)<<8) | (a>>5));
24 d++;
27 s = src;
28 d = (int *)dst;
29 #pragma GCC novector
30 for (i = 0; i < N/4; i++)
32 const int b = *s++;
33 const int g = *s++;
34 const int r = *s++;
35 const int a = *s++;
36 if (*d != ((b>>3) | ((g&0xFC)<<3) | ((r&0xF8)<<8) | (a>>5)))
37 abort ();
38 d++;
42 int main (void)
44 int i;
45 unsigned char in[N], out[N];
47 check_vect ();
49 for (i = 0; i < N; i++)
51 in[i] = i;
52 out[i] = 255;
53 __asm__ volatile ("");
56 foo (in, out);
58 return 0;
61 /* This is an over-widening even though the final result is still an int.
62 It's better to do one vector of ops on chars and then widen than to
63 widen and then do 4 vectors of ops on ints. */
64 /* { dg-final { scan-tree-dump {vect_recog_over_widening_pattern: detected:[^\n]* << 3} "vect" } } */
65 /* { dg-final { scan-tree-dump {vect_recog_over_widening_pattern: detected:[^\n]* >> 3} "vect" } } */
66 /* { dg-final { scan-tree-dump {vect_recog_over_widening_pattern: detected:[^\n]* << 8} "vect" } } */
67 /* { dg-final { scan-tree-dump {vect_recog_over_widening_pattern: detected:[^\n]* >> 5} "vect" } } */
68 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */