1 /* { dg-options "-O3 --param vect-partial-vector-usage=1" } */
2
3 void __attribute__((noipa))
add_loop(unsigned int * x,int n,unsigned int * res)4 add_loop (unsigned int *x, int n, unsigned int *res)
5 {
6 unsigned int res0 = res[0];
7 unsigned int res1 = res[1];
8 for (int i = 0; i < n; ++i)
9 {
10 res0 += x[i * 2];
11 res1 += x[i * 2 + 1];
12 }
13 res[0] = res0;
14 res[1] = res1;
15 }
16
17 void __attribute__((noipa))
min_loop(unsigned int * x,int n,unsigned int * res)18 min_loop (unsigned int *x, int n, unsigned int *res)
19 {
20 unsigned int res0 = res[0];
21 unsigned int res1 = res[1];
22 for (int i = 0; i < n; ++i)
23 {
24 res0 = res0 < x[i * 2] ? res0 : x[i * 2];
25 res1 = res1 < x[i * 2 + 1] ? res1 : x[i * 2 + 1];
26 }
27 res[0] = res0;
28 res[1] = res1;
29 }
30
31 void __attribute__((noipa))
max_loop(unsigned int * x,int n,unsigned int * res)32 max_loop (unsigned int *x, int n, unsigned int *res)
33 {
34 unsigned int res0 = res[0];
35 unsigned int res1 = res[1];
36 for (int i = 0; i < n; ++i)
37 {
38 res0 = res0 > x[i * 2] ? res0 : x[i * 2];
39 res1 = res1 > x[i * 2 + 1] ? res1 : x[i * 2 + 1];
40 }
41 res[0] = res0;
42 res[1] = res1;
43 }
44
45 void __attribute__((noipa))
and_loop(unsigned int * x,int n,unsigned int * res)46 and_loop (unsigned int *x, int n, unsigned int *res)
47 {
48 unsigned int res0 = res[0];
49 unsigned int res1 = res[1];
50 for (int i = 0; i < n; ++i)
51 {
52 res0 &= x[i * 2];
53 res1 &= x[i * 2 + 1];
54 }
55 res[0] = res0;
56 res[1] = res1;
57 }
58
59 void __attribute__((noipa))
or_loop(unsigned int * x,int n,unsigned int * res)60 or_loop (unsigned int *x, int n, unsigned int *res)
61 {
62 unsigned int res0 = res[0];
63 unsigned int res1 = res[1];
64 for (int i = 0; i < n; ++i)
65 {
66 res0 |= x[i * 2];
67 res1 |= x[i * 2 + 1];
68 }
69 res[0] = res0;
70 res[1] = res1;
71 }
72
73 void __attribute__((noipa))
eor_loop(unsigned int * x,int n,unsigned int * res)74 eor_loop (unsigned int *x, int n, unsigned int *res)
75 {
76 unsigned int res0 = res[0];
77 unsigned int res1 = res[1];
78 for (int i = 0; i < n; ++i)
79 {
80 res0 ^= x[i * 2];
81 res1 ^= x[i * 2 + 1];
82 }
83 res[0] = res0;
84 res[1] = res1;
85 }
86
87 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.s, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
88 /* { dg-final { scan-assembler-times {\tadd\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
89 /* { dg-final { scan-assembler-times {\tuaddv\t} 2 } } */
90
91 /* { dg-final { scan-assembler-times {\tumin\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 2 } } */
92 /* { dg-final { scan-assembler-times {\tuminv\t} 2 } } */
93
94 /* { dg-final { scan-assembler-times {\tumax\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 2 } } */
95 /* { dg-final { scan-assembler-times {\tumaxv\t} 2 } } */
96
97 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.d, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */
98 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
99 /* { dg-final { scan-assembler-times {\tandv\t} 2 } } */
100
101 /* { dg-final { scan-assembler-times {\torr\tz[0-9]+\.d, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */
102 /* { dg-final { scan-assembler-times {\torr\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
103 /* { dg-final { scan-assembler-times {\torv\t} 2 } } */
104
105 /* { dg-final { scan-assembler-times {\teor\tz[0-9]+\.d, z[0-9]+\.d, z[0-9]+\.d\n} 1 } } */
106 /* { dg-final { scan-assembler-times {\teor\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s, z[0-9]+\.s\n} 1 } } */
107 /* { dg-final { scan-assembler-times {\teorv\t} 2 } } */
108