1*c9945492SAndroid Build Coastguard Worker #include <limits.h> 2*c9945492SAndroid Build Coastguard Worker #include "libm.h" 3*c9945492SAndroid Build Coastguard Worker ilogbf(float x)4*c9945492SAndroid Build Coastguard Workerint ilogbf(float x) 5*c9945492SAndroid Build Coastguard Worker { 6*c9945492SAndroid Build Coastguard Worker #pragma STDC FENV_ACCESS ON 7*c9945492SAndroid Build Coastguard Worker union {float f; uint32_t i;} u = {x}; 8*c9945492SAndroid Build Coastguard Worker uint32_t i = u.i; 9*c9945492SAndroid Build Coastguard Worker int e = i>>23 & 0xff; 10*c9945492SAndroid Build Coastguard Worker 11*c9945492SAndroid Build Coastguard Worker if (!e) { 12*c9945492SAndroid Build Coastguard Worker i <<= 9; 13*c9945492SAndroid Build Coastguard Worker if (i == 0) { 14*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(0/0.0f); 15*c9945492SAndroid Build Coastguard Worker return FP_ILOGB0; 16*c9945492SAndroid Build Coastguard Worker } 17*c9945492SAndroid Build Coastguard Worker /* subnormal x */ 18*c9945492SAndroid Build Coastguard Worker for (e = -0x7f; i>>31 == 0; e--, i<<=1); 19*c9945492SAndroid Build Coastguard Worker return e; 20*c9945492SAndroid Build Coastguard Worker } 21*c9945492SAndroid Build Coastguard Worker if (e == 0xff) { 22*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(0/0.0f); 23*c9945492SAndroid Build Coastguard Worker return i<<9 ? FP_ILOGBNAN : INT_MAX; 24*c9945492SAndroid Build Coastguard Worker } 25*c9945492SAndroid Build Coastguard Worker return e - 0x7f; 26*c9945492SAndroid Build Coastguard Worker } 27