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
|
#include <cstdint>
#include "utest_helper.hpp"
typedef unsigned char uchar;
typedef unsigned short ushort;
int64_t my_rand(void) {
int64_t x = rand() - RAND_MAX/2;
int64_t y = rand() - RAND_MAX/2;
return x * y;
}
#define DEF(DST_TYPE, SRC_TYPE, DST_MIN, DST_MAX) \
void builtin_convert_ ## SRC_TYPE ## _to_ ## DST_TYPE ## _sat(void) \
{ \
const int n = 128; \
OCL_CREATE_KERNEL_FROM_FILE("builtin_convert_sat", "builtin_convert_" # SRC_TYPE "_to_" # DST_TYPE "_sat"); \
OCL_CREATE_BUFFER(buf[0], 0, n * sizeof(SRC_TYPE), NULL); \
OCL_CREATE_BUFFER(buf[1], 0, n * sizeof(DST_TYPE), NULL); \
OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]); \
OCL_SET_ARG(1, sizeof(cl_mem), &buf[1]); \
globals[0] = n; \
locals[0] = 16; \
OCL_MAP_BUFFER(0); \
for (int i = 0; i < n; i++) \
((SRC_TYPE *)buf_data[0])[i] = my_rand(); \
OCL_UNMAP_BUFFER(0); \
OCL_NDRANGE(1); \
OCL_MAP_BUFFER(0); \
OCL_MAP_BUFFER(1); \
for (int i = 0; i < n; i++) { \
SRC_TYPE src = ((SRC_TYPE *)buf_data[0])[i]; \
DST_TYPE dst; \
if ((double)src > (double)DST_MAX) \
dst = DST_MAX; \
else if ((double)src < (double)DST_MIN) \
dst = DST_MIN; \
else \
dst = src; \
OCL_ASSERT(((DST_TYPE *)buf_data[1])[i] == dst); \
} \
OCL_UNMAP_BUFFER(0); \
OCL_UNMAP_BUFFER(1); \
} \
MAKE_UTEST_FROM_FUNCTION(builtin_convert_ ## SRC_TYPE ## _to_ ## DST_TYPE ## _sat);
DEF(char, uchar, -128, 127);
DEF(char, short, -128, 127);
DEF(char, ushort, -128, 127);
DEF(char, int, -128, 127);
DEF(char, uint, -128, 127);
DEF(char, float, -128, 127);
DEF(uchar, char, 0, 255);
DEF(uchar, short, 0, 255);
DEF(uchar, ushort, 0, 255);
DEF(uchar, int, 0, 255);
DEF(uchar, uint, 0, 255);
DEF(uchar, float, 0, 255);
DEF(short, ushort, -32768, 32767);
DEF(short, int, -32768, 32767);
DEF(short, uint, -32768, 32767);
DEF(short, float, -32768, 32767);
DEF(ushort, short, 0, 65535);
DEF(ushort, int, 0, 65535);
DEF(ushort, uint, 0, 65535);
DEF(ushort, float, 0, 65535);
DEF(int, uint, -0x7FFFFFFF-1, 0x7FFFFFFF);
DEF(int, float, -0x7FFFFFFF-1, 0x7FFFFFFF);
DEF(uint, int, 0, 0xffffffffu);
DEF(uint, float, 0, 0xffffffffu);
#undef DEF
|