Skip to content

Commit 49d584e

Browse files
committed
For scalar frac, if we want to call the builtin use a T(T) Prototype
1 parent 67fa9c3 commit 49d584e

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class FPMathWithF128Template :
2626
class F16F128MathTemplate : Template<["__fp16", "__float128"],
2727
["f16", "f128"]>;
2828

29+
class HLSLF16F32MathTemplate : Template<["float", "__fp16"],
30+
["f", "f16"]>;
31+
2932
class IntMathTemplate : Template<["int", "long int", "long long int"],
3033
["", "l", "ll"], /*AsPrefix=*/1>;
3134

@@ -4897,6 +4900,13 @@ def HLSLFrac : LangBuiltin<"HLSL_LANG"> {
48974900
let Prototype = "void(...)";
48984901
}
48994902

4903+
def HLSLFracScalar : LangBuiltin<"HLSL_LANG">, HLSLF16F32MathTemplate {
4904+
let Spellings = ["__builtin_hlsl_frac"];
4905+
let Attributes = [NoThrow, Const];
4906+
let Prototype = "T(T)";
4907+
}
4908+
4909+
49004910
def HLSLIsinf : LangBuiltin<"HLSL_LANG"> {
49014911
let Spellings = ["__builtin_hlsl_elementwise_isinf"];
49024912
let Attributes = [NoThrow, Const];

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19643,6 +19643,8 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1964319643
/*ReturnType=*/X->getType(), CGM.getHLSLRuntime().getDegreesIntrinsic(),
1964419644
ArrayRef<Value *>{X}, nullptr, "hlsl.degrees");
1964519645
}
19646+
case Builtin::BI__builtin_hlsl_fracf:
19647+
case Builtin::BI__builtin_hlsl_fracf16:
1964619648
case Builtin::BI__builtin_hlsl_elementwise_frac: {
1964719649
Value *Op0 = EmitScalarExpr(E->getArg(0));
1964819650
if (!E->getArg(0)->getType()->hasFloatingRepresentation())

clang/lib/Headers/hlsl/hlsl_detail.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,19 @@ constexpr vector<T, L> reflect_vec_impl(vector<T, L> I, vector<T, L> N) {
9898
template <typename T>
9999
constexpr enable_if_t<is_same<float, T>::value || is_same<half, T>::value, T>
100100
fmod_impl(T X, T Y) {
101-
#if !defined(__DirectX__)
101+
#if !defined(__DIRECTX__)
102102
return __builtin_elementwise_fmod(X, Y);
103103
#else
104104
T div = X / Y;
105105
bool ge = div >= -div;
106-
T frc = __builtin_hlsl_elementwise_frac(__builtin_elementwise_abs(div));
106+
T frc = __builtin_hlsl_fracf(__builtin_elementwise_abs(div));
107107
return __builtin_hlsl_select(ge, frc, -frc) * Y;
108108
#endif
109109
}
110110

111111
template <typename T, int N>
112112
constexpr vector<T, N> fmod_vec_impl(vector<T, N> X, vector<T, N> Y) {
113-
#if !defined(__DirectX__)
113+
#if !defined(__DIRECTX__)
114114
return __builtin_elementwise_fmod(X, Y);
115115
#else
116116
vector<T, N> div = X / Y;

0 commit comments

Comments
 (0)