xref: /aosp_15_r20/external/OpenCL-CTS/test_common/harness/conversions.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
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