summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/hlsl.meta.slang20
1 files changed, 18 insertions, 2 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 6a3ae63ec..e00108e96 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -10628,7 +10628,15 @@ bool isinf(T x)
case spirv:
return spirv_asm { result:$$bool = OpIsInf $x};
case wgsl:
- __intrinsic_asm "($0 > 0x1.fffffep+127f) || ($0 < -0x1.fffffep+127f)";
+ static_assert(T is float, "isnan is implemented only for float type");
+ if (let f = x as float)
+ {
+ let bits = asuint(f);
+ let exp = (bits >> 23) & 0xffu;
+ let frac = bits & 0x7fffffu;
+ return exp == 0xffu && frac == 0u;
+ }
+ return false;
}
}
@@ -10684,7 +10692,15 @@ bool isnan(T x)
case spirv:
return spirv_asm { result:$$bool = OpIsNan $x};
case wgsl:
- __intrinsic_asm "$0 != $0";
+ static_assert(T is float, "isnan is implemented only for float type");
+ if (let f = x as float)
+ {
+ let bits = asuint(f);
+ let exp = (bits >> 23) & 0xffu;
+ let frac = bits & 0x7fffffu;
+ return exp == 0xffu && frac != 0u;
+ }
+ return false;
}
}