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)21convert(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