Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementing asfloat using bit_cast #108686

Merged
merged 1 commit into from
Sep 16, 2024
Merged

Conversation

joaosaffran
Copy link
Contributor

This PR is implementing asfloat for HLSL.

Fixes: #70098

@joaosaffran joaosaffran marked this pull request as ready for review September 14, 2024 06:26
@llvmbot llvmbot added clang Clang issues not falling into any other category backend:X86 clang:headers Headers provided by Clang, e.g. for intrinsics HLSL HLSL Language Support labels Sep 14, 2024
@llvmbot
Copy link
Member

llvmbot commented Sep 14, 2024

@llvm/pr-subscribers-backend-x86
@llvm/pr-subscribers-hlsl

@llvm/pr-subscribers-clang

Author: None (joaosaffran)

Changes

This PR is implementing asfloat for HLSL.

Fixes: #70098


Full diff: https://github.com/llvm/llvm-project/pull/108686.diff

3 Files Affected:

  • (modified) clang/lib/Headers/hlsl/hlsl_intrinsics.h (+17)
  • (added) clang/test/CodeGenHLSL/builtins/asfloat.hlsl (+40)
  • (added) clang/test/SemaHLSL/BuiltIns/asfloat-errors.hlsl (+35)
diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h
index b5c22f7c91b2d6..cb8e1119e9b4e8 100644
--- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h
+++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h
@@ -361,6 +361,23 @@ bool any(double3);
 _HLSL_BUILTIN_ALIAS(__builtin_hlsl_any)
 bool any(double4);
 
+//===----------------------------------------------------------------------===//
+// asfloat builtins
+//===----------------------------------------------------------------------===//
+
+/// \fn uint asfloat(T Val)
+/// \brief Interprets the bit pattern of x as an unsigned integer.
+/// \param Val The input value.
+
+template <typename T, int N>
+_HLSL_INLINE vector<float, N> asfloat(vector<T, N> V) {
+  return __detail::bit_cast<float, T, N>(V);
+}
+
+template <typename T> _HLSL_INLINE float asfloat(T F) {
+  return __detail::bit_cast<float, T>(F);
+}
+
 //===----------------------------------------------------------------------===//
 // asin builtins
 //===----------------------------------------------------------------------===//
diff --git a/clang/test/CodeGenHLSL/builtins/asfloat.hlsl b/clang/test/CodeGenHLSL/builtins/asfloat.hlsl
new file mode 100644
index 00000000000000..59fc15fa60b1e5
--- /dev/null
+++ b/clang/test/CodeGenHLSL/builtins/asfloat.hlsl
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -O1 -o - | FileCheck %s
+
+// CHECK: define {{.*}}test_uint{{.*}}(i32 {{.*}} [[VAL:%.*]]){{.*}} 
+// CHECK: bitcast i32 [[VAL]] to float
+float test_uint(uint p0) {
+  return asfloat(p0);
+}
+
+// CHECK: define {{.*}}test_int{{.*}}(i32 {{.*}} [[VAL:%.*]]){{.*}} 
+// CHECK: bitcast i32 [[VAL]] to float
+float test_int(int p0) {
+  return asfloat(p0);
+}
+
+// CHECK: define {{.*}}test_float{{.*}}(float {{.*}} [[VAL:%.*]]){{.*}} 
+// CHECK-NOT: bitcast
+// CHECK: ret float [[VAL]]
+float test_float(float p0) {
+  return asfloat(p0);
+}
+
+// CHECK: define {{.*}}test_vector_uint{{.*}}(<4 x i32> {{.*}} [[VAL:%.*]]){{.*}} 
+// CHECK: bitcast <4 x i32> [[VAL]] to <4 x float>
+
+float4 test_vector_uint(uint4 p0) {
+  return asfloat(p0);
+}
+
+// CHECK: define {{.*}}test_vector_int{{.*}}(<4 x i32> {{.*}} [[VAL:%.*]]){{.*}} 
+// CHECK: bitcast <4 x i32> [[VAL]] to <4 x float>
+float4 test_vector_int(int4 p0) {
+  return asfloat(p0);
+}
+
+// CHECK: define {{.*}}test_vector_float{{.*}}(<4 x float> {{.*}} [[VAL:%.*]]){{.*}} 
+// CHECK-NOT: bitcast
+// CHECK: ret <4 x float> [[VAL]]
+float4 test_vector_float(float4 p0) {
+  return asfloat(p0);
+}
diff --git a/clang/test/SemaHLSL/BuiltIns/asfloat-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/asfloat-errors.hlsl
new file mode 100644
index 00000000000000..16273a513c41e6
--- /dev/null
+++ b/clang/test/SemaHLSL/BuiltIns/asfloat-errors.hlsl
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -verify
+
+
+float4 test_float_too_many_arg(float p0, float p1) {
+  return asfloat(p0, p1);
+  // expected-error@-1 {{no matching function for call to 'asfloat'}}
+  // expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires single argument 'V', but 2 arguments were provided}}
+  // expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires single argument 'F', but 2 arguments were provided}}
+}
+
+
+float test_float_double(double p1) {
+    return asfloat(p1);
+    // expected-error@hlsl/hlsl_intrinsics.h:* {{no matching function for call to 'bit_cast'}}
+    // expected-note@-2 {{in instantiation of function template specialization 'hlsl::asfloat<double>'}}
+    // expected-note@hlsl/hlsl_detail.h:* {{candidate template ignored: could not match 'vector<double, N>' against 'double'}}
+    // expected-note@hlsl/hlsl_detail.h:* {{candidate template ignored: substitution failure [with U = float, T = double]: no type named 'Type'}}
+}
+
+float test_float_half(half p1) {
+    return asfloat(p1);
+    // expected-error@hlsl/hlsl_intrinsics.h:* {{no matching function for call to 'bit_cast'}}
+    // expected-note@-2 {{in instantiation of function template specialization 'hlsl::asfloat<half>'}}
+    // expected-note@hlsl/hlsl_detail.h:* {{candidate template ignored: could not match 'vector<half, N>' against 'half'}}
+    // expected-note@hlsl/hlsl_detail.h:* {{candidate template ignored: substitution failure [with U = float, T = half]: no type named 'Type'}}
+}
+
+
+float test_float_half(bool p1) {
+    return asfloat(p1);
+    // expected-error@hlsl/hlsl_intrinsics.h:* {{no matching function for call to 'bit_cast'}}
+    // expected-note@-2 {{in instantiation of function template specialization 'hlsl::asfloat<bool>'}}
+    // expected-note@hlsl/hlsl_detail.h:* {{candidate template ignored: could not match 'vector<bool, N>' against 'bool'}}
+    // expected-note@hlsl/hlsl_detail.h:* {{candidate template ignored: substitution failure [with U = float, T = bool]: no type named 'Type'}}
+}
\ No newline at end of file

@joaosaffran
Copy link
Contributor Author

Can someone merge this, please :)

@farzonl farzonl merged commit 1bfc3d0 into llvm:main Sep 16, 2024
4 of 6 checks passed
@joaosaffran joaosaffran deleted the instrinsics/asfloat branch September 19, 2024 00:17
@farzonl farzonl mentioned this pull request Sep 24, 2024
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:X86 clang:headers Headers provided by Clang, e.g. for intrinsics clang Clang issues not falling into any other category HLSL HLSL Language Support
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

Implement the asfloat HLSL Function
6 participants