1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } } */
/* { dg-options "-mdejagnu-cpu=power8 -mvsx -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */
/* { dg-require-effective-target powerpc_vsx } */
#include <altivec.h>
typedef vector long long v_sign;
typedef vector unsigned long long v_uns;
typedef vector bool long long v_bool;
typedef vector bool char v_bchar;
typedef vector bool int v_bint;
typedef vector bool short v_bshort;
typedef vector signed int v_sint;
typedef vector unsigned int v_uint;
typedef vector signed char v_schar;
typedef vector unsigned char v_uchar;
typedef vector float v_float;
v_sign sign_add_1 (v_sign a, v_sign b)
{
return __builtin_altivec_vaddudm (a, b);
}
v_sign sign_add_2 (v_sign a, v_sign b)
{
return vec_add (a, b);
}
v_sign sign_add_3 (v_sign a, v_sign b)
{
return vec_vaddudm (a, b);
}
v_sign sign_sub_1 (v_sign a, v_sign b)
{
return __builtin_altivec_vsubudm (a, b);
}
v_sign sign_sub_2 (v_sign a, v_sign b)
{
return vec_sub (a, b);
}
v_sign sign_sub_3 (v_sign a, v_sign b)
{
return vec_vsubudm (a, b);
}
v_sign sign_min_1 (v_sign a, v_sign b)
{
return __builtin_altivec_vminsd (a, b);
}
v_sign sign_min_2 (v_sign a, v_sign b)
{
return vec_min (a, b);
}
v_sign sign_min_3 (v_sign a, v_sign b)
{
return vec_vminsd (a, b);
}
v_sign sign_max_1 (v_sign a, v_sign b)
{
return __builtin_altivec_vmaxsd (a, b);
}
v_sign sign_max_2 (v_sign a, v_sign b)
{
return vec_max (a, b);
}
v_sign sign_max_3 (v_sign a, v_sign b)
{
return vec_vmaxsd (a, b);
}
v_sign sign_abs (v_sign a)
{
return vec_abs (a); /* xor, vsubudm, vmaxsd. */
}
v_bool sign_eq (v_sign a, v_sign b)
{
return vec_cmpeq (a, b);
}
v_bool sign_lt (v_sign a, v_sign b)
{
return vec_cmplt (a, b);
}
v_uns uns_add_2 (v_uns a, v_uns b)
{
return vec_add (a, b);
}
v_uns uns_add_3 (v_uns a, v_uns b)
{
return vec_vaddudm (a, b);
}
v_uns uns_sub_2 (v_uns a, v_uns b)
{
return vec_sub (a, b);
}
v_uns uns_sub_3 (v_uns a, v_uns b)
{
return vec_vsubudm (a, b);
}
v_uns uns_min_2 (v_uns a, v_uns b)
{
return vec_min (a, b);
}
v_uns uns_min_3 (v_uns a, v_uns b)
{
return vec_vminud (a, b);
}
v_uns uns_max_2 (v_uns a, v_uns b)
{
return vec_max (a, b);
}
v_uns uns_max_3 (v_uns a, v_uns b)
{
return vec_vmaxud (a, b);
}
v_bool uns_eq (v_uns a, v_uns b)
{
return vec_cmpeq (a, b);
}
v_bool uns_lt (v_uns a, v_uns b)
{
return vec_cmplt (a, b);
}
v_sign sign_rl_1 (v_sign a, v_sign b)
{
return __builtin_altivec_vrld (a, b);
}
v_sign sign_rl_2 (v_sign a, v_uns b)
{
return vec_rl (a, b);
}
v_uns uns_rl_2 (v_uns a, v_uns b)
{
return vec_rl (a, b);
}
v_sign sign_sl_1 (v_sign a, v_sign b)
{
return __builtin_altivec_vsld (a, b);
}
v_sign sign_sl_2 (v_sign a, v_uns b)
{
return vec_sl (a, b);
}
v_sign sign_sl_3 (v_sign a, v_uns b)
{
return vec_vsld (a, b);
}
v_uns uns_sl_2 (v_uns a, v_uns b)
{
return vec_sl (a, b);
}
v_uns uns_sl_3 (v_uns a, v_uns b)
{
return vec_vsld (a, b);
}
v_sign sign_sra_1 (v_sign a, v_sign b)
{
return __builtin_altivec_vsrad (a, b);
}
v_sign sign_sra_2 (v_sign a, v_uns b)
{
return vec_sra (a, b);
}
v_sign sign_sra_3 (v_sign a, v_uns b)
{
return vec_vsrad (a, b);
}
v_bchar vbchar_eq (v_bchar a, v_bchar b)
{
return vec_cmpeq (a, b);
}
v_bchar vbschar_eq (v_schar a, v_schar b)
{
return vec_cmpeq (a, b);
}
v_bchar vuchar_eq (v_uchar a, v_uchar b)
{
return vec_cmpeq (a, b);
}
v_bint vbint_eq (v_bint a, v_bint b)
{
return vec_cmpeq (a, b);
}
v_bint vsint_eq (v_sint a, v_sint b)
{
return vec_cmpeq (a, b);
}
v_bint vuint_eq (v_uint a, v_uint b)
{
return vec_cmpeq (a, b);
}
v_bool vbool_eq (v_bool a, v_bool b)
{
return vec_cmpeq (a, b);
}
v_bint vbint_ne (v_bint a, v_bint b)
{
return vec_cmpne (a, b);
}
v_bint vsint_ne (v_sint a, v_sint b)
{
return vec_cmpne (a, b);
}
v_bint vuint_ne (v_uint a, v_uint b)
{
return vec_cmpne (a, b);
}
v_bool vbool_ne (v_bool a, v_bool b)
{
return vec_cmpne (a, b);
}
v_bool vsign_ne (v_sign a, v_sign b)
{
return vec_cmpne (a, b);
}
v_bool vuns_ne (v_uns a, v_uns b)
{
return vec_cmpne (a, b);
}
v_bshort vbshort_ne (v_bshort a, v_bshort b)
{
return vec_cmpne (a, b);
}
/* { dg-final { scan-assembler-times "vaddudm" 5 } } */
/* { dg-final { scan-assembler-times "vsubudm" 6 } } */
/* { dg-final { scan-assembler-times "vmaxsd" 4 } } */
/* { dg-final { scan-assembler-times "vminsd" 3 } } */
/* { dg-final { scan-assembler-times "vmaxud" 2 } } */
/* { dg-final { scan-assembler-times "vminud" 2 } } */
/* { dg-final { scan-assembler-times "vcmpequd" 6 } } */
/* { dg-final { scan-assembler-times "vcmpgtsd" 1 } } */
/* { dg-final { scan-assembler-times "vcmpgtud" 1 } } */
/* { dg-final { scan-assembler-times "vrld" 3 } } */
/* { dg-final { scan-assembler-times "vsld" 5 } } */
/* { dg-final { scan-assembler-times "vsrad" 3 } } */
/* { dg-final { scan-assembler-times "vcmpequb" 3 } } */
/* { dg-final { scan-assembler-times "vcmpequw" 6 } } */
|