xref: /aosp_15_r20/external/OpenCL-CTS/test_common/harness/conversions.h (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 #ifndef _conversions_h
17*6467f958SSadaf Ebrahimi #define _conversions_h
18*6467f958SSadaf Ebrahimi 
19*6467f958SSadaf Ebrahimi #include "compat.h"
20*6467f958SSadaf Ebrahimi 
21*6467f958SSadaf Ebrahimi #include "errorHelpers.h"
22*6467f958SSadaf Ebrahimi #include "mt19937.h"
23*6467f958SSadaf Ebrahimi #include <stdio.h>
24*6467f958SSadaf Ebrahimi #include <stdlib.h>
25*6467f958SSadaf Ebrahimi #include <string.h>
26*6467f958SSadaf Ebrahimi #include <sys/types.h>
27*6467f958SSadaf Ebrahimi 
28*6467f958SSadaf Ebrahimi /* Note: the next three all have to match in size and order!! */
29*6467f958SSadaf Ebrahimi 
30*6467f958SSadaf Ebrahimi enum ExplicitTypes
31*6467f958SSadaf Ebrahimi {
32*6467f958SSadaf Ebrahimi     kBool = 0,
33*6467f958SSadaf Ebrahimi     kChar,
34*6467f958SSadaf Ebrahimi     kUChar,
35*6467f958SSadaf Ebrahimi     kUnsignedChar,
36*6467f958SSadaf Ebrahimi     kShort,
37*6467f958SSadaf Ebrahimi     kUShort,
38*6467f958SSadaf Ebrahimi     kUnsignedShort,
39*6467f958SSadaf Ebrahimi     kInt,
40*6467f958SSadaf Ebrahimi     kUInt,
41*6467f958SSadaf Ebrahimi     kUnsignedInt,
42*6467f958SSadaf Ebrahimi     kLong,
43*6467f958SSadaf Ebrahimi     kULong,
44*6467f958SSadaf Ebrahimi     kUnsignedLong,
45*6467f958SSadaf Ebrahimi     kFloat,
46*6467f958SSadaf Ebrahimi     kHalf,
47*6467f958SSadaf Ebrahimi     kDouble,
48*6467f958SSadaf Ebrahimi     kNumExplicitTypes
49*6467f958SSadaf Ebrahimi };
50*6467f958SSadaf Ebrahimi 
51*6467f958SSadaf Ebrahimi typedef enum ExplicitTypes ExplicitType;
52*6467f958SSadaf Ebrahimi 
53*6467f958SSadaf Ebrahimi enum RoundingTypes
54*6467f958SSadaf Ebrahimi {
55*6467f958SSadaf Ebrahimi     kRoundToEven = 0,
56*6467f958SSadaf Ebrahimi     kRoundToZero,
57*6467f958SSadaf Ebrahimi     kRoundToPosInf,
58*6467f958SSadaf Ebrahimi     kRoundToNegInf,
59*6467f958SSadaf Ebrahimi     kRoundToNearest,
60*6467f958SSadaf Ebrahimi 
61*6467f958SSadaf Ebrahimi     kNumRoundingTypes,
62*6467f958SSadaf Ebrahimi 
63*6467f958SSadaf Ebrahimi     kDefaultRoundingType = kRoundToNearest
64*6467f958SSadaf Ebrahimi };
65*6467f958SSadaf Ebrahimi 
66*6467f958SSadaf Ebrahimi typedef enum RoundingTypes RoundingType;
67*6467f958SSadaf Ebrahimi 
68*6467f958SSadaf Ebrahimi extern void print_type_to_string(ExplicitType type, void *data, char *string);
69*6467f958SSadaf Ebrahimi extern size_t get_explicit_type_size(ExplicitType type);
70*6467f958SSadaf Ebrahimi extern const char *get_explicit_type_name(ExplicitType type);
71*6467f958SSadaf Ebrahimi extern void convert_explicit_value(void *inRaw, void *outRaw,
72*6467f958SSadaf Ebrahimi                                    ExplicitType inType, bool saturate,
73*6467f958SSadaf Ebrahimi                                    RoundingType roundType,
74*6467f958SSadaf Ebrahimi                                    ExplicitType outType);
75*6467f958SSadaf Ebrahimi 
76*6467f958SSadaf Ebrahimi extern void generate_random_data(ExplicitType type, size_t count, MTdata d,
77*6467f958SSadaf Ebrahimi                                  void *outData);
78*6467f958SSadaf Ebrahimi extern void *create_random_data(ExplicitType type, MTdata d, size_t count);
79*6467f958SSadaf Ebrahimi 
80*6467f958SSadaf Ebrahimi extern cl_long read_upscale_signed(void *inRaw, ExplicitType inType);
81*6467f958SSadaf Ebrahimi extern cl_ulong read_upscale_unsigned(void *inRaw, ExplicitType inType);
82*6467f958SSadaf Ebrahimi extern float read_as_float(void *inRaw, ExplicitType inType);
83*6467f958SSadaf Ebrahimi 
84*6467f958SSadaf Ebrahimi extern float get_random_float(float low, float high, MTdata d);
85*6467f958SSadaf Ebrahimi extern double get_random_double(double low, double high, MTdata d);
86*6467f958SSadaf Ebrahimi extern float any_float(MTdata d);
87*6467f958SSadaf Ebrahimi extern double any_double(MTdata d);
88*6467f958SSadaf Ebrahimi 
89*6467f958SSadaf Ebrahimi extern int random_in_range(int minV, int maxV, MTdata d);
90*6467f958SSadaf Ebrahimi 
91*6467f958SSadaf Ebrahimi size_t get_random_size_t(size_t low, size_t high, MTdata d);
92*6467f958SSadaf Ebrahimi 
93*6467f958SSadaf Ebrahimi // Note: though this takes a double, this is for use with single precision tests
IsFloatSubnormal(float x)94*6467f958SSadaf Ebrahimi static inline int IsFloatSubnormal(float x)
95*6467f958SSadaf Ebrahimi {
96*6467f958SSadaf Ebrahimi #if 2 == FLT_RADIX
97*6467f958SSadaf Ebrahimi     // Do this in integer to avoid problems with FTZ behavior
98*6467f958SSadaf Ebrahimi     union {
99*6467f958SSadaf Ebrahimi         float d;
100*6467f958SSadaf Ebrahimi         uint32_t u;
101*6467f958SSadaf Ebrahimi     } u;
102*6467f958SSadaf Ebrahimi     u.d = fabsf(x);
103*6467f958SSadaf Ebrahimi     return (u.u - 1) < 0x007fffffU;
104*6467f958SSadaf Ebrahimi #else
105*6467f958SSadaf Ebrahimi     // rely on floating point hardware for non-radix2 non-IEEE-754 hardware --
106*6467f958SSadaf Ebrahimi     // will fail if you flush subnormals to zero
107*6467f958SSadaf Ebrahimi     return fabs(x) < (double)FLT_MIN && x != 0.0;
108*6467f958SSadaf Ebrahimi #endif
109*6467f958SSadaf Ebrahimi }
110*6467f958SSadaf Ebrahimi 
IsDoubleSubnormal(double x)111*6467f958SSadaf Ebrahimi static inline int IsDoubleSubnormal(double x)
112*6467f958SSadaf Ebrahimi {
113*6467f958SSadaf Ebrahimi #if 2 == FLT_RADIX
114*6467f958SSadaf Ebrahimi     // Do this in integer to avoid problems with FTZ behavior
115*6467f958SSadaf Ebrahimi     union {
116*6467f958SSadaf Ebrahimi         double d;
117*6467f958SSadaf Ebrahimi         uint64_t u;
118*6467f958SSadaf Ebrahimi     } u;
119*6467f958SSadaf Ebrahimi     u.d = fabs(x);
120*6467f958SSadaf Ebrahimi     return (u.u - 1) < 0x000fffffffffffffULL;
121*6467f958SSadaf Ebrahimi #else
122*6467f958SSadaf Ebrahimi     // rely on floating point hardware for non-radix2 non-IEEE-754 hardware --
123*6467f958SSadaf Ebrahimi     // will fail if you flush subnormals to zero
124*6467f958SSadaf Ebrahimi     return fabs(x) < (double)DBL_MIN && x != 0.0;
125*6467f958SSadaf Ebrahimi #endif
126*6467f958SSadaf Ebrahimi }
127*6467f958SSadaf Ebrahimi 
IsHalfSubnormal(cl_half x)128*6467f958SSadaf Ebrahimi static inline int IsHalfSubnormal(cl_half x)
129*6467f958SSadaf Ebrahimi {
130*6467f958SSadaf Ebrahimi     // this relies on interger overflow to exclude 0 as a subnormal
131*6467f958SSadaf Ebrahimi     return ((x & 0x7fffU) - 1U) < 0x03ffU;
132*6467f958SSadaf Ebrahimi }
133*6467f958SSadaf Ebrahimi 
134*6467f958SSadaf Ebrahimi #endif // _conversions_h
135