xref: /aosp_15_r20/external/OpenCL-CTS/test_common/harness/msvc9.c (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 "compat.h"
17*6467f958SSadaf Ebrahimi 
18*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)
19*6467f958SSadaf Ebrahimi 
20*6467f958SSadaf Ebrahimi #include <limits.h>
21*6467f958SSadaf Ebrahimi #include <stdlib.h>
22*6467f958SSadaf Ebrahimi 
23*6467f958SSadaf Ebrahimi #include <CL/cl.h>
24*6467f958SSadaf Ebrahimi 
25*6467f958SSadaf Ebrahimi #include <windows.h>
26*6467f958SSadaf Ebrahimi 
27*6467f958SSadaf Ebrahimi #if _MSC_VER < 1900 && !defined(__INTEL_COMPILER)
28*6467f958SSadaf Ebrahimi 
29*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
30*6467f958SSadaf Ebrahimi //
31*6467f958SSadaf Ebrahimi //                   rint, rintf
32*6467f958SSadaf Ebrahimi //
33*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
34*6467f958SSadaf Ebrahimi 
copysignf(float x,float y)35*6467f958SSadaf Ebrahimi float copysignf(float x, float y)
36*6467f958SSadaf Ebrahimi {
37*6467f958SSadaf Ebrahimi     union {
38*6467f958SSadaf Ebrahimi         cl_uint u;
39*6467f958SSadaf Ebrahimi         float f;
40*6467f958SSadaf Ebrahimi     } ux, uy;
41*6467f958SSadaf Ebrahimi 
42*6467f958SSadaf Ebrahimi     ux.f = x;
43*6467f958SSadaf Ebrahimi     uy.f = y;
44*6467f958SSadaf Ebrahimi 
45*6467f958SSadaf Ebrahimi     ux.u = (ux.u & 0x7fffffffU) | (uy.u & 0x80000000U);
46*6467f958SSadaf Ebrahimi 
47*6467f958SSadaf Ebrahimi     return ux.f;
48*6467f958SSadaf Ebrahimi }
49*6467f958SSadaf Ebrahimi 
copysign(double x,double y)50*6467f958SSadaf Ebrahimi double copysign(double x, double y)
51*6467f958SSadaf Ebrahimi {
52*6467f958SSadaf Ebrahimi     union {
53*6467f958SSadaf Ebrahimi         cl_ulong u;
54*6467f958SSadaf Ebrahimi         double f;
55*6467f958SSadaf Ebrahimi     } ux, uy;
56*6467f958SSadaf Ebrahimi 
57*6467f958SSadaf Ebrahimi     ux.f = x;
58*6467f958SSadaf Ebrahimi     uy.f = y;
59*6467f958SSadaf Ebrahimi 
60*6467f958SSadaf Ebrahimi     ux.u = (ux.u & 0x7fffffffffffffffULL) | (uy.u & 0x8000000000000000ULL);
61*6467f958SSadaf Ebrahimi 
62*6467f958SSadaf Ebrahimi     return ux.f;
63*6467f958SSadaf Ebrahimi }
64*6467f958SSadaf Ebrahimi 
copysignl(long double x,long double y)65*6467f958SSadaf Ebrahimi long double copysignl(long double x, long double y)
66*6467f958SSadaf Ebrahimi {
67*6467f958SSadaf Ebrahimi     union {
68*6467f958SSadaf Ebrahimi         long double f;
69*6467f958SSadaf Ebrahimi         struct
70*6467f958SSadaf Ebrahimi         {
71*6467f958SSadaf Ebrahimi             cl_ulong m;
72*6467f958SSadaf Ebrahimi             cl_ushort sexp;
73*6467f958SSadaf Ebrahimi         } u;
74*6467f958SSadaf Ebrahimi     } ux, uy;
75*6467f958SSadaf Ebrahimi 
76*6467f958SSadaf Ebrahimi     ux.f = x;
77*6467f958SSadaf Ebrahimi     uy.f = y;
78*6467f958SSadaf Ebrahimi 
79*6467f958SSadaf Ebrahimi     ux.u.sexp = (ux.u.sexp & 0x7fff) | (uy.u.sexp & 0x8000);
80*6467f958SSadaf Ebrahimi 
81*6467f958SSadaf Ebrahimi     return ux.f;
82*6467f958SSadaf Ebrahimi }
83*6467f958SSadaf Ebrahimi 
rintf(float x)84*6467f958SSadaf Ebrahimi float rintf(float x)
85*6467f958SSadaf Ebrahimi {
86*6467f958SSadaf Ebrahimi     float absx = fabsf(x);
87*6467f958SSadaf Ebrahimi 
88*6467f958SSadaf Ebrahimi     if (absx < 8388608.0f /* 0x1.0p23f */)
89*6467f958SSadaf Ebrahimi     {
90*6467f958SSadaf Ebrahimi         float magic = copysignf(8388608.0f /* 0x1.0p23f */, x);
91*6467f958SSadaf Ebrahimi         float rounded = x + magic;
92*6467f958SSadaf Ebrahimi         rounded -= magic;
93*6467f958SSadaf Ebrahimi         x = copysignf(rounded, x);
94*6467f958SSadaf Ebrahimi     }
95*6467f958SSadaf Ebrahimi 
96*6467f958SSadaf Ebrahimi     return x;
97*6467f958SSadaf Ebrahimi }
98*6467f958SSadaf Ebrahimi 
rint(double x)99*6467f958SSadaf Ebrahimi double rint(double x)
100*6467f958SSadaf Ebrahimi {
101*6467f958SSadaf Ebrahimi     double absx = fabs(x);
102*6467f958SSadaf Ebrahimi 
103*6467f958SSadaf Ebrahimi     if (absx < 4503599627370496.0 /* 0x1.0p52f */)
104*6467f958SSadaf Ebrahimi     {
105*6467f958SSadaf Ebrahimi         double magic = copysign(4503599627370496.0 /* 0x1.0p52 */, x);
106*6467f958SSadaf Ebrahimi         double rounded = x + magic;
107*6467f958SSadaf Ebrahimi         rounded -= magic;
108*6467f958SSadaf Ebrahimi         x = copysign(rounded, x);
109*6467f958SSadaf Ebrahimi     }
110*6467f958SSadaf Ebrahimi 
111*6467f958SSadaf Ebrahimi     return x;
112*6467f958SSadaf Ebrahimi }
113*6467f958SSadaf Ebrahimi 
rintl(long double x)114*6467f958SSadaf Ebrahimi long double rintl(long double x)
115*6467f958SSadaf Ebrahimi {
116*6467f958SSadaf Ebrahimi     double absx = fabs(x);
117*6467f958SSadaf Ebrahimi 
118*6467f958SSadaf Ebrahimi     if (absx < 9223372036854775808.0L /* 0x1.0p64f */)
119*6467f958SSadaf Ebrahimi     {
120*6467f958SSadaf Ebrahimi         long double magic =
121*6467f958SSadaf Ebrahimi             copysignl(9223372036854775808.0L /* 0x1.0p63L */, x);
122*6467f958SSadaf Ebrahimi         long double rounded = x + magic;
123*6467f958SSadaf Ebrahimi         rounded -= magic;
124*6467f958SSadaf Ebrahimi         x = copysignl(rounded, x);
125*6467f958SSadaf Ebrahimi     }
126*6467f958SSadaf Ebrahimi 
127*6467f958SSadaf Ebrahimi     return x;
128*6467f958SSadaf Ebrahimi }
129*6467f958SSadaf Ebrahimi 
130*6467f958SSadaf Ebrahimi #if _MSC_VER < 1800
131*6467f958SSadaf Ebrahimi 
132*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
133*6467f958SSadaf Ebrahimi //
134*6467f958SSadaf Ebrahimi //                   ilogb, ilogbf, ilogbl
135*6467f958SSadaf Ebrahimi //
136*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
137*6467f958SSadaf Ebrahimi #ifndef FP_ILOGB0
138*6467f958SSadaf Ebrahimi #define FP_ILOGB0 INT_MIN
139*6467f958SSadaf Ebrahimi #endif
140*6467f958SSadaf Ebrahimi 
141*6467f958SSadaf Ebrahimi #ifndef FP_ILOGBNAN
142*6467f958SSadaf Ebrahimi #define FP_ILOGBNAN INT_MIN
143*6467f958SSadaf Ebrahimi #endif
144*6467f958SSadaf Ebrahimi 
ilogb(double x)145*6467f958SSadaf Ebrahimi int ilogb(double x)
146*6467f958SSadaf Ebrahimi {
147*6467f958SSadaf Ebrahimi     union {
148*6467f958SSadaf Ebrahimi         double f;
149*6467f958SSadaf Ebrahimi         cl_ulong u;
150*6467f958SSadaf Ebrahimi     } u;
151*6467f958SSadaf Ebrahimi     u.f = x;
152*6467f958SSadaf Ebrahimi 
153*6467f958SSadaf Ebrahimi     cl_ulong absx = u.u & CL_LONG_MAX;
154*6467f958SSadaf Ebrahimi     if (absx - 0x0001000000000000ULL
155*6467f958SSadaf Ebrahimi         >= 0x7ff0000000000000ULL - 0x0001000000000000ULL)
156*6467f958SSadaf Ebrahimi     {
157*6467f958SSadaf Ebrahimi         switch (absx)
158*6467f958SSadaf Ebrahimi         {
159*6467f958SSadaf Ebrahimi             case 0: return FP_ILOGB0;
160*6467f958SSadaf Ebrahimi             case 0x7ff0000000000000ULL: return INT_MAX;
161*6467f958SSadaf Ebrahimi             default:
162*6467f958SSadaf Ebrahimi                 if (absx > 0x7ff0000000000000ULL) return FP_ILOGBNAN;
163*6467f958SSadaf Ebrahimi 
164*6467f958SSadaf Ebrahimi                 // subnormal
165*6467f958SSadaf Ebrahimi                 u.u = absx | 0x3ff0000000000000ULL;
166*6467f958SSadaf Ebrahimi                 u.f -= 1.0;
167*6467f958SSadaf Ebrahimi                 return (u.u >> 52) - (1023 + 1022);
168*6467f958SSadaf Ebrahimi         }
169*6467f958SSadaf Ebrahimi     }
170*6467f958SSadaf Ebrahimi 
171*6467f958SSadaf Ebrahimi     return (absx >> 52) - 1023;
172*6467f958SSadaf Ebrahimi }
173*6467f958SSadaf Ebrahimi 
174*6467f958SSadaf Ebrahimi 
ilogbf(float x)175*6467f958SSadaf Ebrahimi int ilogbf(float x)
176*6467f958SSadaf Ebrahimi {
177*6467f958SSadaf Ebrahimi     union {
178*6467f958SSadaf Ebrahimi         float f;
179*6467f958SSadaf Ebrahimi         cl_uint u;
180*6467f958SSadaf Ebrahimi     } u;
181*6467f958SSadaf Ebrahimi     u.f = x;
182*6467f958SSadaf Ebrahimi 
183*6467f958SSadaf Ebrahimi     cl_uint absx = u.u & 0x7fffffff;
184*6467f958SSadaf Ebrahimi     if (absx - 0x00800000U >= 0x7f800000U - 0x00800000U)
185*6467f958SSadaf Ebrahimi     {
186*6467f958SSadaf Ebrahimi         switch (absx)
187*6467f958SSadaf Ebrahimi         {
188*6467f958SSadaf Ebrahimi             case 0: return FP_ILOGB0;
189*6467f958SSadaf Ebrahimi             case 0x7f800000U: return INT_MAX;
190*6467f958SSadaf Ebrahimi             default:
191*6467f958SSadaf Ebrahimi                 if (absx > 0x7f800000) return FP_ILOGBNAN;
192*6467f958SSadaf Ebrahimi 
193*6467f958SSadaf Ebrahimi                 // subnormal
194*6467f958SSadaf Ebrahimi                 u.u = absx | 0x3f800000U;
195*6467f958SSadaf Ebrahimi                 u.f -= 1.0f;
196*6467f958SSadaf Ebrahimi                 return (u.u >> 23) - (127 + 126);
197*6467f958SSadaf Ebrahimi         }
198*6467f958SSadaf Ebrahimi     }
199*6467f958SSadaf Ebrahimi 
200*6467f958SSadaf Ebrahimi     return (absx >> 23) - 127;
201*6467f958SSadaf Ebrahimi }
202*6467f958SSadaf Ebrahimi 
ilogbl(long double x)203*6467f958SSadaf Ebrahimi int ilogbl(long double x)
204*6467f958SSadaf Ebrahimi {
205*6467f958SSadaf Ebrahimi     union {
206*6467f958SSadaf Ebrahimi         long double f;
207*6467f958SSadaf Ebrahimi         struct
208*6467f958SSadaf Ebrahimi         {
209*6467f958SSadaf Ebrahimi             cl_ulong m;
210*6467f958SSadaf Ebrahimi             cl_ushort sexp;
211*6467f958SSadaf Ebrahimi         } u;
212*6467f958SSadaf Ebrahimi     } u;
213*6467f958SSadaf Ebrahimi     u.f = x;
214*6467f958SSadaf Ebrahimi 
215*6467f958SSadaf Ebrahimi     int exp = u.u.sexp & 0x7fff;
216*6467f958SSadaf Ebrahimi     if (0 == exp)
217*6467f958SSadaf Ebrahimi     {
218*6467f958SSadaf Ebrahimi         if (0 == u.u.m) return FP_ILOGB0;
219*6467f958SSadaf Ebrahimi 
220*6467f958SSadaf Ebrahimi         // subnormal
221*6467f958SSadaf Ebrahimi         u.u.sexp = 0x3fff;
222*6467f958SSadaf Ebrahimi         u.f -= 1.0f;
223*6467f958SSadaf Ebrahimi         exp = u.u.sexp & 0x7fff;
224*6467f958SSadaf Ebrahimi 
225*6467f958SSadaf Ebrahimi         return exp - (0x3fff + 0x3ffe);
226*6467f958SSadaf Ebrahimi     }
227*6467f958SSadaf Ebrahimi     else if (0x7fff == exp)
228*6467f958SSadaf Ebrahimi     {
229*6467f958SSadaf Ebrahimi         if (u.u.m & CL_LONG_MAX) return FP_ILOGBNAN;
230*6467f958SSadaf Ebrahimi 
231*6467f958SSadaf Ebrahimi         return INT_MAX;
232*6467f958SSadaf Ebrahimi     }
233*6467f958SSadaf Ebrahimi 
234*6467f958SSadaf Ebrahimi     return exp - 0x3fff;
235*6467f958SSadaf Ebrahimi }
236*6467f958SSadaf Ebrahimi 
237*6467f958SSadaf Ebrahimi #endif // _MSC_VER < 1800
238*6467f958SSadaf Ebrahimi 
239*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
240*6467f958SSadaf Ebrahimi //
241*6467f958SSadaf Ebrahimi //                 fmax, fmin, fmaxf, fminf
242*6467f958SSadaf Ebrahimi //
243*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
244*6467f958SSadaf Ebrahimi 
GET_BITS_SP32(float fx,unsigned int * ux)245*6467f958SSadaf Ebrahimi static void GET_BITS_SP32(float fx, unsigned int* ux)
246*6467f958SSadaf Ebrahimi {
247*6467f958SSadaf Ebrahimi     volatile union {
248*6467f958SSadaf Ebrahimi         float f;
249*6467f958SSadaf Ebrahimi         unsigned int u;
250*6467f958SSadaf Ebrahimi     } _bitsy;
251*6467f958SSadaf Ebrahimi     _bitsy.f = (fx);
252*6467f958SSadaf Ebrahimi     *ux = _bitsy.u;
253*6467f958SSadaf Ebrahimi }
254*6467f958SSadaf Ebrahimi /* static void GET_BITS_SP32(float fx, unsigned int* ux) */
255*6467f958SSadaf Ebrahimi /* { */
256*6467f958SSadaf Ebrahimi /*     volatile union {float f; unsigned int i;} _bitsy; */
257*6467f958SSadaf Ebrahimi /*     _bitsy.f = (fx); */
258*6467f958SSadaf Ebrahimi /*     *ux = _bitsy.i; */
259*6467f958SSadaf Ebrahimi /* } */
PUT_BITS_SP32(unsigned int ux,float * fx)260*6467f958SSadaf Ebrahimi static void PUT_BITS_SP32(unsigned int ux, float* fx)
261*6467f958SSadaf Ebrahimi {
262*6467f958SSadaf Ebrahimi     volatile union {
263*6467f958SSadaf Ebrahimi         float f;
264*6467f958SSadaf Ebrahimi         unsigned int u;
265*6467f958SSadaf Ebrahimi     } _bitsy;
266*6467f958SSadaf Ebrahimi     _bitsy.u = (ux);
267*6467f958SSadaf Ebrahimi     *fx = _bitsy.f;
268*6467f958SSadaf Ebrahimi }
269*6467f958SSadaf Ebrahimi /* static void PUT_BITS_SP32(unsigned int ux, float* fx) */
270*6467f958SSadaf Ebrahimi /* { */
271*6467f958SSadaf Ebrahimi /*     volatile union {float f; unsigned int i;} _bitsy; */
272*6467f958SSadaf Ebrahimi /*     _bitsy.i = (ux); */
273*6467f958SSadaf Ebrahimi /*     *fx = _bitsy.f; */
274*6467f958SSadaf Ebrahimi /* } */
GET_BITS_DP64(double dx,unsigned __int64 * lx)275*6467f958SSadaf Ebrahimi static void GET_BITS_DP64(double dx, unsigned __int64* lx)
276*6467f958SSadaf Ebrahimi {
277*6467f958SSadaf Ebrahimi     volatile union {
278*6467f958SSadaf Ebrahimi         double d;
279*6467f958SSadaf Ebrahimi         unsigned __int64 l;
280*6467f958SSadaf Ebrahimi     } _bitsy;
281*6467f958SSadaf Ebrahimi     _bitsy.d = (dx);
282*6467f958SSadaf Ebrahimi     *lx = _bitsy.l;
283*6467f958SSadaf Ebrahimi }
PUT_BITS_DP64(unsigned __int64 lx,double * dx)284*6467f958SSadaf Ebrahimi static void PUT_BITS_DP64(unsigned __int64 lx, double* dx)
285*6467f958SSadaf Ebrahimi {
286*6467f958SSadaf Ebrahimi     volatile union {
287*6467f958SSadaf Ebrahimi         double d;
288*6467f958SSadaf Ebrahimi         unsigned __int64 l;
289*6467f958SSadaf Ebrahimi     } _bitsy;
290*6467f958SSadaf Ebrahimi     _bitsy.l = (lx);
291*6467f958SSadaf Ebrahimi     *dx = _bitsy.d;
292*6467f958SSadaf Ebrahimi }
293*6467f958SSadaf Ebrahimi 
294*6467f958SSadaf Ebrahimi #if 0
295*6467f958SSadaf Ebrahimi int SIGNBIT_DP64(double x )
296*6467f958SSadaf Ebrahimi {
297*6467f958SSadaf Ebrahimi     int hx;
298*6467f958SSadaf Ebrahimi     _GET_HIGH_WORD(hx,x);
299*6467f958SSadaf Ebrahimi     return((hx>>31));
300*6467f958SSadaf Ebrahimi }
301*6467f958SSadaf Ebrahimi #endif
302*6467f958SSadaf Ebrahimi 
303*6467f958SSadaf Ebrahimi #if _MSC_VER < 1900
304*6467f958SSadaf Ebrahimi 
305*6467f958SSadaf Ebrahimi /* fmax(x, y) returns the larger (more positive) of x and y.
306*6467f958SSadaf Ebrahimi    NaNs are treated as missing values: if one argument is NaN,
307*6467f958SSadaf Ebrahimi    the other argument is returned. If both arguments are NaN,
308*6467f958SSadaf Ebrahimi    the first argument is returned. */
309*6467f958SSadaf Ebrahimi 
310*6467f958SSadaf Ebrahimi /* This works so long as the compiler knows that (x != x) means
311*6467f958SSadaf Ebrahimi    that x is NaN; gcc does. */
fmax(double x,double y)312*6467f958SSadaf Ebrahimi double fmax(double x, double y)
313*6467f958SSadaf Ebrahimi {
314*6467f958SSadaf Ebrahimi     if (isnan(y)) return x;
315*6467f958SSadaf Ebrahimi 
316*6467f958SSadaf Ebrahimi     return x >= y ? x : y;
317*6467f958SSadaf Ebrahimi }
318*6467f958SSadaf Ebrahimi 
319*6467f958SSadaf Ebrahimi 
320*6467f958SSadaf Ebrahimi /* fmin(x, y) returns the smaller (more negative) of x and y.
321*6467f958SSadaf Ebrahimi    NaNs are treated as missing values: if one argument is NaN,
322*6467f958SSadaf Ebrahimi    the other argument is returned. If both arguments are NaN,
323*6467f958SSadaf Ebrahimi    the first argument is returned. */
324*6467f958SSadaf Ebrahimi 
fmin(double x,double y)325*6467f958SSadaf Ebrahimi double fmin(double x, double y)
326*6467f958SSadaf Ebrahimi {
327*6467f958SSadaf Ebrahimi     if (isnan(y)) return x;
328*6467f958SSadaf Ebrahimi 
329*6467f958SSadaf Ebrahimi     return x <= y ? x : y;
330*6467f958SSadaf Ebrahimi }
331*6467f958SSadaf Ebrahimi 
332*6467f958SSadaf Ebrahimi 
fmaxf(float x,float y)333*6467f958SSadaf Ebrahimi float fmaxf(float x, float y)
334*6467f958SSadaf Ebrahimi {
335*6467f958SSadaf Ebrahimi     if (isnan(y)) return x;
336*6467f958SSadaf Ebrahimi 
337*6467f958SSadaf Ebrahimi     return x >= y ? x : y;
338*6467f958SSadaf Ebrahimi }
339*6467f958SSadaf Ebrahimi 
340*6467f958SSadaf Ebrahimi /* fminf(x, y) returns the smaller (more negative) of x and y.
341*6467f958SSadaf Ebrahimi    NaNs are treated as missing values: if one argument is NaN,
342*6467f958SSadaf Ebrahimi    the other argument is returned. If both arguments are NaN,
343*6467f958SSadaf Ebrahimi    the first argument is returned. */
344*6467f958SSadaf Ebrahimi 
fminf(float x,float y)345*6467f958SSadaf Ebrahimi float fminf(float x, float y)
346*6467f958SSadaf Ebrahimi {
347*6467f958SSadaf Ebrahimi     if (isnan(y)) return x;
348*6467f958SSadaf Ebrahimi 
349*6467f958SSadaf Ebrahimi     return x <= y ? x : y;
350*6467f958SSadaf Ebrahimi }
351*6467f958SSadaf Ebrahimi 
scalblnl(long double x,long n)352*6467f958SSadaf Ebrahimi long double scalblnl(long double x, long n)
353*6467f958SSadaf Ebrahimi {
354*6467f958SSadaf Ebrahimi     union {
355*6467f958SSadaf Ebrahimi         long double d;
356*6467f958SSadaf Ebrahimi         struct
357*6467f958SSadaf Ebrahimi         {
358*6467f958SSadaf Ebrahimi             cl_ulong m;
359*6467f958SSadaf Ebrahimi             cl_ushort sexp;
360*6467f958SSadaf Ebrahimi         } u;
361*6467f958SSadaf Ebrahimi     } u;
362*6467f958SSadaf Ebrahimi     u.u.m = CL_LONG_MIN;
363*6467f958SSadaf Ebrahimi 
364*6467f958SSadaf Ebrahimi     if (x == 0.0L || n < -2200) return copysignl(0.0L, x);
365*6467f958SSadaf Ebrahimi 
366*6467f958SSadaf Ebrahimi     if (n > 2200) return INFINITY;
367*6467f958SSadaf Ebrahimi 
368*6467f958SSadaf Ebrahimi     if (n < 0)
369*6467f958SSadaf Ebrahimi     {
370*6467f958SSadaf Ebrahimi         u.u.sexp = 0x3fff - 1022;
371*6467f958SSadaf Ebrahimi         while (n <= -1022)
372*6467f958SSadaf Ebrahimi         {
373*6467f958SSadaf Ebrahimi             x *= u.d;
374*6467f958SSadaf Ebrahimi             n += 1022;
375*6467f958SSadaf Ebrahimi         }
376*6467f958SSadaf Ebrahimi         u.u.sexp = 0x3fff + n;
377*6467f958SSadaf Ebrahimi         x *= u.d;
378*6467f958SSadaf Ebrahimi         return x;
379*6467f958SSadaf Ebrahimi     }
380*6467f958SSadaf Ebrahimi 
381*6467f958SSadaf Ebrahimi     if (n > 0)
382*6467f958SSadaf Ebrahimi     {
383*6467f958SSadaf Ebrahimi         u.u.sexp = 0x3fff + 1023;
384*6467f958SSadaf Ebrahimi         while (n >= 1023)
385*6467f958SSadaf Ebrahimi         {
386*6467f958SSadaf Ebrahimi             x *= u.d;
387*6467f958SSadaf Ebrahimi             n -= 1023;
388*6467f958SSadaf Ebrahimi         }
389*6467f958SSadaf Ebrahimi         u.u.sexp = 0x3fff + n;
390*6467f958SSadaf Ebrahimi         x *= u.d;
391*6467f958SSadaf Ebrahimi         return x;
392*6467f958SSadaf Ebrahimi     }
393*6467f958SSadaf Ebrahimi 
394*6467f958SSadaf Ebrahimi     return x;
395*6467f958SSadaf Ebrahimi }
396*6467f958SSadaf Ebrahimi 
397*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
398*6467f958SSadaf Ebrahimi //
399*6467f958SSadaf Ebrahimi //                          log2
400*6467f958SSadaf Ebrahimi //
401*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
402*6467f958SSadaf Ebrahimi const static cl_double log_e_base2 = 1.4426950408889634074;
403*6467f958SSadaf Ebrahimi const static cl_double log_10_base2 = 3.3219280948873623478;
404*6467f958SSadaf Ebrahimi 
405*6467f958SSadaf Ebrahimi // double log10(double x);
406*6467f958SSadaf Ebrahimi 
log2(double x)407*6467f958SSadaf Ebrahimi double log2(double x) { return 1.44269504088896340735992468100189214 * log(x); }
408*6467f958SSadaf Ebrahimi 
log2l(long double x)409*6467f958SSadaf Ebrahimi long double log2l(long double x)
410*6467f958SSadaf Ebrahimi {
411*6467f958SSadaf Ebrahimi     return 1.44269504088896340735992468100189214L * log(x);
412*6467f958SSadaf Ebrahimi }
413*6467f958SSadaf Ebrahimi 
trunc(double x)414*6467f958SSadaf Ebrahimi double trunc(double x)
415*6467f958SSadaf Ebrahimi {
416*6467f958SSadaf Ebrahimi     double absx = fabs(x);
417*6467f958SSadaf Ebrahimi 
418*6467f958SSadaf Ebrahimi     if (absx < 4503599627370496.0 /* 0x1.0p52f */)
419*6467f958SSadaf Ebrahimi     {
420*6467f958SSadaf Ebrahimi         cl_long rounded = x;
421*6467f958SSadaf Ebrahimi         x = copysign((double)rounded, x);
422*6467f958SSadaf Ebrahimi     }
423*6467f958SSadaf Ebrahimi 
424*6467f958SSadaf Ebrahimi     return x;
425*6467f958SSadaf Ebrahimi }
426*6467f958SSadaf Ebrahimi 
truncf(float x)427*6467f958SSadaf Ebrahimi float truncf(float x)
428*6467f958SSadaf Ebrahimi {
429*6467f958SSadaf Ebrahimi     float absx = fabsf(x);
430*6467f958SSadaf Ebrahimi 
431*6467f958SSadaf Ebrahimi     if (absx < 8388608.0f /* 0x1.0p23f */)
432*6467f958SSadaf Ebrahimi     {
433*6467f958SSadaf Ebrahimi         cl_int rounded = x;
434*6467f958SSadaf Ebrahimi         x = copysignf((float)rounded, x);
435*6467f958SSadaf Ebrahimi     }
436*6467f958SSadaf Ebrahimi 
437*6467f958SSadaf Ebrahimi     return x;
438*6467f958SSadaf Ebrahimi }
439*6467f958SSadaf Ebrahimi 
lround(double x)440*6467f958SSadaf Ebrahimi long lround(double x)
441*6467f958SSadaf Ebrahimi {
442*6467f958SSadaf Ebrahimi     double absx = fabs(x);
443*6467f958SSadaf Ebrahimi 
444*6467f958SSadaf Ebrahimi     if (absx < 0.5) return 0;
445*6467f958SSadaf Ebrahimi 
446*6467f958SSadaf Ebrahimi     if (absx < 4503599627370496.0 /* 0x1.0p52 */)
447*6467f958SSadaf Ebrahimi     {
448*6467f958SSadaf Ebrahimi         absx += 0.5;
449*6467f958SSadaf Ebrahimi         cl_long rounded = absx;
450*6467f958SSadaf Ebrahimi         absx = rounded;
451*6467f958SSadaf Ebrahimi         x = copysign(absx, x);
452*6467f958SSadaf Ebrahimi     }
453*6467f958SSadaf Ebrahimi 
454*6467f958SSadaf Ebrahimi     if (x >= (double)LONG_MAX) return LONG_MAX;
455*6467f958SSadaf Ebrahimi 
456*6467f958SSadaf Ebrahimi     return (long)x;
457*6467f958SSadaf Ebrahimi }
458*6467f958SSadaf Ebrahimi 
lroundf(float x)459*6467f958SSadaf Ebrahimi long lroundf(float x)
460*6467f958SSadaf Ebrahimi {
461*6467f958SSadaf Ebrahimi     float absx = fabsf(x);
462*6467f958SSadaf Ebrahimi 
463*6467f958SSadaf Ebrahimi     if (absx < 0.5f) return 0;
464*6467f958SSadaf Ebrahimi 
465*6467f958SSadaf Ebrahimi     if (absx < 8388608.0f)
466*6467f958SSadaf Ebrahimi     {
467*6467f958SSadaf Ebrahimi         absx += 0.5f;
468*6467f958SSadaf Ebrahimi         cl_int rounded = absx;
469*6467f958SSadaf Ebrahimi         absx = rounded;
470*6467f958SSadaf Ebrahimi         x = copysignf(absx, x);
471*6467f958SSadaf Ebrahimi     }
472*6467f958SSadaf Ebrahimi 
473*6467f958SSadaf Ebrahimi     if (x >= (float)LONG_MAX) return LONG_MAX;
474*6467f958SSadaf Ebrahimi 
475*6467f958SSadaf Ebrahimi     return (long)x;
476*6467f958SSadaf Ebrahimi }
477*6467f958SSadaf Ebrahimi 
round(double x)478*6467f958SSadaf Ebrahimi double round(double x)
479*6467f958SSadaf Ebrahimi {
480*6467f958SSadaf Ebrahimi     double absx = fabs(x);
481*6467f958SSadaf Ebrahimi 
482*6467f958SSadaf Ebrahimi     if (absx < 0.5) return copysign(0.0, x);
483*6467f958SSadaf Ebrahimi 
484*6467f958SSadaf Ebrahimi     if (absx < 4503599627370496.0 /* 0x1.0p52 */)
485*6467f958SSadaf Ebrahimi     {
486*6467f958SSadaf Ebrahimi         absx += 0.5;
487*6467f958SSadaf Ebrahimi         cl_long rounded = absx;
488*6467f958SSadaf Ebrahimi         absx = rounded;
489*6467f958SSadaf Ebrahimi         x = copysign(absx, x);
490*6467f958SSadaf Ebrahimi     }
491*6467f958SSadaf Ebrahimi 
492*6467f958SSadaf Ebrahimi     return x;
493*6467f958SSadaf Ebrahimi }
494*6467f958SSadaf Ebrahimi 
roundf(float x)495*6467f958SSadaf Ebrahimi float roundf(float x)
496*6467f958SSadaf Ebrahimi {
497*6467f958SSadaf Ebrahimi     float absx = fabsf(x);
498*6467f958SSadaf Ebrahimi 
499*6467f958SSadaf Ebrahimi     if (absx < 0.5f) return copysignf(0.0f, x);
500*6467f958SSadaf Ebrahimi 
501*6467f958SSadaf Ebrahimi     if (absx < 8388608.0f)
502*6467f958SSadaf Ebrahimi     {
503*6467f958SSadaf Ebrahimi         absx += 0.5f;
504*6467f958SSadaf Ebrahimi         cl_int rounded = absx;
505*6467f958SSadaf Ebrahimi         absx = rounded;
506*6467f958SSadaf Ebrahimi         x = copysignf(absx, x);
507*6467f958SSadaf Ebrahimi     }
508*6467f958SSadaf Ebrahimi 
509*6467f958SSadaf Ebrahimi     return x;
510*6467f958SSadaf Ebrahimi }
511*6467f958SSadaf Ebrahimi 
roundl(long double x)512*6467f958SSadaf Ebrahimi long double roundl(long double x)
513*6467f958SSadaf Ebrahimi {
514*6467f958SSadaf Ebrahimi     long double absx = fabsl(x);
515*6467f958SSadaf Ebrahimi 
516*6467f958SSadaf Ebrahimi     if (absx < 0.5L) return copysignl(0.0L, x);
517*6467f958SSadaf Ebrahimi 
518*6467f958SSadaf Ebrahimi     if (absx < 9223372036854775808.0L /*0x1.0p63L*/)
519*6467f958SSadaf Ebrahimi     {
520*6467f958SSadaf Ebrahimi         absx += 0.5L;
521*6467f958SSadaf Ebrahimi         cl_ulong rounded = absx;
522*6467f958SSadaf Ebrahimi         absx = rounded;
523*6467f958SSadaf Ebrahimi         x = copysignl(absx, x);
524*6467f958SSadaf Ebrahimi     }
525*6467f958SSadaf Ebrahimi 
526*6467f958SSadaf Ebrahimi     return x;
527*6467f958SSadaf Ebrahimi }
528*6467f958SSadaf Ebrahimi 
cbrtf(float x)529*6467f958SSadaf Ebrahimi float cbrtf(float x)
530*6467f958SSadaf Ebrahimi {
531*6467f958SSadaf Ebrahimi     float z = pow(fabs((double)x), 1.0 / 3.0);
532*6467f958SSadaf Ebrahimi     return copysignf(z, x);
533*6467f958SSadaf Ebrahimi }
534*6467f958SSadaf Ebrahimi 
cbrt(double x)535*6467f958SSadaf Ebrahimi double cbrt(double x) { return copysign(pow(fabs(x), 1.0 / 3.0), x); }
536*6467f958SSadaf Ebrahimi 
lrint(double x)537*6467f958SSadaf Ebrahimi long int lrint(double x)
538*6467f958SSadaf Ebrahimi {
539*6467f958SSadaf Ebrahimi     double absx = fabs(x);
540*6467f958SSadaf Ebrahimi 
541*6467f958SSadaf Ebrahimi     if (x >= (double)LONG_MAX) return LONG_MAX;
542*6467f958SSadaf Ebrahimi 
543*6467f958SSadaf Ebrahimi     if (absx < 4503599627370496.0 /* 0x1.0p52 */)
544*6467f958SSadaf Ebrahimi     {
545*6467f958SSadaf Ebrahimi         double magic = copysign(4503599627370496.0 /* 0x1.0p52 */, x);
546*6467f958SSadaf Ebrahimi         double rounded = x + magic;
547*6467f958SSadaf Ebrahimi         rounded -= magic;
548*6467f958SSadaf Ebrahimi         return (long int)rounded;
549*6467f958SSadaf Ebrahimi     }
550*6467f958SSadaf Ebrahimi 
551*6467f958SSadaf Ebrahimi     return (long int)x;
552*6467f958SSadaf Ebrahimi }
553*6467f958SSadaf Ebrahimi 
lrintf(float x)554*6467f958SSadaf Ebrahimi long int lrintf(float x)
555*6467f958SSadaf Ebrahimi {
556*6467f958SSadaf Ebrahimi     float absx = fabsf(x);
557*6467f958SSadaf Ebrahimi 
558*6467f958SSadaf Ebrahimi     if (x >= (float)LONG_MAX) return LONG_MAX;
559*6467f958SSadaf Ebrahimi 
560*6467f958SSadaf Ebrahimi     if (absx < 8388608.0f /* 0x1.0p23f */)
561*6467f958SSadaf Ebrahimi     {
562*6467f958SSadaf Ebrahimi         float magic = copysignf(8388608.0f /* 0x1.0p23f */, x);
563*6467f958SSadaf Ebrahimi         float rounded = x + magic;
564*6467f958SSadaf Ebrahimi         rounded -= magic;
565*6467f958SSadaf Ebrahimi         return (long int)rounded;
566*6467f958SSadaf Ebrahimi     }
567*6467f958SSadaf Ebrahimi 
568*6467f958SSadaf Ebrahimi     return (long int)x;
569*6467f958SSadaf Ebrahimi }
570*6467f958SSadaf Ebrahimi 
571*6467f958SSadaf Ebrahimi #endif // _MSC_VER < 1900
572*6467f958SSadaf Ebrahimi 
573*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
574*6467f958SSadaf Ebrahimi //
575*6467f958SSadaf Ebrahimi //                  fenv functions
576*6467f958SSadaf Ebrahimi //
577*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
578*6467f958SSadaf Ebrahimi 
579*6467f958SSadaf Ebrahimi #if _MSC_VER < 1800
fetestexcept(int excepts)580*6467f958SSadaf Ebrahimi int fetestexcept(int excepts)
581*6467f958SSadaf Ebrahimi {
582*6467f958SSadaf Ebrahimi     unsigned int status = _statusfp();
583*6467f958SSadaf Ebrahimi     return excepts
584*6467f958SSadaf Ebrahimi         & (((status & _SW_INEXACT) ? FE_INEXACT : 0)
585*6467f958SSadaf Ebrahimi            | ((status & _SW_UNDERFLOW) ? FE_UNDERFLOW : 0)
586*6467f958SSadaf Ebrahimi            | ((status & _SW_OVERFLOW) ? FE_OVERFLOW : 0)
587*6467f958SSadaf Ebrahimi            | ((status & _SW_ZERODIVIDE) ? FE_DIVBYZERO : 0)
588*6467f958SSadaf Ebrahimi            | ((status & _SW_INVALID) ? FE_INVALID : 0));
589*6467f958SSadaf Ebrahimi }
590*6467f958SSadaf Ebrahimi 
feclearexcept(int excepts)591*6467f958SSadaf Ebrahimi int feclearexcept(int excepts)
592*6467f958SSadaf Ebrahimi {
593*6467f958SSadaf Ebrahimi     _clearfp();
594*6467f958SSadaf Ebrahimi     return 0;
595*6467f958SSadaf Ebrahimi }
596*6467f958SSadaf Ebrahimi #endif
597*6467f958SSadaf Ebrahimi 
598*6467f958SSadaf Ebrahimi #endif // __INTEL_COMPILER
599*6467f958SSadaf Ebrahimi 
600*6467f958SSadaf Ebrahimi #if _MSC_VER < 1900 && (!defined(__INTEL_COMPILER) || __INTEL_COMPILER < 1300)
601*6467f958SSadaf Ebrahimi 
nanf(const char * str)602*6467f958SSadaf Ebrahimi float nanf(const char* str)
603*6467f958SSadaf Ebrahimi {
604*6467f958SSadaf Ebrahimi     cl_uint u = atoi(str);
605*6467f958SSadaf Ebrahimi     u |= 0x7fc00000U;
606*6467f958SSadaf Ebrahimi     return *(float*)(&u);
607*6467f958SSadaf Ebrahimi }
608*6467f958SSadaf Ebrahimi 
609*6467f958SSadaf Ebrahimi 
nan(const char * str)610*6467f958SSadaf Ebrahimi double nan(const char* str)
611*6467f958SSadaf Ebrahimi {
612*6467f958SSadaf Ebrahimi     cl_ulong u = atoi(str);
613*6467f958SSadaf Ebrahimi     u |= 0x7ff8000000000000ULL;
614*6467f958SSadaf Ebrahimi     return *(double*)(&u);
615*6467f958SSadaf Ebrahimi }
616*6467f958SSadaf Ebrahimi 
617*6467f958SSadaf Ebrahimi // double check this implementatation
nanl(const char * str)618*6467f958SSadaf Ebrahimi long double nanl(const char* str)
619*6467f958SSadaf Ebrahimi {
620*6467f958SSadaf Ebrahimi     union {
621*6467f958SSadaf Ebrahimi         long double f;
622*6467f958SSadaf Ebrahimi         struct
623*6467f958SSadaf Ebrahimi         {
624*6467f958SSadaf Ebrahimi             cl_ulong m;
625*6467f958SSadaf Ebrahimi             cl_ushort sexp;
626*6467f958SSadaf Ebrahimi         } u;
627*6467f958SSadaf Ebrahimi     } u;
628*6467f958SSadaf Ebrahimi     u.u.sexp = 0x7fff;
629*6467f958SSadaf Ebrahimi     u.u.m = 0x8000000000000000ULL | atoi(str);
630*6467f958SSadaf Ebrahimi 
631*6467f958SSadaf Ebrahimi     return u.f;
632*6467f958SSadaf Ebrahimi }
633*6467f958SSadaf Ebrahimi 
634*6467f958SSadaf Ebrahimi #endif
635*6467f958SSadaf Ebrahimi 
636*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
637*6467f958SSadaf Ebrahimi //
638*6467f958SSadaf Ebrahimi //                  misc functions
639*6467f958SSadaf Ebrahimi //
640*6467f958SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////
641*6467f958SSadaf Ebrahimi 
642*6467f958SSadaf Ebrahimi /*
643*6467f958SSadaf Ebrahimi // This function is commented out because the Windows implementation should
644*6467f958SSadaf Ebrahimi never call munmap.
645*6467f958SSadaf Ebrahimi // If it is calling it, we have a bug. Please file a bugzilla.
646*6467f958SSadaf Ebrahimi int munmap(void *addr, size_t len)
647*6467f958SSadaf Ebrahimi {
648*6467f958SSadaf Ebrahimi // FIXME: this is not correct.  munmap is like free()
649*6467f958SSadaf Ebrahimi // http://www.opengroup.org/onlinepubs/7990989775/xsh/munmap.html
650*6467f958SSadaf Ebrahimi 
651*6467f958SSadaf Ebrahimi     return (int)VirtualAlloc( (LPVOID)addr, len,
652*6467f958SSadaf Ebrahimi                   MEM_COMMIT|MEM_RESERVE, PAGE_NOACCESS );
653*6467f958SSadaf Ebrahimi }
654*6467f958SSadaf Ebrahimi */
655*6467f958SSadaf Ebrahimi 
ReadTime(void)656*6467f958SSadaf Ebrahimi uint64_t ReadTime(void)
657*6467f958SSadaf Ebrahimi {
658*6467f958SSadaf Ebrahimi     LARGE_INTEGER current;
659*6467f958SSadaf Ebrahimi     QueryPerformanceCounter(&current);
660*6467f958SSadaf Ebrahimi     return (uint64_t)current.QuadPart;
661*6467f958SSadaf Ebrahimi }
662*6467f958SSadaf Ebrahimi 
SubtractTime(uint64_t endTime,uint64_t startTime)663*6467f958SSadaf Ebrahimi double SubtractTime(uint64_t endTime, uint64_t startTime)
664*6467f958SSadaf Ebrahimi {
665*6467f958SSadaf Ebrahimi     static double PerformanceFrequency = 0.0;
666*6467f958SSadaf Ebrahimi 
667*6467f958SSadaf Ebrahimi     if (PerformanceFrequency == 0.0)
668*6467f958SSadaf Ebrahimi     {
669*6467f958SSadaf Ebrahimi         LARGE_INTEGER frequency;
670*6467f958SSadaf Ebrahimi         QueryPerformanceFrequency(&frequency);
671*6467f958SSadaf Ebrahimi         PerformanceFrequency = (double)frequency.QuadPart;
672*6467f958SSadaf Ebrahimi     }
673*6467f958SSadaf Ebrahimi 
674*6467f958SSadaf Ebrahimi     return (double)(endTime - startTime) / PerformanceFrequency * 1e9;
675*6467f958SSadaf Ebrahimi }
676*6467f958SSadaf Ebrahimi 
cf_signbit(double x)677*6467f958SSadaf Ebrahimi int cf_signbit(double x)
678*6467f958SSadaf Ebrahimi {
679*6467f958SSadaf Ebrahimi     union {
680*6467f958SSadaf Ebrahimi         double f;
681*6467f958SSadaf Ebrahimi         cl_ulong u;
682*6467f958SSadaf Ebrahimi     } u;
683*6467f958SSadaf Ebrahimi     u.f = x;
684*6467f958SSadaf Ebrahimi     return u.u >> 63;
685*6467f958SSadaf Ebrahimi }
686*6467f958SSadaf Ebrahimi 
cf_signbitf(float x)687*6467f958SSadaf Ebrahimi int cf_signbitf(float x)
688*6467f958SSadaf Ebrahimi {
689*6467f958SSadaf Ebrahimi     union {
690*6467f958SSadaf Ebrahimi         float f;
691*6467f958SSadaf Ebrahimi         cl_uint u;
692*6467f958SSadaf Ebrahimi     } u;
693*6467f958SSadaf Ebrahimi     u.f = x;
694*6467f958SSadaf Ebrahimi     return u.u >> 31;
695*6467f958SSadaf Ebrahimi }
696*6467f958SSadaf Ebrahimi 
int2float(int32_t ix)697*6467f958SSadaf Ebrahimi float int2float(int32_t ix)
698*6467f958SSadaf Ebrahimi {
699*6467f958SSadaf Ebrahimi     union {
700*6467f958SSadaf Ebrahimi         float f;
701*6467f958SSadaf Ebrahimi         int32_t i;
702*6467f958SSadaf Ebrahimi     } u;
703*6467f958SSadaf Ebrahimi     u.i = ix;
704*6467f958SSadaf Ebrahimi     return u.f;
705*6467f958SSadaf Ebrahimi }
706*6467f958SSadaf Ebrahimi 
float2int(float fx)707*6467f958SSadaf Ebrahimi int32_t float2int(float fx)
708*6467f958SSadaf Ebrahimi {
709*6467f958SSadaf Ebrahimi     union {
710*6467f958SSadaf Ebrahimi         float f;
711*6467f958SSadaf Ebrahimi         int32_t i;
712*6467f958SSadaf Ebrahimi     } u;
713*6467f958SSadaf Ebrahimi     u.f = fx;
714*6467f958SSadaf Ebrahimi     return u.i;
715*6467f958SSadaf Ebrahimi }
716*6467f958SSadaf Ebrahimi 
717*6467f958SSadaf Ebrahimi #if !defined(_WIN64)
718*6467f958SSadaf Ebrahimi /** Returns the number of leading 0-bits in x,
719*6467f958SSadaf Ebrahimi     starting at the most significant bit position.
720*6467f958SSadaf Ebrahimi     If x is 0, the result is undefined.
721*6467f958SSadaf Ebrahimi */
__builtin_clz(unsigned int pattern)722*6467f958SSadaf Ebrahimi int __builtin_clz(unsigned int pattern)
723*6467f958SSadaf Ebrahimi {
724*6467f958SSadaf Ebrahimi #if 0
725*6467f958SSadaf Ebrahimi     int res;
726*6467f958SSadaf Ebrahimi     __asm {
727*6467f958SSadaf Ebrahimi         mov eax, pattern
728*6467f958SSadaf Ebrahimi         bsr eax, eax
729*6467f958SSadaf Ebrahimi         mov res, eax
730*6467f958SSadaf Ebrahimi     }
731*6467f958SSadaf Ebrahimi     return 31 - res;
732*6467f958SSadaf Ebrahimi #endif
733*6467f958SSadaf Ebrahimi     unsigned long index;
734*6467f958SSadaf Ebrahimi     unsigned char res = _BitScanReverse(&index, pattern);
735*6467f958SSadaf Ebrahimi     if (res)
736*6467f958SSadaf Ebrahimi     {
737*6467f958SSadaf Ebrahimi         return 8 * sizeof(int) - 1 - index;
738*6467f958SSadaf Ebrahimi     }
739*6467f958SSadaf Ebrahimi     else
740*6467f958SSadaf Ebrahimi     {
741*6467f958SSadaf Ebrahimi         return 8 * sizeof(int);
742*6467f958SSadaf Ebrahimi     }
743*6467f958SSadaf Ebrahimi }
744*6467f958SSadaf Ebrahimi #else
__builtin_clz(unsigned int pattern)745*6467f958SSadaf Ebrahimi int __builtin_clz(unsigned int pattern)
746*6467f958SSadaf Ebrahimi {
747*6467f958SSadaf Ebrahimi     int count;
748*6467f958SSadaf Ebrahimi     if (pattern == 0u)
749*6467f958SSadaf Ebrahimi     {
750*6467f958SSadaf Ebrahimi         return 32;
751*6467f958SSadaf Ebrahimi     }
752*6467f958SSadaf Ebrahimi     count = 31;
753*6467f958SSadaf Ebrahimi     if (pattern >= 1u << 16)
754*6467f958SSadaf Ebrahimi     {
755*6467f958SSadaf Ebrahimi         pattern >>= 16;
756*6467f958SSadaf Ebrahimi         count -= 16;
757*6467f958SSadaf Ebrahimi     }
758*6467f958SSadaf Ebrahimi     if (pattern >= 1u << 8)
759*6467f958SSadaf Ebrahimi     {
760*6467f958SSadaf Ebrahimi         pattern >>= 8;
761*6467f958SSadaf Ebrahimi         count -= 8;
762*6467f958SSadaf Ebrahimi     }
763*6467f958SSadaf Ebrahimi     if (pattern >= 1u << 4)
764*6467f958SSadaf Ebrahimi     {
765*6467f958SSadaf Ebrahimi         pattern >>= 4;
766*6467f958SSadaf Ebrahimi         count -= 4;
767*6467f958SSadaf Ebrahimi     }
768*6467f958SSadaf Ebrahimi     if (pattern >= 1u << 2)
769*6467f958SSadaf Ebrahimi     {
770*6467f958SSadaf Ebrahimi         pattern >>= 2;
771*6467f958SSadaf Ebrahimi         count -= 2;
772*6467f958SSadaf Ebrahimi     }
773*6467f958SSadaf Ebrahimi     if (pattern >= 1u << 1)
774*6467f958SSadaf Ebrahimi     {
775*6467f958SSadaf Ebrahimi         count -= 1;
776*6467f958SSadaf Ebrahimi     }
777*6467f958SSadaf Ebrahimi     return count;
778*6467f958SSadaf Ebrahimi }
779*6467f958SSadaf Ebrahimi 
780*6467f958SSadaf Ebrahimi #endif // !defined(_WIN64)
781*6467f958SSadaf Ebrahimi 
782*6467f958SSadaf Ebrahimi #include <intrin.h>
783*6467f958SSadaf Ebrahimi #include <emmintrin.h>
784*6467f958SSadaf Ebrahimi 
usleep(int usec)785*6467f958SSadaf Ebrahimi int usleep(int usec)
786*6467f958SSadaf Ebrahimi {
787*6467f958SSadaf Ebrahimi     Sleep((usec + 999) / 1000);
788*6467f958SSadaf Ebrahimi     return 0;
789*6467f958SSadaf Ebrahimi }
790*6467f958SSadaf Ebrahimi 
sleep(unsigned int sec)791*6467f958SSadaf Ebrahimi unsigned int sleep(unsigned int sec)
792*6467f958SSadaf Ebrahimi {
793*6467f958SSadaf Ebrahimi     Sleep(sec * 1000);
794*6467f958SSadaf Ebrahimi     return 0;
795*6467f958SSadaf Ebrahimi }
796*6467f958SSadaf Ebrahimi 
797*6467f958SSadaf Ebrahimi #endif // defined( _MSC_VER )
798