1 //
2 // Copyright (c) 2017 The Khronos Group Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 #include "harness/errorHelpers.h"
17
18 #include <stdio.h>
19 #include <cinttypes>
20 #include "test_select.h"
21
22
23 //-----------------------------------------
24 // Definitions and initializations
25 //-----------------------------------------
26
27
28 const char *type_name[kTypeCount] = { "uchar", "char", "ushort", "short",
29 "half", "uint", "int", "float",
30 "ulong", "long", "double" };
31
32 const size_t type_size[kTypeCount] = {
33 sizeof(cl_uchar), sizeof(cl_char), sizeof(cl_ushort), sizeof(cl_short),
34 sizeof(cl_half), sizeof(cl_uint), sizeof(cl_int), sizeof(cl_float),
35 sizeof(cl_ulong), sizeof(cl_long), sizeof(cl_double)
36 };
37
38 const Type ctype[kTypeCount][2] = {
39 { kuchar, kchar }, // uchar
40 { kuchar, kchar }, // char
41 { kushort, kshort }, // ushort
42 { kushort, kshort }, // short
43 { kushort, kshort }, // half
44 { kuint, kint }, // uint
45 { kuint, kint }, // int
46 { kuint, kint }, // float
47 { kulong, klong }, // ulong
48 { kulong, klong }, // long
49 { kulong, klong } // double
50 };
51
52
53 //-----------------------------------------
54 // Reference functions
55 //-----------------------------------------
56
refselect_1i8(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)57 void refselect_1i8(void *const dest, const void *const src1,
58 const void *const src2, const void *const cmp, size_t count)
59 {
60 size_t i;
61 cl_char *const d = (cl_char *)dest;
62 const cl_char *const x = (cl_char *)src1;
63 const cl_char *const y = (cl_char *)src2;
64 const cl_char *const m = (cl_char *)cmp;
65 for (i=0; i < count; ++i) {
66 d[i] = m[i] ? y[i] : x[i];
67 }
68 }
69
refselect_1u8(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)70 void refselect_1u8(void *const dest, const void *const src1,
71 const void *const src2, const void *const cmp, size_t count)
72 {
73 size_t i;
74 cl_uchar *const d = (cl_uchar *)dest;
75 const cl_uchar *const x = (cl_uchar *)src1;
76 const cl_uchar *const y = (cl_uchar *)src2;
77 const cl_char *const m = (cl_char *)cmp;
78 for (i=0; i < count; ++i) {
79 d[i] = m[i] ? y[i] : x[i];
80 }
81 }
82
refselect_1i16(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)83 void refselect_1i16(void *const dest, const void *const src1,
84 const void *const src2, const void *const cmp, size_t count)
85 {
86 size_t i;
87 cl_short *const d = (cl_short *)dest;
88 const cl_short *const x = (cl_short *)src1;
89 const cl_short *const y = (cl_short *)src2;
90 const cl_short *const m = (cl_short *)cmp;
91
92 for (i=0; i < count; ++i)
93 d[i] = m[i] ? y[i] : x[i];
94 }
95
refselect_1u16(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)96 void refselect_1u16(void *const dest, const void *const src1,
97 const void *const src2, const void *const cmp, size_t count)
98 {
99 size_t i;
100 cl_ushort *const d = (cl_ushort *)dest;
101 const cl_ushort *const x = (cl_ushort *)src1;
102 const cl_ushort *const y = (cl_ushort *)src2;
103 const cl_short *const m = (cl_short *)cmp;
104 for (i=0; i < count; ++i)
105 d[i] = m[i] ? y[i] : x[i];
106 }
107
refselect_1i32(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)108 void refselect_1i32(void *const dest, const void *const src1,
109 const void *const src2, const void *const cmp, size_t count)
110 {
111 size_t i;
112 cl_int *const d = (cl_int *)dest;
113 const cl_int *const x = (cl_int *)src1;
114 const cl_int *const y = (cl_int *)src2;
115 const cl_int *const m = (cl_int *)cmp;
116 for (i=0; i < count; ++i)
117 d[i] = m[i] ? y[i] : x[i];
118 }
119
refselect_1u32(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)120 void refselect_1u32(void *const dest, const void *const src1,
121 const void *const src2, const void *const cmp, size_t count)
122 {
123 size_t i;
124 cl_uint *const d = (cl_uint *)dest;
125 const cl_uint *const x = (cl_uint *)src1;
126 const cl_uint *const y = (cl_uint *)src2;
127 const cl_int *const m = (cl_int *)cmp;
128 for (i=0; i < count; ++i)
129 d[i] = m[i] ? y[i] : x[i];
130 }
131
refselect_1i64(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)132 void refselect_1i64(void *const dest, const void *const src1,
133 const void *const src2, const void *const cmp, size_t count)
134 {
135 size_t i;
136 cl_long *const d = (cl_long *)dest;
137 const cl_long *const x = (cl_long *)src1;
138 const cl_long *const y = (cl_long *)src2;
139 const cl_long *const m = (cl_long *)cmp;
140 for (i=0; i < count; ++i)
141 d[i] = m[i] ? y[i] : x[i];
142 }
143
refselect_1u64(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)144 void refselect_1u64(void *const dest, const void *const src1,
145 const void *const src2, const void *const cmp, size_t count)
146 {
147 size_t i;
148 cl_ulong *const d = (cl_ulong *)dest;
149 const cl_ulong *const x = (cl_ulong *)src1;
150 const cl_ulong *const y = (cl_ulong *)src2;
151 const cl_long *const m = (cl_long *)cmp;
152 for (i=0; i < count; ++i)
153 d[i] = m[i] ? y[i] : x[i];
154 }
155
refselect_1i8u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)156 void refselect_1i8u(void *const dest, const void *const src1,
157 const void *const src2, const void *const cmp, size_t count)
158 {
159 size_t i;
160 cl_char *const d = (cl_char *)dest;
161 const cl_char *const x = (cl_char *)src1;
162 const cl_char *const y = (cl_char *)src2;
163 const cl_uchar *const m = (cl_uchar *)cmp;
164 for (i=0; i < count; ++i)
165 d[i] = m[i] ? y[i] : x[i];
166 }
167
refselect_1u8u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)168 void refselect_1u8u(void *const dest, const void *const src1,
169 const void *const src2, const void *const cmp, size_t count)
170 {
171 size_t i;
172 cl_uchar *const d = (cl_uchar *)dest;
173 const cl_uchar *const x = (cl_uchar *)src1;
174 const cl_uchar *const y = (cl_uchar *)src2;
175 const cl_uchar *const m = (cl_uchar *)cmp;
176 for (i=0; i < count; ++i)
177 d[i] = m[i] ? y[i] : x[i];
178 }
179
refselect_1i16u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)180 void refselect_1i16u(void *const dest, const void *const src1,
181 const void *const src2, const void *const cmp,
182 size_t count)
183 {
184 size_t i;
185 cl_short *const d = (cl_short *)dest;
186 const cl_short *const x = (cl_short *)src1;
187 const cl_short *const y = (cl_short *)src2;
188 const cl_ushort *const m = (cl_ushort *)cmp;
189 for (i=0; i < count; ++i)
190 d[i] = m[i] ? y[i] : x[i];
191 }
192
refselect_1u16u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)193 void refselect_1u16u(void *const dest, const void *const src1,
194 const void *const src2, const void *const cmp,
195 size_t count)
196 {
197 size_t i;
198 cl_ushort *const d = (cl_ushort *)dest;
199 const cl_ushort *const x = (cl_ushort *)src1;
200 const cl_ushort *const y = (cl_ushort *)src2;
201 const cl_ushort *const m = (cl_ushort *)cmp;
202 for (i=0; i < count; ++i)
203 d[i] = m[i] ? y[i] : x[i];
204 }
205
refselect_1i32u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)206 void refselect_1i32u(void *const dest, const void *const src1,
207 const void *const src2, const void *const cmp,
208 size_t count)
209 {
210 size_t i;
211 cl_int *const d = (cl_int *)dest;
212 const cl_int *const x = (cl_int *)src1;
213 const cl_int *const y = (cl_int *)src2;
214 const cl_uint *const m = (cl_uint *)cmp;
215 for (i=0; i < count; ++i)
216 d[i] = m[i] ? y[i] : x[i];
217 }
218
refselect_1u32u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)219 void refselect_1u32u(void *const dest, const void *const src1,
220 const void *const src2, const void *const cmp,
221 size_t count)
222 {
223 size_t i;
224 cl_uint *const d = (cl_uint *)dest;
225 const cl_uint *const x = (cl_uint *)src1;
226 const cl_uint *const y = (cl_uint *)src2;
227 const cl_uint *const m = (cl_uint *)cmp;
228 for (i=0; i < count; ++i)
229 d[i] = m[i] ? y[i] : x[i];
230 }
231
refselect_1i64u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)232 void refselect_1i64u(void *const dest, const void *const src1,
233 const void *const src2, const void *const cmp,
234 size_t count)
235 {
236 size_t i;
237 cl_long *const d = (cl_long *)dest;
238 const cl_long *const x = (cl_long *)src1;
239 const cl_long *const y = (cl_long *)src2;
240 const cl_ulong *const m = (cl_ulong *)cmp;
241 for (i=0; i < count; ++i)
242 d[i] = m[i] ? y[i] : x[i];
243 }
244
refselect_1u64u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)245 void refselect_1u64u(void *const dest, const void *const src1,
246 const void *const src2, const void *const cmp,
247 size_t count)
248 {
249 size_t i;
250 cl_ulong *const d = (cl_ulong *)dest;
251 const cl_ulong *const x = (cl_ulong *)src1;
252 const cl_ulong *const y = (cl_ulong *)src2;
253 const cl_ulong *const m = (cl_ulong *)cmp;
254 for (i=0; i < count; ++i)
255 d[i] = m[i] ? y[i] : x[i];
256 }
257
refselect_hhi(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)258 void refselect_hhi(void *const dest, const void *const src1,
259 const void *const src2, const void *const cmp, size_t count)
260 {
261 size_t i;
262 cl_short *const d = (cl_short *)dest;
263 const cl_short *const x = (cl_short *)src1;
264 const cl_short *const y = (cl_short *)src2;
265 const cl_short *const m = (cl_short *)cmp;
266 for (i = 0; i < count; ++i) d[i] = m[i] ? y[i] : x[i];
267 }
268
refselect_hhu(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)269 void refselect_hhu(void *const dest, const void *const src1,
270 const void *const src2, const void *const cmp, size_t count)
271 {
272 size_t i;
273 cl_ushort *const d = (cl_ushort *)dest;
274 const cl_ushort *const x = (cl_ushort *)src1;
275 const cl_ushort *const y = (cl_ushort *)src2;
276 const cl_ushort *const m = (cl_ushort *)cmp;
277 for (i = 0; i < count; ++i) d[i] = m[i] ? y[i] : x[i];
278 }
279
refselect_ffi(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)280 void refselect_ffi(void *const dest, const void *const src1,
281 const void *const src2, const void *const cmp, size_t count)
282 {
283 size_t i;
284 cl_int *const d = (cl_int *)dest;
285 const cl_int *const x = (cl_int *)src1;
286 const cl_int *const y = (cl_int *)src2;
287 const cl_int *const m = (cl_int *)cmp;
288 for (i=0; i < count; ++i)
289 d[i] = m[i] ? y[i] : x[i];
290 }
291
refselect_ffu(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)292 void refselect_ffu(void *const dest, const void *const src1,
293 const void *const src2, const void *const cmp, size_t count)
294 {
295 size_t i;
296 cl_uint *const d = (cl_uint *)dest;
297 const cl_uint *const x = (cl_uint *)src1;
298 const cl_uint *const y = (cl_uint *)src2;
299 const cl_uint *const m = (cl_uint *)cmp;
300 for (i=0; i < count; ++i)
301 d[i] = m[i] ? y[i] : x[i];
302 }
303
refselect_ddi(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)304 void refselect_ddi(void *const dest, const void *const src1,
305 const void *const src2, const void *const cmp, size_t count)
306 {
307 size_t i;
308 cl_long *const d = (cl_long *)dest;
309 const cl_long *const x = (cl_long *)src1;
310 const cl_long *const y = (cl_long *)src2;
311 const cl_long *const m = (cl_long *)cmp;
312 for (i=0; i < count; ++i)
313 d[i] = m[i] ? y[i] : x[i];
314 }
315
refselect_ddu(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)316 void refselect_ddu(void *const dest, const void *const src1,
317 const void *const src2, const void *const cmp, size_t count)
318 {
319 size_t i;
320 cl_long *const d = (cl_long *)dest;
321 const cl_long *const x = (cl_long *)src1;
322 const cl_long *const y = (cl_long *)src2;
323 const cl_ulong *const m = (cl_ulong *)cmp;
324 for (i=0; i < count; ++i)
325 d[i] = m[i] ? y[i] : x[i];
326 }
327
vrefselect_1i8(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)328 void vrefselect_1i8(void *const dest, const void *const src1,
329 const void *const src2, const void *const cmp, size_t count)
330 {
331 size_t i;
332 cl_char *const d = (cl_char *)dest;
333 const cl_char *const x = (cl_char *)src1;
334 const cl_char *const y = (cl_char *)src2;
335 const cl_char *const m = (cl_char *)cmp;
336 for (i=0; i < count; ++i)
337 d[i] = (m[i] & 0x80) ? y[i] : x[i];
338 }
339
vrefselect_1u8(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)340 void vrefselect_1u8(void *const dest, const void *const src1,
341 const void *const src2, const void *const cmp, size_t count)
342 {
343 size_t i;
344 cl_uchar *const d = (cl_uchar *)dest;
345 const cl_uchar *const x = (cl_uchar *)src1;
346 const cl_uchar *const y = (cl_uchar *)src2;
347 const cl_char *const m = (cl_char *)cmp;
348 for (i=0; i < count; ++i)
349 d[i] = (m[i] & 0x80) ? y[i] : x[i];
350 }
351
vrefselect_1i16(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)352 void vrefselect_1i16(void *const dest, const void *const src1,
353 const void *const src2, const void *const cmp,
354 size_t count)
355 {
356 size_t i;
357 cl_short *const d = (cl_short *)dest;
358 const cl_short *const x = (cl_short *)src1;
359 const cl_short *const y = (cl_short *)src2;
360 const cl_short *const m = (cl_short *)cmp;
361
362 for (i=0; i < count; ++i)
363 d[i] = (m[i] & 0x8000) ? y[i] : x[i];
364 }
365
vrefselect_1u16(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)366 void vrefselect_1u16(void *const dest, const void *const src1,
367 const void *const src2, const void *const cmp,
368 size_t count)
369 {
370 size_t i;
371 cl_ushort *const d = (cl_ushort *)dest;
372 const cl_ushort *const x = (cl_ushort *)src1;
373 const cl_ushort *const y = (cl_ushort *)src2;
374 const cl_short *const m = (cl_short *)cmp;
375 for (i=0; i < count; ++i)
376 d[i] = (m[i] & 0x8000) ? y[i] : x[i];
377 }
378
vrefselect_1i32(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)379 void vrefselect_1i32(void *const dest, const void *const src1,
380 const void *const src2, const void *const cmp,
381 size_t count)
382 {
383 size_t i;
384 cl_int *const d = (cl_int *)dest;
385 const cl_int *const x = (cl_int *)src1;
386 const cl_int *const y = (cl_int *)src2;
387 const cl_int *const m = (cl_int *)cmp;
388 for (i=0; i < count; ++i)
389 d[i] = (m[i] & 0x80000000) ? y[i] : x[i];
390 }
391
vrefselect_1u32(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)392 void vrefselect_1u32(void *const dest, const void *const src1,
393 const void *const src2, const void *const cmp,
394 size_t count)
395 {
396 size_t i;
397 cl_uint *const d = (cl_uint *)dest;
398 const cl_uint *const x = (cl_uint *)src1;
399 const cl_uint *const y = (cl_uint *)src2;
400 const cl_int *const m = (cl_int *)cmp;
401
402 for (i=0; i < count; ++i)
403 d[i] = (m[i] & 0x80000000) ? y[i] : x[i];
404 }
405
vrefselect_1i64(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)406 void vrefselect_1i64(void *const dest, const void *const src1,
407 const void *const src2, const void *const cmp,
408 size_t count)
409 {
410 size_t i;
411 cl_long *const d = (cl_long *)dest;
412 const cl_long *const x = (cl_long *)src1;
413 const cl_long *const y = (cl_long *)src2;
414 const cl_long *const m = (cl_long *)cmp;
415 for (i=0; i < count; ++i)
416 d[i] = (m[i] & 0x8000000000000000LL) ? y[i] : x[i];
417 }
418
vrefselect_1u64(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)419 void vrefselect_1u64(void *const dest, const void *const src1,
420 const void *const src2, const void *const cmp,
421 size_t count)
422 {
423 size_t i;
424 cl_ulong *const d = (cl_ulong *)dest;
425 const cl_ulong *const x = (cl_ulong *)src1;
426 const cl_ulong *const y = (cl_ulong *)src2;
427 const cl_long *const m = (cl_long *)cmp;
428 for (i=0; i < count; ++i)
429 d[i] = (m[i] & 0x8000000000000000LL) ? y[i] : x[i];
430 }
431
vrefselect_1i8u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)432 void vrefselect_1i8u(void *const dest, const void *const src1,
433 const void *const src2, const void *const cmp,
434 size_t count)
435 {
436 size_t i;
437 cl_char *const d = (cl_char *)dest;
438 const cl_char *const x = (cl_char *)src1;
439 const cl_char *const y = (cl_char *)src2;
440 const cl_uchar *const m = (cl_uchar *)cmp;
441 for (i=0; i < count; ++i)
442 d[i] = (m[i] & 0x80U) ? y[i] : x[i];
443 }
444
vrefselect_1u8u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)445 void vrefselect_1u8u(void *const dest, const void *const src1,
446 const void *const src2, const void *const cmp,
447 size_t count)
448 {
449 size_t i;
450 cl_uchar *const d = (cl_uchar *)dest;
451 const cl_uchar *const x = (cl_uchar *)src1;
452 const cl_uchar *const y = (cl_uchar *)src2;
453 const cl_uchar *const m = (cl_uchar *)cmp;
454 for (i=0; i < count; ++i)
455 d[i] = (m[i] & 0x80U) ? y[i] : x[i];
456 }
457
vrefselect_1i16u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)458 void vrefselect_1i16u(void *const dest, const void *const src1,
459 const void *const src2, const void *const cmp,
460 size_t count)
461 {
462 size_t i;
463 cl_short *const d = (cl_short *)dest;
464 const cl_short *const x = (cl_short *)src1;
465 const cl_short *const y = (cl_short *)src2;
466 const cl_ushort *const m = (cl_ushort *)cmp;
467 for (i=0; i < count; ++i)
468 d[i] = (m[i] & 0x8000U) ? y[i] : x[i];
469 }
470
vrefselect_1u16u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)471 void vrefselect_1u16u(void *const dest, const void *const src1,
472 const void *const src2, const void *const cmp,
473 size_t count)
474 {
475 size_t i;
476 cl_ushort *const d = (cl_ushort *)dest;
477 const cl_ushort *const x = (cl_ushort *)src1;
478 const cl_ushort *const y = (cl_ushort *)src2;
479 const cl_ushort *const m = (cl_ushort *)cmp;
480 for (i=0; i < count; ++i)
481 d[i] = (m[i] & 0x8000U) ? y[i] : x[i];
482 }
483
vrefselect_1i32u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)484 void vrefselect_1i32u(void *const dest, const void *const src1,
485 const void *const src2, const void *const cmp,
486 size_t count)
487 {
488 size_t i;
489 cl_int *const d = (cl_int *)dest;
490 const cl_int *const x = (cl_int *)src1;
491 const cl_int *const y = (cl_int *)src2;
492 const cl_uint *const m = (cl_uint *)cmp;
493 for (i=0; i < count; ++i)
494 d[i] = (m[i] & 0x80000000U) ? y[i] : x[i];
495 }
496
vrefselect_1u32u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)497 void vrefselect_1u32u(void *const dest, const void *const src1,
498 const void *const src2, const void *const cmp,
499 size_t count)
500 {
501 size_t i;
502 cl_uint *const d = (cl_uint *)dest;
503 const cl_uint *const x = (cl_uint *)src1;
504 const cl_uint *const y = (cl_uint *)src2;
505 const cl_uint *const m = (cl_uint *)cmp;
506 for (i=0; i < count; ++i)
507 d[i] = (m[i] & 0x80000000U) ? y[i] : x[i];
508 }
509
vrefselect_1i64u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)510 void vrefselect_1i64u(void *const dest, const void *const src1,
511 const void *const src2, const void *const cmp,
512 size_t count)
513 {
514 size_t i;
515 cl_long *const d = (cl_long *)dest;
516 const cl_long *const x = (cl_long *)src1;
517 const cl_long *const y = (cl_long *)src2;
518 const cl_ulong *const m = (cl_ulong *)cmp;
519 for (i=0; i < count; ++i)
520 d[i] = (m[i] & 0x8000000000000000ULL) ? y[i] : x[i];
521 }
522
vrefselect_1u64u(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)523 void vrefselect_1u64u(void *const dest, const void *const src1,
524 const void *const src2, const void *const cmp,
525 size_t count)
526 {
527 size_t i;
528 cl_ulong *const d = (cl_ulong *)dest;
529 const cl_ulong *const x = (cl_ulong *)src1;
530 const cl_ulong *const y = (cl_ulong *)src2;
531 const cl_ulong *const m = (cl_ulong *)cmp;
532 for (i=0; i < count; ++i)
533 d[i] = (m[i] & 0x8000000000000000ULL) ? y[i] : x[i];
534 }
535
vrefselect_hhi(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)536 void vrefselect_hhi(void *const dest, const void *const src1,
537 const void *const src2, const void *const cmp, size_t count)
538 {
539 size_t i;
540 cl_ushort *const d = (cl_ushort *)dest;
541 const cl_ushort *const x = (cl_ushort *)src1;
542 const cl_ushort *const y = (cl_ushort *)src2;
543 const cl_short *const m = (cl_short *)cmp;
544 for (i = 0; i < count; ++i) d[i] = (m[i] & 0x8000) ? y[i] : x[i];
545 }
546
vrefselect_hhu(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)547 void vrefselect_hhu(void *const dest, const void *const src1,
548 const void *const src2, const void *const cmp, size_t count)
549 {
550 size_t i;
551 cl_ushort *const d = (cl_ushort *)dest;
552 const cl_ushort *const x = (cl_ushort *)src1;
553 const cl_ushort *const y = (cl_ushort *)src2;
554 const cl_ushort *const m = (cl_ushort *)cmp;
555 for (i = 0; i < count; ++i) d[i] = (m[i] & 0x8000U) ? y[i] : x[i];
556 }
557
vrefselect_ffi(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)558 void vrefselect_ffi(void *const dest, const void *const src1,
559 const void *const src2, const void *const cmp, size_t count)
560 {
561 size_t i;
562 cl_uint *const d = (cl_uint *)dest;
563 const cl_uint *const x = (cl_uint *)src1;
564 const cl_uint *const y = (cl_uint *)src2;
565 const cl_int *const m = (cl_int *)cmp;
566 for (i=0; i < count; ++i)
567 d[i] = (m[i] & 0x80000000) ? y[i] : x[i];
568 }
569
vrefselect_ffu(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)570 void vrefselect_ffu(void *const dest, const void *const src1,
571 const void *const src2, const void *const cmp, size_t count)
572 {
573 size_t i;
574 cl_uint *const d = (cl_uint *)dest;
575 const cl_uint *const x = (cl_uint *)src1;
576 const cl_uint *const y = (cl_uint *)src2;
577 const cl_uint *const m = (cl_uint *)cmp;
578 for (i=0; i < count; ++i)
579 d[i] = (m[i] & 0x80000000U) ? y[i] : x[i];
580 }
581
vrefselect_ddi(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)582 void vrefselect_ddi(void *const dest, const void *const src1,
583 const void *const src2, const void *const cmp, size_t count)
584 {
585 size_t i;
586 cl_ulong *const d = (cl_ulong *)dest;
587 const cl_ulong *const x = (cl_ulong *)src1;
588 const cl_ulong *const y = (cl_ulong *)src2;
589 const cl_long *const m = (cl_long *)cmp;
590 for (i=0; i < count; ++i)
591 d[i] = (m[i] & 0x8000000000000000LL) ? y[i] : x[i];
592 }
593
vrefselect_ddu(void * const dest,const void * const src1,const void * const src2,const void * const cmp,size_t count)594 void vrefselect_ddu(void *const dest, const void *const src1,
595 const void *const src2, const void *const cmp, size_t count)
596 {
597 size_t i;
598 cl_ulong *const d = (cl_ulong *)dest;
599 const cl_ulong *const x = (cl_ulong *)src1;
600 const cl_ulong *const y = (cl_ulong *)src2;
601 const cl_ulong *const m = (cl_ulong *)cmp;
602 for (i=0; i < count; ++i)
603 d[i] = (m[i] & 0x8000000000000000ULL) ? y[i] : x[i];
604 }
605
606 // Define refSelects
607 Select refSelects[kTypeCount][2] = {
608 { refselect_1u8u, refselect_1u8 }, // cl_uchar
609 { refselect_1i8u, refselect_1i8 }, // char
610 { refselect_1u16u, refselect_1u16 }, // ushort
611 { refselect_1i16u, refselect_1i16 }, // short
612 { refselect_hhu, refselect_hhi }, // half
613 { refselect_1u32u, refselect_1u32 }, // uint
614 { refselect_1i32u, refselect_1i32 }, // int
615 { refselect_ffu, refselect_ffi }, // float
616 { refselect_1u64u, refselect_1u64 }, // ulong
617 { refselect_1i64u, refselect_1i64 }, // long
618 { refselect_ddu, refselect_ddi } // double
619 };
620
621 // Define vrefSelects (vector refSelects)
622 Select vrefSelects[kTypeCount][2] = {
623 { vrefselect_1u8u, vrefselect_1u8 }, // cl_uchar
624 { vrefselect_1i8u, vrefselect_1i8 }, // char
625 { vrefselect_1u16u, vrefselect_1u16 }, // ushort
626 { vrefselect_1i16u, vrefselect_1i16 }, // short
627 { vrefselect_hhu, vrefselect_hhi }, // half
628 { vrefselect_1u32u, vrefselect_1u32 }, // uint
629 { vrefselect_1i32u, vrefselect_1i32 }, // int
630 { vrefselect_ffu, vrefselect_ffi }, // float
631 { vrefselect_1u64u, vrefselect_1u64 }, // ulong
632 { vrefselect_1i64u, vrefselect_1i64 }, // long
633 { vrefselect_ddu, vrefselect_ddi } // double
634 };
635
636
637 //-----------------------------------------
638 // Check functions
639 //-----------------------------------------
check_uchar(const void * const test,const void * const correct,size_t count,size_t vector_size)640 size_t check_uchar(const void *const test, const void *const correct,
641 size_t count, size_t vector_size)
642 {
643 const cl_uchar *const t = (const cl_uchar *)test;
644 const cl_uchar *const c = (const cl_uchar *)correct;
645 size_t i;
646
647 if (memcmp(t, c, count * sizeof(c[0])) != 0)
648 {
649 for (i = 0; i < count; i++)
650 if (t[i] != c[i])
651 {
652 log_error("\n(check_uchar) Error for vector size %zu found at "
653 "0x%8.8zx (of 0x%8.8zx): "
654 "*0x%2.2x vs 0x%2.2x\n",
655 vector_size, i, count, c[i], t[i]);
656 return i + 1;
657 }
658 }
659 return 0;
660 }
661
check_char(const void * const test,const void * const correct,size_t count,size_t vector_size)662 size_t check_char(const void *const test, const void *const correct,
663 size_t count, size_t vector_size)
664 {
665 const cl_char *const t = (const cl_char *)test;
666 const cl_char *const c = (const cl_char *)correct;
667 size_t i;
668
669 if (memcmp(t, c, count * sizeof(c[0])) != 0)
670 {
671 for (i = 0; i < count; i++)
672 if (t[i] != c[i])
673 {
674 log_error("\n(check_char) Error for vector size %zu found at "
675 "0x%8.8zx (of 0x%8.8zx): "
676 "*0x%2.2x vs 0x%2.2x\n",
677 vector_size, i, count, c[i], t[i]);
678 return i + 1;
679 }
680 }
681
682 return 0;
683 }
684
check_ushort(const void * const test,const void * const correct,size_t count,size_t vector_size)685 size_t check_ushort(const void *const test, const void *const correct,
686 size_t count, size_t vector_size)
687 {
688 const cl_ushort *const t = (const cl_ushort *)test;
689 const cl_ushort *const c = (const cl_ushort *)correct;
690 size_t i;
691
692 if (memcmp(t, c, count * sizeof(c[0])) != 0)
693 {
694 for (i = 0; i < count; i++)
695 if (t[i] != c[i])
696 {
697 log_error("\n(check_ushort) Error for vector size %zu found at "
698 "0x%8.8zx (of 0x%8.8zx): "
699 "*0x%4.4x vs 0x%4.4x\n",
700 vector_size, i, count, c[i], t[i]);
701 return i + 1;
702 }
703 }
704
705 return 0;
706 }
707
check_short(const void * const test,const void * const correct,size_t count,size_t vector_size)708 size_t check_short(const void *const test, const void *const correct,
709 size_t count, size_t vector_size)
710 {
711 const cl_short *const t = (const cl_short *)test;
712 const cl_short *const c = (const cl_short *)correct;
713 size_t i;
714
715 if (memcmp(t, c, count * sizeof(c[0])) != 0)
716 {
717 for (i = 0; i < count; i++)
718 if (t[i] != c[i])
719 {
720 log_error("\n(check_short) Error for vector size %zu found at "
721 "0x%8.8zx (of 0x%8.8zx): "
722 "*0x%8.8x vs 0x%8.8x\n",
723 vector_size, i, count, c[i], t[i]);
724 return i + 1;
725 }
726 }
727
728 return 0;
729 }
730
check_uint(const void * const test,const void * const correct,size_t count,size_t vector_size)731 size_t check_uint(const void *const test, const void *const correct,
732 size_t count, size_t vector_size)
733 {
734 const cl_uint *const t = (const cl_uint *)test;
735 const cl_uint *const c = (const cl_uint *)correct;
736 size_t i;
737
738 if (memcmp(t, c, count * sizeof(c[0])) != 0)
739 {
740 for (i = 0; i < count; i++)
741 if (t[i] != c[i])
742 {
743 log_error("\n(check_uint) Error for vector size %zu found at "
744 "0x%8.8zx (of 0x%8.8zx): "
745 "*0x%8.8x vs 0x%8.8x\n",
746 vector_size, i, count, c[i], t[i]);
747 return i + 1;
748 }
749 }
750
751 return 0;
752 }
753
check_int(const void * const test,const void * const correct,size_t count,size_t vector_size)754 size_t check_int(const void *const test, const void *const correct,
755 size_t count, size_t vector_size)
756 {
757 const cl_int *const t = (const cl_int *)test;
758 const cl_int *const c = (const cl_int *)correct;
759 size_t i;
760
761 if (memcmp(t, c, count * sizeof(c[0])) != 0)
762 {
763 for (i = 0; i < count; i++)
764 if (t[i] != c[i])
765 {
766
767 log_error("\n(check_int) Error for vector size %zu found at "
768 "0x%8.8zx (of 0x%8.8zx): "
769 "*0x%8.8x vs 0x%8.8x\n",
770 vector_size, i, count, c[i], t[i]);
771 return i + 1;
772 }
773 }
774
775 return 0;
776 }
777
check_ulong(const void * const test,const void * const correct,size_t count,size_t vector_size)778 size_t check_ulong(const void *const test, const void *const correct,
779 size_t count, size_t vector_size)
780 {
781 const cl_ulong *const t = (const cl_ulong *)test;
782 const cl_ulong *const c = (const cl_ulong *)correct;
783 size_t i;
784
785 if (memcmp(t, c, count * sizeof(c[0])) != 0)
786 {
787 for (i = 0; i < count; i++)
788 if (t[i] != c[i])
789 {
790 log_error("\n(check_ulong) Error for vector size %zu found at "
791 "0x%8.8zx (of 0x%8.8zx): "
792 "*0x%16.16" PRIx64 " vs 0x%16.16" PRIx64 "\n",
793 vector_size, i, count, c[i], t[i]);
794 return i + 1;
795 }
796 }
797
798 return 0;
799 }
800
check_long(const void * const test,const void * const correct,size_t count,size_t vector_size)801 size_t check_long(const void *const test, const void *const correct,
802 size_t count, size_t vector_size)
803 {
804 const cl_long *const t = (const cl_long *)test;
805 const cl_long *const c = (const cl_long *)correct;
806 size_t i;
807
808 if (memcmp(t, c, count * sizeof(c[0])) != 0)
809 {
810 for (i = 0; i < count; i++)
811 if (t[i] != c[i])
812 {
813 log_error("\n(check_long) Error for vector size %zu found at "
814 "0x%8.8zx (of 0x%8.8zx): "
815 "*0x%16.16" PRIx64 " vs 0x%16.16" PRIx64 "\n",
816 vector_size, i, count, c[i], t[i]);
817 return i + 1;
818 }
819 }
820
821 return 0;
822 }
823
check_half(const void * const test,const void * const correct,size_t count,size_t vector_size)824 size_t check_half(const void *const test, const void *const correct,
825 size_t count, size_t vector_size)
826 {
827 const cl_ushort *const t = (const cl_ushort *)test;
828 const cl_ushort *const c = (const cl_ushort *)correct;
829 size_t i;
830
831 if (memcmp(t, c, count * sizeof(c[0])) != 0)
832 {
833 for (i = 0; i < count; i++) /* Allow nans to be binary different */
834 if ((t[i] != c[i])
835 && !(isnan(((cl_half *)correct)[i])
836 && isnan(((cl_half *)test)[i])))
837 {
838 log_error("\n(check_half) Error for vector size %zu found at "
839 "0x%8.8zx (of 0x%8.8zx): "
840 "*0x%4.4x vs 0x%4.4x\n",
841 vector_size, i, count, c[i], t[i]);
842 return i + 1;
843 }
844 }
845
846 return 0;
847 }
848
check_float(const void * const test,const void * const correct,size_t count,size_t vector_size)849 size_t check_float(const void *const test, const void *const correct,
850 size_t count, size_t vector_size)
851 {
852 const cl_uint *const t = (const cl_uint *)test;
853 const cl_uint *const c = (const cl_uint *)correct;
854 size_t i;
855
856 if (memcmp(t, c, count * sizeof(c[0])) != 0)
857 {
858 for (i = 0; i < count; i++) /* Allow nans to be binary different */
859 if ((t[i] != c[i])
860 && !(isnan(((float *)correct)[i]) && isnan(((float *)test)[i])))
861 {
862 log_error("\n(check_float) Error for vector size %zu found at "
863 "0x%8.8zx (of 0x%8.8zx): "
864 "*0x%8.8x vs 0x%8.8x\n",
865 vector_size, i, count, c[i], t[i]);
866 return i + 1;
867 }
868 }
869
870 return 0;
871 }
872
check_double(const void * const test,const void * const correct,size_t count,size_t vector_size)873 size_t check_double(const void *const test, const void *const correct,
874 size_t count, size_t vector_size)
875 {
876 const cl_ulong *const t = (const cl_ulong *)test;
877 const cl_ulong *const c = (const cl_ulong *)correct;
878 size_t i;
879
880 if (memcmp(t, c, count * sizeof(c[0])) != 0)
881 {
882 for (i = 0; i < count; i++) /* Allow nans to be binary different */
883 if ((t[i] != c[i])
884 && !(isnan(((double *)correct)[i])
885 && isnan(((double *)test)[i])))
886 {
887 log_error("\n(check_double) Error for vector size %zu found at "
888 "0x%8.8zx (of 0x%8.8zx): "
889 "*0x%16.16" PRIx64 " vs 0x%16.16" PRIx64 "\n",
890 vector_size, i, count, c[i], t[i]);
891 return i + 1;
892 }
893 }
894
895 return 0;
896 }
897
898 CheckResults checkResults[kTypeCount] = {
899 check_uchar, check_char, check_ushort, check_short,
900 check_half, check_uint, check_int, check_float,
901 check_ulong, check_long, check_double
902 };
903