summaryrefslogtreecommitdiffstats
path: root/source
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
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')
-rw-r--r--source/slang/hlsl.meta.slang28
-rw-r--r--source/slang/hlsl.meta.slang.h30
-rw-r--r--source/slang/slang-hlsl-intrinsic-set.h7
3 files changed, 51 insertions, 14 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);
diff --git a/source/slang/hlsl.meta.slang.h b/source/slang/hlsl.meta.slang.h
index f69d0cb3d..6721d4a28 100644
--- a/source/slang/hlsl.meta.slang.h
+++ b/source/slang/hlsl.meta.slang.h
@@ -1020,9 +1020,17 @@ SLANG_RAW("__target_intrinsic(cuda, \"($2 = (uint)atomicXor((int*)&$0, $1))\")\n
SLANG_RAW("void InterlockedXor(__ref uint dest, uint value, out uint original_value);\n")
SLANG_RAW("\n")
SLANG_RAW("// Is floating-point value finite?\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType> bool isfinite(T x);\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isfinite(vector<T,N> x);\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isfinite(matrix<T,N,M> x);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n")
+SLANG_RAW("__target_intrinsic(glsl, \"(!(isinf($0) || isnan($0)))\")\n")
+SLANG_RAW("bool isfinite(T x);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n")
+SLANG_RAW("__target_intrinsic(glsl, \"(!(isinf($0) || isnan($0)))\")\n")
+SLANG_RAW("vector<bool,N> isfinite(vector<T,N> x);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n")
+SLANG_RAW("matrix<bool,N,M> isfinite(matrix<T,N,M> x);\n")
SLANG_RAW("\n")
SLANG_RAW("// Is floating-point value infinite?\n")
SLANG_RAW("__generic<T : __BuiltinFloatingPointType> bool isinf(T x);\n")
@@ -1035,9 +1043,17 @@ SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N>
SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isnan(matrix<T,N,M> x);\n")
SLANG_RAW("\n")
SLANG_RAW("// Construct float from mantissa and exponent\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType> T ldexp(T x, T exp);\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> ldexp(vector<T,N> x, vector<T,N> exp);\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> ldexp(matrix<T,N,M> x, matrix<T,N,M> exp);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n")
+SLANG_RAW("__target_intrinsic(glsl, \"($0 * pow(2.0f, $1))\")\n")
+SLANG_RAW("T ldexp(T x, T exp);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n")
+SLANG_RAW("__target_intrinsic(glsl, \"($0 * pow(2.0f, $1))\")\n")
+SLANG_RAW("vector<T,N> ldexp(vector<T,N> x, vector<T,N> exp);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n")
+SLANG_RAW("matrix<T,N,M> ldexp(matrix<T,N,M> x, matrix<T,N,M> exp);\n")
SLANG_RAW("\n")
SLANG_RAW("// Vector length\n")
SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> T length(vector<T,N> x);\n")
@@ -1625,7 +1641,7 @@ for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa)
sb << "};\n";
}
-SLANG_RAW("#line 1552 \"hlsl.meta.slang\"")
+SLANG_RAW("#line 1568 \"hlsl.meta.slang\"")
SLANG_RAW("\n")
SLANG_RAW("\n")
SLANG_RAW("\n")
diff --git a/source/slang/slang-hlsl-intrinsic-set.h b/source/slang/slang-hlsl-intrinsic-set.h
index 90ed9368f..ce951a008 100644
--- a/source/slang/slang-hlsl-intrinsic-set.h
+++ b/source/slang/slang-hlsl-intrinsic-set.h
@@ -124,7 +124,12 @@ just constructXXXFromScalar. Would be good if there was a suitable name to encom
\
x(GetAt, "", 2) \
\
- x(CountBits, "countbits", 1)
+ x(CountBits, "countbits", 1) \
+ \
+ x(IsInfinite, "isinf", 1) \
+ x(IsFinite, "isfinite", 1) \
+ x(IsNan, "isnan", 1) \
+ x(LdExp, "ldexp", 2)
struct HLSLIntrinsic
{