_Float128 __fabsl(_Float128 x) { u_int64_t hx; GET_LDOUBLE_MSW64(hx,x); SET_LDOUBLE_MSW64(x,hx&0x7fffffffffffffffLL); return x; }
long double __fabsl(long double x) { u_int64_t hx; GET_LDOUBLE_MSW64(hx,x); SET_LDOUBLE_MSW64(x,hx&0x7fffffffffffffffLL); return x; }
_Float128 __copysignl(_Float128 x, _Float128 y) { uint64_t hx,hy; GET_LDOUBLE_MSW64(hx,x); GET_LDOUBLE_MSW64(hy,y); SET_LDOUBLE_MSW64(x,(hx&0x7fffffffffffffffULL) |(hy&0x8000000000000000ULL)); return x; }
_Float128 __frexpl(_Float128 x, int *eptr) { uint64_t hx, lx, ix; GET_LDOUBLE_WORDS64(hx,lx,x); ix = 0x7fffffffffffffffULL&hx; *eptr = 0; if(ix>=0x7fff000000000000ULL||((ix|lx)==0)) return x + x;/* 0,inf,nan */ if (ix<0x0001000000000000ULL) { /* subnormal */ x *= two114; GET_LDOUBLE_MSW64(hx,x); ix = hx&0x7fffffffffffffffULL; *eptr = -114; } *eptr += (ix>>48)-16382; hx = (hx&0x8000ffffffffffffULL) | 0x3ffe000000000000ULL; SET_LDOUBLE_MSW64(x,hx); return x; }
_Float128 __ieee754_remainderl(_Float128 x, _Float128 p) { int64_t hx,hp; uint64_t sx,lx,lp; _Float128 p_half; GET_LDOUBLE_WORDS64(hx,lx,x); GET_LDOUBLE_WORDS64(hp,lp,p); sx = hx&0x8000000000000000ULL; hp &= 0x7fffffffffffffffLL; hx &= 0x7fffffffffffffffLL; /* purge off exception values */ if((hp|lp)==0) return (x*p)/(x*p); /* p = 0 */ if((hx>=0x7fff000000000000LL)|| /* x not finite */ ((hp>=0x7fff000000000000LL)&& /* p is NaN */ (((hp-0x7fff000000000000LL)|lp)!=0))) return (x*p)/(x*p); if (hp<=0x7ffdffffffffffffLL) x = __ieee754_fmodl(x,p+p); /* now x < 2p */ if (((hx-hp)|(lx-lp))==0) return zero*x; x = fabsl(x); p = fabsl(p); if (hp<0x0002000000000000LL) { if(x+x>p) { x-=p; if(x+x>=p) x -= p; } } else { p_half = L(0.5)*p; if(x>p_half) { x-=p; if(x>=p_half) x -= p; } } GET_LDOUBLE_MSW64(hx,x); SET_LDOUBLE_MSW64(x,hx^sx); return x; }
long double __ieee754_hypotl(long double x, long double y) { long double a,b,t1,t2,y1,y2,w; int64_t j,k,ha,hb; GET_LDOUBLE_MSW64(ha,x); ha &= 0x7fffffffffffffffLL; GET_LDOUBLE_MSW64(hb,y); hb &= 0x7fffffffffffffffLL; if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;} SET_LDOUBLE_MSW64(a,ha); /* a <- |a| */ SET_LDOUBLE_MSW64(b,hb); /* b <- |b| */ if((ha-hb)>0x78000000000000LL) {return a+b;} /* x/y > 2**120 */ k=0; if(ha > 0x5f3f000000000000LL) { /* a>2**8000 */ if(ha >= 0x7fff000000000000LL) { /* Inf or NaN */ u_int64_t low; w = a+b; /* for sNaN */ GET_LDOUBLE_LSW64(low,a); if(((ha&0xffffffffffffLL)|low)==0) w = a; GET_LDOUBLE_LSW64(low,b); if(((hb^0x7fff000000000000LL)|low)==0) w = b; return w; } /* scale a and b by 2**-9600 */ ha -= 0x2580000000000000LL; hb -= 0x2580000000000000LL; k += 9600; SET_LDOUBLE_MSW64(a,ha); SET_LDOUBLE_MSW64(b,hb); } if(hb < 0x20bf000000000000LL) { /* b < 2**-8000 */ if(hb <= 0x0000ffffffffffffLL) { /* subnormal b or 0 */ u_int64_t low; GET_LDOUBLE_LSW64(low,b); if((hb|low)==0) return a; t1=0; SET_LDOUBLE_MSW64(t1,0x7ffd000000000000LL); /* t1=2^16382 */ b *= t1; a *= t1; k -= 16382; GET_LDOUBLE_MSW64 (ha, a); GET_LDOUBLE_MSW64 (hb, b); if (hb > ha) { t1 = a; a = b; b = t1; j = ha; ha = hb; hb = j; } } else { /* scale a and b by 2^9600 */ ha += 0x2580000000000000LL; /* a *= 2^9600 */ hb += 0x2580000000000000LL; /* b *= 2^9600 */ k -= 9600; SET_LDOUBLE_MSW64(a,ha); SET_LDOUBLE_MSW64(b,hb); } } /* medium size a and b */ w = a-b; if (w>b) { t1 = 0; SET_LDOUBLE_MSW64(t1,ha); t2 = a-t1; w = __ieee754_sqrtl(t1*t1-(b*(-b)-t2*(a+t1))); } else { a = a+a; y1 = 0; SET_LDOUBLE_MSW64(y1,hb); y2 = b - y1; t1 = 0; SET_LDOUBLE_MSW64(t1,ha+0x0001000000000000LL); t2 = a - t1; w = __ieee754_sqrtl(t1*y1-(w*(-w)-(t1*y2+t2*b))); } if(k!=0) { u_int64_t high; t1 = 1.0L; GET_LDOUBLE_MSW64(high,t1); SET_LDOUBLE_MSW64(t1,high+(k<<48)); return t1*w; } else return w; }