From e1e7a6eec04ee1d04dc7e0d0212208d4c7a9592b Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 12 Feb 2020 10:44:07 -0500 Subject: 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. --- source/slang/hlsl.meta.slang | 28 ++++++++++++++++++++++------ source/slang/hlsl.meta.slang.h | 30 +++++++++++++++++++++++------- source/slang/slang-hlsl-intrinsic-set.h | 7 ++++++- 3 files changed, 51 insertions(+), 14 deletions(-) (limited to 'source/slang') 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 bool isfinite(T x); -__generic vector isfinite(vector x); -__generic matrix isfinite(matrix x); + +__generic +__target_intrinsic(glsl, "(!(isinf($0) || isnan($0)))") +bool isfinite(T x); + +__generic +__target_intrinsic(glsl, "(!(isinf($0) || isnan($0)))") +vector isfinite(vector x); + +__generic +matrix isfinite(matrix x); // Is floating-point value infinite? __generic bool isinf(T x); @@ -959,9 +967,17 @@ __generic vector isnan(vect __generic matrix isnan(matrix x); // Construct float from mantissa and exponent -__generic T ldexp(T x, T exp); -__generic vector ldexp(vector x, vector exp); -__generic matrix ldexp(matrix x, matrix exp); + +__generic +__target_intrinsic(glsl, "($0 * pow(2.0f, $1))") +T ldexp(T x, T exp); + +__generic +__target_intrinsic(glsl, "($0 * pow(2.0f, $1))") +vector ldexp(vector x, vector exp); + +__generic +matrix ldexp(matrix x, matrix exp); // Vector length __generic T length(vector 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 bool isfinite(T x);\n") -SLANG_RAW("__generic vector isfinite(vector x);\n") -SLANG_RAW("__generic matrix isfinite(matrix x);\n") +SLANG_RAW("\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"(!(isinf($0) || isnan($0)))\")\n") +SLANG_RAW("bool isfinite(T x);\n") +SLANG_RAW("\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"(!(isinf($0) || isnan($0)))\")\n") +SLANG_RAW("vector isfinite(vector x);\n") +SLANG_RAW("\n") +SLANG_RAW("__generic\n") +SLANG_RAW("matrix isfinite(matrix x);\n") SLANG_RAW("\n") SLANG_RAW("// Is floating-point value infinite?\n") SLANG_RAW("__generic bool isinf(T x);\n") @@ -1035,9 +1043,17 @@ SLANG_RAW("__generic vector SLANG_RAW("__generic matrix isnan(matrix x);\n") SLANG_RAW("\n") SLANG_RAW("// Construct float from mantissa and exponent\n") -SLANG_RAW("__generic T ldexp(T x, T exp);\n") -SLANG_RAW("__generic vector ldexp(vector x, vector exp);\n") -SLANG_RAW("__generic matrix ldexp(matrix x, matrix exp);\n") +SLANG_RAW("\n") +SLANG_RAW("__generic\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\n") +SLANG_RAW("__target_intrinsic(glsl, \"($0 * pow(2.0f, $1))\")\n") +SLANG_RAW("vector ldexp(vector x, vector exp);\n") +SLANG_RAW("\n") +SLANG_RAW("__generic\n") +SLANG_RAW("matrix ldexp(matrix x, matrix exp);\n") SLANG_RAW("\n") SLANG_RAW("// Vector length\n") SLANG_RAW("__generic T length(vector 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 { -- cgit v1.2.3