1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
3 /* { dg-require-effective-target powerpc_p8vector_ok } */
4 /* { dg-options "-mcpu=power8 -O2 -ftree-vectorize -fvect-cost-model -fno-unroll-loops -fno-unroll-all-loops" } */
5
6 #include <altivec.h>
7
8 typedef vector long long v_sign;
9 typedef vector unsigned long long v_uns;
10 typedef vector bool long long v_bool;
11
sign_add_1(v_sign a,v_sign b)12 v_sign sign_add_1 (v_sign a, v_sign b)
13 {
14 return __builtin_altivec_vaddudm (a, b);
15 }
16
sign_add_2(v_sign a,v_sign b)17 v_sign sign_add_2 (v_sign a, v_sign b)
18 {
19 return vec_add (a, b);
20 }
21
sign_add_3(v_sign a,v_sign b)22 v_sign sign_add_3 (v_sign a, v_sign b)
23 {
24 return vec_vaddudm (a, b);
25 }
26
sign_sub_1(v_sign a,v_sign b)27 v_sign sign_sub_1 (v_sign a, v_sign b)
28 {
29 return __builtin_altivec_vsubudm (a, b);
30 }
31
sign_sub_2(v_sign a,v_sign b)32 v_sign sign_sub_2 (v_sign a, v_sign b)
33 {
34 return vec_sub (a, b);
35 }
36
37
sign_sub_3(v_sign a,v_sign b)38 v_sign sign_sub_3 (v_sign a, v_sign b)
39 {
40 return vec_vsubudm (a, b);
41 }
42
sign_min_1(v_sign a,v_sign b)43 v_sign sign_min_1 (v_sign a, v_sign b)
44 {
45 return __builtin_altivec_vminsd (a, b);
46 }
47
sign_min_2(v_sign a,v_sign b)48 v_sign sign_min_2 (v_sign a, v_sign b)
49 {
50 return vec_min (a, b);
51 }
52
sign_min_3(v_sign a,v_sign b)53 v_sign sign_min_3 (v_sign a, v_sign b)
54 {
55 return vec_vminsd (a, b);
56 }
57
sign_max_1(v_sign a,v_sign b)58 v_sign sign_max_1 (v_sign a, v_sign b)
59 {
60 return __builtin_altivec_vmaxsd (a, b);
61 }
62
sign_max_2(v_sign a,v_sign b)63 v_sign sign_max_2 (v_sign a, v_sign b)
64 {
65 return vec_max (a, b);
66 }
67
sign_max_3(v_sign a,v_sign b)68 v_sign sign_max_3 (v_sign a, v_sign b)
69 {
70 return vec_vmaxsd (a, b);
71 }
72
sign_abs(v_sign a)73 v_sign sign_abs (v_sign a)
74 {
75 return vec_abs (a); /* xor, vsubudm, vmaxsd. */
76 }
77
sign_eq(v_sign a,v_sign b)78 v_bool sign_eq (v_sign a, v_sign b)
79 {
80 return vec_cmpeq (a, b);
81 }
82
sign_lt(v_sign a,v_sign b)83 v_bool sign_lt (v_sign a, v_sign b)
84 {
85 return vec_cmplt (a, b);
86 }
87
uns_add_2(v_uns a,v_uns b)88 v_uns uns_add_2 (v_uns a, v_uns b)
89 {
90 return vec_add (a, b);
91 }
92
uns_add_3(v_uns a,v_uns b)93 v_uns uns_add_3 (v_uns a, v_uns b)
94 {
95 return vec_vaddudm (a, b);
96 }
97
uns_sub_2(v_uns a,v_uns b)98 v_uns uns_sub_2 (v_uns a, v_uns b)
99 {
100 return vec_sub (a, b);
101 }
102
uns_sub_3(v_uns a,v_uns b)103 v_uns uns_sub_3 (v_uns a, v_uns b)
104 {
105 return vec_vsubudm (a, b);
106 }
107
uns_min_2(v_uns a,v_uns b)108 v_uns uns_min_2 (v_uns a, v_uns b)
109 {
110 return vec_min (a, b);
111 }
112
uns_min_3(v_uns a,v_uns b)113 v_uns uns_min_3 (v_uns a, v_uns b)
114 {
115 return vec_vminud (a, b);
116 }
117
uns_max_2(v_uns a,v_uns b)118 v_uns uns_max_2 (v_uns a, v_uns b)
119 {
120 return vec_max (a, b);
121 }
122
uns_max_3(v_uns a,v_uns b)123 v_uns uns_max_3 (v_uns a, v_uns b)
124 {
125 return vec_vmaxud (a, b);
126 }
127
uns_eq(v_uns a,v_uns b)128 v_bool uns_eq (v_uns a, v_uns b)
129 {
130 return vec_cmpeq (a, b);
131 }
132
uns_lt(v_uns a,v_uns b)133 v_bool uns_lt (v_uns a, v_uns b)
134 {
135 return vec_cmplt (a, b);
136 }
137
sign_rl_1(v_sign a,v_sign b)138 v_sign sign_rl_1 (v_sign a, v_sign b)
139 {
140 return __builtin_altivec_vrld (a, b);
141 }
142
sign_rl_2(v_sign a,v_uns b)143 v_sign sign_rl_2 (v_sign a, v_uns b)
144 {
145 return vec_rl (a, b);
146 }
147
uns_rl_2(v_uns a,v_uns b)148 v_uns uns_rl_2 (v_uns a, v_uns b)
149 {
150 return vec_rl (a, b);
151 }
152
sign_sl_1(v_sign a,v_sign b)153 v_sign sign_sl_1 (v_sign a, v_sign b)
154 {
155 return __builtin_altivec_vsld (a, b);
156 }
157
sign_sl_2(v_sign a,v_uns b)158 v_sign sign_sl_2 (v_sign a, v_uns b)
159 {
160 return vec_sl (a, b);
161 }
162
sign_sl_3(v_sign a,v_uns b)163 v_sign sign_sl_3 (v_sign a, v_uns b)
164 {
165 return vec_vsld (a, b);
166 }
167
uns_sl_2(v_uns a,v_uns b)168 v_uns uns_sl_2 (v_uns a, v_uns b)
169 {
170 return vec_sl (a, b);
171 }
172
uns_sl_3(v_uns a,v_uns b)173 v_uns uns_sl_3 (v_uns a, v_uns b)
174 {
175 return vec_vsld (a, b);
176 }
177
sign_sra_1(v_sign a,v_sign b)178 v_sign sign_sra_1 (v_sign a, v_sign b)
179 {
180 return __builtin_altivec_vsrad (a, b);
181 }
182
sign_sra_2(v_sign a,v_uns b)183 v_sign sign_sra_2 (v_sign a, v_uns b)
184 {
185 return vec_sra (a, b);
186 }
187
sign_sra_3(v_sign a,v_uns b)188 v_sign sign_sra_3 (v_sign a, v_uns b)
189 {
190 return vec_vsrad (a, b);
191 }
192
193 /* { dg-final { scan-assembler-times "vaddudm" 5 } } */
194 /* { dg-final { scan-assembler-times "vsubudm" 6 } } */
195 /* { dg-final { scan-assembler-times "vmaxsd" 4 } } */
196 /* { dg-final { scan-assembler-times "vminsd" 3 } } */
197 /* { dg-final { scan-assembler-times "vmaxud" 2 } } */
198 /* { dg-final { scan-assembler-times "vminud" 2 } } */
199 /* { dg-final { scan-assembler-times "vcmpequd" 2 } } */
200 /* { dg-final { scan-assembler-times "vcmpgtsd" 1 } } */
201 /* { dg-final { scan-assembler-times "vcmpgtud" 1 } } */
202 /* { dg-final { scan-assembler-times "vrld" 3 } } */
203 /* { dg-final { scan-assembler-times "vsld" 5 } } */
204 /* { dg-final { scan-assembler-times "vsrad" 3 } } */
205