diff --git a/clang/lib/Headers/opencl-c-base.h b/clang/lib/Headers/opencl-c-base.h --- 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 --- a/clang/lib/Headers/opencl-c.h +++ b/clang/lib/Headers/opencl-c.h @@ -16251,6 +16251,30 @@ 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 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -1749,6 +1749,31 @@ 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 --- a/clang/test/Headers/opencl-c-header.cl +++ b/clang/test/Headers/opencl-c-header.cl @@ -126,6 +126,15 @@ #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 @@ #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)