xref: /aosp_15_r20/external/musl/src/math/frexpl.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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
frexpl(long double x,int * e)4*c9945492SAndroid Build Coastguard Worker long double frexpl(long double x, int *e)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	return frexp(x, e);
7*c9945492SAndroid Build Coastguard Worker }
8*c9945492SAndroid Build Coastguard Worker #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
frexpl(long double x,int * e)9*c9945492SAndroid Build Coastguard Worker long double frexpl(long double x, int *e)
10*c9945492SAndroid Build Coastguard Worker {
11*c9945492SAndroid Build Coastguard Worker 	union ldshape u = {x};
12*c9945492SAndroid Build Coastguard Worker 	int ee = u.i.se & 0x7fff;
13*c9945492SAndroid Build Coastguard Worker 
14*c9945492SAndroid Build Coastguard Worker 	if (!ee) {
15*c9945492SAndroid Build Coastguard Worker 		if (x) {
16*c9945492SAndroid Build Coastguard Worker 			x = frexpl(x*0x1p120, e);
17*c9945492SAndroid Build Coastguard Worker 			*e -= 120;
18*c9945492SAndroid Build Coastguard Worker 		} else *e = 0;
19*c9945492SAndroid Build Coastguard Worker 		return x;
20*c9945492SAndroid Build Coastguard Worker 	} else if (ee == 0x7fff) {
21*c9945492SAndroid Build Coastguard Worker 		return x;
22*c9945492SAndroid Build Coastguard Worker 	}
23*c9945492SAndroid Build Coastguard Worker 
24*c9945492SAndroid Build Coastguard Worker 	*e = ee - 0x3ffe;
25*c9945492SAndroid Build Coastguard Worker 	u.i.se &= 0x8000;
26*c9945492SAndroid Build Coastguard Worker 	u.i.se |= 0x3ffe;
27*c9945492SAndroid Build Coastguard Worker 	return u.f;
28*c9945492SAndroid Build Coastguard Worker }
29*c9945492SAndroid Build Coastguard Worker #endif
30