1 /* { dg-do compile } */
2 /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */
3 /* { dg-additional-options "-msse4.2" } */
4 
5 #define ubyte unsigned char
6 #define byte char
7 
8 #define SCALE 8
9 
10 #define R2Y (76)
11 #define G2Y (150)
12 #define B2Y (30)
13 #define R2I (127)
14 #define G2I (-59)
15 #define B2I (-68)
16 #define R2Q (51)
17 #define G2Q (-127)
18 #define B2Q (76)
19 
20 void
convert(ubyte * in,ubyte * out,unsigned n)21 convert(ubyte *in, ubyte *out, unsigned n)
22 {
23   ubyte r, g, b;
24   ubyte y = 0;
25   byte i, q;
26 
27   while (--n) {
28 	  r = *in++;
29 	  g = *in++;
30 	  b = *in++;
31 
32       y = (ubyte)(((R2Y * r) + (G2Y * g) + (B2Y * b) + (1 << (SCALE - 1))) >> SCALE);
33       i = (byte)(((R2I * r) + (G2I * g) + (B2I * b) + (1 << (SCALE - 1))) >> SCALE);
34       q = (byte)(((R2Q * r) + (G2Q * g) + (B2Q * b) + (1 << (SCALE - 1))) >> SCALE);
35 
36       *out++ = y;
37 	  *out++ = i;
38 	  *out++ = q;
39   }
40 }
41 
42 /* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */
43