Skip to content

Commit f73ac21

Browse files
authored
[HLSL][clang] Add elementwise builtins for trig intrinsics (#95999)
This change is part of this proposal: https://discourse.llvm.org/t/rfc-all-the-math-intrinsics/78294 This is part 3 of 4 PRs. It sets the ground work for using the intrinsics in HLSL. Add HLSL frontend apis for `acos`, `asin`, `atan`, `cosh`, `sinh`, and `tanh` #70079 #70080 #70081 #70083 #70084 #95966
1 parent f3005d5 commit f73ac21

18 files changed

+1000
-1
lines changed

clang/docs/LanguageExtensions.rst

+6
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,12 @@ Unless specified otherwise operation(±0) = ±0 and operation(±infinity) = ±in
657657
T __builtin_elementwise_sin(T x) return the sine of x interpreted as an angle in radians floating point types
658658
T __builtin_elementwise_cos(T x) return the cosine of x interpreted as an angle in radians floating point types
659659
T __builtin_elementwise_tan(T x) return the tangent of x interpreted as an angle in radians floating point types
660+
T __builtin_elementwise_asin(T x) return the arcsine of x interpreted as an angle in radians floating point types
661+
T __builtin_elementwise_acos(T x) return the arccosine of x interpreted as an angle in radians floating point types
662+
T __builtin_elementwise_atan(T x) return the arctangent of x interpreted as an angle in radians floating point types
663+
T __builtin_elementwise_sinh(T x) return the hyperbolic sine of angle x in radians floating point types
664+
T __builtin_elementwise_cosh(T x) return the hyperbolic cosine of angle x in radians floating point types
665+
T __builtin_elementwise_tanh(T x) return the hyperbolic tangent of angle x in radians floating point types
660666
T __builtin_elementwise_floor(T x) return the largest integral value less than or equal to x floating point types
661667
T __builtin_elementwise_log(T x) return the natural logarithm of x floating point types
662668
T __builtin_elementwise_log2(T x) return the base 2 logarithm of x floating point types

clang/include/clang/Basic/Builtins.td

+36
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,24 @@ def ElementwiseAbs : Builtin {
12181218
let Prototype = "void(...)";
12191219
}
12201220

1221+
def ElementwiseACos : Builtin {
1222+
let Spellings = ["__builtin_elementwise_acos"];
1223+
let Attributes = [NoThrow, Const, CustomTypeChecking];
1224+
let Prototype = "void(...)";
1225+
}
1226+
1227+
def ElementwiseASin : Builtin {
1228+
let Spellings = ["__builtin_elementwise_asin"];
1229+
let Attributes = [NoThrow, Const, CustomTypeChecking];
1230+
let Prototype = "void(...)";
1231+
}
1232+
1233+
def ElementwiseATan : Builtin {
1234+
let Spellings = ["__builtin_elementwise_atan"];
1235+
let Attributes = [NoThrow, Const, CustomTypeChecking];
1236+
let Prototype = "void(...)";
1237+
}
1238+
12211239
def ElementwiseBitreverse : Builtin {
12221240
let Spellings = ["__builtin_elementwise_bitreverse"];
12231241
let Attributes = [NoThrow, Const, CustomTypeChecking];
@@ -1248,6 +1266,12 @@ def ElementwiseCos : Builtin {
12481266
let Prototype = "void(...)";
12491267
}
12501268

1269+
def ElementwiseCosh : Builtin {
1270+
let Spellings = ["__builtin_elementwise_cosh"];
1271+
let Attributes = [NoThrow, Const, CustomTypeChecking];
1272+
let Prototype = "void(...)";
1273+
}
1274+
12511275
def ElementwiseExp : Builtin {
12521276
let Spellings = ["__builtin_elementwise_exp"];
12531277
let Attributes = [NoThrow, Const, CustomTypeChecking];
@@ -1320,6 +1344,12 @@ def ElementwiseSin : Builtin {
13201344
let Prototype = "void(...)";
13211345
}
13221346

1347+
def ElementwiseSinh : Builtin {
1348+
let Spellings = ["__builtin_elementwise_sinh"];
1349+
let Attributes = [NoThrow, Const, CustomTypeChecking];
1350+
let Prototype = "void(...)";
1351+
}
1352+
13231353
def ElementwiseSqrt : Builtin {
13241354
let Spellings = ["__builtin_elementwise_sqrt"];
13251355
let Attributes = [NoThrow, Const, CustomTypeChecking];
@@ -1332,6 +1362,12 @@ def ElementwiseTan : Builtin {
13321362
let Prototype = "void(...)";
13331363
}
13341364

1365+
def ElementwiseTanh : Builtin {
1366+
let Spellings = ["__builtin_elementwise_tanh"];
1367+
let Attributes = [NoThrow, Const, CustomTypeChecking];
1368+
let Prototype = "void(...)";
1369+
}
1370+
13351371
def ElementwiseTrunc : Builtin {
13361372
let Spellings = ["__builtin_elementwise_trunc"];
13371373
let Attributes = [NoThrow, Const, CustomTypeChecking];

clang/lib/CodeGen/CGBuiltin.cpp

+18-1
Original file line numberDiff line numberDiff line change
@@ -3690,7 +3690,15 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
36903690

36913691
return RValue::get(Result);
36923692
}
3693-
3693+
case Builtin::BI__builtin_elementwise_acos:
3694+
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3695+
*this, E, llvm::Intrinsic::acos, "elt.acos"));
3696+
case Builtin::BI__builtin_elementwise_asin:
3697+
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3698+
*this, E, llvm::Intrinsic::asin, "elt.asin"));
3699+
case Builtin::BI__builtin_elementwise_atan:
3700+
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3701+
*this, E, llvm::Intrinsic::atan, "elt.atan"));
36943702
case Builtin::BI__builtin_elementwise_ceil:
36953703
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
36963704
*this, E, llvm::Intrinsic::ceil, "elt.ceil"));
@@ -3719,6 +3727,9 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
37193727
case Builtin::BI__builtin_elementwise_cos:
37203728
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
37213729
*this, E, llvm::Intrinsic::cos, "elt.cos"));
3730+
case Builtin::BI__builtin_elementwise_cosh:
3731+
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3732+
*this, E, llvm::Intrinsic::cosh, "elt.cosh"));
37223733
case Builtin::BI__builtin_elementwise_floor:
37233734
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
37243735
*this, E, llvm::Intrinsic::floor, "elt.floor"));
@@ -3737,9 +3748,15 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
37373748
case Builtin::BI__builtin_elementwise_sin:
37383749
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
37393750
*this, E, llvm::Intrinsic::sin, "elt.sin"));
3751+
case Builtin::BI__builtin_elementwise_sinh:
3752+
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3753+
*this, E, llvm::Intrinsic::sinh, "elt.sinh"));
37403754
case Builtin::BI__builtin_elementwise_tan:
37413755
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
37423756
*this, E, llvm::Intrinsic::tan, "elt.tan"));
3757+
case Builtin::BI__builtin_elementwise_tanh:
3758+
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
3759+
*this, E, llvm::Intrinsic::tanh, "elt.tanh"));
37433760
case Builtin::BI__builtin_elementwise_trunc:
37443761
return RValue::get(emitBuiltinWithOneOverloadedType<1>(
37453762
*this, E, llvm::Intrinsic::trunc, "elt.trunc"));

