1 /* { dg-additional-options "--param vect-epilogues-nomask=0" } */
2 /* { dg-require-effective-target vect_int } */
3
4 #include <stdarg.h>
5 #include "tree-vect.h"
6
7 #define N 64
8
9 unsigned char X[N] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
10 unsigned char Y[N] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
11 unsigned int result[N];
12
13 /* unsigned char-> unsigned int widening-mult. */
14 __attribute__ ((noinline)) int
15 foo (int len) {
16 int i;
17
18 for (i=0; i<len; i++) {
19 result[i] = X[i] * Y[i];
20 }
21 }
22
23 int main (void)
24 {
25 int i;
26
27 check_vect ();
28
29 for (i=0; i<N; i++) {
30 X[i] = i;
31 Y[i] = 64-i;
32 __asm__ volatile ("");
33 }
34
35 foo (N);
36
37 for (i=0; i<N; i++) {
38 if (result[i] != X[i] * Y[i])
39 abort ();
40 }
41
42 return 0;
43 }
44
45 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { vect_widen_mult_qi_to_hi || vect_unpack } } } } */
46 /* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 1 "vect" { target vect_widen_mult_qi_to_hi_pattern } } } */
47 /* { dg-final { scan-tree-dump-times "widen_mult pattern recognized" 1 "vect" { target vect_widen_mult_qi_to_hi_pattern } } } */
48