1#include <clc/clc.h> 2#include "math.h" 3#include "../clcmacro.h" 4 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; 12 return r; 13} 14 15_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, logb, float); 16 17#ifdef cl_khr_fp64 18#pragma OPENCL EXTENSION cl_khr_fp64 : enable 19 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; 27 return r; 28} 29 30_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, logb, double) 31#endif 32