summaryrefslogtreecommitdiff
path: root/source/slang/hlsl.meta.slang
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-02-12 10:44:07 -0500
committerGitHub <noreply@github.com>2020-02-12 10:44:07 -0500
commite1e7a6eec04ee1d04dc7e0d0212208d4c7a9592b (patch)
tree18543abbb95cb93accedf4b0ecc894b6a363f11b /source/slang/hlsl.meta.slang
parentfe9d27af9de047ea75db1334c961bb025fb732f6 (diff)
Support for isinf/isfinite/isnan/ldexp (#1219)
* Added support ldexp. * Added classify-float.slang test Fixed glsl output. * Added classify-double.slang * Added ldexp test to scalar-double.slang * isnan, isinf, isfinite are macros (on some targets) so remove :: prefix.
Diffstat (limited to 'source/slang/hlsl.meta.slang')
-rw-r--r--source/slang/hlsl.meta.slang28
1 files changed, 22 insertions, 6 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 669fbb440..41a69382d 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -944,9 +944,17 @@ __target_intrinsic(cuda, "($2 = (uint)atomicXor((int*)&$0, $1))")
void InterlockedXor(__ref uint dest, uint value, out uint original_value);
// Is floating-point value finite?
-__generic<T : __BuiltinFloatingPointType> bool isfinite(T x);
-__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isfinite(vector<T,N> x);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isfinite(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, "(!(isinf($0) || isnan($0)))")
+bool isfinite(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl, "(!(isinf($0) || isnan($0)))")
+vector<bool,N> isfinite(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+matrix<bool,N,M> isfinite(matrix<T,N,M> x);
// Is floating-point value infinite?
__generic<T : __BuiltinFloatingPointType> bool isinf(T x);
@@ -959,9 +967,17 @@ __generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isnan(vect
__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isnan(matrix<T,N,M> x);
// Construct float from mantissa and exponent
-__generic<T : __BuiltinFloatingPointType> T ldexp(T x, T exp);
-__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> ldexp(vector<T,N> x, vector<T,N> exp);
-__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> ldexp(matrix<T,N,M> x, matrix<T,N,M> exp);
+
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, "($0 * pow(2.0f, $1))")
+T ldexp(T x, T exp);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl, "($0 * pow(2.0f, $1))")
+vector<T,N> ldexp(vector<T,N> x, vector<T,N> exp);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+matrix<T,N,M> ldexp(matrix<T,N,M> x, matrix<T,N,M> exp);
// Vector length
__generic<T : __BuiltinFloatingPointType, let N : int> T length(vector<T,N> x);