Skip to content

Commit a88a4ed

Browse files
Adding asuint implementation to hlsl
1 parent fb14941 commit a88a4ed

File tree

5 files changed

+122
-11
lines changed

5 files changed

+122
-11
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4751,6 +4751,12 @@ def HLSLRcp : LangBuiltin<"HLSL_LANG"> {
47514751
let Prototype = "void(...)";
47524752
}
47534753

4754+
def HLSLAsUint : LangBuiltin<"HLSL_LANG"> {
4755+
let Spellings = ["__builtin_hlsl_elementwise_asuint"];
4756+
let Attributes = [NoThrow, Const];
4757+
let Prototype = "void(...)";
4758+
}
4759+
47544760
def HLSLRSqrt : LangBuiltin<"HLSL_LANG"> {
47554761
let Spellings = ["__builtin_hlsl_elementwise_rsqrt"];
47564762
let Attributes = [NoThrow, Const];

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
#include "clang/AST/Decl.h"
2828
#include "clang/AST/OSLog.h"
2929
#include "clang/AST/OperationKinds.h"
30+
#include "clang/Basic/Builtins.h"
3031
#include "clang/Basic/TargetBuiltins.h"
3132
#include "clang/Basic/TargetInfo.h"
3233
#include "clang/Basic/TargetOptions.h"
34+
#include "clang/Basic/TokenKinds.h"
3335
#include "clang/CodeGen/CGFunctionInfo.h"
3436
#include "clang/Frontend/FrontendDiagnostic.h"
3537
#include "llvm/ADT/APFloat.h"
@@ -39,6 +41,7 @@
3941
#include "llvm/ADT/StringExtras.h"
4042
#include "llvm/Analysis/ValueTracking.h"
4143
#include "llvm/IR/DataLayout.h"
44+
#include "llvm/IR/DerivedTypes.h"
4245
#include "llvm/IR/InlineAsm.h"
4346
#include "llvm/IR/Intrinsics.h"
4447
#include "llvm/IR/IntrinsicsAArch64.h"
@@ -62,6 +65,7 @@
6265
#include "llvm/Support/ConvertUTF.h"
6366
#include "llvm/Support/MathExtras.h"
6467
#include "llvm/Support/ScopedPrinter.h"
68+
#include "llvm/Support/raw_ostream.h"
6569
#include "llvm/TargetParser/AArch64TargetParser.h"
6670
#include "llvm/TargetParser/RISCVISAInfo.h"
6771
#include "llvm/TargetParser/X86TargetParser.h"
@@ -18815,6 +18819,19 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1881518819
llvm::FunctionType::get(IntTy, {}, false), "__hlsl_wave_get_lane_index",
1881618820
{}, false, true));
1881718821
}
18822+
case Builtin::BI__builtin_hlsl_elementwise_asuint: {
18823+
Value *Op = EmitScalarExpr(E->getArg(0));
18824+
E->dump();
18825+
llvm::Type *DestTy = llvm::Type::getInt32Ty(this->getLLVMContext());
18826+
18827+
if (Op -> getType()->isVectorTy()){
18828+
auto VecTy = E->getArg(0)->getType()->getAs<VectorType>();
18829+
DestTy = llvm::VectorType::get(DestTy, VecTy->getNumElements(),
18830+
VecTy->isSizelessVectorType());
18831+
}
18832+
18833+
return Builder.CreateBitCast(Op, DestTy);
18834+
}
1881818835
case Builtin::BI__builtin_hlsl_wave_is_first_lane: {
1881918836
Intrinsic::ID ID = CGM.getHLSLRuntime().getWaveIsFirstLaneIntrinsic();
1882018837
return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID));

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -367,17 +367,6 @@ bool any(double4);
367367
/// \brief Returns the arcsine of the input value, \a Val.
368368
/// \param Val The input value.
369369

370-
#ifdef __HLSL_ENABLE_16_BIT
371-
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
372-
half asin(half);
373-
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
374-
half2 asin(half2);
375-
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
376-
half3 asin(half3);
377-
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
378-
half4 asin(half4);
379-
#endif
380-
381370
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
382371
float asin(float);
383372
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
@@ -387,6 +376,33 @@ float3 asin(float3);
387376
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
388377
float4 asin(float4);
389378

