--- firefox-115.7.0/modules/fdlibm/src/math_private.h.orig 2024-01-15 22:07:35.000000000 +0100 +++ firefox-115.7.0/modules/fdlibm/src/math_private.h 2024-02-15 16:17:40.794640534 +0100 @@ -30,7 +30,11 @@ * Adapted from https://github.com/freebsd/freebsd-src/search?q=__double_t */ +#ifdef __LP64__ typedef double __double_t; +#else +typedef long double __double_t; +#endif typedef __double_t double_t; typedef float __float_t; @@ -626,6 +630,41 @@ return ((double)(x + 0x1.8p52) - 0x1.8p52); } +static inline float +rnintf(__float_t x) +{ + /* + * As for rnint(), except we could just call that to handle the + * extra precision case, usually without losing efficiency. + */ + return ((float)(x + 0x1.8p23F) - 0x1.8p23F); +} + +#ifdef LDBL_MANT_DIG +/* + * The complications for extra precision are smaller for rnintl() since it + * can safely assume that the rounding precision has been increased from + * its default to FP_PE on x86. We don't exploit that here to get small + * optimizations from limiting the rangle to double. We just need it for + * the magic number to work with long doubles. ld128 callers should use + * rnint() instead of this if possible. ld80 callers should prefer + * rnintl() since for amd64 this avoids swapping the register set, while + * for i386 it makes no difference (assuming FP_PE), and for other arches + * it makes little difference. + */ +static inline long double +rnintl(long double x) +{ +#if (LDBL_MANT_DIG == 64) + return (x + __CONCAT(0x1.8p, 64) / 2 - + __CONCAT(0x1.8p, 64) / 2); +#else + return (x + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2 - + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2); +#endif +} +#endif /* LDBL_MANT_DIG */ + /* * irint() and i64rint() give the same result as casting to their integer * return type provided their arg is a floating point integer. They can @@ -668,6 +707,39 @@ static __inline int irintl(long double x) { + int n; + + __asm("fistl %0" : "=m" (n) : "t" (x)); + return (n); +} +#endif + +#define i64rint(x) ((int64_t)(x)) /* only needed for ld128 so not opt. */ + +#if defined(__i386__) && defined(__GNUCLIKE_ASM) +static __inline int +irintf(float x) +{ + int n; + + __asm("fistl %0" : "=m" (n) : "t" (x)); + return (n); +} + +static __inline int +irintd(double x) +{ + int n; + + __asm("fistl %0" : "=m" (n) : "t" (x)); + return (n); +} +#endif + +#if (defined(__amd64__) || defined(__i386__)) && defined(__GNUCLIKE_ASM) +static __inline int +irintl(long double x) +{ int n; __asm("fistl %0" : "=m" (n) : "t" (x));