1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } } */
3 /* { dg-require-effective-target powerpc_p8vector_ok } */
4 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
5 /* { dg-options "-mcpu=power8 -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */
9 typedef vector
long long v_sign
;
10 typedef vector
unsigned long long v_uns
;
11 typedef vector
bool long long v_bool
;
12 typedef vector
bool char v_bchar
;
13 typedef vector
bool int v_bint
;
14 typedef vector
bool short v_bshort
;
15 typedef vector
signed int v_sint
;
16 typedef vector
unsigned int v_uint
;
17 typedef vector
signed char v_schar
;
18 typedef vector
unsigned char v_uchar
;
19 typedef vector
float v_float
;
21 v_sign
sign_add_1 (v_sign a
, v_sign b
)
23 return __builtin_altivec_vaddudm (a
, b
);
26 v_sign
sign_add_2 (v_sign a
, v_sign b
)
28 return vec_add (a
, b
);
31 v_sign
sign_add_3 (v_sign a
, v_sign b
)
33 return vec_vaddudm (a
, b
);
36 v_sign
sign_sub_1 (v_sign a
, v_sign b
)
38 return __builtin_altivec_vsubudm (a
, b
);
41 v_sign
sign_sub_2 (v_sign a
, v_sign b
)
43 return vec_sub (a
, b
);
47 v_sign
sign_sub_3 (v_sign a
, v_sign b
)
49 return vec_vsubudm (a
, b
);
52 v_sign
sign_min_1 (v_sign a
, v_sign b
)
54 return __builtin_altivec_vminsd (a
, b
);
57 v_sign
sign_min_2 (v_sign a
, v_sign b
)
59 return vec_min (a
, b
);
62 v_sign
sign_min_3 (v_sign a
, v_sign b
)
64 return vec_vminsd (a
, b
);
67 v_sign
sign_max_1 (v_sign a
, v_sign b
)
69 return __builtin_altivec_vmaxsd (a
, b
);
72 v_sign
sign_max_2 (v_sign a
, v_sign b
)
74 return vec_max (a
, b
);
77 v_sign
sign_max_3 (v_sign a
, v_sign b
)
79 return vec_vmaxsd (a
, b
);
82 v_sign
sign_abs (v_sign a
)
84 return vec_abs (a
); /* xor, vsubudm, vmaxsd. */
87 v_bool
sign_eq (v_sign a
, v_sign b
)
89 return vec_cmpeq (a
, b
);
92 v_bool
sign_lt (v_sign a
, v_sign b
)
94 return vec_cmplt (a
, b
);
97 v_uns
uns_add_2 (v_uns a
, v_uns b
)
99 return vec_add (a
, b
);
102 v_uns
uns_add_3 (v_uns a
, v_uns b
)
104 return vec_vaddudm (a
, b
);
107 v_uns
uns_sub_2 (v_uns a
, v_uns b
)
109 return vec_sub (a
, b
);
112 v_uns
uns_sub_3 (v_uns a
, v_uns b
)
114 return vec_vsubudm (a
, b
);
117 v_uns
uns_min_2 (v_uns a
, v_uns b
)
119 return vec_min (a
, b
);
122 v_uns
uns_min_3 (v_uns a
, v_uns b
)
124 return vec_vminud (a
, b
);
127 v_uns
uns_max_2 (v_uns a
, v_uns b
)
129 return vec_max (a
, b
);
132 v_uns
uns_max_3 (v_uns a
, v_uns b
)
134 return vec_vmaxud (a
, b
);
137 v_bool
uns_eq (v_uns a
, v_uns b
)
139 return vec_cmpeq (a
, b
);
142 v_bool
uns_lt (v_uns a
, v_uns b
)
144 return vec_cmplt (a
, b
);
147 v_sign
sign_rl_1 (v_sign a
, v_sign b
)
149 return __builtin_altivec_vrld (a
, b
);
152 v_sign
sign_rl_2 (v_sign a
, v_uns b
)
154 return vec_rl (a
, b
);
157 v_uns
uns_rl_2 (v_uns a
, v_uns b
)
159 return vec_rl (a
, b
);
162 v_sign
sign_sl_1 (v_sign a
, v_sign b
)
164 return __builtin_altivec_vsld (a
, b
);
167 v_sign
sign_sl_2 (v_sign a
, v_uns b
)
169 return vec_sl (a
, b
);
172 v_sign
sign_sl_3 (v_sign a
, v_uns b
)
174 return vec_vsld (a
, b
);
177 v_uns
uns_sl_2 (v_uns a
, v_uns b
)
179 return vec_sl (a
, b
);
182 v_uns
uns_sl_3 (v_uns a
, v_uns b
)
184 return vec_vsld (a
, b
);
187 v_sign
sign_sra_1 (v_sign a
, v_sign b
)
189 return __builtin_altivec_vsrad (a
, b
);
192 v_sign
sign_sra_2 (v_sign a
, v_uns b
)
194 return vec_sra (a
, b
);
197 v_sign
sign_sra_3 (v_sign a
, v_uns b
)
199 return vec_vsrad (a
, b
);
202 v_bchar
vbchar_eq (v_bchar a
, v_bchar b
)
204 return vec_cmpeq (a
, b
);
207 v_bchar
vbschar_eq (v_schar a
, v_schar b
)
209 return vec_cmpeq (a
, b
);
212 v_bchar
vuchar_eq (v_uchar a
, v_uchar b
)
214 return vec_cmpeq (a
, b
);
217 v_bint
vbint_eq (v_bint a
, v_bint b
)
219 return vec_cmpeq (a
, b
);
222 v_bint
vsint_eq (v_sint a
, v_sint b
)
224 return vec_cmpeq (a
, b
);
227 v_bint
vuint_eq (v_uint a
, v_uint b
)
229 return vec_cmpeq (a
, b
);
232 v_bool
vbool_eq (v_bool a
, v_bool b
)
234 return vec_cmpeq (a
, b
);
237 v_bint
vbint_ne (v_bint a
, v_bint b
)
239 return vec_cmpne (a
, b
);
242 v_bint
vsint_ne (v_sint a
, v_sint b
)
244 return vec_cmpne (a
, b
);
247 v_bint
vuint_ne (v_uint a
, v_uint b
)
249 return vec_cmpne (a
, b
);
252 v_bool
vbool_ne (v_bool a
, v_bool b
)
254 return vec_cmpne (a
, b
);
257 v_bool
vsign_ne (v_sign a
, v_sign b
)
259 return vec_cmpne (a
, b
);
262 v_bool
vuns_ne (v_uns a
, v_uns b
)
264 return vec_cmpne (a
, b
);
267 v_bshort
vbshort_ne (v_bshort a
, v_bshort b
)
269 return vec_cmpne (a
, b
);
273 /* { dg-final { scan-assembler-times "vaddudm" 5 } } */
274 /* { dg-final { scan-assembler-times "vsubudm" 6 } } */
275 /* { dg-final { scan-assembler-times "vmaxsd" 4 } } */
276 /* { dg-final { scan-assembler-times "vminsd" 3 } } */
277 /* { dg-final { scan-assembler-times "vmaxud" 2 } } */
278 /* { dg-final { scan-assembler-times "vminud" 2 } } */
279 /* { dg-final { scan-assembler-times "vcmpequd" 6 } } */
280 /* { dg-final { scan-assembler-times "vcmpgtsd" 1 } } */
281 /* { dg-final { scan-assembler-times "vcmpgtud" 1 } } */
282 /* { dg-final { scan-assembler-times "vrld" 3 } } */
283 /* { dg-final { scan-assembler-times "vsld" 5 } } */
284 /* { dg-final { scan-assembler-times "vsrad" 3 } } */
285 /* { dg-final { scan-assembler-times "vcmpequb" 3 } } */
286 /* { dg-final { scan-assembler-times "vcmpequw" 6 } } */