379+
//===----------------------------------------------------------------------===//
380+
// asin builtins
381+
//===----------------------------------------------------------------------===//
382+
383+
/// \fn uint asin(T Val)
384+
/// \brief Reinterprest.
385+
/// \param Val The input value.
386+
387+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
388+
uint asuint(float);
389+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
390+
uint2 asuint(float2);
391+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
392+
uint3 asuint(float3);
393+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
394+
uint4 asuint(float4);
395+
396+
397+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
398+
uint asuint(double);
399+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
400+
uint2 asuint(double2);
401+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
402+
uint3 asuint(double3);
403+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
404+
uint4 asuint(double4);
405+
390406
//===----------------------------------------------------------------------===//
391407
// atan builtins
392408
//===----------------------------------------------------------------------===//

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "llvm/ADT/SmallVector.h"
2929
#include "llvm/ADT/StringExtras.h"
3030
#include "llvm/ADT/StringRef.h"
31+
#include "llvm/IR/DerivedTypes.h"
32+
#include "llvm/IR/Type.h"
3133
#include "llvm/Support/Casting.h"
3234
#include "llvm/Support/DXILABI.h"
3335
#include "llvm/Support/ErrorHandling.h"
@@ -1646,6 +1648,23 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
16461648
return true;
16471649
break;
16481650
}
1651+
case Builtin::BI__builtin_hlsl_elementwise_asuint: {
1652+
if (SemaRef.checkArgCount(TheCall, 1))
1653+
return true;
1654+
1655+
ExprResult A = TheCall->getArg(0);
1656+
QualType ArgTyA = A.get()->getType();
1657+
1658+
if(ArgTyA->isVectorType()){
1659+
auto VecTy = TheCall->getArg(0)->getType()->getAs<VectorType>();
1660+
auto ReturnType = this->getASTContext().getVectorType(TheCall->getCallReturnType(this->getASTContext()), VecTy->getNumElements(),
1661+
VectorKind::Generic);
1662+
1663+
TheCall->setType(ReturnType);
1664+
}
1665+
1666+
break;
1667+
}
16491668
case Builtin::BI__builtin_elementwise_acos:
16501669
case Builtin::BI__builtin_elementwise_asin:
16511670
case Builtin::BI__builtin_elementwise_atan:
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s
2+
3+
// // CHECK-LABEL: builtin_test_asuint_float
4+
// // CHECK: bitcast float %0 to i32
5+
// // CHECK: ret <4 x i32> %dx.clamp
6+
// export uint builtin_test_asuint_float(float p0) {
7+
// return __builtin_hlsl_elementwise_asuint(p0);
8+
// }
9+
10+
11+
// // CHECK-LABEL: builtin_test_asuint_float
12+
// // CHECK: bitcast float %0 to i32
13+
// // CHECK: ret <4 x i32> %dx.clamp
14+
// export uint builtin_test_asuint_double(double p0) {
15+
// return __builtin_hlsl_elementwise_asuint(p0);
16+
// }
17+
18+
19+
// // CHECK-LABEL: builtin_test_asuint_float
20+
// // CHECK: bitcast float %0 to i32
21+
// // CHECK: ret <4 x i32> %dx.clamp
22+
// export uint builtin_test_asuint_half(half p0) {
23+
// return __builtin_hlsl_elementwise_asuint(p0);
24+
// }
25+
26+
27+
// // CHECK-LABEL: builtin_test_asuint_float
28+
// // CHECK: bitcast float %0 to i32
29+
// // CHECK: ret <4 x i32> %dx.clamp
30+
// export uint4 builtin_test_asuint_float_vector(float p0) {
31+
// return __builtin_hlsl_elementwise_asuint(p0);
32+
// }
33+
34+
35+
// CHECK-LABEL: builtin_test_asuint_float
36+
// CHECK: bitcast float %0 to i32
37+
// CHECK: ret <4 x i32> %dx.clamp
38+
export uint4 builtin_test_asuint_floa4t(float p0) {
39+
return asuint(p0);
40+
}
41+
42+
// export uint4 builtin_test_asuint4_uint(uint p0) {
43+
// return __builtin_hlsl_elementwise_asuint(p0);
44+
// }
45+
46+
47+
// export uint4 builtin_test_asuint4_int(int p0) {
48+
// return __builtin_hlsl_elementwise_asuint(p0);
49+
// }
50+
51+
// export uint builtin_test_asuint_float(float p0) {
52+
// return __builtin_hlsl_elementwise_asuint(p0);
53+
// }

0 commit comments

Comments
 (0)