2022-04-01 20:00:47 +00:00
|
|
|
From 77cdba9a810726e01542ab330ee7ec49f446a50e Mon Sep 17 00:00:00 2001
|
|
|
|
From: Roman Yurchak <rth.yurchak@gmail.com>
|
|
|
|
Date: Thu, 31 Mar 2022 17:19:07 -0700
|
|
|
|
Subject: [PATCH 04/14] Fix ieee754
|
2021-03-23 21:49:38 +00:00
|
|
|
|
2022-04-01 20:00:47 +00:00
|
|
|
Use float error status without external includes in numpy
|
|
|
|
|
|
|
|
A better solution would be to rely on FE_DIVBYZERO, FE_DIVBYZERO etc
|
|
|
|
defined in musl's fenv.h (https://github.com/numpy/numpy/pull/12124)
|
|
|
|
however these are not valid for emscripten
|
|
|
|
(https://github.com/emscripten-core/emscripten/issues/13678)
|
|
|
|
---
|
|
|
|
numpy/core/src/npymath/ieee754.c.src | 30 ++++++++--------------------
|
|
|
|
1 file changed, 8 insertions(+), 22 deletions(-)
|
2021-03-23 21:49:38 +00:00
|
|
|
|
|
|
|
diff --git a/numpy/core/src/npymath/ieee754.c.src b/numpy/core/src/npymath/ieee754.c.src
|
2022-04-01 20:00:47 +00:00
|
|
|
index 4e6ddb712..6aecb7577 100644
|
2021-03-23 21:49:38 +00:00
|
|
|
--- a/numpy/core/src/npymath/ieee754.c.src
|
|
|
|
+++ b/numpy/core/src/npymath/ieee754.c.src
|
|
|
|
@@ -682,7 +682,8 @@ void npy_set_floatstatus_invalid(void)
|
|
|
|
}
|
|
|
|
|
|
|
|
#elif defined(_MSC_VER) || (defined(__osf__) && defined(__alpha)) || \
|
|
|
|
- defined (__UCLIBC__) || (defined(__arc__) && defined(__GLIBC__))
|
|
|
|
+ defined (__UCLIBC__) || (defined(__arc__) && defined(__GLIBC__)) || \
|
|
|
|
+ defined(__EMSCRIPTEN__)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* By using a volatile floating point value,
|
|
|
|
@@ -719,37 +720,22 @@ void npy_set_floatstatus_invalid(void)
|
|
|
|
}
|
|
|
|
|
|
|
|
/* MS Windows -----------------------------------------------------*/
|
|
|
|
-#if defined(_MSC_VER)
|
|
|
|
+#if defined(_MSC_VER) || defined(__EMSCRIPTEN__)
|
|
|
|
|
|
|
|
#include <float.h>
|
|
|
|
|
|
|
|
int npy_get_floatstatus_barrier(char *param)
|
|
|
|
{
|
|
|
|
- /*
|
|
|
|
- * By using a volatile, the compiler cannot reorder this call
|
|
|
|
- */
|
|
|
|
-#if defined(_WIN64)
|
|
|
|
- int fpstatus = _statusfp();
|
|
|
|
-#else
|
|
|
|
- /* windows enables sse on 32 bit, so check both flags */
|
|
|
|
- int fpstatus, fpstatus2;
|
|
|
|
- _statusfp2(&fpstatus, &fpstatus2);
|
|
|
|
- fpstatus |= fpstatus2;
|
|
|
|
-#endif
|
|
|
|
- if (param != NULL) {
|
|
|
|
- volatile char NPY_UNUSED(c) = *(char*)param;
|
|
|
|
- }
|
|
|
|
- return ((SW_ZERODIVIDE & fpstatus) ? NPY_FPE_DIVIDEBYZERO : 0) |
|
|
|
|
- ((SW_OVERFLOW & fpstatus) ? NPY_FPE_OVERFLOW : 0) |
|
|
|
|
- ((SW_UNDERFLOW & fpstatus) ? NPY_FPE_UNDERFLOW : 0) |
|
|
|
|
- ((SW_INVALID & fpstatus) ? NPY_FPE_INVALID : 0);
|
|
|
|
+ /*
|
|
|
|
+ TODO: This is a suboptimal implementation from numpy 1.15.4 that would lead
|
|
|
|
+ to issues like https://github.com/numpy/numpy/issues/12095
|
|
|
|
+ */
|
|
|
|
+ return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int npy_clear_floatstatus_barrier(char *param)
|
|
|
|
{
|
|
|
|
int fpstatus = npy_get_floatstatus_barrier(param);
|
|
|
|
- _clearfp();
|
|
|
|
-
|
|
|
|
return fpstatus;
|
|
|
|
}
|
|
|
|
|
2022-04-01 20:00:47 +00:00
|
|
|
--
|
|
|
|
2.25.1
|
|
|
|
|