[PATCH v2 5/5] math: Optimize frexpl (binary128) with fast path for normal numbers
Osama Abdelkader
osama.abdelkader@gmail.com
Thu Nov 6 19:36:44 GMT 2025
On Tue, Nov 04, 2025 at 09:36:55PM +0000, Wilco Dijkstra wrote:
> Hi Osama,
>
> A few additional comments:
>
> > + uint64_t hx, lx;
> > + GET_LDOUBLE_WORDS64 (hx, lx, x);
> > + uint64_t ex = 0x7fff & (hx >> 48);
>
> I'd swap that around for clarity.
>
> > +
> > + /* Fast path for normal numbers. */
> > + if (__glibc_likely ((ex - 1U) < 0x7ffe))
> > + {
> > + *eptr = ex - EXPONENT_BIAS + 1;
> > + hx = hx - ((ex - FREXPL_EXP_VALUE) << 48);
>
> This is simpler and doesn't require FREXPL_EXP_VALUE:
>
> ex -= EXPONENT_BIAS - 1;
> *eptr = ex;
> hx = hx - (ex << 48);
>
> > + SET_LDOUBLE_MSW64 (x, hx);
> > + return x;
> > + }
> > +
> > + /* Handle zero, infinity, and NaN. */
> > + uint64_t ix = hx & 0x7fffffffffffffffULL;
> > + if (__glibc_likely (ix >= 0x7fff000000000000ULL || ((ix | lx) == 0)))
>
> ex == 0x7fff || ((hx << 1) | lx) == 0) is simpler and avoids all the huge immediates.
>
> > + {
> > + *eptr = 0;
> > + return x + x;
> > + }
> > +
> > + /* Subnormal. */
> > + x *= two114;
> > + GET_LDOUBLE_MSW64 (hx, x);
> > + ex = 0x7fff & (hx >> 48);
>
> swap immediate
>
> > + *eptr = ex - EXPONENT_BIAS - 114 + 1;
> > + hx = hx - ((ex - FREXPL_EXP_VALUE) << 48);
>
> This feels a bit clearer:
>
> ex -= EXPONENT_BIAS - 1;
> *eptr = ex - 114;
> hx = hx - (ex << 48);
>
> > + SET_LDOUBLE_MSW64 (x, hx);
> > + return x;
> > }
>
> Cheers,
> Wilco
Thanks Wilco, I just sent v3 of this one.
BR,
Osama
More information about the Libc-alpha
mailing list