From 989bedec7a6ae95a0db865f23677047f78dc9257 Mon Sep 17 00:00:00 2001 From: Sven van Haastregt Date: Fri, 23 Jul 2021 10:10:16 +0100 Subject: [PATCH] [OpenCL] Add cl_khr_integer_dot_product Add the builtins defined by Section 42 "Integer dot product" in the OpenCL Extension Specification. Differential Revision: https://reviews.llvm.org/D106434 --- clang/lib/Headers/opencl-c-base.h | 4 ++++ clang/lib/Headers/opencl-c.h | 24 ++++++++++++++++++++++++ clang/lib/Sema/OpenCLBuiltins.td | 25 +++++++++++++++++++++++++ clang/test/Headers/opencl-c-header.cl | 18 ++++++++++++++++++ 4 files changed, 71 insertions(+) diff --git a/clang/lib/Headers/opencl-c-base.h b/clang/lib/Headers/opencl-c-base.h index ebc4b7a47925b..1dc52ec75e037 100644 --- a/clang/lib/Headers/opencl-c-base.h +++ b/clang/lib/Headers/opencl-c-base.h @@ -22,6 +22,10 @@ #define cl_khr_subgroup_shuffle_relative 1 #define cl_khr_subgroup_clustered_reduce 1 #define cl_khr_extended_bit_ops 1 +#define cl_khr_integer_dot_product 1 +#define __opencl_c_integer_dot_product_input_4x8bit 1 +#define __opencl_c_integer_dot_product_input_4x8bit_packed 1 + #endif // defined(__SPIR__) #endif // (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200) diff --git a/clang/lib/Headers/opencl-c.h b/clang/lib/Headers/opencl-c.h index 5b3cd05d4426d..4be57058b33f1 100644 --- a/clang/lib/Headers/opencl-c.h +++ b/clang/lib/Headers/opencl-c.h @@ -16251,6 +16251,30 @@ long16 __ovld __cnfn bit_reverse(long16); ulong16 __ovld __cnfn bit_reverse(ulong16); #endif // cl_khr_extended_bit_ops +#if defined(__opencl_c_integer_dot_product_input_4x8bit) +uint __ovld __cnfn dot(uchar4, uchar4); +int __ovld __cnfn dot(char4, char4); +int __ovld __cnfn dot(uchar4, char4); +int __ovld __cnfn dot(char4, uchar4); + +uint __ovld __cnfn dot_acc_sat(uchar4, uchar4, uint); +int __ovld __cnfn dot_acc_sat(char4, char4, int); +int __ovld __cnfn dot_acc_sat(uchar4, char4, int); +int __ovld __cnfn dot_acc_sat(char4, uchar4, int); +#endif // __opencl_c_integer_dot_product_input_4x8bit + +#if defined(__opencl_c_integer_dot_product_input_4x8bit_packed) +uint __ovld __cnfn dot_4x8packed_uu_uint(uint, uint); +int __ovld __cnfn dot_4x8packed_ss_int(uint, uint); +int __ovld __cnfn dot_4x8packed_us_int(uint, uint); +int __ovld __cnfn dot_4x8packed_su_int(uint, uint); + +uint __ovld __cnfn dot_acc_sat_4x8packed_uu_uint(uint, uint, uint); +int __ovld __cnfn dot_acc_sat_4x8packed_ss_int(uint, uint, int); +int __ovld __cnfn dot_acc_sat_4x8packed_us_int(uint, uint, int); +int __ovld __cnfn dot_acc_sat_4x8packed_su_int(uint, uint, int); +#endif // __opencl_c_integer_dot_product_input_4x8bit_packed + #if defined(cl_intel_subgroups) // Intel-Specific Sub Group Functions float __ovld __conv intel_sub_group_shuffle( float x, uint c ); diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td index 63def2bce8c27..cd704fe395a96 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -1749,6 +1749,31 @@ let Extension = FuncExtKhrExtendedBitOps in { def : Builtin<"bit_reverse", [AIGenTypeN, AIGenTypeN], Attr.Const>; } +// Section 42.3 - cl_khr_integer_dot_product +let Extension = FunctionExtension<"__opencl_c_integer_dot_product_input_4x8bit"> in { + def : Builtin<"dot", [UInt, VectorType, VectorType], Attr.Const>; + def : Builtin<"dot", [Int, VectorType, VectorType], Attr.Const>; + def : Builtin<"dot", [Int, VectorType, VectorType], Attr.Const>; + def : Builtin<"dot", [Int, VectorType, VectorType], Attr.Const>; + + def : Builtin<"dot_acc_sat", [UInt, VectorType, VectorType, UInt], Attr.Const>; + def : Builtin<"dot_acc_sat", [Int, VectorType, VectorType, Int], Attr.Const>; + def : Builtin<"dot_acc_sat", [Int, VectorType, VectorType, Int], Attr.Const>; + def : Builtin<"dot_acc_sat", [Int, VectorType, VectorType, Int], Attr.Const>; +} + +let Extension = FunctionExtension<"__opencl_c_integer_dot_product_input_4x8bit_packed"> in { + def : Builtin<"dot_4x8packed_uu_uint", [UInt, UInt, UInt], Attr.Const>; + def : Builtin<"dot_4x8packed_ss_int", [Int, UInt, UInt], Attr.Const>; + def : Builtin<"dot_4x8packed_us_int", [Int, UInt, UInt], Attr.Const>; + def : Builtin<"dot_4x8packed_su_int", [Int, UInt, UInt], Attr.Const>; + + def : Builtin<"dot_acc_sat_4x8packed_uu_uint", [UInt, UInt, UInt, UInt], Attr.Const>; + def : Builtin<"dot_acc_sat_4x8packed_ss_int", [Int, UInt, UInt, Int], Attr.Const>; + def : Builtin<"dot_acc_sat_4x8packed_us_int", [Int, UInt, UInt, Int], Attr.Const>; + def : Builtin<"dot_acc_sat_4x8packed_su_int", [Int, UInt, UInt, Int], Attr.Const>; +} + //-------------------------------------------------------------------- // Arm extensions. let Extension = ArmIntegerDotProductInt8 in { diff --git a/clang/test/Headers/opencl-c-header.cl b/clang/test/Headers/opencl-c-header.cl index 18ee9aa2d8675..e7d0ae017d3a7 100644 --- a/clang/test/Headers/opencl-c-header.cl +++ b/clang/test/Headers/opencl-c-header.cl @@ -126,6 +126,15 @@ global atomic_int z = ATOMIC_VAR_INIT(99); #if cl_khr_extended_bit_ops != 1 #error "Incorrectly defined cl_khr_extended_bit_ops" #endif +#if cl_khr_integer_dot_product != 1 +#error "Incorrectly defined cl_khr_integer_dot_product" +#endif +#if __opencl_c_integer_dot_product_input_4x8bit != 1 +#error "Incorrectly defined __opencl_c_integer_dot_product_input_4x8bit" +#endif +#if __opencl_c_integer_dot_product_input_4x8bit_packed != 1 +#error "Incorrectly defined __opencl_c_integer_dot_product_input_4x8bit_packed" +#endif #else @@ -153,6 +162,15 @@ global atomic_int z = ATOMIC_VAR_INIT(99); #ifdef cl_khr_extended_bit_ops #error "Incorrect cl_khr_extended_bit_ops define" #endif +#ifdef cl_khr_integer_dot_product +#error "Incorrect cl_khr_integer_dot_product define" +#endif +#ifdef __opencl_c_integer_dot_product_input_4x8bit +#error "Incorrect __opencl_c_integer_dot_product_input_4x8bit define" +#endif +#ifdef __opencl_c_integer_dot_product_input_4x8bit_packed +#error "Incorrect __opencl_c_integer_dot_product_input_4x8bit_packed define" +#endif #endif //(defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)