clang/lib/Headers/hlsl/hlsl_intrinsics.h

+173
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,34 @@ double3 abs(double3);
107107
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
108108
double4 abs(double4);
109109

110+
//===----------------------------------------------------------------------===//
111+
// acos builtins
112+
//===----------------------------------------------------------------------===//
113+
114+
/// \fn T acos(T Val)
115+
/// \brief Returns the arccosine of the input value, \a Val.
116+
/// \param Val The input value.
117+
118+
#ifdef __HLSL_ENABLE_16_BIT
119+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
120+
half acos(half);
121+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
122+
half2 acos(half2);
123+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
124+
half3 acos(half3);
125+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
126+
half4 acos(half4);
127+
#endif
128+
129+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
130+
float acos(float);
131+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
132+
float2 acos(float2);
133+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
134+
float3 acos(float3);
135+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_acos)
136+
float4 acos(float4);
137+
110138
//===----------------------------------------------------------------------===//
111139
// all builtins
112140
//===----------------------------------------------------------------------===//
@@ -331,6 +359,62 @@ bool any(double3);
331359
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_any)
332360
bool any(double4);
333361

362+
//===----------------------------------------------------------------------===//
363+
// asin builtins
364+
//===----------------------------------------------------------------------===//
365+
366+
/// \fn T asin(T Val)
367+
/// \brief Returns the arcsine of the input value, \a Val.
368+
/// \param Val The input value.
369+
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+
381+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
382+
float asin(float);
383+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
384+
float2 asin(float2);
385+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
386+
float3 asin(float3);
387+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin)
388+
float4 asin(float4);
389+
390+
//===----------------------------------------------------------------------===//
391+
// atan builtins
392+
//===----------------------------------------------------------------------===//
393+
394+
/// \fn T atan(T Val)
395+
/// \brief Returns the arctangent of the input value, \a Val.
396+
/// \param Val The input value.
397+
398+
#ifdef __HLSL_ENABLE_16_BIT
399+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
400+
half atan(half);
401+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
402+
half2 atan(half2);
403+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
404+
half3 atan(half3);
405+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
406+
half4 atan(half4);
407+
#endif
408+
409+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
410+
float atan(float);
411+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
412+
float2 atan(float2);
413+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
414+
float3 atan(float3);
415+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_atan)
416+
float4 atan(float4);
417+
334418
//===----------------------------------------------------------------------===//
335419
// ceil builtins
336420
//===----------------------------------------------------------------------===//
@@ -502,6 +586,34 @@ float3 cos(float3);
502586
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cos)
503587
float4 cos(float4);
504588

