2 * Copyright
(c) 2015 Advanced Micro Devices
, Inc.
3 * Copyright
(c) 2016 Aaron Watry
5 * Permission is hereby granted
, free of charge
, to any person obtaining a copy
6 * of this software and associated documentation files
(the "Software"), to deal
7 * in the Software without restriction
, including without limitation the rights
8 * to use
, copy
, modify
, merge
, publish
, distribute
, sublicense
, and
/or sell
9 * copies of the Software
, and to permit persons to whom the Software is
10 * furnished to do so
, subject to the following conditions
:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED
"AS IS", WITHOUT WARRANTY OF ANY KIND
, EXPRESS OR
16 * IMPLIED
, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM
, DAMAGES OR OTHER
19 * LIABILITY
, WHETHER IN AN ACTION OF CONTRACT
, TORT OR OTHERWISE
, ARISING FROM
,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 #include
<clc
/clcmacro.h
>
28 _CLC_OVERLOAD _CLC_DEF int ilogb
(float x
) {
30 uint ax
= ux
& EXSIGNBIT_SP32
;
31 int rs
= -
118 -
(int) clz
(ux & MANTBITS_SP32
);
32 int r
= (int) (ax >> EXPSHIFTBITS_SP32
) - EXPBIAS_SP32
;
33 r
= ax
< 0x00800000U ? rs
: r
;
34 r
= ax
== 0 ? FP_ILOGB0
: r
;
36 // We could merge those
2 tests and have
:
38 // r
= ax
>= EXPBITS_SP32 ?
0x7fffffff : r
40 // since FP_ILOGBNAN is set to INT_MAX
, but it
's clearer this way and
41 // FP_ILOGBNAN can change without requiring changes to ilogb
() code.
42 r
= ax
> EXPBITS_SP32 ? FP_ILOGBNAN
: r
;
43 r
= ax
== EXPBITS_SP32 ?
0x7fffffff : r
;
47 _CLC_UNARY_VECTORIZE
(_CLC_OVERLOAD _CLC_DEF
, int
, ilogb
, float
);
50 #pragma OPENCL EXTENSION cl_khr_fp64
: enable
52 _CLC_OVERLOAD _CLC_DEF int ilogb
(double x
) {
53 ulong ux
= as_ulong
(x);
54 ulong ax
= ux
& ~SIGNBIT_DP64
;
55 int r
= (int) (ax >> EXPSHIFTBITS_DP64
) - EXPBIAS_DP64
;
56 int rs
= -
1011 -
(int) clz
(ax & MANTBITS_DP64
);
57 r
= ax
< 0x0010000000000000UL ? rs
: r
;
58 r
= ax
== 0UL ? FP_ILOGB0
: r
;
60 // We could merge those
2 tests and have
:
62 // r
= ax
>= 0x7ff0000000000000UL ?
0x7fffffff : r
64 // since FP_ILOGBNAN is set to INT_MAX
, but it
's clearer this way and
65 // FP_ILOGBNAN can change without requiring changes to ilogb
() code.
66 r
= ax
> 0x7ff0000000000000UL ? FP_ILOGBNAN
: r
;
67 r
= ax
== 0x7ff0000000000000UL ?
0x7fffffff : r
;
71 _CLC_UNARY_VECTORIZE
(_CLC_OVERLOAD _CLC_DEF
, int
, ilogb
, double
);
77 #pragma OPENCL EXTENSION cl_khr_fp16
: enable
79 _CLC_OVERLOAD _CLC_DEF int ilogb
(half x
) {
80 return ilogb
((float)x
);
83 _CLC_UNARY_VECTORIZE
(_CLC_OVERLOAD _CLC_DEF
, int
, ilogb
, half
);