Skip to content

Commit c7cf755

Browse files
committed
[SYCL][Docs] Add sycl_ext_oneapi_ternary_bitwise extension
This commit adds the specification and implementation of a new bitwise operation taking three operands. The exact bitwise operation is determined by the LUTIndex template argument, which can be calculated by applying the bitwise operation to a predefined set of arguments. Signed-off-by: Larsen, Steffen <[email protected]>
1 parent be88160 commit c7cf755

File tree

17 files changed

+1002
-4
lines changed

17 files changed

+1002
-4
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10852,7 +10852,8 @@ static void getTripleBasedSPIRVTransOpts(Compilation &C,
1085210852
",+SPV_INTEL_fpga_latency_control"
1085310853
",+SPV_KHR_shader_clock"
1085410854
",+SPV_INTEL_bindless_images"
10855-
",+SPV_INTEL_task_sequence";
10855+
",+SPV_INTEL_task_sequence"
10856+
",+SPV_INTEL_ternary_bitwise_function";
1085610857
ExtArg = ExtArg + DefaultExtArg + INTELExtArg;
1085710858
if (C.getDriver().IsFPGAHWMode())
1085810859
// Enable several extensions on FPGA H/W exclusively

clang/lib/Sema/SPIRVBuiltins.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,9 @@ foreach name = ["BitCount"] in {
901901
def : SPVBuiltin<name, [AIGenTypeN, AIGenTypeN], Attr.Const>;
902902
}
903903

904+
def : SPVBuiltin<"BitwiseFunctionINTEL",
905+
[AIGenTypeN, AIGenTypeN, AIGenTypeN, AIGenTypeN, Int]>;
906+
904907
// 3.32.20. Barrier Instructions
905908

906909
foreach name = ["ControlBarrier"] in {

clang/test/Driver/sycl-spirv-ext-old-model.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
// CHECK-DEFAULT-SAME:,+SPV_KHR_shader_clock
3737
// CHECK-DEFAULT-SAME:,+SPV_INTEL_bindless_images
3838
// CHECK-DEFAULT-SAME:,+SPV_INTEL_task_sequence
39+
// CHECK-DEFAULT-SAME:,+SPV_INTEL_ternary_bitwise_function
3940
// CHECK-DEFAULT-SAME:,+SPV_INTEL_bfloat16_conversion
4041
// CHECK-DEFAULT-SAME:,+SPV_INTEL_joint_matrix
4142
// CHECK-DEFAULT-SAME:,+SPV_INTEL_hw_thread_queries
@@ -73,6 +74,7 @@
7374
// CHECK-CPU-SAME:,+SPV_INTEL_fpga_invocation_pipelining_attributes
7475
// CHECK-CPU-SAME:,+SPV_INTEL_fpga_latency_control
7576
// CHECK-CPU-SAME:,+SPV_INTEL_task_sequence
77+
// CHECK-CPU-SAME:,+SPV_INTEL_ternary_bitwise_function
7678
// CHECK-CPU-SAME:,+SPV_INTEL_bfloat16_conversion
7779
// CHECK-CPU-SAME:,+SPV_INTEL_joint_matrix
7880
// CHECK-CPU-SAME:,+SPV_INTEL_hw_thread_queries

clang/test/Driver/sycl-spirv-ext.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
// CHECK-DEFAULT-SAME:,+SPV_KHR_shader_clock
5454
// CHECK-DEFAULT-SAME:,+SPV_INTEL_bindless_images
5555
// CHECK-DEFAULT-SAME:,+SPV_INTEL_task_sequence
56+
// CHECK-DEFAULT-SAME:,+SPV_INTEL_ternary_bitwise_function
5657
// CHECK-DEFAULT-SAME:,+SPV_INTEL_bfloat16_conversion
5758
// CHECK-DEFAULT-SAME:,+SPV_INTEL_joint_matrix
5859
// CHECK-DEFAULT-SAME:,+SPV_INTEL_hw_thread_queries
@@ -90,6 +91,7 @@
9091
// CHECK-CPU-SAME:,+SPV_INTEL_fpga_invocation_pipelining_attributes
9192
// CHECK-CPU-SAME:,+SPV_INTEL_fpga_latency_control
9293
// CHECK-CPU-SAME:,+SPV_INTEL_task_sequence
94+
// CHECK-CPU-SAME:,+SPV_INTEL_ternary_bitwise_function
9395
// CHECK-CPU-SAME:,+SPV_INTEL_bfloat16_conversion
9496
// CHECK-CPU-SAME:,+SPV_INTEL_joint_matrix
9597
// CHECK-CPU-SAME:,+SPV_INTEL_hw_thread_queries

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,8 @@ getTripleBasedSPIRVTransOpts(const ArgList &Args,
873873
",+SPV_INTEL_fpga_latency_control"
874874
",+SPV_KHR_shader_clock"
875875
",+SPV_INTEL_bindless_images"
876-
",+SPV_INTEL_task_sequence";
876+
",+SPV_INTEL_task_sequence"
877+
",+SPV_INTEL_ternary_bitwise_function";
877878
ExtArg = ExtArg + DefaultExtArg + INTELExtArg;
878879
ExtArg += ",+SPV_INTEL_bfloat16_conversion"
879880
",+SPV_INTEL_joint_matrix"

clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,8 @@ static void getSPIRVTransOpts(const ArgList &Args,
355355
",+SPV_INTEL_fpga_latency_control"
356356
",+SPV_INTEL_task_sequence"
357357
",+SPV_KHR_shader_clock"
358-
",+SPV_INTEL_bindless_images";
358+
",+SPV_INTEL_bindless_images"
359+
",+SPV_INTEL_ternary_bitwise_function";
359360
ExtArg = ExtArg + DefaultExtArg + INTELExtArg;
360361
ExtArg += ",+SPV_INTEL_token_type"
361362
",+SPV_INTEL_bfloat16_conversion"

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,4 @@ EXT(SPV_INTEL_maximum_registers)
7676
EXT(SPV_INTEL_bindless_images)
7777
EXT(SPV_INTEL_2d_block_io)
7878
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate)
79+
EXT(SPV_INTEL_ternary_bitwise_function)

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4446,5 +4446,60 @@ class SPIRVSubgroupMatrixMultiplyAccumulateINTELInst
44464446
_SPIRV_OP(SubgroupMatrixMultiplyAccumulate, true, 7, true, 4)
44474447
#undef _SPIRV_OP
44484448

4449+
class SPIRVTernaryBitwiseFunctionINTELInst : public SPIRVInstTemplateBase {
4450+
public:
4451+
void validate() const override {
4452+
SPIRVInstruction::validate();
4453+
SPIRVErrorLog &SPVErrLog = this->getModule()->getErrorLog();
4454+
std::string InstName = "BitwiseFunctionINTEL";
4455+
4456+
const SPIRVType *ResTy = this->getType();
4457+
SPVErrLog.checkError(
4458+
ResTy->isTypeInt() || (ResTy->isTypeVector() &&
4459+
ResTy->getVectorComponentType()->isTypeInt()),
4460+
SPIRVEC_InvalidInstruction,
4461+
InstName + "\nResult type must be an integer scalar or vector.\n");
4462+
4463+
auto CommonArgCheck = [this, ResTy, &InstName,
4464+
&SPVErrLog](size_t ArgI, const char *ArgPlacement) {
4465+
SPIRVValue *Arg =
4466+
const_cast<SPIRVTernaryBitwiseFunctionINTELInst *>(this)->getOperand(
4467+
ArgI);
4468+
SPVErrLog.checkError(
4469+
Arg->getType() == ResTy, SPIRVEC_InvalidInstruction,
4470+
InstName + "\n" + ArgPlacement +
4471+
" argument must be the same as the result type.\n");
4472+
};
4473+
4474+
CommonArgCheck(0, "First");
4475+
CommonArgCheck(1, "Second");
4476+
CommonArgCheck(2, "Third");
4477+
4478+
SPIRVValue *LUTIndexArg =
4479+
const_cast<SPIRVTernaryBitwiseFunctionINTELInst *>(this)->getOperand(3);
4480+
const SPIRVType *LUTIndexArgTy = LUTIndexArg->getType();
4481+
SPVErrLog.checkError(
4482+
LUTIndexArgTy->isTypeInt(32), SPIRVEC_InvalidInstruction,
4483+
InstName + "\nFourth argument must be a 32-bit integer scalar.\n");
4484+
SPVErrLog.checkError(
4485+
isConstantOpCode(LUTIndexArg->getOpCode()), SPIRVEC_InvalidInstruction,
4486+
InstName + "\nFourth argument must be constant instruction.\n");
4487+
}
4488+
4489+
std::optional<ExtensionID> getRequiredExtension() const override {
4490+
return ExtensionID::SPV_INTEL_ternary_bitwise_function;
4491+
}
4492+
SPIRVCapVec getRequiredCapability() const override {
4493+
return getVec(internal::CapabilityTernaryBitwiseFunctionINTEL);
4494+
}
4495+
};
4496+
4497+
#define _SPIRV_OP(x, ...) \
4498+
typedef SPIRVInstTemplate<SPIRVTernaryBitwiseFunctionINTELInst, \
4499+
internal::Op##x##INTEL, __VA_ARGS__> \
4500+
SPIRV##x##INTEL;
4501+
_SPIRV_OP(BitwiseFunction, true, 7)
4502+
#undef _SPIRV_OP
4503+
44494504
} // namespace SPIRV
44504505
#endif // SPIRV_LIBSPIRV_SPIRVINSTRUCTION_H

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,8 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
696696
"SubgroupRequirementsINTEL");
697697
add(internal::CapabilityTaskSequenceINTEL, "TaskSequenceINTEL");
698698
add(internal::CapabilityBindlessImagesINTEL, "BindlessImagesINTEL");
699+
add(internal::CapabilityTernaryBitwiseFunctionINTEL,
700+
"TernaryBitwiseFunctionINTEL");
699701
}
700702
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
701703

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVOpCodeEnumInternal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,4 @@ _SPIRV_OP_INTERNAL(ConvertHandleToSamplerINTEL,
4444
internal::ConvertHandleToSamplerINTEL)
4545
_SPIRV_OP_INTERNAL(ConvertHandleToSampledImageINTEL,
4646
internal::ConvertHandleToSampledImageINTEL)
47+
_SPIRV_OP_INTERNAL(BitwiseFunctionINTEL, internal::BitwiseFunctionINTEL)

0 commit comments

Comments
 (0)