589+
//===----------------------------------------------------------------------===//
590+
// cosh builtins
591+
//===----------------------------------------------------------------------===//
592+
593+
/// \fn T cosh(T Val)
594+
/// \brief Returns the hyperbolic cosine of the input value, \a Val.
595+
/// \param Val The input value.
596+
597+
#ifdef __HLSL_ENABLE_16_BIT
598+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
599+
half cosh(half);
600+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
601+
half2 cosh(half2);
602+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
603+
half3 cosh(half3);
604+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
605+
half4 cosh(half4);
606+
#endif
607+
608+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
609+
float cosh(float);
610+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
611+
float2 cosh(float2);
612+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
613+
float3 cosh(float3);
614+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_cosh)
615+
float4 cosh(float4);
616+
505617
//===----------------------------------------------------------------------===//
506618
// dot product builtins
507619
//===----------------------------------------------------------------------===//
@@ -1418,6 +1530,34 @@ float3 sin(float3);
14181530
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sin)
14191531
float4 sin(float4);
14201532

1533+
//===----------------------------------------------------------------------===//
1534+
// sinh builtins
1535+
//===----------------------------------------------------------------------===//
1536+
1537+
/// \fn T sinh(T Val)
1538+
/// \brief Returns the hyperbolic sine of the input value, \a Val.
1539+
/// \param Val The input value.
1540+
1541+
#ifdef __HLSL_ENABLE_16_BIT
1542+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1543+
half sinh(half);
1544+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1545+
half2 sinh(half2);
1546+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1547+
half3 sinh(half3);
1548+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1549+
half4 sinh(half4);
1550+
#endif
1551+
1552+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1553+
float sinh(float);
1554+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1555+
float2 sinh(float2);
1556+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1557+
float3 sinh(float3);
1558+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_sinh)
1559+
float4 sinh(float4);
1560+
14211561
//===----------------------------------------------------------------------===//
14221562
// sqrt builtins
14231563
//===----------------------------------------------------------------------===//
@@ -1451,6 +1591,11 @@ float4 sqrt(float4);
14511591
//===----------------------------------------------------------------------===//
14521592
// tan builtins
14531593
//===----------------------------------------------------------------------===//
1594+
1595+
/// \fn T tan(T Val)
1596+
/// \brief Returns the tangent of the input value, \a Val.
1597+
/// \param Val The input value.
1598+
14541599
#ifdef __HLSL_ENABLE_16_BIT
14551600
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tan)
14561601
half tan(half);
@@ -1471,6 +1616,34 @@ float3 tan(float3);
14711616
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tan)
14721617
float4 tan(float4);
14731618

