diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2020-02-12 10:44:07 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-12 10:44:07 -0500 |
| commit | e1e7a6eec04ee1d04dc7e0d0212208d4c7a9592b (patch) | |
| tree | 18543abbb95cb93accedf4b0ecc894b6a363f11b /source | |
| parent | fe9d27af9de047ea75db1334c961bb025fb732f6 (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.slang | 28 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang.h | 30 | ||||
| -rw-r--r-- | source/slang/slang-hlsl-intrinsic-set.h | 7 |
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 { |
