[clang] be07c80 - [HLSL] add ceil library function

Xiang Li via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 29 14:04:01 PDT 2022


Author: Joshua Batista
Date: 2022-09-29T14:03:30-07:00
New Revision: be07c80cf7774e8ada84ddc29ae7ab5efa4d1ec9

URL: https://github.com/llvm/llvm-project/commit/be07c80cf7774e8ada84ddc29ae7ab5efa4d1ec9
DIFF: https://github.com/llvm/llvm-project/commit/be07c80cf7774e8ada84ddc29ae7ab5efa4d1ec9.diff

LOG: [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

Added: 
    clang/test/CodeGenHLSL/builtins/ceil.hlsl

Modified: 
    clang/lib/Headers/hlsl/hlsl_intrinsics.h

Removed: 
    


################################################################################
diff  --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h
index 172e78d0357a7..43f8dfee7a5f1 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 0000000000000..69f2b82730673
--- /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 at __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 at __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 at __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 );
+}


        


More information about the cfe-commits mailing list