Skip to content

Commit

Permalink
[HLSL] add log library functions
Browse files Browse the repository at this point in the history
This change exposes the log library functions for HLSL,excluding long, int, and long long doubles. The log functions are 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 log functions only work on floating type arguments.

The full documentation of the HLSL log functions are available here:
https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-log
https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-log2
https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-log10

Reviewed By: python3kgae

Differential Revision: https://reviews.llvm.org/D144120
  • Loading branch information
bob80905 committed Feb 16, 2023
1 parent 891b091 commit f842b7a
Show file tree
Hide file tree
Showing 4 changed files with 257 additions and 0 deletions.
89 changes: 89 additions & 0 deletions clang/lib/Headers/hlsl/hlsl_intrinsics.h
Expand Up @@ -219,5 +219,94 @@ double3 trunc(double3);
__attribute__((clang_builtin_alias(__builtin_elementwise_trunc)))
double4 trunc(double4);

// log builtins
#ifdef __HLSL_ENABLE_16_BIT
__attribute__((clang_builtin_alias(__builtin_elementwise_log))) half log(half);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
half2 log(half2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
half3 log(half3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
half4 log(half4);
#endif

__attribute__((clang_builtin_alias(__builtin_elementwise_log))) float
log(float);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
float2 log(float2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
float3 log(float3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
float4 log(float4);

__attribute__((clang_builtin_alias(__builtin_elementwise_log))) double
log(double);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
double2 log(double2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
double3 log(double3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log)))
double4 log(double4);

// log2 builtins
#ifdef __HLSL_ENABLE_16_BIT
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
half log2(half);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
half2 log2(half2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
half3 log2(half3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
half4 log2(half4);
#endif

__attribute__((clang_builtin_alias(__builtin_elementwise_log2))) float
log2(float);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
float2 log2(float2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
float3 log2(float3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
float4 log2(float4);

__attribute__((clang_builtin_alias(__builtin_elementwise_log2))) double
log2(double);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
double2 log2(double2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
double3 log2(double3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log2)))
double4 log2(double4);

// log10 builtins
#ifdef __HLSL_ENABLE_16_BIT
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
half log10(half);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
half2 log10(half2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
half3 log10(half3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
half4 log10(half4);
#endif

__attribute__((clang_builtin_alias(__builtin_elementwise_log10))) float
log10(float);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
float2 log10(float2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
float3 log10(float3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
float4 log10(float4);

__attribute__((clang_builtin_alias(__builtin_elementwise_log10))) double
log10(double);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
double2 log10(double2);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
double3 log10(double3);
__attribute__((clang_builtin_alias(__builtin_elementwise_log10)))
double4 log10(double4);

} // namespace hlsl
#endif //_HLSL_HLSL_INTRINSICS_H_
56 changes: 56 additions & 0 deletions clang/test/CodeGenHLSL/builtins/log.hlsl
@@ -0,0 +1,56 @@
// 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.log.f16(
// NO_HALF: define noundef float @"?test_log_half@@YA$halff@$halff@@Z"(
// NO_HALF: call float @llvm.log.f32(
half test_log_half ( half p0 ) {
return log ( p0 );
}
// CHECK: define noundef <2 x half> @
// CHECK: call <2 x half> @llvm.log.v2f16
// NO_HALF: define noundef <2 x float> @"?test_log_float2@@YAT?$__vector@M$01@__clang@@T12@@Z"(
// NO_HALF: call <2 x float> @llvm.log.v2f32(
half2 test_log_half2 ( half2 p0 ) {
return log ( p0 );
}
// CHECK: define noundef <3 x half> @
// CHECK: call <3 x half> @llvm.log.v3f16
// NO_HALF: define noundef <3 x float> @"?test_log_float3@@YAT?$__vector@M$02@__clang@@T12@@Z"(
// NO_HALF: call <3 x float> @llvm.log.v3f32(
half3 test_log_half3 ( half3 p0 ) {
return log ( p0 );
}
// CHECK: define noundef <4 x half> @
// CHECK: call <4 x half> @llvm.log.v4f16
// NO_HALF: define noundef <4 x float> @"?test_log_float4@@YAT?$__vector@M$03@__clang@@T12@@Z"(
// NO_HALF: call <4 x float> @llvm.log.v4f32(
half4 test_log_half4 ( half4 p0 ) {
return log ( p0 );
}

// CHECK: define noundef float @
// CHECK: call float @llvm.log.f32(
float test_log_float ( float p0 ) {
return log ( p0 );
}
// CHECK: define noundef <2 x float> @
// CHECK: call <2 x float> @llvm.log.v2f32
float2 test_log_float2 ( float2 p0 ) {
return log ( p0 );
}
// CHECK: define noundef <3 x float> @
// CHECK: call <3 x float> @llvm.log.v3f32
float3 test_log_float3 ( float3 p0 ) {
return log ( p0 );
}
// CHECK: define noundef <4 x float> @
// CHECK: call <4 x float> @llvm.log.v4f32
float4 test_log_float4 ( float4 p0 ) {
return log ( p0 );
}
56 changes: 56 additions & 0 deletions clang/test/CodeGenHLSL/builtins/log10.hlsl
@@ -0,0 +1,56 @@
// 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.log10.f16(
// NO_HALF: define noundef float @"?test_log10_half@@YA$halff@$halff@@Z"(
// NO_HALF: call float @llvm.log10.f32(
half test_log10_half ( half p0 ) {
return log10 ( p0 );
}
// CHECK: define noundef <2 x half> @
// CHECK: call <2 x half> @llvm.log10.v2f16
// NO_HALF: define noundef <2 x float> @"?test_log10_float2@@YAT?$__vector@M$01@__clang@@T12@@Z"(
// NO_HALF: call <2 x float> @llvm.log10.v2f32(
half2 test_log10_half2 ( half2 p0 ) {
return log10 ( p0 );
}
// CHECK: define noundef <3 x half> @
// CHECK: call <3 x half> @llvm.log10.v3f16
// NO_HALF: define noundef <3 x float> @"?test_log10_float3@@YAT?$__vector@M$02@__clang@@T12@@Z"(
// NO_HALF: call <3 x float> @llvm.log10.v3f32(
half3 test_log10_half3 ( half3 p0 ) {
return log10 ( p0 );
}
// CHECK: define noundef <4 x half> @
// CHECK: call <4 x half> @llvm.log10.v4f16
// NO_HALF: define noundef <4 x float> @"?test_log10_float4@@YAT?$__vector@M$03@__clang@@T12@@Z"(
// NO_HALF: call <4 x float> @llvm.log10.v4f32(
half4 test_log10_half4 ( half4 p0 ) {
return log10 ( p0 );
}

// CHECK: define noundef float @
// CHECK: call float @llvm.log10.f32(
float test_log10_float ( float p0 ) {
return log10 ( p0 );
}
// CHECK: define noundef <2 x float> @
// CHECK: call <2 x float> @llvm.log10.v2f32
float2 test_log10_float2 ( float2 p0 ) {
return log10 ( p0 );
}
// CHECK: define noundef <3 x float> @
// CHECK: call <3 x float> @llvm.log10.v3f32
float3 test_log10_float3 ( float3 p0 ) {
return log10 ( p0 );
}
// CHECK: define noundef <4 x float> @
// CHECK: call <4 x float> @llvm.log10.v4f32
float4 test_log10_float4 ( float4 p0 ) {
return log10 ( p0 );
}
56 changes: 56 additions & 0 deletions clang/test/CodeGenHLSL/builtins/log2.hlsl
@@ -0,0 +1,56 @@
// 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.log2.f16(
// NO_HALF: define noundef float @"?test_log2_half@@YA$halff@$halff@@Z"(
// NO_HALF: call float @llvm.log2.f32(
half test_log2_half ( half p0 ) {
return log2 ( p0 );
}
// CHECK: define noundef <2 x half> @
// CHECK: call <2 x half> @llvm.log2.v2f16
// NO_HALF: define noundef <2 x float> @"?test_log2_float2@@YAT?$__vector@M$01@__clang@@T12@@Z"(
// NO_HALF: call <2 x float> @llvm.log2.v2f32(
half2 test_log2_half2 ( half2 p0 ) {
return log2 ( p0 );
}
// CHECK: define noundef <3 x half> @
// CHECK: call <3 x half> @llvm.log2.v3f16
// NO_HALF: define noundef <3 x float> @"?test_log2_float3@@YAT?$__vector@M$02@__clang@@T12@@Z"(
// NO_HALF: call <3 x float> @llvm.log2.v3f32(
half3 test_log2_half3 ( half3 p0 ) {
return log2 ( p0 );
}
// CHECK: define noundef <4 x half> @
// CHECK: call <4 x half> @llvm.log2.v4f16
// NO_HALF: define noundef <4 x float> @"?test_log2_float4@@YAT?$__vector@M$03@__clang@@T12@@Z"(
// NO_HALF: call <4 x float> @llvm.log2.v4f32(
half4 test_log2_half4 ( half4 p0 ) {
return log2 ( p0 );
}

// CHECK: define noundef float @
// CHECK: call float @llvm.log2.f32(
float test_log2_float ( float p0 ) {
return log2 ( p0 );
}
// CHECK: define noundef <2 x float> @
// CHECK: call <2 x float> @llvm.log2.v2f32
float2 test_log2_float2 ( float2 p0 ) {
return log2 ( p0 );
}
// CHECK: define noundef <3 x float> @
// CHECK: call <3 x float> @llvm.log2.v3f32
float3 test_log2_float3 ( float3 p0 ) {
return log2 ( p0 );
}
// CHECK: define noundef <4 x float> @
// CHECK: call <4 x float> @llvm.log2.v4f32
float4 test_log2_float4 ( float4 p0 ) {
return log2 ( p0 );
}

0 comments on commit f842b7a

Please sign in to comment.