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. --- tests/hlsl-intrinsic/classify-double.slang | 31 ++++++++++++++++++++++ .../classify-double.slang.expected.txt | 4 +++ tests/hlsl-intrinsic/classify-float.slang | 28 +++++++++++++++++++ .../classify-float.slang.expected.txt | 4 +++ tests/hlsl-intrinsic/scalar-double.slang | 2 ++ .../scalar-double.slang.expected.txt | 8 +++--- tests/hlsl-intrinsic/scalar-float.slang | 6 +++-- .../hlsl-intrinsic/scalar-float.slang.expected.txt | 8 +++--- 8 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 tests/hlsl-intrinsic/classify-double.slang create mode 100644 tests/hlsl-intrinsic/classify-double.slang.expected.txt create mode 100644 tests/hlsl-intrinsic/classify-float.slang create mode 100644 tests/hlsl-intrinsic/classify-float.slang.expected.txt (limited to 'tests') diff --git a/tests/hlsl-intrinsic/classify-double.slang b/tests/hlsl-intrinsic/classify-double.slang new file mode 100644 index 000000000..ba7f2cbf9 --- /dev/null +++ b/tests/hlsl-intrinsic/classify-double.slang @@ -0,0 +1,31 @@ +//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute + +// inf, -inf, nan, finite +//TEST_INPUT:ubuffer(data=[ 0 0x7ff00000 0 0xfff00000 0xffffffff 0x7fffffff 1 0], stride=4):name inputBuffer +RWStructuredBuffer inputBuffer; + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer +RWStructuredBuffer outputBuffer; + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + int idx = int(dispatchThreadID.x); + + uint low = inputBuffer[idx * 2 + 0]; + uint high = inputBuffer[idx * 2 + 1]; + + double v = asdouble(low, high); + + int flags = 0; + + flags |= isnan(v) ? 1 : 0; + flags |= isfinite(v) ? 2 : 0; + flags |= isinf(v) ? 4 : 0; + + outputBuffer[idx] = flags; +} \ No newline at end of file diff --git a/tests/hlsl-intrinsic/classify-double.slang.expected.txt b/tests/hlsl-intrinsic/classify-double.slang.expected.txt new file mode 100644 index 000000000..1688f7508 --- /dev/null +++ b/tests/hlsl-intrinsic/classify-double.slang.expected.txt @@ -0,0 +1,4 @@ +4 +4 +1 +2 diff --git a/tests/hlsl-intrinsic/classify-float.slang b/tests/hlsl-intrinsic/classify-float.slang new file mode 100644 index 000000000..1b23dc748 --- /dev/null +++ b/tests/hlsl-intrinsic/classify-float.slang @@ -0,0 +1,28 @@ +//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute + +// inf, -inf, nan, finite +//TEST_INPUT:ubuffer(data=[ 0x7f800000 0xff800000 0x7fffffff 1 ], stride=4):name inputBuffer +RWStructuredBuffer inputBuffer; + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer +RWStructuredBuffer outputBuffer; + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + int idx = int(dispatchThreadID.x); + + float v = inputBuffer[idx]; + + int flags = 0; + + flags |= isnan(v) ? 1 : 0; + flags |= isfinite(v) ? 2 : 0; + flags |= isinf(v) ? 4 : 0; + + outputBuffer[idx] = flags; +} \ No newline at end of file diff --git a/tests/hlsl-intrinsic/classify-float.slang.expected.txt b/tests/hlsl-intrinsic/classify-float.slang.expected.txt new file mode 100644 index 000000000..1688f7508 --- /dev/null +++ b/tests/hlsl-intrinsic/classify-float.slang.expected.txt @@ -0,0 +1,4 @@ +4 +4 +1 +2 diff --git a/tests/hlsl-intrinsic/scalar-double.slang b/tests/hlsl-intrinsic/scalar-double.slang index 705a6d88a..35f530269 100644 --- a/tests/hlsl-intrinsic/scalar-double.slang +++ b/tests/hlsl-intrinsic/scalar-double.slang @@ -86,5 +86,7 @@ void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) ft += asdouble(low, high); } + ft += ldexp(23.2, f); + outputBuffer[idx] = int(ft * 16); } \ No newline at end of file diff --git a/tests/hlsl-intrinsic/scalar-double.slang.expected.txt b/tests/hlsl-intrinsic/scalar-double.slang.expected.txt index 2fedcded2..05bb16948 100644 --- a/tests/hlsl-intrinsic/scalar-double.slang.expected.txt +++ b/tests/hlsl-intrinsic/scalar-double.slang.expected.txt @@ -1,4 +1,4 @@ -FFFFFA0C -FFFFFDE8 -1D5 -5CA +FFFFFB7F +FFFFFFA1 +3E2 +83B diff --git a/tests/hlsl-intrinsic/scalar-float.slang b/tests/hlsl-intrinsic/scalar-float.slang index 6c090cff1..e0d338075 100644 --- a/tests/hlsl-intrinsic/scalar-float.slang +++ b/tests/hlsl-intrinsic/scalar-float.slang @@ -82,9 +82,11 @@ void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) int vi = asint(f - f) + idx; ft += float(vi); - + + ft += ldexp(23.2, f); + uint vu = asuint(f); ft += asfloat(vu); outputBuffer[idx] = int(ft * 16); -} \ No newline at end of file +} diff --git a/tests/hlsl-intrinsic/scalar-float.slang.expected.txt b/tests/hlsl-intrinsic/scalar-float.slang.expected.txt index 3ad5914c4..2b6c42d94 100644 --- a/tests/hlsl-intrinsic/scalar-float.slang.expected.txt +++ b/tests/hlsl-intrinsic/scalar-float.slang.expected.txt @@ -1,4 +1,4 @@ -FFFFFA0C -FFFFFDF4 -1ED -5EE +FFFFFB7F +FFFFFFAD +3FA +85F -- cgit v1.2.3