From 4c4826d47eeef4675daae4ae53ff76f4d5ebd84a Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 16 Feb 2023 13:55:32 -0800 Subject: Overhaul global inst deduplication and cpp/cuda backend. (#2654) * Overhaul global inst deduplication and cpp/cuda backend. * Update IR documentation. --------- Co-authored-by: Yong He --- source/slang/hlsl.meta.slang | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) (limited to 'source/slang/hlsl.meta.slang') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 464811a96..1d2b327d2 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -872,36 +872,31 @@ matrix acos(matrix x) // Test if all components are non-zero (HLSL SM 1.0) __generic +__target_intrinsic(cpp, "bool($0)") +__target_intrinsic(cuda, "bool($0)") __target_intrinsic(glsl, "bool($0)") bool all(T x); __generic __target_intrinsic(hlsl) __target_intrinsic(glsl, "all(bvec$N0($0))") -bool all(vector x); -// TODO: implementation of `all()` in the stdlib is -// blocked on fixing implementation of `bool` vector -// `getAt` on the CUDA codegen path. -/* +bool all(vector x) { bool result = true; for(int i = 0; i < N; ++i) result = result && all(x[i]); return result; } -*/ __generic __target_intrinsic(hlsl) -bool all(matrix x); -/* +bool all(matrix x) { bool result = true; for(int i = 0; i < N; ++i) result = result && all(x[i]); return result; } -*/ // Barrier for writes to all memory spaces (HLSL SM 5.0) __target_intrinsic(glsl, "memoryBarrier(), groupMemoryBarrier(), memoryBarrierImage(), memoryBarrierBuffer()") @@ -916,42 +911,39 @@ void AllMemoryBarrierWithGroupSync(); // Test if any components is non-zero (HLSL SM 1.0) __generic +__target_intrinsic(cpp, "bool($0)") +__target_intrinsic(cuda, "bool($0)") __target_intrinsic(glsl, "bool($0)") bool any(T x); __generic __target_intrinsic(hlsl) __target_intrinsic(glsl, "any(bvec$N0($0))") -bool any(vector x); -// TODO: implementation of `any()` in the stdlib is -// blocked on fixing implementation of `bool` vector -// `getAt` on the CUDA codegen path. -/* +bool any(vector x) { bool result = false; for(int i = 0; i < N; ++i) result = result || any(x[i]); return result; } -*/ __generic __target_intrinsic(hlsl) -bool any(matrix x); -/* +bool any(matrix x) { bool result = false; for(int i = 0; i < N; ++i) result = result || any(x[i]); return result; } -*/ // Reinterpret bits as a double (HLSL SM 5.0) __target_intrinsic(hlsl) __target_intrinsic(glsl, "packDouble2x32(uvec2($0, $1))") +__target_intrinsic(cpp, "$P_asdouble($0, $1)") +__target_intrinsic(cuda, "$P_asdouble($0, $1)") __target_intrinsic(spirv_direct, "%v = OpCompositeConstruct _type(uint2) resultId _0 _1; OpExtInst resultType resultId glsl450 59 %v") __glsl_extension(GL_ARB_gpu_shader5) double asdouble(uint lowbits, uint highbits); @@ -960,11 +952,15 @@ double asdouble(uint lowbits, uint highbits); __target_intrinsic(hlsl) __target_intrinsic(glsl, "intBitsToFloat") +__target_intrinsic(cpp, "$P_asfloat($0)") +__target_intrinsic(cuda, "$P_asfloat($0)") __target_intrinsic(spirv_direct, "OpBitcast resultType resultId _0") float asfloat(int x); __target_intrinsic(hlsl) __target_intrinsic(glsl, "uintBitsToFloat") +__target_intrinsic(cpp, "$P_asfloat($0)") +__target_intrinsic(cuda, "$P_asfloat($0)") __target_intrinsic(spirv_direct, "OpBitcast resultType resultId _0") float asfloat(uint x); @@ -1044,11 +1040,15 @@ matrix asin(matrix x) __target_intrinsic(hlsl) __target_intrinsic(glsl, "floatBitsToInt") +__target_intrinsic(cpp, "$P_asint($0)") +__target_intrinsic(cuda, "$P_asint($0)") __target_intrinsic(spirv_direct, "OpBitcast resultType resultId _0") int asint(float x); __target_intrinsic(hlsl) __target_intrinsic(glsl, "int($0)") +__target_intrinsic(cpp, "$P_asint($0)") +__target_intrinsic(cuda, "$P_asint($0)") __target_intrinsic(spirv_direct, "OpBitcast resultType resultId _0") int asint(uint x); @@ -1104,6 +1104,8 @@ matrix asint(matrix x) __target_intrinsic(hlsl) __target_intrinsic(glsl, "{ uvec2 v = unpackDouble2x32($0); $1 = v.x; $2 = v.y; }") __glsl_extension(GL_ARB_gpu_shader5) +__target_intrinsic(cpp, "$P_asuint($0, $1, $2)") +__target_intrinsic(cuda, "$P_asuint($0, $1, $2)") void asuint(double value, out uint lowbits, out uint highbits); // Reinterpret bits as a uint (HLSL SM 4.0) @@ -1111,11 +1113,15 @@ void asuint(double value, out uint lowbits, out uint highbits); __target_intrinsic(hlsl) __target_intrinsic(glsl, "floatBitsToUint") __target_intrinsic(spirv_direct, "OpBitcast resultType resultId _0") +__target_intrinsic(cpp, "$P_asuint($0)") +__target_intrinsic(cuda, "$P_asuint($0)") uint asuint(float x); __target_intrinsic(hlsl) __target_intrinsic(glsl, "uint($0)") __target_intrinsic(spirv_direct, "OpBitcast resultType resultId _0") +__target_intrinsic(cpp, "$P_asuint($0)") +__target_intrinsic(cuda, "$P_asuint($0)") uint asuint(int x); __generic @@ -1812,7 +1818,7 @@ __target_intrinsic(glsl, "unpackHalf2x16($0).x") __glsl_version(420) __target_intrinsic(hlsl) __cuda_sm_version(6.0) -__target_intrinsic(cuda, "__half2float(__short_as_half($0))") +__target_intrinsic(cuda, "__half2float(__ushort_as_half($0))") float f16tof32(uint value); __generic -- cgit v1.2.3