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