bob80905 created this revision. bob80905 added reviewers: python3kgae, beanz, pow2clk. Herald added a subscriber: Anastasia. Herald added a project: All. bob80905 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This change exposes the cos library function for HLSL, excluding long, int, and long long doubles. Cos is supported for all scalar, vector, and matrix types. Long and long long double support is missing in this patch because those types don't exist in HLSL. Int is missing because the cos function only works on floating type arguments. The full documentation of the HLSL cos function is available here: https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-cos Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D134921 Files: clang/lib/Headers/hlsl/hlsl_intrinsics.h clang/test/CodeGenHLSL/builtins/cos.hlsl
Index: clang/test/CodeGenHLSL/builtins/cos.hlsl =================================================================== --- /dev/null +++ clang/test/CodeGenHLSL/builtins/cos.hlsl @@ -0,0 +1,77 @@ +// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -fnative-half-type \ +// RUN: -emit-llvm -disable-llvm-passes -O3 -o - | FileCheck %s +// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes \ +// RUN: -D__HLSL_ENABLE_16_BIT -o - | FileCheck %s --check-prefix=NO_HALF + +// CHECK: define noundef half @ +// CHECK: noundef half @"?cos@@YA$f16@$f16@@Z"( +// NO_HALF: define noundef float @"?test_cos_half@@YA$halff@$halff@@Z"( +// NO_HALF: call noundef float @"?cos@@YAMM@Z"(float noundef %0) +half test_cos_half ( half p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <2 x half> @ +// CHECK: call noundef <2 x half> @"?cos@@YAT?$__vector@$f16@$01@__clang@@T12@@Z"( +// NO_HALF: define noundef <2 x float> @"?test_cos_float2@@YAT?$__vector@M$01@__clang@@T12@@Z"( +// NO_HALF: call noundef <2 x float> @"?cos@@YAT?$__vector@M$01@__clang@@T12@@Z"( +half2 test_cos_half2 ( half2 p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <3 x half> @ +// CHECK: call noundef <3 x half> @"?cos@@YAT?$__vector@$f16@$02@__clang@@T12@@Z"( +// NO_HALF: define noundef <3 x float> @"?test_cos_float3@@YAT?$__vector@M$02@__clang@@T12@@Z"( +// NO_HALF: call noundef <3 x float> @"?cos@@YAT?$__vector@M$02@__clang@@T12@@Z"( +half3 test_cos_half3 ( half3 p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <4 x half> @ +// CHECK: call noundef <4 x half> @"?cos@@YAT?$__vector@$f16@$03@__clang@@T12@@Z"( +// NO_HALF: define noundef <4 x float> @"?test_cos_float4@@YAT?$__vector@M$03@__clang@@T12@@Z"( +// NO_HALF: call noundef <4 x float> @"?cos@@YAT?$__vector@M$03@__clang@@T12@@Z"( +half4 test_cos_half4 ( half4 p0 ) { + return cos ( p0 ); +} + +// CHECK: define noundef float @ +// CHECK: call noundef float @"?cos@@YAMM@Z"( +float test_cos_float ( float p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <2 x float> @ +// CHECK: call noundef <2 x float> @"?cos@@YAT?$__vector@M$01@__clang@@T12@@Z"( +float2 test_cos_float2 ( float2 p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <3 x float> @ +// CHECK: call noundef <3 x float> @"?cos@@YAT?$__vector@M$02@__clang@@T12@@Z"( +float3 test_cos_float3 ( float3 p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <4 x float> @ +// CHECK: call noundef <4 x float> @"?cos@@YAT?$__vector@M$03@__clang@@T12@@Z"( +float4 test_cos_float4 ( float4 p0 ) { + return cos ( p0 ); +} + +// CHECK: define noundef double @ +// CHECK: call noundef double @"?cos@@YANN@Z"( +double test_cos_double ( double p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <2 x double> @ +// CHECK: call noundef <2 x double> @"?cos@@YAT?$__vector@N$01@__clang@@T12@@Z"( +double2 test_cos_double2 ( double2 p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <3 x double> @ +// CHECK: call noundef <3 x double> @"?cos@@YAT?$__vector@N$02@__clang@@T12@@Z"( +double3 test_cos_double3 ( double3 p0 ) { + return cos ( p0 ); +} +// CHECK: define noundef <4 x double> @ +// CHECK: call noundef <4 x double> @"?cos@@YAT?$__vector@N$03@__clang@@T12@@Z"( +double4 test_cos_double4 ( double4 p0 ) { + return cos ( p0 ); +} Index: clang/lib/Headers/hlsl/hlsl_intrinsics.h =================================================================== --- clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -99,4 +99,53 @@ __attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) double4 ceil(double4); +// cos builtins + +#ifdef __HLSL_ENABLE_16_BIT +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int16_t cos(int16_t); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int16_t2 cos(int16_t2); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int16_t3 cos(int16_t3); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int16_t4 cos(int16_t4); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) half cos(half); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +half2 cos(half2); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +half3 cos(half3); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +half4 cos(half4); +#endif + +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) int cos(int); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) int2 cos(int2); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) int3 cos(int3); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) int4 cos(int4); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) float +cos(float); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +float2 cos(float2); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +float3 cos(float3); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +float4 cos(float4); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int64_t cos(int64_t); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int64_t2 cos(int64_t2); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int64_t3 cos(int64_t3); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +int64_t4 cos(int64_t4); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) double +cos(double); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +double2 cos(double2); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +double3 cos(double3); +__attribute__((clang_builtin_alias(__builtin_elementwise_cos))) +double4 cos(double4); + #endif //_HLSL_HLSL_INTRINSICS_H_
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits