1 /* { dg-do compile { target { powerpc*-*-* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } } */
3 /* { dg-require-effective-target powerpc_vsx_ok } */
4 /* { dg-options "-mdejagnu-cpu=power8 -mvsx -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */
8 typedef vector
long long v_sign
;
9 typedef vector
unsigned long long v_uns
;
10 typedef vector
bool long long v_bool
;
11 typedef vector
bool char v_bchar
;
12 typedef vector
bool int v_bint
;
13 typedef vector
bool short v_bshort
;
14 typedef vector
signed int v_sint
;
15 typedef vector
unsigned int v_uint
;
16 typedef vector
signed char v_schar
;
17 typedef vector
unsigned char v_uchar
;
18 typedef vector
float v_float
;
20 v_sign
sign_add_1 (v_sign a
, v_sign b
)
22 return __builtin_altivec_vaddudm (a
, b
);
25 v_sign
sign_add_2 (v_sign a
, v_sign b
)
27 return vec_add (a
, b
);
30 v_sign
sign_add_3 (v_sign a
, v_sign b
)
32 return vec_vaddudm (a
, b
);
35 v_sign
sign_sub_1 (v_sign a
, v_sign b
)
37 return __builtin_altivec_vsubudm (a
, b
);
40 v_sign
sign_sub_2 (v_sign a
, v_sign b
)
42 return vec_sub (a
, b
);
46 v_sign
sign_sub_3 (v_sign a
, v_sign b
)
48 return vec_vsubudm (a
, b
);
51 v_sign
sign_min_1 (v_sign a
, v_sign b
)
53 return __builtin_altivec_vminsd (a
, b
);
56 v_sign
sign_min_2 (v_sign a
, v_sign b
)
58 return vec_min (a
, b
);
61 v_sign
sign_min_3 (v_sign a
, v_sign b
)
63 return vec_vminsd (a
, b
);
66 v_sign
sign_max_1 (v_sign a
, v_sign b
)
68 return __builtin_altivec_vmaxsd (a
, b
);
71 v_sign
sign_max_2 (v_sign a
, v_sign b
)
73 return vec_max (a
, b
);
76 v_sign
sign_max_3 (v_sign a
, v_sign b
)
78 return vec_vmaxsd (a
, b
);
81 v_sign
sign_abs (v_sign a
)
83 return vec_abs (a
); /* xor, vsubudm, vmaxsd. */
86 v_bool
sign_eq (v_sign a
, v_sign b
)
88 return vec_cmpeq (a
, b
);
91 v_bool
sign_lt (v_sign a
, v_sign b
)
93 return vec_cmplt (a
, b
);
96 v_uns
uns_add_2 (v_uns a
, v_uns b
)
98 return vec_add (a
, b
);
101 v_uns
uns_add_3 (v_uns a
, v_uns b
)
103 return vec_vaddudm (a
, b
);
106 v_uns
uns_sub_2 (v_uns a
, v_uns b
)
108 return vec_sub (a
, b
);
111 v_uns
uns_sub_3 (v_uns a
, v_uns b
)
113 return vec_vsubudm (a
, b
);
116 v_uns
uns_min_2 (v_uns a
, v_uns b
)
118 return vec_min (a
, b
);
121 v_uns
uns_min_3 (v_uns a
, v_uns b
)
123 return vec_vminud (a
, b
);
126 v_uns
uns_max_2 (v_uns a
, v_uns b
)
128 return vec_max (a
, b
);
131 v_uns
uns_max_3 (v_uns a
, v_uns b
)
133 return vec_vmaxud (a
, b
);
136 v_bool
uns_eq (v_uns a
, v_uns b
)
138 return vec_cmpeq (a
, b
);
141 v_bool
uns_lt (v_uns a
, v_uns b
)
143 return vec_cmplt (a
, b
);
146 v_sign
sign_rl_1 (v_sign a
, v_sign b
)
148 return __builtin_altivec_vrld (a
, b
);
151 v_sign
sign_rl_2 (v_sign a
, v_uns b
)
153 return vec_rl (a
, b
);
156 v_uns
uns_rl_2 (v_uns a
, v_uns b
)
158 return vec_rl (a
, b
);
161 v_sign
sign_sl_1 (v_sign a
, v_sign b
)
163 return __builtin_altivec_vsld (a
, b
);
166 v_sign
sign_sl_2 (v_sign a
, v_uns b
)
168 return vec_sl (a
, b
);
171 v_sign
sign_sl_3 (v_sign a
, v_uns b
)
173 return vec_vsld (a
, b
);
176 v_uns
uns_sl_2 (v_uns a
, v_uns b
)
178 return vec_sl (a
, b
);
181 v_uns
uns_sl_3 (v_uns a
, v_uns b
)
183 return vec_vsld (a
, b
);
186 v_sign
sign_sra_1 (v_sign a
, v_sign b
)
188 return __builtin_altivec_vsrad (a
, b
);
191 v_sign
sign_sra_2 (v_sign a
, v_uns b
)
193 return vec_sra (a
, b
);
196 v_sign
sign_sra_3 (v_sign a
, v_uns b
)
198 return vec_vsrad (a
, b
);
201 v_bchar
vbchar_eq (v_bchar a
, v_bchar b
)
203 return vec_cmpeq (a
, b
);
206 v_bchar
vbschar_eq (v_schar a
, v_schar b
)
208 return vec_cmpeq (a
, b
);
211 v_bchar
vuchar_eq (v_uchar a
, v_uchar b
)
213 return vec_cmpeq (a
, b
);
216 v_bint
vbint_eq (v_bint a
, v_bint b
)
218 return vec_cmpeq (a
, b
);
221 v_bint
vsint_eq (v_sint a
, v_sint b
)
223 return vec_cmpeq (a
, b
);
226 v_bint
vuint_eq (v_uint a
, v_uint b
)
228 return vec_cmpeq (a
, b
);
231 v_bool
vbool_eq (v_bool a
, v_bool b
)
233 return vec_cmpeq (a
, b
);
236 v_bint
vbint_ne (v_bint a
, v_bint b
)
238 return vec_cmpne (a
, b
);
241 v_bint
vsint_ne (v_sint a
, v_sint b
)
243 return vec_cmpne (a
, b
);
246 v_bint
vuint_ne (v_uint a
, v_uint b
)
248 return vec_cmpne (a
, b
);
251 v_bool
vbool_ne (v_bool a
, v_bool b
)
253 return vec_cmpne (a
, b
);
256 v_bool
vsign_ne (v_sign a
, v_sign b
)
258 return vec_cmpne (a
, b
);
261 v_bool
vuns_ne (v_uns a
, v_uns b
)
263 return vec_cmpne (a
, b
);
266 v_bshort
vbshort_ne (v_bshort a
, v_bshort b
)
268 return vec_cmpne (a
, b
);
272 /* { dg-final { scan-assembler-times "vaddudm" 5 } } */
273 /* { dg-final { scan-assembler-times "vsubudm" 6 } } */
274 /* { dg-final { scan-assembler-times "vmaxsd" 4 } } */
275 /* { dg-final { scan-assembler-times "vminsd" 3 } } */
276 /* { dg-final { scan-assembler-times "vmaxud" 2 } } */
277 /* { dg-final { scan-assembler-times "vminud" 2 } } */
278 /* { dg-final { scan-assembler-times "vcmpequd" 6 } } */
279 /* { dg-final { scan-assembler-times "vcmpgtsd" 1 } } */
280 /* { dg-final { scan-assembler-times "vcmpgtud" 1 } } */
281 /* { dg-final { scan-assembler-times "vrld" 3 } } */
282 /* { dg-final { scan-assembler-times "vsld" 5 } } */
283 /* { dg-final { scan-assembler-times "vsrad" 3 } } */
284 /* { dg-final { scan-assembler-times "vcmpequb" 3 } } */
285 /* { dg-final { scan-assembler-times "vcmpequw" 6 } } */