Skip to content

Commit baf45a5

Browse files
committed
[HLSL][DXIL][SPIRV] Intrinsic unification PR
1 parent ea4a119 commit baf45a5

File tree

10 files changed

+545
-3
lines changed

10 files changed

+545
-3
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4587,6 +4587,12 @@ def GetDeviceSideMangledName : LangBuiltin<"CUDA_LANG"> {
45874587
}
45884588

45894589
// HLSL
4590+
def HLSLAll : LangBuiltin<"HLSL_LANG"> {
4591+
let Spellings = ["__builtin_hlsl_elementwise_all"];
4592+
let Attributes = [NoThrow, Const];
4593+
let Prototype = "bool(...)";
4594+
}
4595+
45904596
def HLSLAny : LangBuiltin<"HLSL_LANG"> {
45914597
let Spellings = ["__builtin_hlsl_elementwise_any"];
45924598
let Attributes = [NoThrow, Const];

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include "llvm/IR/IntrinsicsR600.h"
5252
#include "llvm/IR/IntrinsicsRISCV.h"
5353
#include "llvm/IR/IntrinsicsS390.h"
54+
#include "llvm/IR/IntrinsicsSPIRV.h"
5455
#include "llvm/IR/IntrinsicsVE.h"
5556
#include "llvm/IR/IntrinsicsWebAssembly.h"
5657
#include "llvm/IR/IntrinsicsX86.h"
@@ -18176,12 +18177,30 @@ Intrinsic::ID getDotProductIntrinsic(QualType QT, int elementCount) {
1817618177
return Intrinsic::dx_udot;
1817718178
}
1817818179

18180+
Intrinsic::ID getAllIntrinsic(const llvm::Triple::ArchType Arch) {
18181+
switch (Arch) {
18182+
case llvm::Triple::dxil:
18183+
return Intrinsic::dx_all;
18184+
case llvm::Triple::spirv:
18185+
return Intrinsic::spv_all;
18186+
default:
18187+
llvm_unreachable("Input semantic not supported by target");
18188+
}
18189+
}
18190+
1817918191
Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1818018192
const CallExpr *E) {
1818118193
if (!getLangOpts().HLSL)
1818218194
return nullptr;
1818318195

1818418196
switch (BuiltinID) {
18197+
case Builtin::BI__builtin_hlsl_elementwise_all: {
18198+
Value *Op0 = EmitScalarExpr(E->getArg(0));
18199+
return Builder.CreateIntrinsic(
18200+
/*ReturnType=*/llvm::Type::getInt1Ty(getLLVMContext()),
18201+
getAllIntrinsic(CGM.getTarget().getTriple().getArch()),
18202+
ArrayRef<Value *>{Op0}, nullptr, "hlsl.all");
18203+
}
1818518204
case Builtin::BI__builtin_hlsl_elementwise_any: {
1818618205
Value *Op0 = EmitScalarExpr(E->getArg(0));
1818718206
return Builder.CreateIntrinsic(

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,118 @@ double3 abs(double3);
100100
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
101101
double4 abs(double4);
102102

103+
//===----------------------------------------------------------------------===//
104+
// all builtins
105+
//===----------------------------------------------------------------------===//
106+
107+
/// \fn bool all(T x)
108+
/// \brief Returns True if all components of the \a x parameter are non-zero;
109+
/// otherwise, false. \param x The input value.
110+
111+
#ifdef __HLSL_ENABLE_16_BIT
112+
_HLSL_AVAILABILITY(shadermodel, 6.2)
113+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
114+
bool all(int16_t);
115+
_HLSL_AVAILABILITY(shadermodel, 6.2)
116+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
117+
bool all(int16_t2);
118+
_HLSL_AVAILABILITY(shadermodel, 6.2)
119+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
120+
bool all(int16_t3);
121+
_HLSL_AVAILABILITY(shadermodel, 6.2)
122+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
123+
bool all(int16_t4);
124+
_HLSL_AVAILABILITY(shadermodel, 6.2)
125+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
126+
bool all(uint16_t);
127+
_HLSL_AVAILABILITY(shadermodel, 6.2)
128+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
129+
bool all(uint16_t2);
130+
_HLSL_AVAILABILITY(shadermodel, 6.2)
131+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
132+
bool all(uint16_t3);
133+
_HLSL_AVAILABILITY(shadermodel, 6.2)
134+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
135+
bool all(uint16_t4);
136+
#endif
137+
138+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
139+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
140+
bool all(half);
141+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
142+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
143+
bool all(half2);
144+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
145+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
146+
bool all(half3);
147+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
148+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
149+
bool all(half4);
150+
151+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
152+
bool all(bool);
153+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
154+
bool all(bool2);
155+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
156+
bool all(bool3);
157+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
158+
bool all(bool4);
159+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
160+
161+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
162+
bool all(int);
163+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
164+
bool all(int2);
165+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
166+
bool all(int3);
167+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
168+
bool all(int4);
169+
170+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
171+
bool all(uint);
172+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
173+
bool all(uint2);
174+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
175+
bool all(uint3);
176+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
177+
bool all(uint4);
178+
179+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
180+
bool all(float);
181+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
182+
bool all(float2);
183+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
184+
bool all(float3);
185+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
186+
bool all(float4);
187+
188+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
189+
bool all(int64_t);
190+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
191+
bool all(int64_t2);
192+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
193+
bool all(int64_t3);
194+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
195+
bool all(int64_t4);
196+
197+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
198+
bool all(uint64_t);
199+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
200+
bool all(uint64_t2);
201+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
202+
bool all(uint64_t3);
203+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
204+
bool all(uint64_t4);
205+
206+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
207+
bool all(double);
208+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
209+
bool all(double2);
210+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
211+
bool all(double3);
212+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_all)
213+
bool all(double4);
214+
103215
//===----------------------------------------------------------------------===//
104216
// any builtins
105217
//===----------------------------------------------------------------------===//

clang/lib/Sema/SemaChecking.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5563,6 +5563,7 @@ void SetElementTypeAsReturnType(Sema *S, CallExpr *TheCall,
55635563
// returning an ExprError
55645564
bool Sema::CheckHLSLBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
55655565
switch (BuiltinID) {
5566+
case Builtin::BI__builtin_hlsl_elementwise_all:
55665567
case Builtin::BI__builtin_hlsl_elementwise_any: {
55675568
if (checkArgCount(*this, TheCall, 1))
55685569
return true;

0 commit comments

Comments
 (0)