2024-02-22 08:51:55 +01:00
|
|
|
--- 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 @@
|
2024-01-06 07:17:13 +01:00
|
|
|
* 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;
|
2024-02-22 08:51:55 +01:00
|
|
|
typedef float __float_t;
|
|
|
|
|
|
|
|
@@ -626,6 +630,41 @@
|
2024-01-06 07:17:13 +01:00
|
|
|
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
|
2024-02-22 08:51:55 +01:00
|
|
|
@@ -668,6 +707,39 @@
|
|
|
|
static __inline int
|
|
|
|
irintl(long double x)
|
|
|
|
{
|
|
|
|
+ int n;
|
|
|
|
+
|
|
|
|
+ __asm("fistl %0" : "=m" (n) : "t" (x));
|
|
|
|
+ return (n);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
2024-01-06 07:17:13 +01:00
|
|
|
+#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)
|
|
|
|
+{
|
2024-02-22 08:51:55 +01:00
|
|
|
int n;
|
|
|
|
|
|
|
|
__asm("fistl %0" : "=m" (n) : "t" (x));
|