[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