1 /* { dg-do compile } */
2 /* { dg-require-effective-target vect_int } */
3 /* { dg-require-effective-target vect_unpack } */
4 /* { dg-require-effective-target vect_pack_trunc } */
5
6 #define SHIFTFORDIV255(a)\
7 ((((a) >> 8) + a) >> 8)
8
9 #define DIV255(a)\
10 SHIFTFORDIV255(a + 0x80)
11
12 typedef unsigned char uint8_t;
13
14 void
15 opSourceOver_premul(uint8_t* restrict Rrgba,
16 const uint8_t* restrict Srgba,
17 const uint8_t* restrict Drgba, int len)
18 {
19 Rrgba = __builtin_assume_aligned (Rrgba, __BIGGEST_ALIGNMENT__);
20 Srgba = __builtin_assume_aligned (Rrgba, __BIGGEST_ALIGNMENT__);
21 Drgba = __builtin_assume_aligned (Rrgba, __BIGGEST_ALIGNMENT__);
22 int i = 0;
23 for (; i < len*4; i += 4)
24 {
25 uint8_t Sa = Srgba[i + 3];
26 Rrgba[i + 0] = DIV255(Srgba[i + 0] * 255 + Drgba[i + 0] * (255 - Sa));
27 Rrgba[i + 1] = DIV255(Srgba[i + 1] * 255 + Drgba[i + 1] * (255 - Sa));
28 Rrgba[i + 2] = DIV255(Srgba[i + 2] * 255 + Drgba[i + 2] * (255 - Sa));
29 Rrgba[i + 3] = DIV255(Srgba[i + 3] * 255 + Drgba[i + 3] * (255 - Sa));
30 }
31 }
32
33 /* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */