Skip to content

Commit a8a3478

Browse files
committed
[clang][HLSL] Add sign intrinsic part 3
1 parent 04f6504 commit a8a3478

File tree

5 files changed

+113
-1
lines changed

5 files changed

+113
-1
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4737,6 +4737,12 @@ def HLSLRSqrt : LangBuiltin<"HLSL_LANG"> {
47374737
let Prototype = "void(...)";
47384738
}
47394739

4740+
def HLSLSign : LangBuiltin<"HLSL_LANG"> {
4741+
let Spellings = ["__builtin_hlsl_elementwise_sign"];
4742+
let Attributes = [NoThrow, Const];
4743+
let Prototype = "int(...)";
4744+
}
4745+
47404746
// Builtins for XRay.
47414747
def XRayCustomEvent : Builtin {
47424748
let Spellings = ["__xray_customevent"];

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18662,6 +18662,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1866218662
llvm::FunctionType::get(IntTy, {}, false), "__hlsl_wave_get_lane_index",
1866318663
{}, false, true));
1866418664
}
18665+
case Builtin::BI__builtin_hlsl_elementwise_sign: {
18666+
Value *Op0 = EmitScalarExpr(E->getArg(0));
18667+
llvm::Type *Xty = Op0->getType();
18668+
llvm::Type *retType = llvm::Type::getInt32Ty(this->getLLVMContext());
18669+
if (Xty->isVectorTy()) {
18670+
auto *XVecTy = E->getArg(0)->getType()->getAs<VectorType>();
18671+
retType = llvm::VectorType::get(
18672+
retType, ElementCount::getFixed(XVecTy->getNumElements()));
18673+
}
18674+
if (!E->getArg(0)->getType()->hasFloatingRepresentation() &&
18675+
!E->getArg(0)->getType()->hasSignedIntegerRepresentation())
18676+
llvm_unreachable("sign operand must have a float or int representation");
18677+
18678+
return Builder.CreateIntrinsic(
18679+
retType, CGM.getHLSLRuntime().getSignIntrinsic(),
18680+
ArrayRef<Value *>{Op0}, nullptr, "hlsl.sign");
18681+
}
1866518682
}
1866618683
return nullptr;
1866718684
}

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class CGHLSLRuntime {
7878
GENERATE_HLSL_INTRINSIC_FUNCTION(Length, length)
7979
GENERATE_HLSL_INTRINSIC_FUNCTION(Lerp, lerp)
8080
GENERATE_HLSL_INTRINSIC_FUNCTION(Rsqrt, rsqrt)
81+
GENERATE_HLSL_INTRINSIC_FUNCTION(Sign, sign)
8182
GENERATE_HLSL_INTRINSIC_FUNCTION(ThreadId, thread_id)
8283

8384
//===----------------------------------------------------------------------===//

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ float4 lerp(float4, float4, float4);
916916
/// \brief Returns the length of the specified floating-point vector.
917917
/// \param x [in] The vector of floats, or a scalar float.
918918
///
919-
/// Length is based on the following formula: sqrt(x[0]^2 + x[1]^2 + …).
919+
/// Length is based on the following formula: sqrt(x[0]^2 + x[1]^2 + ).
920920

921921
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
922922
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_length)
@@ -1725,5 +1725,76 @@ _HLSL_AVAILABILITY(shadermodel, 6.0)
17251725
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_get_lane_index)
17261726
__attribute__((convergent)) uint WaveGetLaneIndex();
17271727

1728+
//===----------------------------------------------------------------------===//
1729+
// sign builtins
1730+
//===----------------------------------------------------------------------===//
1731+
1732+
/// \fn T sign(T Val)
1733+
/// \brief Returns -1 if \a Val is less than zero; 0 if \a Val equals zero; and
1734+
/// 1 if \a Val is greater than zero. \param Val The input value.
1735+
1736+
#ifdef __HLSL_ENABLE_16_BIT
1737+
_HLSL_AVAILABILITY(shadermodel, 6.2)
1738+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1739+
int16_t sign(int16_t);
1740+
_HLSL_AVAILABILITY(shadermodel, 6.2)
1741+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1742+
int16_t2 sign(int16_t2);
1743+
_HLSL_AVAILABILITY(shadermodel, 6.2)
1744+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1745+
int16_t3 sign(int16_t3);
1746+
_HLSL_AVAILABILITY(shadermodel, 6.2)
1747+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1748+
int16_t4 sign(int16_t4);
1749+
#endif
1750+
1751+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
1752+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1753+
half sign(half);
1754+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
1755+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1756+
half2 sign(half2);
1757+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
1758+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1759+
half3 sign(half3);
1760+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
1761+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1762+
half4 sign(half4);
1763+
1764+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1765+
int sign(int);
1766+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1767+
int2 sign(int2);
1768+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1769+
int3 sign(int3);
1770+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1771+
int4 sign(int4);
1772+
1773+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1774+
float sign(float);
1775+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1776+
float2 sign(float2);
1777+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1778+
float3 sign(float3);
1779+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1780+
float4 sign(float4);
1781+
1782+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1783+
int64_t sign(int64_t);
1784+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1785+
int64_t2 sign(int64_t2);
1786+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1787+
int64_t3 sign(int64_t3);
1788+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1789+
int64_t4 sign(int64_t4);
1790+
1791+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1792+
double sign(double);
1793+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1794+
double2 sign(double2);
1795+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1796+
double3 sign(double3);
1797+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign)
1798+
double4 sign(double4);
17281799
} // namespace hlsl
17291800
#endif //_HLSL_HLSL_INTRINSICS_H_

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "clang/AST/Decl.h"
1313
#include "clang/AST/Expr.h"
1414
#include "clang/AST/RecursiveASTVisitor.h"
15+
#include "clang/Basic/Builtins.h"
1516
#include "clang/Basic/DiagnosticSema.h"
1617
#include "clang/Basic/LLVM.h"
1718
#include "clang/Basic/TargetInfo.h"
@@ -995,6 +996,14 @@ bool CheckNoDoubleVectors(Sema *S, CallExpr *TheCall) {
995996
return CheckArgsTypesAreCorrect(S, TheCall, S->Context.FloatTy,
996997
checkDoubleVector);
997998
}
999+
bool CheckFloatingOrSignedIntRepresentation(Sema *S, CallExpr *TheCall) {
1000+
auto checkAllSignedTypes = [](clang::QualType PassedType) -> bool {
1001+
return !PassedType->hasSignedIntegerRepresentation() &&
1002+
!PassedType->hasFloatingRepresentation();
1003+
};
1004+
return CheckArgsTypesAreCorrect(S, TheCall, S->Context.IntTy,
1005+
checkAllSignedTypes);
1006+
}
9981007

9991008
bool CheckUnsignedIntRepresentation(Sema *S, CallExpr *TheCall) {
10001009
auto checkAllUnsignedTypes = [](clang::QualType PassedType) -> bool {
@@ -1108,6 +1117,14 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
11081117
return true;
11091118
break;
11101119
}
1120+
case Builtin::BI__builtin_hlsl_elementwise_sign: {
1121+
if (CheckFloatingOrSignedIntRepresentation(&SemaRef, TheCall))
1122+
return true;
1123+
if (SemaRef.PrepareBuiltinElementwiseMathOneArgCall(TheCall))
1124+
return true;
1125+
SetElementTypeAsReturnType(&SemaRef, TheCall, getASTContext().IntTy);
1126+
break;
1127+
}
11111128
// Note these are llvm builtins that we want to catch invalid intrinsic
11121129
// generation. Normal handling of these builitns will occur elsewhere.
11131130
case Builtin::BI__builtin_elementwise_bitreverse: {

0 commit comments

Comments
 (0)