Skip to content

Commit

Permalink
[OpenCL] Add cl_khr_integer_dot_product
Browse files Browse the repository at this point in the history
Add the builtins defined by Section 42 "Integer dot product" in
the OpenCL Extension Specification.

Differential Revision: https://reviews.llvm.org/D106434
  • Loading branch information
svenvh committed Jul 23, 2021
1 parent c3044a5 commit 989bede
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 0 deletions.
4 changes: 4 additions & 0 deletions clang/lib/Headers/opencl-c-base.h
Expand Up @@ -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)

Expand Down
24 changes: 24 additions & 0 deletions clang/lib/Headers/opencl-c.h
Expand Up @@ -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 );
Expand Down
25 changes: 25 additions & 0 deletions clang/lib/Sema/OpenCLBuiltins.td
Expand Up @@ -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<UChar, 4>, VectorType<UChar, 4>], Attr.Const>;
def : Builtin<"dot", [Int, VectorType<Char, 4>, VectorType<Char, 4>], Attr.Const>;
def : Builtin<"dot", [Int, VectorType<UChar, 4>, VectorType<Char, 4>], Attr.Const>;
def : Builtin<"dot", [Int, VectorType<Char, 4>, VectorType<UChar, 4>], Attr.Const>;

def : Builtin<"dot_acc_sat", [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>, UInt], Attr.Const>;
def : Builtin<"dot_acc_sat", [Int, VectorType<Char, 4>, VectorType<Char, 4>, Int], Attr.Const>;
def : Builtin<"dot_acc_sat", [Int, VectorType<UChar, 4>, VectorType<Char, 4>, Int], Attr.Const>;
def : Builtin<"dot_acc_sat", [Int, VectorType<Char, 4>, VectorType<UChar, 4>, 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 {
Expand Down
18 changes: 18 additions & 0 deletions clang/test/Headers/opencl-c-header.cl
Expand Up @@ -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

Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit 989bede

Please sign in to comment.