From bb91d99e1b5bbce04cdf3f34abac454564420a63 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Fri, 15 Jul 2022 15:17:57 -0700 Subject: [PATCH] isnan.h --- util/include/rusefi/interpolation.h | 1 + util/include/rusefi/isnan.h | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 util/include/rusefi/isnan.h diff --git a/util/include/rusefi/interpolation.h b/util/include/rusefi/interpolation.h index 7952cba..da57131 100644 --- a/util/include/rusefi/interpolation.h +++ b/util/include/rusefi/interpolation.h @@ -2,6 +2,7 @@ #include +#include "isnan.h" #include "scaled_channel.h" namespace priv { diff --git a/util/include/rusefi/isnan.h b/util/include/rusefi/isnan.h new file mode 100644 index 0000000..026f1c2 --- /dev/null +++ b/util/include/rusefi/isnan.h @@ -0,0 +1,14 @@ +#pragma once + +#if defined(__cplusplus) && defined(__OPTIMIZE__) +#include +// "g++ -O2" version, adds more strict type check and yet no "strict-aliasing" warnings! +#define cisnan(f) ({ \ + static_assert(sizeof(f) == sizeof(int32_t)); \ + union cisnanu_t { std::remove_reference_t __f; int32_t __i; } __cisnan_u = { f }; \ + __cisnan_u.__i == 0x7FC00000; \ +}) +#else +// "g++ -O0" or other C++/C compilers +#define cisnan(f) (*(((int*) (&f))) == 0x7FC00000) +#endif /* __cplusplus && __OPTIMIZE__ */