3 #include
<clc
/clcmacro.h
>
5 _CLC_OVERLOAD _CLC_DEF float logb
(float x
) {
6 int ax
= as_int
(x) & EXSIGNBIT_SP32
;
7 float s
= -
118 - clz
(ax);
8 float r
= (ax >> EXPSHIFTBITS_SP32
) - EXPBIAS_SP32
;
9 r
= ax
>= PINFBITPATT_SP32 ? as_float
(ax) : r
;
10 r
= ax
< 0x00800000 ? s
: r
;
11 r
= ax
== 0 ? as_float
(NINFBITPATT_SP32) : r
;
15 _CLC_UNARY_VECTORIZE
(_CLC_OVERLOAD _CLC_DEF
, float
, logb
, float
);
18 #pragma OPENCL EXTENSION cl_khr_fp64
: enable
20 _CLC_OVERLOAD _CLC_DEF double logb
(double x
) {
21 long ax
= as_long
(x) & EXSIGNBIT_DP64
;
22 double s
= -
1011L - clz
(ax);
23 double r
= (int) (ax >> EXPSHIFTBITS_DP64
) - EXPBIAS_DP64
;
24 r
= ax
>= PINFBITPATT_DP64 ? as_double
(ax) : r
;
25 r
= ax
< 0x0010000000000000L ? s
: r
;
26 r
= ax
== 0L ? as_double
(NINFBITPATT_DP64) : r
;
30 _CLC_UNARY_VECTORIZE
(_CLC_OVERLOAD _CLC_DEF
, double
, logb
, double
)
33 _CLC_DEFINE_UNARY_BUILTIN_FP16
(logb)