From 54802abece1e4742050795162e3a773f0e143aa3 Mon Sep 17 00:00:00 2001 From: haonanya Date: Fri, 24 Dec 2021 15:27:46 +0800 Subject: [PATCH] [OpenCL] Add cl_khr_integer_dot_product This is backporting of https://reviews.llvm.org/D106434 Add the builtins defined by Section 42 "Integer dot product" in the OpenCL Extension Specification. See https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#cl_khr_integer_dot_product Signed-off-by: haonanya Upstream-Status: Backport [https://github.com/llvm/llvm-project/commit/989bedec7a6ae95a0db865f23677047f78dc9257] Signed-off-by: Anuj Mittal --- clang/lib/Headers/opencl-c-base.h | 3 +++ clang/lib/Headers/opencl-c.h | 24 ++++++++++++++++++++++++ clang/lib/Sema/OpenCLBuiltins.td | 25 +++++++++++++++++++++++++ clang/test/Headers/opencl-c-header.cl | 18 ++++++++++++++++++ 4 files changed, 70 insertions(+) diff --git a/clang/lib/Headers/opencl-c-base.h b/clang/lib/Headers/opencl-c-base.h index d94d64372dbb..b55d9601a452 100644 --- a/clang/lib/Headers/opencl-c-base.h +++ b/clang/lib/Headers/opencl-c-base.h @@ -40,6 +40,9 @@ #define __opencl_c_ext_fp32_local_atomic_add 1 #define __opencl_c_ext_fp32_global_atomic_min_max 1 #define __opencl_c_ext_fp32_local_atomic_min_max 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 501a04f6e82b..50dcc03955cb 100644 --- a/clang/lib/Headers/opencl-c.h +++ b/clang/lib/Headers/opencl-c.h @@ -16362,6 +16362,30 @@ double __ovld sub_group_clustered_reduce_max( double value, uint clustersize ); #endif // cl_khr_subgroup_clustered_reduce +#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 745363a6b43f..3c5f8821063d 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -1482,6 +1482,31 @@ let Extension = FuncExtKhrSubgroups in { } } +// 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 443f682c711a..184eefd9f9c3 100644 --- a/clang/test/Headers/opencl-c-header.cl +++ b/clang/test/Headers/opencl-c-header.cl @@ -166,6 +166,15 @@ global atomic_int z = ATOMIC_VAR_INIT(99); #if __opencl_c_ext_fp64_local_atomic_min_max != 1 #error "Incorrectly defined __opencl_c_ext_fp64_local_atomic_min_max" #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 @@ -232,6 +241,15 @@ global atomic_int z = ATOMIC_VAR_INIT(99); #ifdef __opencl_c_ext_fp64_local_atomic_min_max #error "Incorrectly __opencl_c_ext_fp64_local_atomic_min_max defined" #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) -- 2.17.1