1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker 3*c9945492SAndroid Build Coastguard Worker #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 floorl(long double x)4*c9945492SAndroid Build Coastguard Workerlong double floorl(long double x) 5*c9945492SAndroid Build Coastguard Worker { 6*c9945492SAndroid Build Coastguard Worker return floor(x); 7*c9945492SAndroid Build Coastguard Worker } 8*c9945492SAndroid Build Coastguard Worker #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 9*c9945492SAndroid Build Coastguard Worker 10*c9945492SAndroid Build Coastguard Worker static const long double toint = 1/LDBL_EPSILON; 11*c9945492SAndroid Build Coastguard Worker floorl(long double x)12*c9945492SAndroid Build Coastguard Workerlong double floorl(long double x) 13*c9945492SAndroid Build Coastguard Worker { 14*c9945492SAndroid Build Coastguard Worker union ldshape u = {x}; 15*c9945492SAndroid Build Coastguard Worker int e = u.i.se & 0x7fff; 16*c9945492SAndroid Build Coastguard Worker long double y; 17*c9945492SAndroid Build Coastguard Worker 18*c9945492SAndroid Build Coastguard Worker if (e >= 0x3fff+LDBL_MANT_DIG-1 || x == 0) 19*c9945492SAndroid Build Coastguard Worker return x; 20*c9945492SAndroid Build Coastguard Worker /* y = int(x) - x, where int(x) is an integer neighbor of x */ 21*c9945492SAndroid Build Coastguard Worker if (u.i.se >> 15) 22*c9945492SAndroid Build Coastguard Worker y = x - toint + toint - x; 23*c9945492SAndroid Build Coastguard Worker else 24*c9945492SAndroid Build Coastguard Worker y = x + toint - toint - x; 25*c9945492SAndroid Build Coastguard Worker /* special case because of non-nearest rounding modes */ 26*c9945492SAndroid Build Coastguard Worker if (e <= 0x3fff-1) { 27*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(y); 28*c9945492SAndroid Build Coastguard Worker return u.i.se >> 15 ? -1 : 0; 29*c9945492SAndroid Build Coastguard Worker } 30*c9945492SAndroid Build Coastguard Worker if (y > 0) 31*c9945492SAndroid Build Coastguard Worker return x + y - 1; 32*c9945492SAndroid Build Coastguard Worker return x + y; 33*c9945492SAndroid Build Coastguard Worker } 34*c9945492SAndroid Build Coastguard Worker #endif 35