1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi // http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "conversions.h"
17*6467f958SSadaf Ebrahimi #include <cinttypes>
18*6467f958SSadaf Ebrahimi #include <limits.h>
19*6467f958SSadaf Ebrahimi #include <time.h>
20*6467f958SSadaf Ebrahimi #include <assert.h>
21*6467f958SSadaf Ebrahimi #include "mt19937.h"
22*6467f958SSadaf Ebrahimi #include "compat.h"
23*6467f958SSadaf Ebrahimi
24*6467f958SSadaf Ebrahimi #if defined(__SSE__) || defined(_MSC_VER)
25*6467f958SSadaf Ebrahimi #include <xmmintrin.h>
26*6467f958SSadaf Ebrahimi #endif
27*6467f958SSadaf Ebrahimi #if defined(__SSE2__) || defined(_MSC_VER)
28*6467f958SSadaf Ebrahimi #include <emmintrin.h>
29*6467f958SSadaf Ebrahimi #endif
30*6467f958SSadaf Ebrahimi
print_type_to_string(ExplicitType type,void * data,char * string)31*6467f958SSadaf Ebrahimi void print_type_to_string(ExplicitType type, void *data, char *string)
32*6467f958SSadaf Ebrahimi {
33*6467f958SSadaf Ebrahimi switch (type)
34*6467f958SSadaf Ebrahimi {
35*6467f958SSadaf Ebrahimi case kBool:
36*6467f958SSadaf Ebrahimi if (*(char *)data)
37*6467f958SSadaf Ebrahimi sprintf(string, "true");
38*6467f958SSadaf Ebrahimi else
39*6467f958SSadaf Ebrahimi sprintf(string, "false");
40*6467f958SSadaf Ebrahimi return;
41*6467f958SSadaf Ebrahimi case kChar: sprintf(string, "%d", (int)*((cl_char *)data)); return;
42*6467f958SSadaf Ebrahimi case kUChar:
43*6467f958SSadaf Ebrahimi case kUnsignedChar:
44*6467f958SSadaf Ebrahimi sprintf(string, "%u", (int)*((cl_uchar *)data));
45*6467f958SSadaf Ebrahimi return;
46*6467f958SSadaf Ebrahimi case kShort: sprintf(string, "%d", (int)*((cl_short *)data)); return;
47*6467f958SSadaf Ebrahimi case kUShort:
48*6467f958SSadaf Ebrahimi case kUnsignedShort:
49*6467f958SSadaf Ebrahimi sprintf(string, "%u", (int)*((cl_ushort *)data));
50*6467f958SSadaf Ebrahimi return;
51*6467f958SSadaf Ebrahimi case kInt: sprintf(string, "%d", *((cl_int *)data)); return;
52*6467f958SSadaf Ebrahimi case kUInt:
53*6467f958SSadaf Ebrahimi case kUnsignedInt: sprintf(string, "%u", *((cl_uint *)data)); return;
54*6467f958SSadaf Ebrahimi case kLong: sprintf(string, "%" PRId64 "", *((cl_long *)data)); return;
55*6467f958SSadaf Ebrahimi case kULong:
56*6467f958SSadaf Ebrahimi case kUnsignedLong:
57*6467f958SSadaf Ebrahimi sprintf(string, "%" PRIu64 "", *((cl_ulong *)data));
58*6467f958SSadaf Ebrahimi return;
59*6467f958SSadaf Ebrahimi case kFloat: sprintf(string, "%f", *((cl_float *)data)); return;
60*6467f958SSadaf Ebrahimi case kHalf: sprintf(string, "half"); return;
61*6467f958SSadaf Ebrahimi case kDouble: sprintf(string, "%g", *((cl_double *)data)); return;
62*6467f958SSadaf Ebrahimi default: sprintf(string, "INVALID"); return;
63*6467f958SSadaf Ebrahimi }
64*6467f958SSadaf Ebrahimi }
65*6467f958SSadaf Ebrahimi
get_explicit_type_size(ExplicitType type)66*6467f958SSadaf Ebrahimi size_t get_explicit_type_size(ExplicitType type)
67*6467f958SSadaf Ebrahimi {
68*6467f958SSadaf Ebrahimi /* Quick method to avoid branching: make sure the following array matches
69*6467f958SSadaf Ebrahimi * the Enum order */
70*6467f958SSadaf Ebrahimi static size_t sExplicitTypeSizes[] = {
71*6467f958SSadaf Ebrahimi sizeof(cl_bool), sizeof(cl_char), sizeof(cl_uchar),
72*6467f958SSadaf Ebrahimi sizeof(cl_uchar), sizeof(cl_short), sizeof(cl_ushort),
73*6467f958SSadaf Ebrahimi sizeof(cl_ushort), sizeof(cl_int), sizeof(cl_uint),
74*6467f958SSadaf Ebrahimi sizeof(cl_uint), sizeof(cl_long), sizeof(cl_ulong),
75*6467f958SSadaf Ebrahimi sizeof(cl_ulong), sizeof(cl_float), sizeof(cl_half),
76*6467f958SSadaf Ebrahimi sizeof(cl_double)
77*6467f958SSadaf Ebrahimi };
78*6467f958SSadaf Ebrahimi
79*6467f958SSadaf Ebrahimi return sExplicitTypeSizes[type];
80*6467f958SSadaf Ebrahimi }
81*6467f958SSadaf Ebrahimi
get_explicit_type_name(ExplicitType type)82*6467f958SSadaf Ebrahimi const char *get_explicit_type_name(ExplicitType type)
83*6467f958SSadaf Ebrahimi {
84*6467f958SSadaf Ebrahimi /* Quick method to avoid branching: make sure the following array matches
85*6467f958SSadaf Ebrahimi * the Enum order */
86*6467f958SSadaf Ebrahimi static const char *sExplicitTypeNames[] = {
87*6467f958SSadaf Ebrahimi "bool", "char", "uchar", "unsigned char", "short", "ushort",
88*6467f958SSadaf Ebrahimi "unsigned short", "int", "uint", "unsigned int", "long", "ulong",
89*6467f958SSadaf Ebrahimi "unsigned long", "float", "half", "double"
90*6467f958SSadaf Ebrahimi };
91*6467f958SSadaf Ebrahimi
92*6467f958SSadaf Ebrahimi return sExplicitTypeNames[type];
93*6467f958SSadaf Ebrahimi }
94*6467f958SSadaf Ebrahimi
95*6467f958SSadaf Ebrahimi static long lrintf_clamped(float f);
lrintf_clamped(float f)96*6467f958SSadaf Ebrahimi static long lrintf_clamped(float f)
97*6467f958SSadaf Ebrahimi {
98*6467f958SSadaf Ebrahimi static const float magic[2] = { MAKE_HEX_FLOAT(0x1.0p23f, 0x1, 23),
99*6467f958SSadaf Ebrahimi -MAKE_HEX_FLOAT(0x1.0p23f, 0x1, 23) };
100*6467f958SSadaf Ebrahimi
101*6467f958SSadaf Ebrahimi if (f >= -(float)LONG_MIN) return LONG_MAX;
102*6467f958SSadaf Ebrahimi
103*6467f958SSadaf Ebrahimi if (f <= (float)LONG_MIN) return LONG_MIN;
104*6467f958SSadaf Ebrahimi
105*6467f958SSadaf Ebrahimi // Round fractional values to integer in round towards nearest mode
106*6467f958SSadaf Ebrahimi if (fabsf(f) < MAKE_HEX_FLOAT(0x1.0p23f, 0x1, 23))
107*6467f958SSadaf Ebrahimi {
108*6467f958SSadaf Ebrahimi volatile float x = f;
109*6467f958SSadaf Ebrahimi float magicVal = magic[f < 0];
110*6467f958SSadaf Ebrahimi
111*6467f958SSadaf Ebrahimi #if defined(__SSE__) || defined(_WIN32)
112*6467f958SSadaf Ebrahimi // Defeat x87 based arithmetic, which cant do FTZ, and will round this
113*6467f958SSadaf Ebrahimi // incorrectly
114*6467f958SSadaf Ebrahimi __m128 v = _mm_set_ss(x);
115*6467f958SSadaf Ebrahimi __m128 m = _mm_set_ss(magicVal);
116*6467f958SSadaf Ebrahimi v = _mm_add_ss(v, m);
117*6467f958SSadaf Ebrahimi v = _mm_sub_ss(v, m);
118*6467f958SSadaf Ebrahimi _mm_store_ss((float *)&x, v);
119*6467f958SSadaf Ebrahimi #else
120*6467f958SSadaf Ebrahimi x += magicVal;
121*6467f958SSadaf Ebrahimi x -= magicVal;
122*6467f958SSadaf Ebrahimi #endif
123*6467f958SSadaf Ebrahimi f = x;
124*6467f958SSadaf Ebrahimi }
125*6467f958SSadaf Ebrahimi
126*6467f958SSadaf Ebrahimi return (long)f;
127*6467f958SSadaf Ebrahimi }
128*6467f958SSadaf Ebrahimi
129*6467f958SSadaf Ebrahimi static long lrint_clamped(double f);
lrint_clamped(double f)130*6467f958SSadaf Ebrahimi static long lrint_clamped(double f)
131*6467f958SSadaf Ebrahimi {
132*6467f958SSadaf Ebrahimi static const double magic[2] = { MAKE_HEX_DOUBLE(0x1.0p52, 0x1LL, 52),
133*6467f958SSadaf Ebrahimi MAKE_HEX_DOUBLE(-0x1.0p52, -0x1LL, 52) };
134*6467f958SSadaf Ebrahimi
135*6467f958SSadaf Ebrahimi if (sizeof(long) > 4)
136*6467f958SSadaf Ebrahimi {
137*6467f958SSadaf Ebrahimi if (f >= -(double)LONG_MIN) return LONG_MAX;
138*6467f958SSadaf Ebrahimi }
139*6467f958SSadaf Ebrahimi else
140*6467f958SSadaf Ebrahimi {
141*6467f958SSadaf Ebrahimi if (f >= LONG_MAX) return LONG_MAX;
142*6467f958SSadaf Ebrahimi }
143*6467f958SSadaf Ebrahimi
144*6467f958SSadaf Ebrahimi if (f <= (double)LONG_MIN) return LONG_MIN;
145*6467f958SSadaf Ebrahimi
146*6467f958SSadaf Ebrahimi // Round fractional values to integer in round towards nearest mode
147*6467f958SSadaf Ebrahimi if (fabs(f) < MAKE_HEX_DOUBLE(0x1.0p52, 0x1LL, 52))
148*6467f958SSadaf Ebrahimi {
149*6467f958SSadaf Ebrahimi volatile double x = f;
150*6467f958SSadaf Ebrahimi double magicVal = magic[f < 0];
151*6467f958SSadaf Ebrahimi #if defined(__SSE2__) || (defined(_MSC_VER))
152*6467f958SSadaf Ebrahimi // Defeat x87 based arithmetic, which cant do FTZ, and will round this
153*6467f958SSadaf Ebrahimi // incorrectly
154*6467f958SSadaf Ebrahimi __m128d v = _mm_set_sd(x);
155*6467f958SSadaf Ebrahimi __m128d m = _mm_set_sd(magicVal);
156*6467f958SSadaf Ebrahimi v = _mm_add_sd(v, m);
157*6467f958SSadaf Ebrahimi v = _mm_sub_sd(v, m);
158*6467f958SSadaf Ebrahimi _mm_store_sd((double *)&x, v);
159*6467f958SSadaf Ebrahimi #else
160*6467f958SSadaf Ebrahimi x += magicVal;
161*6467f958SSadaf Ebrahimi x -= magicVal;
162*6467f958SSadaf Ebrahimi #endif
163*6467f958SSadaf Ebrahimi f = x;
164*6467f958SSadaf Ebrahimi }
165*6467f958SSadaf Ebrahimi
166*6467f958SSadaf Ebrahimi return (long)f;
167*6467f958SSadaf Ebrahimi }
168*6467f958SSadaf Ebrahimi
169*6467f958SSadaf Ebrahimi
170*6467f958SSadaf Ebrahimi typedef cl_long Long;
171*6467f958SSadaf Ebrahimi typedef cl_ulong ULong;
172*6467f958SSadaf Ebrahimi
173*6467f958SSadaf Ebrahimi static ULong sUpperLimits[kNumExplicitTypes] = {
174*6467f958SSadaf Ebrahimi 0,
175*6467f958SSadaf Ebrahimi 127,
176*6467f958SSadaf Ebrahimi 255,
177*6467f958SSadaf Ebrahimi 255,
178*6467f958SSadaf Ebrahimi 32767,
179*6467f958SSadaf Ebrahimi 65535,
180*6467f958SSadaf Ebrahimi 65535,
181*6467f958SSadaf Ebrahimi 0x7fffffffLL,
182*6467f958SSadaf Ebrahimi 0xffffffffLL,
183*6467f958SSadaf Ebrahimi 0xffffffffLL,
184*6467f958SSadaf Ebrahimi 0x7fffffffffffffffLL,
185*6467f958SSadaf Ebrahimi 0xffffffffffffffffULL,
186*6467f958SSadaf Ebrahimi 0xffffffffffffffffULL,
187*6467f958SSadaf Ebrahimi 0,
188*6467f958SSadaf Ebrahimi 0
189*6467f958SSadaf Ebrahimi }; // Last two values aren't stored here
190*6467f958SSadaf Ebrahimi
191*6467f958SSadaf Ebrahimi static Long sLowerLimits[kNumExplicitTypes] = {
192*6467f958SSadaf Ebrahimi -1,
193*6467f958SSadaf Ebrahimi -128,
194*6467f958SSadaf Ebrahimi 0,
195*6467f958SSadaf Ebrahimi 0,
196*6467f958SSadaf Ebrahimi -32768,
197*6467f958SSadaf Ebrahimi 0,
198*6467f958SSadaf Ebrahimi 0,
199*6467f958SSadaf Ebrahimi (Long)0xffffffff80000000LL,
200*6467f958SSadaf Ebrahimi 0,
201*6467f958SSadaf Ebrahimi 0,
202*6467f958SSadaf Ebrahimi (Long)0x8000000000000000LL,
203*6467f958SSadaf Ebrahimi 0,
204*6467f958SSadaf Ebrahimi 0,
205*6467f958SSadaf Ebrahimi 0,
206*6467f958SSadaf Ebrahimi 0
207*6467f958SSadaf Ebrahimi }; // Last two values aren't stored here
208*6467f958SSadaf Ebrahimi
209*6467f958SSadaf Ebrahimi #define BOOL_CASE(inType) \
210*6467f958SSadaf Ebrahimi case kBool: \
211*6467f958SSadaf Ebrahimi boolPtr = (bool *)outRaw; \
212*6467f958SSadaf Ebrahimi *boolPtr = (*inType##Ptr) != 0 ? true : false; \
213*6467f958SSadaf Ebrahimi break;
214*6467f958SSadaf Ebrahimi
215*6467f958SSadaf Ebrahimi #define SIMPLE_CAST_CASE(inType, outEnum, outType) \
216*6467f958SSadaf Ebrahimi case outEnum: \
217*6467f958SSadaf Ebrahimi outType##Ptr = (outType *)outRaw; \
218*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)(*inType##Ptr); \
219*6467f958SSadaf Ebrahimi break;
220*6467f958SSadaf Ebrahimi
221*6467f958SSadaf Ebrahimi // Sadly, the ULong downcasting cases need a separate #define to get rid of
222*6467f958SSadaf Ebrahimi // signed/unsigned comparison warnings
223*6467f958SSadaf Ebrahimi #define DOWN_CAST_CASE(inType, outEnum, outType, sat) \
224*6467f958SSadaf Ebrahimi case outEnum: \
225*6467f958SSadaf Ebrahimi outType##Ptr = (outType *)outRaw; \
226*6467f958SSadaf Ebrahimi if (sat) \
227*6467f958SSadaf Ebrahimi { \
228*6467f958SSadaf Ebrahimi if ((sLowerLimits[outEnum] < 0 \
229*6467f958SSadaf Ebrahimi && *inType##Ptr > (Long)sUpperLimits[outEnum]) \
230*6467f958SSadaf Ebrahimi || (sLowerLimits[outEnum] == 0 \
231*6467f958SSadaf Ebrahimi && (ULong)*inType##Ptr > sUpperLimits[outEnum])) \
232*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)sUpperLimits[outEnum]; \
233*6467f958SSadaf Ebrahimi else if (*inType##Ptr < sLowerLimits[outEnum]) \
234*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)sLowerLimits[outEnum]; \
235*6467f958SSadaf Ebrahimi else \
236*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)*inType##Ptr; \
237*6467f958SSadaf Ebrahimi } \
238*6467f958SSadaf Ebrahimi else \
239*6467f958SSadaf Ebrahimi { \
240*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)( \
241*6467f958SSadaf Ebrahimi *inType##Ptr \
242*6467f958SSadaf Ebrahimi & (0xffffffffffffffffLL >> (64 - (sizeof(outType) * 8)))); \
243*6467f958SSadaf Ebrahimi } \
244*6467f958SSadaf Ebrahimi break;
245*6467f958SSadaf Ebrahimi
246*6467f958SSadaf Ebrahimi #define U_DOWN_CAST_CASE(inType, outEnum, outType, sat) \
247*6467f958SSadaf Ebrahimi case outEnum: \
248*6467f958SSadaf Ebrahimi outType##Ptr = (outType *)outRaw; \
249*6467f958SSadaf Ebrahimi if (sat) \
250*6467f958SSadaf Ebrahimi { \
251*6467f958SSadaf Ebrahimi if ((ULong)*inType##Ptr > sUpperLimits[outEnum]) \
252*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)sUpperLimits[outEnum]; \
253*6467f958SSadaf Ebrahimi else \
254*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)*inType##Ptr; \
255*6467f958SSadaf Ebrahimi } \
256*6467f958SSadaf Ebrahimi else \
257*6467f958SSadaf Ebrahimi { \
258*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)( \
259*6467f958SSadaf Ebrahimi *inType##Ptr \
260*6467f958SSadaf Ebrahimi & (0xffffffffffffffffLL >> (64 - (sizeof(outType) * 8)))); \
261*6467f958SSadaf Ebrahimi } \
262*6467f958SSadaf Ebrahimi break;
263*6467f958SSadaf Ebrahimi
264*6467f958SSadaf Ebrahimi #define TO_FLOAT_CASE(inType) \
265*6467f958SSadaf Ebrahimi case kFloat: \
266*6467f958SSadaf Ebrahimi floatPtr = (float *)outRaw; \
267*6467f958SSadaf Ebrahimi *floatPtr = (float)(*inType##Ptr); \
268*6467f958SSadaf Ebrahimi break;
269*6467f958SSadaf Ebrahimi #define TO_DOUBLE_CASE(inType) \
270*6467f958SSadaf Ebrahimi case kDouble: \
271*6467f958SSadaf Ebrahimi doublePtr = (double *)outRaw; \
272*6467f958SSadaf Ebrahimi *doublePtr = (double)(*inType##Ptr); \
273*6467f958SSadaf Ebrahimi break;
274*6467f958SSadaf Ebrahimi
275*6467f958SSadaf Ebrahimi
276*6467f958SSadaf Ebrahimi /* Note: we use lrintf here to force the rounding instead of whatever the
277*6467f958SSadaf Ebrahimi * processor's current rounding mode is */
278*6467f958SSadaf Ebrahimi #define FLOAT_ROUND_TO_NEAREST_CASE(outEnum, outType) \
279*6467f958SSadaf Ebrahimi case outEnum: \
280*6467f958SSadaf Ebrahimi outType##Ptr = (outType *)outRaw; \
281*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)lrintf_clamped(*floatPtr); \
282*6467f958SSadaf Ebrahimi break;
283*6467f958SSadaf Ebrahimi
284*6467f958SSadaf Ebrahimi #define FLOAT_ROUND_CASE(outEnum, outType, rounding, sat) \
285*6467f958SSadaf Ebrahimi case outEnum: { \
286*6467f958SSadaf Ebrahimi outType##Ptr = (outType *)outRaw; \
287*6467f958SSadaf Ebrahimi /* Get the tens digit */ \
288*6467f958SSadaf Ebrahimi Long wholeValue = (Long)*floatPtr; \
289*6467f958SSadaf Ebrahimi float largeRemainder = (*floatPtr - (float)wholeValue) * 10.f; \
290*6467f958SSadaf Ebrahimi /* What do we do based on that? */ \
291*6467f958SSadaf Ebrahimi if (rounding == kRoundToEven) \
292*6467f958SSadaf Ebrahimi { \
293*6467f958SSadaf Ebrahimi if (wholeValue & 1LL) /*between 1 and 1.99 */ \
294*6467f958SSadaf Ebrahimi wholeValue += 1LL; /* round up to even */ \
295*6467f958SSadaf Ebrahimi } \
296*6467f958SSadaf Ebrahimi else if (rounding == kRoundToZero) \
297*6467f958SSadaf Ebrahimi { \
298*6467f958SSadaf Ebrahimi /* Nothing to do, round-to-zero is what C casting does */ \
299*6467f958SSadaf Ebrahimi } \
300*6467f958SSadaf Ebrahimi else if (rounding == kRoundToPosInf) \
301*6467f958SSadaf Ebrahimi { \
302*6467f958SSadaf Ebrahimi /* Only positive numbers are wrong */ \
303*6467f958SSadaf Ebrahimi if (largeRemainder != 0.f && wholeValue >= 0) wholeValue++; \
304*6467f958SSadaf Ebrahimi } \
305*6467f958SSadaf Ebrahimi else if (rounding == kRoundToNegInf) \
306*6467f958SSadaf Ebrahimi { \
307*6467f958SSadaf Ebrahimi /* Only negative numbers are off */ \
308*6467f958SSadaf Ebrahimi if (largeRemainder != 0.f && wholeValue < 0) wholeValue--; \
309*6467f958SSadaf Ebrahimi } \
310*6467f958SSadaf Ebrahimi else \
311*6467f958SSadaf Ebrahimi { /* Default is round-to-nearest */ \
312*6467f958SSadaf Ebrahimi wholeValue = (Long)lrintf_clamped(*floatPtr); \
313*6467f958SSadaf Ebrahimi } \
314*6467f958SSadaf Ebrahimi /* Now apply saturation rules */ \
315*6467f958SSadaf Ebrahimi if (sat) \
316*6467f958SSadaf Ebrahimi { \
317*6467f958SSadaf Ebrahimi if ((sLowerLimits[outEnum] < 0 \
318*6467f958SSadaf Ebrahimi && wholeValue > (Long)sUpperLimits[outEnum]) \
319*6467f958SSadaf Ebrahimi || (sLowerLimits[outEnum] == 0 \
320*6467f958SSadaf Ebrahimi && (ULong)wholeValue > sUpperLimits[outEnum])) \
321*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)sUpperLimits[outEnum]; \
322*6467f958SSadaf Ebrahimi else if (wholeValue < sLowerLimits[outEnum]) \
323*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)sLowerLimits[outEnum]; \
324*6467f958SSadaf Ebrahimi else \
325*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)wholeValue; \
326*6467f958SSadaf Ebrahimi } \
327*6467f958SSadaf Ebrahimi else \
328*6467f958SSadaf Ebrahimi { \
329*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)( \
330*6467f958SSadaf Ebrahimi wholeValue \
331*6467f958SSadaf Ebrahimi & (0xffffffffffffffffLL >> (64 - (sizeof(outType) * 8)))); \
332*6467f958SSadaf Ebrahimi } \
333*6467f958SSadaf Ebrahimi } \
334*6467f958SSadaf Ebrahimi break;
335*6467f958SSadaf Ebrahimi
336*6467f958SSadaf Ebrahimi #define DOUBLE_ROUND_CASE(outEnum, outType, rounding, sat) \
337*6467f958SSadaf Ebrahimi case outEnum: { \
338*6467f958SSadaf Ebrahimi outType##Ptr = (outType *)outRaw; \
339*6467f958SSadaf Ebrahimi /* Get the tens digit */ \
340*6467f958SSadaf Ebrahimi Long wholeValue = (Long)*doublePtr; \
341*6467f958SSadaf Ebrahimi double largeRemainder = (*doublePtr - (double)wholeValue) * 10.0; \
342*6467f958SSadaf Ebrahimi /* What do we do based on that? */ \
343*6467f958SSadaf Ebrahimi if (rounding == kRoundToEven) \
344*6467f958SSadaf Ebrahimi { \
345*6467f958SSadaf Ebrahimi if (wholeValue & 1LL) /*between 1 and 1.99 */ \
346*6467f958SSadaf Ebrahimi wholeValue += 1LL; /* round up to even */ \
347*6467f958SSadaf Ebrahimi } \
348*6467f958SSadaf Ebrahimi else if (rounding == kRoundToZero) \
349*6467f958SSadaf Ebrahimi { \
350*6467f958SSadaf Ebrahimi /* Nothing to do, round-to-zero is what C casting does */ \
351*6467f958SSadaf Ebrahimi } \
352*6467f958SSadaf Ebrahimi else if (rounding == kRoundToPosInf) \
353*6467f958SSadaf Ebrahimi { \
354*6467f958SSadaf Ebrahimi /* Only positive numbers are wrong */ \
355*6467f958SSadaf Ebrahimi if (largeRemainder != 0.0 && wholeValue >= 0) wholeValue++; \
356*6467f958SSadaf Ebrahimi } \
357*6467f958SSadaf Ebrahimi else if (rounding == kRoundToNegInf) \
358*6467f958SSadaf Ebrahimi { \
359*6467f958SSadaf Ebrahimi /* Only negative numbers are off */ \
360*6467f958SSadaf Ebrahimi if (largeRemainder != 0.0 && wholeValue < 0) wholeValue--; \
361*6467f958SSadaf Ebrahimi } \
362*6467f958SSadaf Ebrahimi else \
363*6467f958SSadaf Ebrahimi { /* Default is round-to-nearest */ \
364*6467f958SSadaf Ebrahimi wholeValue = (Long)lrint_clamped(*doublePtr); \
365*6467f958SSadaf Ebrahimi } \
366*6467f958SSadaf Ebrahimi /* Now apply saturation rules */ \
367*6467f958SSadaf Ebrahimi if (sat) \
368*6467f958SSadaf Ebrahimi { \
369*6467f958SSadaf Ebrahimi if ((sLowerLimits[outEnum] < 0 \
370*6467f958SSadaf Ebrahimi && wholeValue > (Long)sUpperLimits[outEnum]) \
371*6467f958SSadaf Ebrahimi || (sLowerLimits[outEnum] == 0 \
372*6467f958SSadaf Ebrahimi && (ULong)wholeValue > sUpperLimits[outEnum])) \
373*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)sUpperLimits[outEnum]; \
374*6467f958SSadaf Ebrahimi else if (wholeValue < sLowerLimits[outEnum]) \
375*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)sLowerLimits[outEnum]; \
376*6467f958SSadaf Ebrahimi else \
377*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)wholeValue; \
378*6467f958SSadaf Ebrahimi } \
379*6467f958SSadaf Ebrahimi else \
380*6467f958SSadaf Ebrahimi { \
381*6467f958SSadaf Ebrahimi *outType##Ptr = (outType)( \
382*6467f958SSadaf Ebrahimi wholeValue \
383*6467f958SSadaf Ebrahimi & (0xffffffffffffffffLL >> (64 - (sizeof(outType) * 8)))); \
384*6467f958SSadaf Ebrahimi } \
385*6467f958SSadaf Ebrahimi } \
386*6467f958SSadaf Ebrahimi break;
387*6467f958SSadaf Ebrahimi
388*6467f958SSadaf Ebrahimi typedef unsigned char uchar;
389*6467f958SSadaf Ebrahimi typedef unsigned short ushort;
390*6467f958SSadaf Ebrahimi typedef unsigned int uint;
391*6467f958SSadaf Ebrahimi typedef unsigned long ulong;
392*6467f958SSadaf Ebrahimi
convert_explicit_value(void * inRaw,void * outRaw,ExplicitType inType,bool saturate,RoundingType roundType,ExplicitType outType)393*6467f958SSadaf Ebrahimi void convert_explicit_value(void *inRaw, void *outRaw, ExplicitType inType,
394*6467f958SSadaf Ebrahimi bool saturate, RoundingType roundType,
395*6467f958SSadaf Ebrahimi ExplicitType outType)
396*6467f958SSadaf Ebrahimi {
397*6467f958SSadaf Ebrahimi bool *boolPtr;
398*6467f958SSadaf Ebrahimi char *charPtr;
399*6467f958SSadaf Ebrahimi uchar *ucharPtr;
400*6467f958SSadaf Ebrahimi short *shortPtr;
401*6467f958SSadaf Ebrahimi ushort *ushortPtr;
402*6467f958SSadaf Ebrahimi int *intPtr;
403*6467f958SSadaf Ebrahimi uint *uintPtr;
404*6467f958SSadaf Ebrahimi Long *LongPtr;
405*6467f958SSadaf Ebrahimi ULong *ULongPtr;
406*6467f958SSadaf Ebrahimi float *floatPtr;
407*6467f958SSadaf Ebrahimi double *doublePtr;
408*6467f958SSadaf Ebrahimi
409*6467f958SSadaf Ebrahimi
410*6467f958SSadaf Ebrahimi switch (inType)
411*6467f958SSadaf Ebrahimi {
412*6467f958SSadaf Ebrahimi case kBool:
413*6467f958SSadaf Ebrahimi boolPtr = (bool *)inRaw;
414*6467f958SSadaf Ebrahimi switch (outType)
415*6467f958SSadaf Ebrahimi {
416*6467f958SSadaf Ebrahimi case kBool:
417*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
418*6467f958SSadaf Ebrahimi break;
419*6467f958SSadaf Ebrahimi
420*6467f958SSadaf Ebrahimi case kChar:
421*6467f958SSadaf Ebrahimi case kUChar:
422*6467f958SSadaf Ebrahimi case kUnsignedChar:
423*6467f958SSadaf Ebrahimi case kShort:
424*6467f958SSadaf Ebrahimi case kUShort:
425*6467f958SSadaf Ebrahimi case kUnsignedShort:
426*6467f958SSadaf Ebrahimi case kInt:
427*6467f958SSadaf Ebrahimi case kUInt:
428*6467f958SSadaf Ebrahimi case kUnsignedInt:
429*6467f958SSadaf Ebrahimi case kLong:
430*6467f958SSadaf Ebrahimi case kULong:
431*6467f958SSadaf Ebrahimi case kUnsignedLong:
432*6467f958SSadaf Ebrahimi memset(outRaw, *boolPtr ? 0xff : 0,
433*6467f958SSadaf Ebrahimi get_explicit_type_size(outType));
434*6467f958SSadaf Ebrahimi break;
435*6467f958SSadaf Ebrahimi
436*6467f958SSadaf Ebrahimi case kFloat:
437*6467f958SSadaf Ebrahimi floatPtr = (float *)outRaw;
438*6467f958SSadaf Ebrahimi *floatPtr = (*boolPtr) ? -1.f : 0.f;
439*6467f958SSadaf Ebrahimi break;
440*6467f958SSadaf Ebrahimi case kDouble:
441*6467f958SSadaf Ebrahimi doublePtr = (double *)outRaw;
442*6467f958SSadaf Ebrahimi *doublePtr = (*boolPtr) ? -1.0 : 0.0;
443*6467f958SSadaf Ebrahimi break;
444*6467f958SSadaf Ebrahimi default:
445*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
446*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
447*6467f958SSadaf Ebrahimi break;
448*6467f958SSadaf Ebrahimi }
449*6467f958SSadaf Ebrahimi break;
450*6467f958SSadaf Ebrahimi
451*6467f958SSadaf Ebrahimi case kChar:
452*6467f958SSadaf Ebrahimi charPtr = (char *)inRaw;
453*6467f958SSadaf Ebrahimi switch (outType)
454*6467f958SSadaf Ebrahimi {
455*6467f958SSadaf Ebrahimi BOOL_CASE(char)
456*6467f958SSadaf Ebrahimi
457*6467f958SSadaf Ebrahimi case kChar:
458*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
459*6467f958SSadaf Ebrahimi break;
460*6467f958SSadaf Ebrahimi
461*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(char, kUChar, uchar, saturate)
462*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kUnsignedChar, uchar)
463*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kShort, short)
464*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kUShort, ushort)
465*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kUnsignedShort, ushort)
466*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kInt, int)
467*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kUInt, uint)
468*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kUnsignedInt, uint)
469*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kLong, Long)
470*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kULong, ULong)
471*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(char, kUnsignedLong, ULong)
472*6467f958SSadaf Ebrahimi
473*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(char)
474*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(char)
475*6467f958SSadaf Ebrahimi
476*6467f958SSadaf Ebrahimi default:
477*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
478*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
479*6467f958SSadaf Ebrahimi break;
480*6467f958SSadaf Ebrahimi }
481*6467f958SSadaf Ebrahimi break;
482*6467f958SSadaf Ebrahimi
483*6467f958SSadaf Ebrahimi case kUChar:
484*6467f958SSadaf Ebrahimi ucharPtr = (uchar *)inRaw;
485*6467f958SSadaf Ebrahimi switch (outType)
486*6467f958SSadaf Ebrahimi {
487*6467f958SSadaf Ebrahimi BOOL_CASE(uchar)
488*6467f958SSadaf Ebrahimi
489*6467f958SSadaf Ebrahimi case kUChar:
490*6467f958SSadaf Ebrahimi case kUnsignedChar:
491*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
492*6467f958SSadaf Ebrahimi break;
493*6467f958SSadaf Ebrahimi
494*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uchar, kChar, char, saturate)
495*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kShort, short)
496*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUShort, ushort)
497*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUnsignedShort, ushort)
498*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kInt, int)
499*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUInt, uint)
500*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUnsignedInt, uint)
501*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kLong, Long)
502*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kULong, ULong)
503*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUnsignedLong, ULong)
504*6467f958SSadaf Ebrahimi
505*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(uchar)
506*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(uchar)
507*6467f958SSadaf Ebrahimi
508*6467f958SSadaf Ebrahimi default:
509*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
510*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
511*6467f958SSadaf Ebrahimi break;
512*6467f958SSadaf Ebrahimi }
513*6467f958SSadaf Ebrahimi break;
514*6467f958SSadaf Ebrahimi
515*6467f958SSadaf Ebrahimi case kUnsignedChar:
516*6467f958SSadaf Ebrahimi ucharPtr = (uchar *)inRaw;
517*6467f958SSadaf Ebrahimi switch (outType)
518*6467f958SSadaf Ebrahimi {
519*6467f958SSadaf Ebrahimi BOOL_CASE(uchar)
520*6467f958SSadaf Ebrahimi
521*6467f958SSadaf Ebrahimi case kUChar:
522*6467f958SSadaf Ebrahimi case kUnsignedChar:
523*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
524*6467f958SSadaf Ebrahimi break;
525*6467f958SSadaf Ebrahimi
526*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uchar, kChar, char, saturate)
527*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kShort, short)
528*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUShort, ushort)
529*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUnsignedShort, ushort)
530*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kInt, int)
531*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUInt, uint)
532*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUnsignedInt, uint)
533*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kLong, Long)
534*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kULong, ULong)
535*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uchar, kUnsignedLong, ULong)
536*6467f958SSadaf Ebrahimi
537*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(uchar)
538*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(uchar)
539*6467f958SSadaf Ebrahimi
540*6467f958SSadaf Ebrahimi default:
541*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
542*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
543*6467f958SSadaf Ebrahimi break;
544*6467f958SSadaf Ebrahimi }
545*6467f958SSadaf Ebrahimi break;
546*6467f958SSadaf Ebrahimi
547*6467f958SSadaf Ebrahimi case kShort:
548*6467f958SSadaf Ebrahimi shortPtr = (short *)inRaw;
549*6467f958SSadaf Ebrahimi switch (outType)
550*6467f958SSadaf Ebrahimi {
551*6467f958SSadaf Ebrahimi BOOL_CASE(short)
552*6467f958SSadaf Ebrahimi
553*6467f958SSadaf Ebrahimi case kShort:
554*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
555*6467f958SSadaf Ebrahimi break;
556*6467f958SSadaf Ebrahimi
557*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(short, kChar, char, saturate)
558*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(short, kUChar, uchar, saturate)
559*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(short, kUnsignedChar, uchar, saturate)
560*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(short, kUShort, ushort, saturate)
561*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(short, kUnsignedShort, ushort, saturate)
562*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(short, kInt, int)
563*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(short, kUInt, uint)
564*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(short, kUnsignedInt, uint)
565*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(short, kLong, Long)
566*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(short, kULong, ULong)
567*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(short, kUnsignedLong, ULong)
568*6467f958SSadaf Ebrahimi
569*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(short)
570*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(short)
571*6467f958SSadaf Ebrahimi
572*6467f958SSadaf Ebrahimi default:
573*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
574*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
575*6467f958SSadaf Ebrahimi break;
576*6467f958SSadaf Ebrahimi }
577*6467f958SSadaf Ebrahimi break;
578*6467f958SSadaf Ebrahimi
579*6467f958SSadaf Ebrahimi case kUShort:
580*6467f958SSadaf Ebrahimi ushortPtr = (ushort *)inRaw;
581*6467f958SSadaf Ebrahimi switch (outType)
582*6467f958SSadaf Ebrahimi {
583*6467f958SSadaf Ebrahimi BOOL_CASE(ushort)
584*6467f958SSadaf Ebrahimi
585*6467f958SSadaf Ebrahimi case kUShort:
586*6467f958SSadaf Ebrahimi case kUnsignedShort:
587*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
588*6467f958SSadaf Ebrahimi break;
589*6467f958SSadaf Ebrahimi
590*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kChar, char, saturate)
591*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kUChar, uchar, saturate)
592*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kUnsignedChar, uchar, saturate)
593*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kShort, short, saturate)
594*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kInt, int)
595*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kUInt, uint)
596*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kUnsignedInt, uint)
597*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kLong, Long)
598*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kULong, ULong)
599*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kUnsignedLong, ULong)
600*6467f958SSadaf Ebrahimi
601*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(ushort)
602*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(ushort)
603*6467f958SSadaf Ebrahimi
604*6467f958SSadaf Ebrahimi default:
605*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
606*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
607*6467f958SSadaf Ebrahimi break;
608*6467f958SSadaf Ebrahimi }
609*6467f958SSadaf Ebrahimi break;
610*6467f958SSadaf Ebrahimi
611*6467f958SSadaf Ebrahimi case kUnsignedShort:
612*6467f958SSadaf Ebrahimi ushortPtr = (ushort *)inRaw;
613*6467f958SSadaf Ebrahimi switch (outType)
614*6467f958SSadaf Ebrahimi {
615*6467f958SSadaf Ebrahimi BOOL_CASE(ushort)
616*6467f958SSadaf Ebrahimi
617*6467f958SSadaf Ebrahimi case kUShort:
618*6467f958SSadaf Ebrahimi case kUnsignedShort:
619*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
620*6467f958SSadaf Ebrahimi break;
621*6467f958SSadaf Ebrahimi
622*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kChar, char, saturate)
623*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kUChar, uchar, saturate)
624*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kUnsignedChar, uchar, saturate)
625*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(ushort, kShort, short, saturate)
626*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kInt, int)
627*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kUInt, uint)
628*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kUnsignedInt, uint)
629*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kLong, Long)
630*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kULong, ULong)
631*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(ushort, kUnsignedLong, ULong)
632*6467f958SSadaf Ebrahimi
633*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(ushort)
634*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(ushort)
635*6467f958SSadaf Ebrahimi
636*6467f958SSadaf Ebrahimi default:
637*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
638*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
639*6467f958SSadaf Ebrahimi break;
640*6467f958SSadaf Ebrahimi }
641*6467f958SSadaf Ebrahimi break;
642*6467f958SSadaf Ebrahimi
643*6467f958SSadaf Ebrahimi case kInt:
644*6467f958SSadaf Ebrahimi intPtr = (int *)inRaw;
645*6467f958SSadaf Ebrahimi switch (outType)
646*6467f958SSadaf Ebrahimi {
647*6467f958SSadaf Ebrahimi BOOL_CASE(int)
648*6467f958SSadaf Ebrahimi
649*6467f958SSadaf Ebrahimi case kInt:
650*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
651*6467f958SSadaf Ebrahimi break;
652*6467f958SSadaf Ebrahimi
653*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kChar, char, saturate)
654*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kUChar, uchar, saturate)
655*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kUnsignedChar, uchar, saturate)
656*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kShort, short, saturate)
657*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kUShort, ushort, saturate)
658*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kUnsignedShort, ushort, saturate)
659*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kUInt, uint, saturate)
660*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(int, kUnsignedInt, uint, saturate)
661*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(int, kLong, Long)
662*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(int, kULong, ULong)
663*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(int, kUnsignedLong, ULong)
664*6467f958SSadaf Ebrahimi
665*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(int)
666*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(int)
667*6467f958SSadaf Ebrahimi
668*6467f958SSadaf Ebrahimi default:
669*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
670*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
671*6467f958SSadaf Ebrahimi break;
672*6467f958SSadaf Ebrahimi }
673*6467f958SSadaf Ebrahimi break;
674*6467f958SSadaf Ebrahimi
675*6467f958SSadaf Ebrahimi case kUInt:
676*6467f958SSadaf Ebrahimi uintPtr = (uint *)inRaw;
677*6467f958SSadaf Ebrahimi switch (outType)
678*6467f958SSadaf Ebrahimi {
679*6467f958SSadaf Ebrahimi BOOL_CASE(uint)
680*6467f958SSadaf Ebrahimi
681*6467f958SSadaf Ebrahimi case kUInt:
682*6467f958SSadaf Ebrahimi case kUnsignedInt:
683*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
684*6467f958SSadaf Ebrahimi break;
685*6467f958SSadaf Ebrahimi
686*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kChar, char, saturate)
687*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUChar, uchar, saturate)
688*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUnsignedChar, uchar, saturate)
689*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kShort, short, saturate)
690*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUShort, ushort, saturate)
691*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUnsignedShort, ushort, saturate)
692*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kInt, int, saturate)
693*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uint, kLong, Long)
694*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uint, kULong, ULong)
695*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uint, kUnsignedLong, ULong)
696*6467f958SSadaf Ebrahimi
697*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(uint)
698*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(uint)
699*6467f958SSadaf Ebrahimi
700*6467f958SSadaf Ebrahimi default:
701*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
702*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
703*6467f958SSadaf Ebrahimi break;
704*6467f958SSadaf Ebrahimi }
705*6467f958SSadaf Ebrahimi break;
706*6467f958SSadaf Ebrahimi
707*6467f958SSadaf Ebrahimi case kUnsignedInt:
708*6467f958SSadaf Ebrahimi uintPtr = (uint *)inRaw;
709*6467f958SSadaf Ebrahimi switch (outType)
710*6467f958SSadaf Ebrahimi {
711*6467f958SSadaf Ebrahimi BOOL_CASE(uint)
712*6467f958SSadaf Ebrahimi
713*6467f958SSadaf Ebrahimi case kUInt:
714*6467f958SSadaf Ebrahimi case kUnsignedInt:
715*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
716*6467f958SSadaf Ebrahimi break;
717*6467f958SSadaf Ebrahimi
718*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kChar, char, saturate)
719*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUChar, uchar, saturate)
720*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUnsignedChar, uchar, saturate)
721*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kShort, short, saturate)
722*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUShort, ushort, saturate)
723*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kUnsignedShort, ushort, saturate)
724*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(uint, kInt, int, saturate)
725*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uint, kLong, Long)
726*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uint, kULong, ULong)
727*6467f958SSadaf Ebrahimi SIMPLE_CAST_CASE(uint, kUnsignedLong, ULong)
728*6467f958SSadaf Ebrahimi
729*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(uint)
730*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(uint)
731*6467f958SSadaf Ebrahimi
732*6467f958SSadaf Ebrahimi default:
733*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
734*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
735*6467f958SSadaf Ebrahimi break;
736*6467f958SSadaf Ebrahimi }
737*6467f958SSadaf Ebrahimi break;
738*6467f958SSadaf Ebrahimi
739*6467f958SSadaf Ebrahimi case kLong:
740*6467f958SSadaf Ebrahimi LongPtr = (Long *)inRaw;
741*6467f958SSadaf Ebrahimi switch (outType)
742*6467f958SSadaf Ebrahimi {
743*6467f958SSadaf Ebrahimi BOOL_CASE(Long)
744*6467f958SSadaf Ebrahimi
745*6467f958SSadaf Ebrahimi case kLong:
746*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
747*6467f958SSadaf Ebrahimi break;
748*6467f958SSadaf Ebrahimi
749*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kChar, char, saturate)
750*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kUChar, uchar, saturate)
751*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kUnsignedChar, uchar, saturate)
752*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kShort, short, saturate)
753*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kUShort, ushort, saturate)
754*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kUnsignedShort, ushort, saturate)
755*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kInt, int, saturate)
756*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kUInt, uint, saturate)
757*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kUnsignedInt, uint, saturate)
758*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kULong, ULong, saturate)
759*6467f958SSadaf Ebrahimi DOWN_CAST_CASE(Long, kUnsignedLong, ULong, saturate)
760*6467f958SSadaf Ebrahimi
761*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(Long)
762*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(Long)
763*6467f958SSadaf Ebrahimi
764*6467f958SSadaf Ebrahimi default:
765*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
766*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
767*6467f958SSadaf Ebrahimi break;
768*6467f958SSadaf Ebrahimi }
769*6467f958SSadaf Ebrahimi break;
770*6467f958SSadaf Ebrahimi
771*6467f958SSadaf Ebrahimi case kULong:
772*6467f958SSadaf Ebrahimi ULongPtr = (ULong *)inRaw;
773*6467f958SSadaf Ebrahimi switch (outType)
774*6467f958SSadaf Ebrahimi {
775*6467f958SSadaf Ebrahimi BOOL_CASE(ULong)
776*6467f958SSadaf Ebrahimi
777*6467f958SSadaf Ebrahimi case kUnsignedLong:
778*6467f958SSadaf Ebrahimi case kULong:
779*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
780*6467f958SSadaf Ebrahimi break;
781*6467f958SSadaf Ebrahimi
782*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kChar, char, saturate)
783*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUChar, uchar, saturate)
784*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUnsignedChar, uchar, saturate)
785*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kShort, short, saturate)
786*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUShort, ushort, saturate)
787*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUnsignedShort, ushort, saturate)
788*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kInt, int, saturate)
789*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUInt, uint, saturate)
790*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUnsignedInt, uint, saturate)
791*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kLong, Long, saturate)
792*6467f958SSadaf Ebrahimi
793*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(ULong)
794*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(ULong)
795*6467f958SSadaf Ebrahimi
796*6467f958SSadaf Ebrahimi default:
797*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
798*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
799*6467f958SSadaf Ebrahimi break;
800*6467f958SSadaf Ebrahimi }
801*6467f958SSadaf Ebrahimi break;
802*6467f958SSadaf Ebrahimi
803*6467f958SSadaf Ebrahimi case kUnsignedLong:
804*6467f958SSadaf Ebrahimi ULongPtr = (ULong *)inRaw;
805*6467f958SSadaf Ebrahimi switch (outType)
806*6467f958SSadaf Ebrahimi {
807*6467f958SSadaf Ebrahimi BOOL_CASE(ULong)
808*6467f958SSadaf Ebrahimi
809*6467f958SSadaf Ebrahimi case kULong:
810*6467f958SSadaf Ebrahimi case kUnsignedLong:
811*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
812*6467f958SSadaf Ebrahimi break;
813*6467f958SSadaf Ebrahimi
814*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kChar, char, saturate)
815*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUChar, uchar, saturate)
816*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUnsignedChar, uchar, saturate)
817*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kShort, short, saturate)
818*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUShort, ushort, saturate)
819*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUnsignedShort, ushort, saturate)
820*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kInt, int, saturate)
821*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUInt, uint, saturate)
822*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kUnsignedInt, uint, saturate)
823*6467f958SSadaf Ebrahimi U_DOWN_CAST_CASE(ULong, kLong, Long, saturate)
824*6467f958SSadaf Ebrahimi
825*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(ULong)
826*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(ULong)
827*6467f958SSadaf Ebrahimi
828*6467f958SSadaf Ebrahimi default:
829*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
830*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
831*6467f958SSadaf Ebrahimi break;
832*6467f958SSadaf Ebrahimi }
833*6467f958SSadaf Ebrahimi break;
834*6467f958SSadaf Ebrahimi
835*6467f958SSadaf Ebrahimi case kFloat:
836*6467f958SSadaf Ebrahimi floatPtr = (float *)inRaw;
837*6467f958SSadaf Ebrahimi switch (outType)
838*6467f958SSadaf Ebrahimi {
839*6467f958SSadaf Ebrahimi BOOL_CASE(float)
840*6467f958SSadaf Ebrahimi
841*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kChar, char, roundType, saturate)
842*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kUChar, uchar, roundType, saturate)
843*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kUnsignedChar, uchar, roundType, saturate)
844*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kShort, short, roundType, saturate)
845*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kUShort, ushort, roundType, saturate)
846*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kUnsignedShort, ushort, roundType, saturate)
847*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kInt, int, roundType, saturate)
848*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kUInt, uint, roundType, saturate)
849*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kUnsignedInt, uint, roundType, saturate)
850*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kLong, Long, roundType, saturate)
851*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kULong, ULong, roundType, saturate)
852*6467f958SSadaf Ebrahimi FLOAT_ROUND_CASE(kUnsignedLong, ULong, roundType, saturate)
853*6467f958SSadaf Ebrahimi
854*6467f958SSadaf Ebrahimi case kFloat:
855*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
856*6467f958SSadaf Ebrahimi break;
857*6467f958SSadaf Ebrahimi
858*6467f958SSadaf Ebrahimi TO_DOUBLE_CASE(float);
859*6467f958SSadaf Ebrahimi
860*6467f958SSadaf Ebrahimi default:
861*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
862*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
863*6467f958SSadaf Ebrahimi break;
864*6467f958SSadaf Ebrahimi }
865*6467f958SSadaf Ebrahimi break;
866*6467f958SSadaf Ebrahimi
867*6467f958SSadaf Ebrahimi case kDouble:
868*6467f958SSadaf Ebrahimi doublePtr = (double *)inRaw;
869*6467f958SSadaf Ebrahimi switch (outType)
870*6467f958SSadaf Ebrahimi {
871*6467f958SSadaf Ebrahimi BOOL_CASE(double)
872*6467f958SSadaf Ebrahimi
873*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kChar, char, roundType, saturate)
874*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kUChar, uchar, roundType, saturate)
875*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kUnsignedChar, uchar, roundType, saturate)
876*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kShort, short, roundType, saturate)
877*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kUShort, ushort, roundType, saturate)
878*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kUnsignedShort, ushort, roundType, saturate)
879*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kInt, int, roundType, saturate)
880*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kUInt, uint, roundType, saturate)
881*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kUnsignedInt, uint, roundType, saturate)
882*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kLong, Long, roundType, saturate)
883*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kULong, ULong, roundType, saturate)
884*6467f958SSadaf Ebrahimi DOUBLE_ROUND_CASE(kUnsignedLong, ULong, roundType, saturate)
885*6467f958SSadaf Ebrahimi
886*6467f958SSadaf Ebrahimi TO_FLOAT_CASE(double);
887*6467f958SSadaf Ebrahimi
888*6467f958SSadaf Ebrahimi case kDouble:
889*6467f958SSadaf Ebrahimi memcpy(outRaw, inRaw, get_explicit_type_size(inType));
890*6467f958SSadaf Ebrahimi break;
891*6467f958SSadaf Ebrahimi
892*6467f958SSadaf Ebrahimi default:
893*6467f958SSadaf Ebrahimi log_error("ERROR: Invalid type given to "
894*6467f958SSadaf Ebrahimi "convert_explicit_value!!\n");
895*6467f958SSadaf Ebrahimi break;
896*6467f958SSadaf Ebrahimi }
897*6467f958SSadaf Ebrahimi break;
898*6467f958SSadaf Ebrahimi
899*6467f958SSadaf Ebrahimi default:
900*6467f958SSadaf Ebrahimi log_error(
901*6467f958SSadaf Ebrahimi "ERROR: Invalid type given to convert_explicit_value!!\n");
902*6467f958SSadaf Ebrahimi break;
903*6467f958SSadaf Ebrahimi }
904*6467f958SSadaf Ebrahimi }
905*6467f958SSadaf Ebrahimi
generate_random_data(ExplicitType type,size_t count,MTdata d,void * outData)906*6467f958SSadaf Ebrahimi void generate_random_data(ExplicitType type, size_t count, MTdata d,
907*6467f958SSadaf Ebrahimi void *outData)
908*6467f958SSadaf Ebrahimi {
909*6467f958SSadaf Ebrahimi bool *boolPtr;
910*6467f958SSadaf Ebrahimi cl_char *charPtr;
911*6467f958SSadaf Ebrahimi cl_uchar *ucharPtr;
912*6467f958SSadaf Ebrahimi cl_short *shortPtr;
913*6467f958SSadaf Ebrahimi cl_ushort *ushortPtr;
914*6467f958SSadaf Ebrahimi cl_int *intPtr;
915*6467f958SSadaf Ebrahimi cl_uint *uintPtr;
916*6467f958SSadaf Ebrahimi cl_long *longPtr;
917*6467f958SSadaf Ebrahimi cl_ulong *ulongPtr;
918*6467f958SSadaf Ebrahimi cl_float *floatPtr;
919*6467f958SSadaf Ebrahimi cl_double *doublePtr;
920*6467f958SSadaf Ebrahimi cl_half *halfPtr;
921*6467f958SSadaf Ebrahimi size_t i;
922*6467f958SSadaf Ebrahimi cl_uint bits = genrand_int32(d);
923*6467f958SSadaf Ebrahimi cl_uint bitsLeft = 32;
924*6467f958SSadaf Ebrahimi
925*6467f958SSadaf Ebrahimi switch (type)
926*6467f958SSadaf Ebrahimi {
927*6467f958SSadaf Ebrahimi case kBool:
928*6467f958SSadaf Ebrahimi boolPtr = (bool *)outData;
929*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
930*6467f958SSadaf Ebrahimi {
931*6467f958SSadaf Ebrahimi if (0 == bitsLeft)
932*6467f958SSadaf Ebrahimi {
933*6467f958SSadaf Ebrahimi bits = genrand_int32(d);
934*6467f958SSadaf Ebrahimi bitsLeft = 32;
935*6467f958SSadaf Ebrahimi }
936*6467f958SSadaf Ebrahimi boolPtr[i] = (bits & 1) ? true : false;
937*6467f958SSadaf Ebrahimi bits >>= 1;
938*6467f958SSadaf Ebrahimi bitsLeft -= 1;
939*6467f958SSadaf Ebrahimi }
940*6467f958SSadaf Ebrahimi break;
941*6467f958SSadaf Ebrahimi
942*6467f958SSadaf Ebrahimi case kChar:
943*6467f958SSadaf Ebrahimi charPtr = (cl_char *)outData;
944*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
945*6467f958SSadaf Ebrahimi {
946*6467f958SSadaf Ebrahimi if (0 == bitsLeft)
947*6467f958SSadaf Ebrahimi {
948*6467f958SSadaf Ebrahimi bits = genrand_int32(d);
949*6467f958SSadaf Ebrahimi bitsLeft = 32;
950*6467f958SSadaf Ebrahimi }
951*6467f958SSadaf Ebrahimi charPtr[i] = (cl_char)((cl_int)(bits & 255) - 127);
952*6467f958SSadaf Ebrahimi bits >>= 8;
953*6467f958SSadaf Ebrahimi bitsLeft -= 8;
954*6467f958SSadaf Ebrahimi }
955*6467f958SSadaf Ebrahimi break;
956*6467f958SSadaf Ebrahimi
957*6467f958SSadaf Ebrahimi case kUChar:
958*6467f958SSadaf Ebrahimi case kUnsignedChar:
959*6467f958SSadaf Ebrahimi ucharPtr = (cl_uchar *)outData;
960*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
961*6467f958SSadaf Ebrahimi {
962*6467f958SSadaf Ebrahimi if (0 == bitsLeft)
963*6467f958SSadaf Ebrahimi {
964*6467f958SSadaf Ebrahimi bits = genrand_int32(d);
965*6467f958SSadaf Ebrahimi bitsLeft = 32;
966*6467f958SSadaf Ebrahimi }
967*6467f958SSadaf Ebrahimi ucharPtr[i] = (cl_uchar)(bits & 255);
968*6467f958SSadaf Ebrahimi bits >>= 8;
969*6467f958SSadaf Ebrahimi bitsLeft -= 8;
970*6467f958SSadaf Ebrahimi }
971*6467f958SSadaf Ebrahimi break;
972*6467f958SSadaf Ebrahimi
973*6467f958SSadaf Ebrahimi case kShort:
974*6467f958SSadaf Ebrahimi shortPtr = (cl_short *)outData;
975*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
976*6467f958SSadaf Ebrahimi {
977*6467f958SSadaf Ebrahimi if (0 == bitsLeft)
978*6467f958SSadaf Ebrahimi {
979*6467f958SSadaf Ebrahimi bits = genrand_int32(d);
980*6467f958SSadaf Ebrahimi bitsLeft = 32;
981*6467f958SSadaf Ebrahimi }
982*6467f958SSadaf Ebrahimi shortPtr[i] = (cl_short)((cl_int)(bits & 65535) - 32767);
983*6467f958SSadaf Ebrahimi bits >>= 16;
984*6467f958SSadaf Ebrahimi bitsLeft -= 16;
985*6467f958SSadaf Ebrahimi }
986*6467f958SSadaf Ebrahimi break;
987*6467f958SSadaf Ebrahimi
988*6467f958SSadaf Ebrahimi case kUShort:
989*6467f958SSadaf Ebrahimi case kUnsignedShort:
990*6467f958SSadaf Ebrahimi ushortPtr = (cl_ushort *)outData;
991*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
992*6467f958SSadaf Ebrahimi {
993*6467f958SSadaf Ebrahimi if (0 == bitsLeft)
994*6467f958SSadaf Ebrahimi {
995*6467f958SSadaf Ebrahimi bits = genrand_int32(d);
996*6467f958SSadaf Ebrahimi bitsLeft = 32;
997*6467f958SSadaf Ebrahimi }
998*6467f958SSadaf Ebrahimi ushortPtr[i] = (cl_ushort)((cl_int)(bits & 65535));
999*6467f958SSadaf Ebrahimi bits >>= 16;
1000*6467f958SSadaf Ebrahimi bitsLeft -= 16;
1001*6467f958SSadaf Ebrahimi }
1002*6467f958SSadaf Ebrahimi break;
1003*6467f958SSadaf Ebrahimi
1004*6467f958SSadaf Ebrahimi case kInt:
1005*6467f958SSadaf Ebrahimi intPtr = (cl_int *)outData;
1006*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
1007*6467f958SSadaf Ebrahimi {
1008*6467f958SSadaf Ebrahimi intPtr[i] = (cl_int)genrand_int32(d);
1009*6467f958SSadaf Ebrahimi }
1010*6467f958SSadaf Ebrahimi break;
1011*6467f958SSadaf Ebrahimi
1012*6467f958SSadaf Ebrahimi case kUInt:
1013*6467f958SSadaf Ebrahimi case kUnsignedInt:
1014*6467f958SSadaf Ebrahimi uintPtr = (cl_uint *)outData;
1015*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
1016*6467f958SSadaf Ebrahimi {
1017*6467f958SSadaf Ebrahimi uintPtr[i] = (unsigned int)genrand_int32(d);
1018*6467f958SSadaf Ebrahimi }
1019*6467f958SSadaf Ebrahimi break;
1020*6467f958SSadaf Ebrahimi
1021*6467f958SSadaf Ebrahimi case kLong:
1022*6467f958SSadaf Ebrahimi longPtr = (cl_long *)outData;
1023*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
1024*6467f958SSadaf Ebrahimi {
1025*6467f958SSadaf Ebrahimi longPtr[i] = (cl_long)genrand_int32(d)
1026*6467f958SSadaf Ebrahimi | ((cl_long)genrand_int32(d) << 32);
1027*6467f958SSadaf Ebrahimi }
1028*6467f958SSadaf Ebrahimi break;
1029*6467f958SSadaf Ebrahimi
1030*6467f958SSadaf Ebrahimi case kULong:
1031*6467f958SSadaf Ebrahimi case kUnsignedLong:
1032*6467f958SSadaf Ebrahimi ulongPtr = (cl_ulong *)outData;
1033*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
1034*6467f958SSadaf Ebrahimi {
1035*6467f958SSadaf Ebrahimi ulongPtr[i] = (cl_ulong)genrand_int32(d)
1036*6467f958SSadaf Ebrahimi | ((cl_ulong)genrand_int32(d) << 32);
1037*6467f958SSadaf Ebrahimi }
1038*6467f958SSadaf Ebrahimi break;
1039*6467f958SSadaf Ebrahimi
1040*6467f958SSadaf Ebrahimi case kFloat:
1041*6467f958SSadaf Ebrahimi floatPtr = (cl_float *)outData;
1042*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
1043*6467f958SSadaf Ebrahimi {
1044*6467f958SSadaf Ebrahimi // [ -(double) 0x7fffffff, (double) 0x7fffffff ]
1045*6467f958SSadaf Ebrahimi double t = genrand_real1(d);
1046*6467f958SSadaf Ebrahimi floatPtr[i] = (float)((1.0 - t) * -(double)0x7fffffff
1047*6467f958SSadaf Ebrahimi + t * (double)0x7fffffff);
1048*6467f958SSadaf Ebrahimi }
1049*6467f958SSadaf Ebrahimi break;
1050*6467f958SSadaf Ebrahimi
1051*6467f958SSadaf Ebrahimi case kDouble:
1052*6467f958SSadaf Ebrahimi doublePtr = (cl_double *)outData;
1053*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
1054*6467f958SSadaf Ebrahimi {
1055*6467f958SSadaf Ebrahimi cl_long u = (cl_long)genrand_int32(d)
1056*6467f958SSadaf Ebrahimi | ((cl_long)genrand_int32(d) << 32);
1057*6467f958SSadaf Ebrahimi double t = (double)u;
1058*6467f958SSadaf Ebrahimi // scale [-2**63, 2**63] to [-2**31, 2**31]
1059*6467f958SSadaf Ebrahimi t *= MAKE_HEX_DOUBLE(0x1.0p-32, 0x1, -32);
1060*6467f958SSadaf Ebrahimi doublePtr[i] = t;
1061*6467f958SSadaf Ebrahimi }
1062*6467f958SSadaf Ebrahimi break;
1063*6467f958SSadaf Ebrahimi
1064*6467f958SSadaf Ebrahimi case kHalf:
1065*6467f958SSadaf Ebrahimi halfPtr = (ushort *)outData;
1066*6467f958SSadaf Ebrahimi for (i = 0; i < count; i++)
1067*6467f958SSadaf Ebrahimi {
1068*6467f958SSadaf Ebrahimi if (0 == bitsLeft)
1069*6467f958SSadaf Ebrahimi {
1070*6467f958SSadaf Ebrahimi bits = genrand_int32(d);
1071*6467f958SSadaf Ebrahimi bitsLeft = 32;
1072*6467f958SSadaf Ebrahimi }
1073*6467f958SSadaf Ebrahimi halfPtr[i] =
1074*6467f958SSadaf Ebrahimi bits & 65535; /* Kindly generates random bits for us */
1075*6467f958SSadaf Ebrahimi bits >>= 16;
1076*6467f958SSadaf Ebrahimi bitsLeft -= 16;
1077*6467f958SSadaf Ebrahimi }
1078*6467f958SSadaf Ebrahimi break;
1079*6467f958SSadaf Ebrahimi
1080*6467f958SSadaf Ebrahimi default:
1081*6467f958SSadaf Ebrahimi log_error(
1082*6467f958SSadaf Ebrahimi "ERROR: Invalid type passed in to generate_random_data!\n");
1083*6467f958SSadaf Ebrahimi break;
1084*6467f958SSadaf Ebrahimi }
1085*6467f958SSadaf Ebrahimi }
1086*6467f958SSadaf Ebrahimi
create_random_data(ExplicitType type,MTdata d,size_t count)1087*6467f958SSadaf Ebrahimi void *create_random_data(ExplicitType type, MTdata d, size_t count)
1088*6467f958SSadaf Ebrahimi {
1089*6467f958SSadaf Ebrahimi void *data = malloc(get_explicit_type_size(type) * count);
1090*6467f958SSadaf Ebrahimi generate_random_data(type, count, d, data);
1091*6467f958SSadaf Ebrahimi return data;
1092*6467f958SSadaf Ebrahimi }
1093*6467f958SSadaf Ebrahimi
read_upscale_signed(void * inRaw,ExplicitType inType)1094*6467f958SSadaf Ebrahimi cl_long read_upscale_signed(void *inRaw, ExplicitType inType)
1095*6467f958SSadaf Ebrahimi {
1096*6467f958SSadaf Ebrahimi switch (inType)
1097*6467f958SSadaf Ebrahimi {
1098*6467f958SSadaf Ebrahimi case kChar: return (cl_long)(*((cl_char *)inRaw));
1099*6467f958SSadaf Ebrahimi case kUChar:
1100*6467f958SSadaf Ebrahimi case kUnsignedChar: return (cl_long)(*((cl_uchar *)inRaw));
1101*6467f958SSadaf Ebrahimi case kShort: return (cl_long)(*((cl_short *)inRaw));
1102*6467f958SSadaf Ebrahimi case kUShort:
1103*6467f958SSadaf Ebrahimi case kUnsignedShort: return (cl_long)(*((cl_ushort *)inRaw));
1104*6467f958SSadaf Ebrahimi case kInt: return (cl_long)(*((cl_int *)inRaw));
1105*6467f958SSadaf Ebrahimi case kUInt:
1106*6467f958SSadaf Ebrahimi case kUnsignedInt: return (cl_long)(*((cl_uint *)inRaw));
1107*6467f958SSadaf Ebrahimi case kLong: return (cl_long)(*((cl_long *)inRaw));
1108*6467f958SSadaf Ebrahimi case kULong:
1109*6467f958SSadaf Ebrahimi case kUnsignedLong: return (cl_long)(*((cl_ulong *)inRaw));
1110*6467f958SSadaf Ebrahimi default: return 0;
1111*6467f958SSadaf Ebrahimi }
1112*6467f958SSadaf Ebrahimi }
1113*6467f958SSadaf Ebrahimi
read_upscale_unsigned(void * inRaw,ExplicitType inType)1114*6467f958SSadaf Ebrahimi cl_ulong read_upscale_unsigned(void *inRaw, ExplicitType inType)
1115*6467f958SSadaf Ebrahimi {
1116*6467f958SSadaf Ebrahimi switch (inType)
1117*6467f958SSadaf Ebrahimi {
1118*6467f958SSadaf Ebrahimi case kChar: return (cl_ulong)(*((cl_char *)inRaw));
1119*6467f958SSadaf Ebrahimi case kUChar:
1120*6467f958SSadaf Ebrahimi case kUnsignedChar: return (cl_ulong)(*((cl_uchar *)inRaw));
1121*6467f958SSadaf Ebrahimi case kShort: return (cl_ulong)(*((cl_short *)inRaw));
1122*6467f958SSadaf Ebrahimi case kUShort:
1123*6467f958SSadaf Ebrahimi case kUnsignedShort: return (cl_ulong)(*((cl_ushort *)inRaw));
1124*6467f958SSadaf Ebrahimi case kInt: return (cl_ulong)(*((cl_int *)inRaw));
1125*6467f958SSadaf Ebrahimi case kUInt:
1126*6467f958SSadaf Ebrahimi case kUnsignedInt: return (cl_ulong)(*((cl_uint *)inRaw));
1127*6467f958SSadaf Ebrahimi case kLong: return (cl_ulong)(*((cl_long *)inRaw));
1128*6467f958SSadaf Ebrahimi case kULong:
1129*6467f958SSadaf Ebrahimi case kUnsignedLong: return (cl_ulong)(*((cl_ulong *)inRaw));
1130*6467f958SSadaf Ebrahimi default: return 0;
1131*6467f958SSadaf Ebrahimi }
1132*6467f958SSadaf Ebrahimi }
1133*6467f958SSadaf Ebrahimi
read_as_float(void * inRaw,ExplicitType inType)1134*6467f958SSadaf Ebrahimi float read_as_float(void *inRaw, ExplicitType inType)
1135*6467f958SSadaf Ebrahimi {
1136*6467f958SSadaf Ebrahimi switch (inType)
1137*6467f958SSadaf Ebrahimi {
1138*6467f958SSadaf Ebrahimi case kChar: return (float)(*((cl_char *)inRaw));
1139*6467f958SSadaf Ebrahimi case kUChar:
1140*6467f958SSadaf Ebrahimi case kUnsignedChar: return (float)(*((cl_char *)inRaw));
1141*6467f958SSadaf Ebrahimi case kShort: return (float)(*((cl_short *)inRaw));
1142*6467f958SSadaf Ebrahimi case kUShort:
1143*6467f958SSadaf Ebrahimi case kUnsignedShort: return (float)(*((cl_ushort *)inRaw));
1144*6467f958SSadaf Ebrahimi case kInt: return (float)(*((cl_int *)inRaw));
1145*6467f958SSadaf Ebrahimi case kUInt:
1146*6467f958SSadaf Ebrahimi case kUnsignedInt: return (float)(*((cl_uint *)inRaw));
1147*6467f958SSadaf Ebrahimi case kLong: return (float)(*((cl_long *)inRaw));
1148*6467f958SSadaf Ebrahimi case kULong:
1149*6467f958SSadaf Ebrahimi case kUnsignedLong: return (float)(*((cl_ulong *)inRaw));
1150*6467f958SSadaf Ebrahimi case kFloat: return *((float *)inRaw);
1151*6467f958SSadaf Ebrahimi case kDouble: return (float)*((double *)inRaw);
1152*6467f958SSadaf Ebrahimi default: return 0;
1153*6467f958SSadaf Ebrahimi }
1154*6467f958SSadaf Ebrahimi }
1155*6467f958SSadaf Ebrahimi
get_random_float(float low,float high,MTdata d)1156*6467f958SSadaf Ebrahimi float get_random_float(float low, float high, MTdata d)
1157*6467f958SSadaf Ebrahimi {
1158*6467f958SSadaf Ebrahimi float t = (float)((double)genrand_int32(d) / (double)0xFFFFFFFF);
1159*6467f958SSadaf Ebrahimi return (1.0f - t) * low + t * high;
1160*6467f958SSadaf Ebrahimi }
1161*6467f958SSadaf Ebrahimi
get_random_double(double low,double high,MTdata d)1162*6467f958SSadaf Ebrahimi double get_random_double(double low, double high, MTdata d)
1163*6467f958SSadaf Ebrahimi {
1164*6467f958SSadaf Ebrahimi cl_ulong u =
1165*6467f958SSadaf Ebrahimi (cl_ulong)genrand_int32(d) | ((cl_ulong)genrand_int32(d) << 32);
1166*6467f958SSadaf Ebrahimi double t = (double)u * MAKE_HEX_DOUBLE(0x1.0p-64, 0x1, -64);
1167*6467f958SSadaf Ebrahimi return (1.0f - t) * low + t * high;
1168*6467f958SSadaf Ebrahimi }
1169*6467f958SSadaf Ebrahimi
any_float(MTdata d)1170*6467f958SSadaf Ebrahimi float any_float(MTdata d)
1171*6467f958SSadaf Ebrahimi {
1172*6467f958SSadaf Ebrahimi union {
1173*6467f958SSadaf Ebrahimi float f;
1174*6467f958SSadaf Ebrahimi cl_uint u;
1175*6467f958SSadaf Ebrahimi } u;
1176*6467f958SSadaf Ebrahimi
1177*6467f958SSadaf Ebrahimi u.u = genrand_int32(d);
1178*6467f958SSadaf Ebrahimi return u.f;
1179*6467f958SSadaf Ebrahimi }
1180*6467f958SSadaf Ebrahimi
1181*6467f958SSadaf Ebrahimi
any_double(MTdata d)1182*6467f958SSadaf Ebrahimi double any_double(MTdata d)
1183*6467f958SSadaf Ebrahimi {
1184*6467f958SSadaf Ebrahimi union {
1185*6467f958SSadaf Ebrahimi double f;
1186*6467f958SSadaf Ebrahimi cl_ulong u;
1187*6467f958SSadaf Ebrahimi } u;
1188*6467f958SSadaf Ebrahimi
1189*6467f958SSadaf Ebrahimi u.u = (cl_ulong)genrand_int32(d) | ((cl_ulong)genrand_int32(d) << 32);
1190*6467f958SSadaf Ebrahimi return u.f;
1191*6467f958SSadaf Ebrahimi }
1192*6467f958SSadaf Ebrahimi
random_in_range(int minV,int maxV,MTdata d)1193*6467f958SSadaf Ebrahimi int random_in_range(int minV, int maxV, MTdata d)
1194*6467f958SSadaf Ebrahimi {
1195*6467f958SSadaf Ebrahimi cl_ulong r = ((cl_ulong)genrand_int32(d)) * (maxV - minV + 1);
1196*6467f958SSadaf Ebrahimi return (cl_uint)(r >> 32) + minV;
1197*6467f958SSadaf Ebrahimi }
1198*6467f958SSadaf Ebrahimi
get_random_size_t(size_t low,size_t high,MTdata d)1199*6467f958SSadaf Ebrahimi size_t get_random_size_t(size_t low, size_t high, MTdata d)
1200*6467f958SSadaf Ebrahimi {
1201*6467f958SSadaf Ebrahimi enum
1202*6467f958SSadaf Ebrahimi {
1203*6467f958SSadaf Ebrahimi N = sizeof(size_t) / sizeof(int)
1204*6467f958SSadaf Ebrahimi };
1205*6467f958SSadaf Ebrahimi
1206*6467f958SSadaf Ebrahimi union {
1207*6467f958SSadaf Ebrahimi int word[N];
1208*6467f958SSadaf Ebrahimi size_t size;
1209*6467f958SSadaf Ebrahimi } u;
1210*6467f958SSadaf Ebrahimi
1211*6467f958SSadaf Ebrahimi for (unsigned i = 0; i != N; ++i)
1212*6467f958SSadaf Ebrahimi {
1213*6467f958SSadaf Ebrahimi u.word[i] = genrand_int32(d);
1214*6467f958SSadaf Ebrahimi }
1215*6467f958SSadaf Ebrahimi
1216*6467f958SSadaf Ebrahimi assert(low <= high && "Invalid random number range specified");
1217*6467f958SSadaf Ebrahimi size_t range = high - low;
1218*6467f958SSadaf Ebrahimi
1219*6467f958SSadaf Ebrahimi return (range) ? low + ((u.size - low) % range) : low;
1220*6467f958SSadaf Ebrahimi }
1221