From be07c80cf7774e8ada84ddc29ae7ab5efa4d1ec9 Mon Sep 17 00:00:00 2001 From: Joshua Batista Date: Thu, 29 Sep 2022 13:43:24 -0700 Subject: [PATCH] [HLSL] add ceil library function This change exposes the ceil library function for HLSL, excluding long, int, and long long doubles. Ceil 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 ceil function only works on floating type arguments. The full documentation of the HLSL ceil function is available here: https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-ceil Reviewed By: python3kgae Differential Revision: https://reviews.llvm.org/D134319 --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 31 ++++++++++++- clang/test/CodeGenHLSL/builtins/ceil.hlsl | 77 +++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGenHLSL/builtins/ceil.hlsl diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 172e78d..43f8dfe 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -13,7 +13,6 @@ __attribute__((availability(shadermodel, introduced = 6.0))) __attribute__((clang_builtin_alias(__builtin_hlsl_wave_active_count_bits))) uint WaveActiveCountBits(bool bBit); - // abs builtins #ifdef __HLSL_ENABLE_16_BIT __attribute__((clang_builtin_alias(__builtin_elementwise_abs))) @@ -33,7 +32,6 @@ __attribute__((clang_builtin_alias(__builtin_elementwise_abs))) half4 abs(half4); #endif - __attribute__((clang_builtin_alias(__builtin_elementwise_abs))) int abs(int); __attribute__((clang_builtin_alias(__builtin_elementwise_abs))) int2 abs(int2); __attribute__((clang_builtin_alias(__builtin_elementwise_abs))) int3 abs(int3); @@ -71,5 +69,34 @@ __attribute__((clang_builtin_alias(__builtin_sqrtf))) float sqrt(float In); __attribute__((clang_builtin_alias(__builtin_sqrtf16))) half sqrt(half In); #endif +// ceil builtins +#ifdef __HLSL_ENABLE_16_BIT +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +half ceil(half); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +half2 ceil(half2); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +half3 ceil(half3); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +half4 ceil(half4); +#endif + +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) float +ceil(float); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +float2 ceil(float2); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +float3 ceil(float3); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +float4 ceil(float4); + +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) double +ceil(double); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +double2 ceil(double2); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +double3 ceil(double3); +__attribute__((clang_builtin_alias(__builtin_elementwise_ceil))) +double4 ceil(double4); #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/test/CodeGenHLSL/builtins/ceil.hlsl b/clang/test/CodeGenHLSL/builtins/ceil.hlsl new file mode 100644 index 0000000..69f2b82 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/ceil.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: call half @llvm.ceil.f16( +// NO_HALF: define noundef float @"?test_ceil_half@@YA$halff@$halff@@Z"( +// NO_HALF: call float @llvm.ceil.f32(float %0) +half test_ceil_half ( half p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <2 x half> @ +// CHECK: call <2 x half> @llvm.ceil.v2f16( +// NO_HALF: define noundef <2 x float> @"?test_ceil_half2@@YAT?$__vector@$halff@$01@__clang@@T12@@Z"( +// NO_HALF: call <2 x float> @llvm.ceil.v2f32( +half2 test_ceil_half2 ( half2 p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <3 x half> @ +// CHECK: call <3 x half> @llvm.ceil.v3f16( +// NO_HALF: define noundef <3 x float> @"?test_ceil_half3@@YAT?$__vector@$halff@$02@__clang@@T12@@Z"( +// NO_HALF: call <3 x float> @llvm.ceil.v3f32( +half3 test_ceil_half3 ( half3 p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <4 x half> @ +// CHECK: call <4 x half> @llvm.ceil.v4f16( +// NO_HALF: define noundef <4 x float> @"?test_ceil_half4@@YAT?$__vector@$halff@$03@__clang@@T12@@Z"( +// NO_HALF: call <4 x float> @llvm.ceil.v4f32( +half4 test_ceil_half4 ( half4 p0 ) { + return ceil ( p0 ); +} + +// CHECK: define noundef float @ +// CHECK: call float @llvm.ceil.f32( +float test_ceil_float ( float p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <2 x float> @ +// CHECK: call <2 x float> @llvm.ceil.v2f32( +float2 test_ceil_float2 ( float2 p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <3 x float> @ +// CHECK: call <3 x float> @llvm.ceil.v3f32( +float3 test_ceil_float3 ( float3 p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <4 x float> @ +// CHECK: call <4 x float> @llvm.ceil.v4f32( +float4 test_ceil_float4 ( float4 p0 ) { + return ceil ( p0 ); +} + +// CHECK: define noundef double @ +// CHECK: call double @llvm.ceil.f64( +double test_ceil_double ( double p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <2 x double> @ +// CHECK: call <2 x double> @llvm.ceil.v2f64( +double2 test_ceil_double2 ( double2 p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <3 x double> @ +// CHECK: call <3 x double> @llvm.ceil.v3f64( +double3 test_ceil_double3 ( double3 p0 ) { + return ceil ( p0 ); +} +// CHECK: define noundef <4 x double> @ +// CHECK: call <4 x double> @llvm.ceil.v4f64( +double4 test_ceil_double4 ( double4 p0 ) { + return ceil ( p0 ); +} -- 2.7.4