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(¤t);
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