xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/select/util_select.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
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