xref: /aosp_15_r20/external/OpenCL-CTS/test_common/harness/compat.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 COMPAT_H_
17*6467f958SSadaf Ebrahimi #define COMPAT_H_
18*6467f958SSadaf Ebrahimi 
19*6467f958SSadaf Ebrahimi #if defined(_WIN32) && defined(_MSC_VER)
20*6467f958SSadaf Ebrahimi #include <Windows.h>
21*6467f958SSadaf Ebrahimi #else
22*6467f958SSadaf Ebrahimi #ifdef __cplusplus
23*6467f958SSadaf Ebrahimi #define EXTERN_C extern "C"
24*6467f958SSadaf Ebrahimi #else
25*6467f958SSadaf Ebrahimi #define EXTERN_C
26*6467f958SSadaf Ebrahimi #endif
27*6467f958SSadaf Ebrahimi #endif
28*6467f958SSadaf Ebrahimi 
29*6467f958SSadaf Ebrahimi 
30*6467f958SSadaf Ebrahimi //
31*6467f958SSadaf Ebrahimi // stdlib.h
32*6467f958SSadaf Ebrahimi //
33*6467f958SSadaf Ebrahimi 
34*6467f958SSadaf Ebrahimi #include <stdlib.h> // On Windows, _MAX_PATH defined there.
35*6467f958SSadaf Ebrahimi 
36*6467f958SSadaf Ebrahimi // llabs appeared in MS C v16 (VS 10/2010).
37*6467f958SSadaf Ebrahimi #if defined(_MSC_VER) && _MSC_VER <= 1500
llabs(long long __x)38*6467f958SSadaf Ebrahimi EXTERN_C inline long long llabs(long long __x) { return __x >= 0 ? __x : -__x; }
39*6467f958SSadaf Ebrahimi #endif
40*6467f958SSadaf Ebrahimi 
41*6467f958SSadaf Ebrahimi 
42*6467f958SSadaf Ebrahimi //
43*6467f958SSadaf Ebrahimi // stdbool.h
44*6467f958SSadaf Ebrahimi //
45*6467f958SSadaf Ebrahimi 
46*6467f958SSadaf Ebrahimi // stdbool.h appeared in MS C v18 (VS 12/2013).
47*6467f958SSadaf Ebrahimi #if defined(_MSC_VER) && MSC_VER <= 1700
48*6467f958SSadaf Ebrahimi #if !defined(__cplusplus)
49*6467f958SSadaf Ebrahimi typedef char bool;
50*6467f958SSadaf Ebrahimi #define true 1
51*6467f958SSadaf Ebrahimi #define false 0
52*6467f958SSadaf Ebrahimi #endif
53*6467f958SSadaf Ebrahimi #else
54*6467f958SSadaf Ebrahimi #include <stdbool.h>
55*6467f958SSadaf Ebrahimi #endif // defined(_MSC_VER) && MSC_VER <= 1700
56*6467f958SSadaf Ebrahimi 
57*6467f958SSadaf Ebrahimi 
58*6467f958SSadaf Ebrahimi //
59*6467f958SSadaf Ebrahimi // stdint.h
60*6467f958SSadaf Ebrahimi //
61*6467f958SSadaf Ebrahimi 
62*6467f958SSadaf Ebrahimi // stdint.h appeared in MS C v16 (VS 10/2010) and Intel C v12.
63*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)                                                          \
64*6467f958SSadaf Ebrahimi     && (!defined(__INTEL_COMPILER) && _MSC_VER <= 1500                         \
65*6467f958SSadaf Ebrahimi         || defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1200)
66*6467f958SSadaf Ebrahimi typedef unsigned char uint8_t;
67*6467f958SSadaf Ebrahimi typedef char int8_t;
68*6467f958SSadaf Ebrahimi typedef unsigned short uint16_t;
69*6467f958SSadaf Ebrahimi typedef short int16_t;
70*6467f958SSadaf Ebrahimi typedef unsigned int uint32_t;
71*6467f958SSadaf Ebrahimi typedef int int32_t;
72*6467f958SSadaf Ebrahimi typedef unsigned long long uint64_t;
73*6467f958SSadaf Ebrahimi typedef long long int64_t;
74*6467f958SSadaf Ebrahimi #else
75*6467f958SSadaf Ebrahimi #ifndef __STDC_LIMIT_MACROS
76*6467f958SSadaf Ebrahimi #define __STDC_LIMIT_MACROS
77*6467f958SSadaf Ebrahimi #endif
78*6467f958SSadaf Ebrahimi #include <stdint.h>
79*6467f958SSadaf Ebrahimi #endif
80*6467f958SSadaf Ebrahimi 
81*6467f958SSadaf Ebrahimi 
82*6467f958SSadaf Ebrahimi //
83*6467f958SSadaf Ebrahimi // float.h
84*6467f958SSadaf Ebrahimi //
85*6467f958SSadaf Ebrahimi 
86*6467f958SSadaf Ebrahimi #include <float.h>
87*6467f958SSadaf Ebrahimi 
88*6467f958SSadaf Ebrahimi 
89*6467f958SSadaf Ebrahimi //
90*6467f958SSadaf Ebrahimi // fenv.h
91*6467f958SSadaf Ebrahimi //
92*6467f958SSadaf Ebrahimi 
93*6467f958SSadaf Ebrahimi // fenv.h appeared in MS C v18 (VS 12/2013).
94*6467f958SSadaf Ebrahimi #if defined(_MSC_VER) && _MSC_VER <= 1700 && !defined(__INTEL_COMPILER)
95*6467f958SSadaf Ebrahimi // reimplement fenv.h because windows doesn't have it
96*6467f958SSadaf Ebrahimi #define FE_INEXACT 0x0020
97*6467f958SSadaf Ebrahimi #define FE_UNDERFLOW 0x0010
98*6467f958SSadaf Ebrahimi #define FE_OVERFLOW 0x0008
99*6467f958SSadaf Ebrahimi #define FE_DIVBYZERO 0x0004
100*6467f958SSadaf Ebrahimi #define FE_INVALID 0x0001
101*6467f958SSadaf Ebrahimi #define FE_ALL_EXCEPT 0x003D
102*6467f958SSadaf Ebrahimi int fetestexcept(int excepts);
103*6467f958SSadaf Ebrahimi int feclearexcept(int excepts);
104*6467f958SSadaf Ebrahimi #else
105*6467f958SSadaf Ebrahimi #include <fenv.h>
106*6467f958SSadaf Ebrahimi #endif
107*6467f958SSadaf Ebrahimi 
108*6467f958SSadaf Ebrahimi 
109*6467f958SSadaf Ebrahimi //
110*6467f958SSadaf Ebrahimi // math.h
111*6467f958SSadaf Ebrahimi //
112*6467f958SSadaf Ebrahimi 
113*6467f958SSadaf Ebrahimi #if defined(__INTEL_COMPILER)
114*6467f958SSadaf Ebrahimi #include <mathimf.h>
115*6467f958SSadaf Ebrahimi #else
116*6467f958SSadaf Ebrahimi #include <math.h>
117*6467f958SSadaf Ebrahimi #endif
118*6467f958SSadaf Ebrahimi 
119*6467f958SSadaf Ebrahimi #ifndef M_PI
120*6467f958SSadaf Ebrahimi #define M_PI 3.14159265358979323846264338327950288
121*6467f958SSadaf Ebrahimi #endif
122*6467f958SSadaf Ebrahimi 
123*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)
124*6467f958SSadaf Ebrahimi 
125*6467f958SSadaf Ebrahimi #ifdef __cplusplus
126*6467f958SSadaf Ebrahimi extern "C" {
127*6467f958SSadaf Ebrahimi #endif
128*6467f958SSadaf Ebrahimi 
129*6467f958SSadaf Ebrahimi #ifndef NAN
130*6467f958SSadaf Ebrahimi #define NAN (INFINITY - INFINITY)
131*6467f958SSadaf Ebrahimi #endif
132*6467f958SSadaf Ebrahimi 
133*6467f958SSadaf Ebrahimi #ifndef HUGE_VALF
134*6467f958SSadaf Ebrahimi #define HUGE_VALF (float)HUGE_VAL
135*6467f958SSadaf Ebrahimi #endif
136*6467f958SSadaf Ebrahimi 
137*6467f958SSadaf Ebrahimi #ifndef INFINITY
138*6467f958SSadaf Ebrahimi #define INFINITY (FLT_MAX + FLT_MAX)
139*6467f958SSadaf Ebrahimi #endif
140*6467f958SSadaf Ebrahimi 
141*6467f958SSadaf Ebrahimi #ifndef isfinite
142*6467f958SSadaf Ebrahimi #define isfinite(x) _finite(x)
143*6467f958SSadaf Ebrahimi #endif
144*6467f958SSadaf Ebrahimi 
145*6467f958SSadaf Ebrahimi #ifndef isnan
146*6467f958SSadaf Ebrahimi #define isnan(x) ((x) != (x))
147*6467f958SSadaf Ebrahimi #endif
148*6467f958SSadaf Ebrahimi 
149*6467f958SSadaf Ebrahimi #ifndef isinf
150*6467f958SSadaf Ebrahimi #define isinf(_x) ((_x) == INFINITY || (_x) == -INFINITY)
151*6467f958SSadaf Ebrahimi #endif
152*6467f958SSadaf Ebrahimi 
153*6467f958SSadaf Ebrahimi #if _MSC_VER < 1900 && !defined(__INTEL_COMPILER)
154*6467f958SSadaf Ebrahimi 
155*6467f958SSadaf Ebrahimi double rint(double x);
156*6467f958SSadaf Ebrahimi float rintf(float x);
157*6467f958SSadaf Ebrahimi long double rintl(long double x);
158*6467f958SSadaf Ebrahimi 
159*6467f958SSadaf Ebrahimi float cbrtf(float);
160*6467f958SSadaf Ebrahimi double cbrt(double);
161*6467f958SSadaf Ebrahimi 
162*6467f958SSadaf Ebrahimi int ilogb(double x);
163*6467f958SSadaf Ebrahimi int ilogbf(float x);
164*6467f958SSadaf Ebrahimi int ilogbl(long double x);
165*6467f958SSadaf Ebrahimi 
166*6467f958SSadaf Ebrahimi double fmax(double x, double y);
167*6467f958SSadaf Ebrahimi double fmin(double x, double y);
168*6467f958SSadaf Ebrahimi float fmaxf(float x, float y);
169*6467f958SSadaf Ebrahimi float fminf(float x, float y);
170*6467f958SSadaf Ebrahimi 
171*6467f958SSadaf Ebrahimi double log2(double x);
172*6467f958SSadaf Ebrahimi long double log2l(long double x);
173*6467f958SSadaf Ebrahimi 
174*6467f958SSadaf Ebrahimi double exp2(double x);
175*6467f958SSadaf Ebrahimi long double exp2l(long double x);
176*6467f958SSadaf Ebrahimi 
177*6467f958SSadaf Ebrahimi double fdim(double x, double y);
178*6467f958SSadaf Ebrahimi float fdimf(float x, float y);
179*6467f958SSadaf Ebrahimi long double fdiml(long double x, long double y);
180*6467f958SSadaf Ebrahimi 
181*6467f958SSadaf Ebrahimi double remquo(double x, double y, int* quo);
182*6467f958SSadaf Ebrahimi float remquof(float x, float y, int* quo);
183*6467f958SSadaf Ebrahimi long double remquol(long double x, long double y, int* quo);
184*6467f958SSadaf Ebrahimi 
185*6467f958SSadaf Ebrahimi long double scalblnl(long double x, long n);
186*6467f958SSadaf Ebrahimi 
187*6467f958SSadaf Ebrahimi float hypotf(float x, float y);
188*6467f958SSadaf Ebrahimi long double hypotl(long double x, long double y);
189*6467f958SSadaf Ebrahimi double lgamma(double x);
190*6467f958SSadaf Ebrahimi float lgammaf(float x);
191*6467f958SSadaf Ebrahimi 
192*6467f958SSadaf Ebrahimi double trunc(double x);
193*6467f958SSadaf Ebrahimi float truncf(float x);
194*6467f958SSadaf Ebrahimi 
195*6467f958SSadaf Ebrahimi double log1p(double x);
196*6467f958SSadaf Ebrahimi float log1pf(float x);
197*6467f958SSadaf Ebrahimi long double log1pl(long double x);
198*6467f958SSadaf Ebrahimi 
199*6467f958SSadaf Ebrahimi double copysign(double x, double y);
200*6467f958SSadaf Ebrahimi float copysignf(float x, float y);
201*6467f958SSadaf Ebrahimi long double copysignl(long double x, long double y);
202*6467f958SSadaf Ebrahimi 
203*6467f958SSadaf Ebrahimi long lround(double x);
204*6467f958SSadaf Ebrahimi long lroundf(float x);
205*6467f958SSadaf Ebrahimi // long lroundl(long double x)
206*6467f958SSadaf Ebrahimi 
207*6467f958SSadaf Ebrahimi double round(double x);
208*6467f958SSadaf Ebrahimi float roundf(float x);
209*6467f958SSadaf Ebrahimi long double roundl(long double x);
210*6467f958SSadaf Ebrahimi 
211*6467f958SSadaf Ebrahimi int cf_signbit(double x);
212*6467f958SSadaf Ebrahimi int cf_signbitf(float x);
213*6467f958SSadaf Ebrahimi 
214*6467f958SSadaf Ebrahimi // Added in _MSC_VER == 1800 (Visual Studio 2013)
215*6467f958SSadaf Ebrahimi #if _MSC_VER < 1800
signbit(double x)216*6467f958SSadaf Ebrahimi static int signbit(double x) { return cf_signbit(x); }
217*6467f958SSadaf Ebrahimi #endif
signbitf(float x)218*6467f958SSadaf Ebrahimi static int signbitf(float x) { return cf_signbitf(x); }
219*6467f958SSadaf Ebrahimi 
220*6467f958SSadaf Ebrahimi long int lrint(double flt);
221*6467f958SSadaf Ebrahimi long int lrintf(float flt);
222*6467f958SSadaf Ebrahimi 
223*6467f958SSadaf Ebrahimi float int2float(int32_t ix);
224*6467f958SSadaf Ebrahimi int32_t float2int(float fx);
225*6467f958SSadaf Ebrahimi 
226*6467f958SSadaf Ebrahimi #endif // _MSC_VER < 1900 && ! defined( __INTEL_COMPILER )
227*6467f958SSadaf Ebrahimi 
228*6467f958SSadaf Ebrahimi #if _MSC_VER < 1900 && (!defined(__INTEL_COMPILER) || __INTEL_COMPILER < 1300)
229*6467f958SSadaf Ebrahimi // These functions appeared in Intel C v13 and Visual Studio 2015
230*6467f958SSadaf Ebrahimi float nanf(const char* str);
231*6467f958SSadaf Ebrahimi double nan(const char* str);
232*6467f958SSadaf Ebrahimi long double nanl(const char* str);
233*6467f958SSadaf Ebrahimi #endif
234*6467f958SSadaf Ebrahimi 
235*6467f958SSadaf Ebrahimi #ifdef __cplusplus
236*6467f958SSadaf Ebrahimi }
237*6467f958SSadaf Ebrahimi #endif
238*6467f958SSadaf Ebrahimi 
239*6467f958SSadaf Ebrahimi #endif // defined(_MSC_VER)
240*6467f958SSadaf Ebrahimi 
241*6467f958SSadaf Ebrahimi #if defined(__ANDROID__)
242*6467f958SSadaf Ebrahimi #define log2(X) (log(X) / log(2))
243*6467f958SSadaf Ebrahimi #endif
244*6467f958SSadaf Ebrahimi 
245*6467f958SSadaf Ebrahimi 
246*6467f958SSadaf Ebrahimi //
247*6467f958SSadaf Ebrahimi // stdio.h
248*6467f958SSadaf Ebrahimi //
249*6467f958SSadaf Ebrahimi 
250*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)
251*6467f958SSadaf Ebrahimi // snprintf added in _MSC_VER == 1900 (Visual Studio 2015)
252*6467f958SSadaf Ebrahimi #if _MSC_VER < 1900
253*6467f958SSadaf Ebrahimi #define snprintf sprintf_s
254*6467f958SSadaf Ebrahimi #endif
255*6467f958SSadaf Ebrahimi #endif // defined(_MSC_VER)
256*6467f958SSadaf Ebrahimi 
257*6467f958SSadaf Ebrahimi 
258*6467f958SSadaf Ebrahimi //
259*6467f958SSadaf Ebrahimi // string.h
260*6467f958SSadaf Ebrahimi //
261*6467f958SSadaf Ebrahimi 
262*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)
263*6467f958SSadaf Ebrahimi #define strtok_r strtok_s
264*6467f958SSadaf Ebrahimi #endif
265*6467f958SSadaf Ebrahimi 
266*6467f958SSadaf Ebrahimi 
267*6467f958SSadaf Ebrahimi //
268*6467f958SSadaf Ebrahimi // unistd.h
269*6467f958SSadaf Ebrahimi //
270*6467f958SSadaf Ebrahimi 
271*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)
272*6467f958SSadaf Ebrahimi EXTERN_C unsigned int sleep(unsigned int sec);
273*6467f958SSadaf Ebrahimi EXTERN_C int usleep(int usec);
274*6467f958SSadaf Ebrahimi #endif
275*6467f958SSadaf Ebrahimi 
276*6467f958SSadaf Ebrahimi 
277*6467f958SSadaf Ebrahimi //
278*6467f958SSadaf Ebrahimi // syscall.h
279*6467f958SSadaf Ebrahimi //
280*6467f958SSadaf Ebrahimi 
281*6467f958SSadaf Ebrahimi #if defined(__ANDROID__)
282*6467f958SSadaf Ebrahimi // Android bionic's isn't providing SYS_sysctl wrappers.
283*6467f958SSadaf Ebrahimi #define SYS__sysctl __NR__sysctl
284*6467f958SSadaf Ebrahimi #endif
285*6467f958SSadaf Ebrahimi 
286*6467f958SSadaf Ebrahimi 
287*6467f958SSadaf Ebrahimi // Some tests use _malloca which defined in malloc.h.
288*6467f958SSadaf Ebrahimi #if !defined(__APPLE__)
289*6467f958SSadaf Ebrahimi #include <malloc.h>
290*6467f958SSadaf Ebrahimi #endif
291*6467f958SSadaf Ebrahimi 
292*6467f958SSadaf Ebrahimi 
293*6467f958SSadaf Ebrahimi //
294*6467f958SSadaf Ebrahimi // ???
295*6467f958SSadaf Ebrahimi //
296*6467f958SSadaf Ebrahimi 
297*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)
298*6467f958SSadaf Ebrahimi 
299*6467f958SSadaf Ebrahimi #define MAXPATHLEN _MAX_PATH
300*6467f958SSadaf Ebrahimi 
301*6467f958SSadaf Ebrahimi EXTERN_C uint64_t ReadTime(void);
302*6467f958SSadaf Ebrahimi EXTERN_C double SubtractTime(uint64_t endTime, uint64_t startTime);
303*6467f958SSadaf Ebrahimi 
304*6467f958SSadaf Ebrahimi /** Returns the number of leading 0-bits in x,
305*6467f958SSadaf Ebrahimi     starting at the most significant bit position.
306*6467f958SSadaf Ebrahimi     If x is 0, the result is undefined.
307*6467f958SSadaf Ebrahimi */
308*6467f958SSadaf Ebrahimi EXTERN_C int __builtin_clz(unsigned int pattern);
309*6467f958SSadaf Ebrahimi 
310*6467f958SSadaf Ebrahimi #endif
311*6467f958SSadaf Ebrahimi 
312*6467f958SSadaf Ebrahimi 
313*6467f958SSadaf Ebrahimi /*-----------------------------------------------------------------------------
314*6467f958SSadaf Ebrahimi    WARNING: DO NOT USE THESE MACROS:
315*6467f958SSadaf Ebrahimi         MAKE_HEX_FLOAT, MAKE_HEX_DOUBLE, MAKE_HEX_LONG.
316*6467f958SSadaf Ebrahimi 
317*6467f958SSadaf Ebrahimi    This is a typical usage of the macros:
318*6467f958SSadaf Ebrahimi 
319*6467f958SSadaf Ebrahimi      double yhi = MAKE_HEX_DOUBLE(0x1.5555555555555p-2,0x15555555555555LL,-2);
320*6467f958SSadaf Ebrahimi 
321*6467f958SSadaf Ebrahimi    (taken from math_brute_force/reference_math.c). There are two problems:
322*6467f958SSadaf Ebrahimi 
323*6467f958SSadaf Ebrahimi      1. There is an error here. On Windows in will produce incorrect result
324*6467f958SSadaf Ebrahimi         `0x1.5555555555555p+50'.
325*6467f958SSadaf Ebrahimi         To have a correct result it should be written as:
326*6467f958SSadaf Ebrahimi            MAKE_HEX_DOUBLE(0x1.5555555555555p-2, 0x15555555555555LL, -54)
327*6467f958SSadaf Ebrahimi         A proper value of the third argument is not obvious -- sometimes it
328*6467f958SSadaf Ebrahimi         should be the same as exponent of the first argument, but sometimes
329*6467f958SSadaf Ebrahimi         not.
330*6467f958SSadaf Ebrahimi 
331*6467f958SSadaf Ebrahimi      2. Information is duplicated. It is easy to make a mistake.
332*6467f958SSadaf Ebrahimi 
333*6467f958SSadaf Ebrahimi    Use HEX_FLT, HEX_DBL, HEX_LDBL macros instead
334*6467f958SSadaf Ebrahimi    (see them in the bottom of the file).
335*6467f958SSadaf Ebrahimi -----------------------------------------------------------------------------*/
336*6467f958SSadaf Ebrahimi #if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
337*6467f958SSadaf Ebrahimi 
338*6467f958SSadaf Ebrahimi #define MAKE_HEX_FLOAT(x, y, z) ((float)ldexp((float)(y), z))
339*6467f958SSadaf Ebrahimi #define MAKE_HEX_DOUBLE(x, y, z) ldexp((double)(y), z)
340*6467f958SSadaf Ebrahimi #define MAKE_HEX_LONG(x, y, z) ((long double)ldexp((long double)(y), z))
341*6467f958SSadaf Ebrahimi 
342*6467f958SSadaf Ebrahimi #else
343*6467f958SSadaf Ebrahimi 
344*6467f958SSadaf Ebrahimi // Do not use these macros in new code, use HEX_FLT, HEX_DBL, HEX_LDBL instead.
345*6467f958SSadaf Ebrahimi #define MAKE_HEX_FLOAT(x, y, z) x
346*6467f958SSadaf Ebrahimi #define MAKE_HEX_DOUBLE(x, y, z) x
347*6467f958SSadaf Ebrahimi #define MAKE_HEX_LONG(x, y, z) x
348*6467f958SSadaf Ebrahimi 
349*6467f958SSadaf Ebrahimi #endif
350*6467f958SSadaf Ebrahimi 
351*6467f958SSadaf Ebrahimi 
352*6467f958SSadaf Ebrahimi /*-----------------------------------------------------------------------------
353*6467f958SSadaf Ebrahimi    HEX_FLT, HEXT_DBL, HEX_LDBL -- Create hex floating point literal of type
354*6467f958SSadaf Ebrahimi    float, double, long double respectively. Arguments:
355*6467f958SSadaf Ebrahimi 
356*6467f958SSadaf Ebrahimi       sm    -- sign of number,
357*6467f958SSadaf Ebrahimi       int   -- integer part of mantissa (without `0x' prefix),
358*6467f958SSadaf Ebrahimi       fract -- fractional part of mantissa (without decimal point and `L' or
359*6467f958SSadaf Ebrahimi             `LL' suffixes),
360*6467f958SSadaf Ebrahimi       se    -- sign of exponent,
361*6467f958SSadaf Ebrahimi       exp   -- absolute value of (binary) exponent.
362*6467f958SSadaf Ebrahimi 
363*6467f958SSadaf Ebrahimi    Example:
364*6467f958SSadaf Ebrahimi 
365*6467f958SSadaf Ebrahimi       double yhi = HEX_DBL(+, 1, 5555555555555, -, 2); // 0x1.5555555555555p-2
366*6467f958SSadaf Ebrahimi 
367*6467f958SSadaf Ebrahimi    Note:
368*6467f958SSadaf Ebrahimi 
369*6467f958SSadaf Ebrahimi       We have to pass signs as separate arguments because gcc pass negative
370*6467f958SSadaf Ebrahimi    integer values (e. g. `-2') into a macro as two separate tokens, so
371*6467f958SSadaf Ebrahimi    `HEX_FLT(1, 0, -2)' produces result `0x1.0p- 2' (note a space between minus
372*6467f958SSadaf Ebrahimi    and two) which is not a correct floating point literal.
373*6467f958SSadaf Ebrahimi -----------------------------------------------------------------------------*/
374*6467f958SSadaf Ebrahimi #if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
375*6467f958SSadaf Ebrahimi // If compiler does not support hex floating point literals:
376*6467f958SSadaf Ebrahimi #define HEX_FLT(sm, int, fract, se, exp)                                       \
377*6467f958SSadaf Ebrahimi     sm ldexpf((float)(0x##int##fract##UL),                                     \
378*6467f958SSadaf Ebrahimi               se exp + ilogbf((float)0x##int)                                  \
379*6467f958SSadaf Ebrahimi                   - ilogbf((float)(0x##int##fract##UL)))
380*6467f958SSadaf Ebrahimi #define HEX_DBL(sm, int, fract, se, exp)                                       \
381*6467f958SSadaf Ebrahimi     sm ldexp((double)(0x##int##fract##ULL),                                    \
382*6467f958SSadaf Ebrahimi              se exp + ilogb((double)0x##int)                                   \
383*6467f958SSadaf Ebrahimi                  - ilogb((double)(0x##int##fract##ULL)))
384*6467f958SSadaf Ebrahimi #define HEX_LDBL(sm, int, fract, se, exp)                                      \
385*6467f958SSadaf Ebrahimi     sm ldexpl((long double)(0x##int##fract##ULL),                              \
386*6467f958SSadaf Ebrahimi               se exp + ilogbl((long double)0x##int)                            \
387*6467f958SSadaf Ebrahimi                   - ilogbl((long double)(0x##int##fract##ULL)))
388*6467f958SSadaf Ebrahimi #else
389*6467f958SSadaf Ebrahimi // If compiler supports hex floating point literals: just concatenate all the
390*6467f958SSadaf Ebrahimi // parts into a literal.
391*6467f958SSadaf Ebrahimi #define HEX_FLT(sm, int, fract, se, exp) sm 0x##int##.##fract##p##se##exp##F
392*6467f958SSadaf Ebrahimi #define HEX_DBL(sm, int, fract, se, exp) sm 0x##int##.##fract##p##se##exp
393*6467f958SSadaf Ebrahimi #define HEX_LDBL(sm, int, fract, se, exp) sm 0x##int##.##fract##p##se##exp##L
394*6467f958SSadaf Ebrahimi #endif
395*6467f958SSadaf Ebrahimi 
396*6467f958SSadaf Ebrahimi #if defined(__MINGW32__)
397*6467f958SSadaf Ebrahimi #include <Windows.h>
398*6467f958SSadaf Ebrahimi #define sleep(sec) Sleep((sec)*1000)
399*6467f958SSadaf Ebrahimi #endif
400*6467f958SSadaf Ebrahimi 
401*6467f958SSadaf Ebrahimi #endif // COMPAT_H_
402