1619+
//===----------------------------------------------------------------------===//
1620+
// tanh builtins
1621+
//===----------------------------------------------------------------------===//
1622+
1623+
/// \fn T tanh(T Val)
1624+
/// \brief Returns the hyperbolic tangent of the input value, \a Val.
1625+
/// \param Val The input value.
1626+
1627+
#ifdef __HLSL_ENABLE_16_BIT
1628+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1629+
half tanh(half);
1630+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1631+
half2 tanh(half2);
1632+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1633+
half3 tanh(half3);
1634+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1635+
half4 tanh(half4);
1636+
#endif
1637+
1638+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1639+
float tanh(float);
1640+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1641+
float2 tanh(float2);
1642+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1643+
float3 tanh(float3);
1644+
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_tanh)
1645+
float4 tanh(float4);
1646+
14741647
//===----------------------------------------------------------------------===//
14751648
// trunc builtins
14761649
//===----------------------------------------------------------------------===//

clang/lib/Sema/SemaChecking.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -3160,8 +3160,12 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
31603160

31613161
// These builtins restrict the element type to floating point
31623162
// types only.
3163+
case Builtin::BI__builtin_elementwise_acos:
3164+
case Builtin::BI__builtin_elementwise_asin:
3165+
case Builtin::BI__builtin_elementwise_atan:
31633166
case Builtin::BI__builtin_elementwise_ceil:
31643167
case Builtin::BI__builtin_elementwise_cos:
3168+
case Builtin::BI__builtin_elementwise_cosh:
31653169
case Builtin::BI__builtin_elementwise_exp:
31663170
case Builtin::BI__builtin_elementwise_exp2:
31673171
case Builtin::BI__builtin_elementwise_floor:
@@ -3173,8 +3177,10 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
31733177
case Builtin::BI__builtin_elementwise_rint:
31743178
case Builtin::BI__builtin_elementwise_nearbyint:
31753179
case Builtin::BI__builtin_elementwise_sin:
3180+
case Builtin::BI__builtin_elementwise_sinh:
31763181
case Builtin::BI__builtin_elementwise_sqrt:
31773182
case Builtin::BI__builtin_elementwise_tan:
3183+
case Builtin::BI__builtin_elementwise_tanh:
31783184
case Builtin::BI__builtin_elementwise_trunc:
31793185
case Builtin::BI__builtin_elementwise_canonicalize: {
31803186
if (PrepareBuiltinElementwiseMathOneArgCall(TheCall))
@@ -3635,8 +3641,12 @@ bool Sema::CheckHLSLBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
36353641
return true;
36363642
break;
36373643
}
3644+
case Builtin::BI__builtin_elementwise_acos:
3645+
case Builtin::BI__builtin_elementwise_asin:
3646+
case Builtin::BI__builtin_elementwise_atan:
36383647
case Builtin::BI__builtin_elementwise_ceil:
36393648
case Builtin::BI__builtin_elementwise_cos:
3649+
case Builtin::BI__builtin_elementwise_cosh:
36403650
case Builtin::BI__builtin_elementwise_exp:
36413651
case Builtin::BI__builtin_elementwise_exp2:
36423652
case Builtin::BI__builtin_elementwise_floor:
@@ -3646,8 +3656,10 @@ bool Sema::CheckHLSLBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
36463656
case Builtin::BI__builtin_elementwise_pow:
36473657
case Builtin::BI__builtin_elementwise_roundeven:
36483658
case Builtin::BI__builtin_elementwise_sin:
3659+
case Builtin::BI__builtin_elementwise_sinh:
36493660
case Builtin::BI__builtin_elementwise_sqrt:
36503661
case Builtin::BI__builtin_elementwise_tan:
3662+
case Builtin::BI__builtin_elementwise_tanh:
36513663
case Builtin::BI__builtin_elementwise_trunc: {
36523664
if (CheckFloatOrHalfRepresentations(this, TheCall))
36533665
return true;

0 commit comments

Comments
 (0)