summaryrefslogtreecommitdiff
path: root/prelude
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2020-06-19 11:48:28 -0700
committerTim Foley <tfoley@nvidia.com>2020-06-19 11:48:28 -0700
commit11e377a541023973213ec758fbec68e2772ce7bc (patch)
treeff4dfa28c0a66b30e96b5a4fdbc8080f3681d437 /prelude
parentfc4342b834fbf3f20bcb90574a63859bf34462cd (diff)
parent110d15b61ac5d76da001d412eaa4be07f3cd8f4d (diff)
Merge remote-tracking branch 'origin/master' into struct-inheritance-and-interfaces
Diffstat (limited to 'prelude')
-rw-r--r--prelude/slang-cpp-prelude.h13
-rw-r--r--prelude/slang-cpp-scalar-intrinsics.h26
2 files changed, 27 insertions, 12 deletions
diff --git a/prelude/slang-cpp-prelude.h b/prelude/slang-cpp-prelude.h
index 7da613024..d47b0463c 100644
--- a/prelude/slang-cpp-prelude.h
+++ b/prelude/slang-cpp-prelude.h
@@ -3,7 +3,18 @@
#include "../slang.h"
-#include <math.h>
+// Because the signiture of isnan, isfinite, and is isinf changed in C++, we use the macro
+// to use the version in the std namespace.
+// https://stackoverflow.com/questions/39130040/cmath-hides-isnan-in-math-h-in-c14-c11
+
+#if SLANG_GCC_FAMILY && __GNUC__ < 6
+# include <cmath>
+# define SLANG_PRELUDE_STD std::
+#else
+# include <math.h>
+# define SLANG_PRELUDE_STD
+#endif
+
#include <assert.h>
#include <stdlib.h>
diff --git a/prelude/slang-cpp-scalar-intrinsics.h b/prelude/slang-cpp-scalar-intrinsics.h
index c814365c6..07945f1e0 100644
--- a/prelude/slang-cpp-scalar-intrinsics.h
+++ b/prelude/slang-cpp-scalar-intrinsics.h
@@ -68,9 +68,9 @@ SLANG_FORCE_INLINE float F32_rsqrt(float f) { return 1.0f / F32_sqrt(f); }
SLANG_FORCE_INLINE float F32_sign(float f) { return ( f == 0.0f) ? f : (( f < 0.0f) ? -1.0f : 1.0f); }
SLANG_FORCE_INLINE float F32_frac(float f) { return f - F32_floor(f); }
-SLANG_FORCE_INLINE bool F32_isnan(float f) { return isnan(f); }
-SLANG_FORCE_INLINE bool F32_isfinite(float f) { return isfinite(f); }
-SLANG_FORCE_INLINE bool F32_isinf(float f) { return isinf(f); }
+SLANG_FORCE_INLINE bool F32_isnan(float f) { return SLANG_PRELUDE_STD isnan(f); }
+SLANG_FORCE_INLINE bool F32_isfinite(float f) { return SLANG_PRELUDE_STD isfinite(f); }
+SLANG_FORCE_INLINE bool F32_isinf(float f) { return SLANG_PRELUDE_STD isinf(f); }
// Binary
SLANG_FORCE_INLINE float F32_min(float a, float b) { return ::fminf(a, b); }
@@ -84,7 +84,7 @@ SLANG_FORCE_INLINE float F32_frexp(float x, float& e)
{
int ei;
float m = ::frexpf(x, &ei);
- e = ei;
+ e = float(ei);
return m;
}
SLANG_FORCE_INLINE float F32_modf(float x, float& ip)
@@ -135,9 +135,9 @@ SLANG_FORCE_INLINE double F64_rsqrt(double f) { return 1.0 / F64_sqrt(f); }
SLANG_FORCE_INLINE double F64_sign(double f) { return (f == 0.0) ? f : ((f < 0.0) ? -1.0 : 1.0); }
SLANG_FORCE_INLINE double F64_frac(double f) { return f - F64_floor(f); }
-SLANG_FORCE_INLINE bool F64_isnan(double f) { return isnan(f); }
-SLANG_FORCE_INLINE bool F64_isfinite(double f) { return isfinite(f); }
-SLANG_FORCE_INLINE bool F64_isinf(double f) { return isinf(f); }
+SLANG_FORCE_INLINE bool F64_isnan(double f) { return SLANG_PRELUDE_STD isnan(f); }
+SLANG_FORCE_INLINE bool F64_isfinite(double f) { return SLANG_PRELUDE_STD isfinite(f); }
+SLANG_FORCE_INLINE bool F64_isinf(double f) { return SLANG_PRELUDE_STD isinf(f); }
// Binary
SLANG_FORCE_INLINE double F64_min(double a, double b) { return ::fmin(a, b); }
@@ -151,9 +151,10 @@ SLANG_FORCE_INLINE double F64_frexp(double x, double& e)
{
int ei;
double m = ::frexp(x, &ei);
- e = ei;
+ e = float(ei);
return m;
}
+
SLANG_FORCE_INLINE double F64_modf(double x, double& ip)
{
return ::modf(x, &ip);
@@ -236,14 +237,17 @@ SLANG_FORCE_INLINE uint64_t U64_abs(uint64_t f) { return f; }
SLANG_FORCE_INLINE uint64_t U64_min(uint64_t a, uint64_t b) { return a < b ? a : b; }
SLANG_FORCE_INLINE uint64_t U64_max(uint64_t a, uint64_t b) { return a > b ? a : b; }
+// TODO(JS): We don't define countbits for 64bit in stdlib currently.
+// It's not clear from documentation if it should return 32 or 64 bits, if it exists.
+// 32 bits can always hold the result, and will be implicitly promoted.
SLANG_FORCE_INLINE uint32_t U64_countbits(uint64_t v)
{
#if SLANG_GCC_FAMILY
- return __builtin_popcountl(v);
+ return uint32_t(__builtin_popcountl(v));
#elif SLANG_PROCESSOR_X86_64 && SLANG_VC
- return __popcnt64(v);
+ return uint32_t(__popcnt64(v));
#else
- uint64_t c = 0;
+ uint32_t c = 0;
while (v)
{
c++;