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@__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 );
+}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to