[OpenCL] Add atomic_half type builtins
Add atomic_half types and builtins operating on the types from the cl_ext_float_atomics extension. Patch by Haonan Yang. Differential Revision: https://reviews.llvm.org/D109740
This commit is contained in:
parent
d4717b9b9d
commit
544d89e847
|
@ -13640,6 +13640,118 @@ uintptr_t __ovld atomic_fetch_sub_explicit(volatile __local atomic_uintptr_t *ob
|
|||
// The functionality added by cl_ext_float_atomics extension
|
||||
#if defined(cl_ext_float_atomics)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_global_atomic_load_store)
|
||||
void __ovld atomic_store(volatile __global atomic_half *object, half operand);
|
||||
void __ovld atomic_store_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
void __ovld atomic_store_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_load(volatile __global atomic_half *object);
|
||||
half __ovld atomic_load_explicit(volatile __global atomic_half *object,
|
||||
memory_order order);
|
||||
half __ovld atomic_load_explicit(volatile __global atomic_half *object,
|
||||
memory_order order, memory_scope scope);
|
||||
half __ovld atomic_exchange(volatile __global atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_local_atomic_load_store)
|
||||
void __ovld atomic_store(volatile __local atomic_half *object, half operand);
|
||||
void __ovld atomic_store_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
void __ovld atomic_store_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_load(volatile __local atomic_half *object);
|
||||
half __ovld atomic_load_explicit(volatile __local atomic_half *object,
|
||||
memory_order order);
|
||||
half __ovld atomic_load_explicit(volatile __local atomic_half *object,
|
||||
memory_order order, memory_scope scope);
|
||||
half __ovld atomic_exchange(volatile __local atomic_half *object, half operand);
|
||||
half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_local_atomic_load_store)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_global_atomic_load_store) && \
|
||||
defined(__opencl_c_ext_fp16_local_atomic_load_store)
|
||||
void __ovld atomic_store(volatile atomic_half *object, half operand);
|
||||
void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
|
||||
memory_order order);
|
||||
void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
|
||||
memory_order order, memory_scope scope);
|
||||
half __ovld atomic_load(volatile atomic_half *object);
|
||||
half __ovld atomic_load_explicit(volatile atomic_half *object,
|
||||
memory_order order);
|
||||
half __ovld atomic_load_explicit(volatile atomic_half *object,
|
||||
memory_order order, memory_scope scope);
|
||||
half __ovld atomic_exchange(volatile atomic_half *object, half operand);
|
||||
half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
|
||||
memory_order order);
|
||||
half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
|
||||
memory_order order, memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) &&
|
||||
// defined(__opencl_c_ext_fp16_local_atomic_load_store)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_global_atomic_min_max)
|
||||
half __ovld atomic_fetch_min(volatile __global atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_max(volatile __global atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_local_atomic_min_max)
|
||||
half __ovld atomic_fetch_min(volatile __local atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_max(volatile __local atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_local_atomic_min_max)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
|
||||
defined(__opencl_c_ext_fp16_local_atomic_min_max)
|
||||
half __ovld atomic_fetch_min(volatile atomic_half *object, half operand);
|
||||
half __ovld atomic_fetch_max(volatile atomic_half *object, half operand);
|
||||
half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
|
||||
defined(__opencl_c_ext_fp16_local_atomic_min_max)
|
||||
|
||||
#if defined(__opencl_c_ext_fp32_global_atomic_min_max)
|
||||
float __ovld atomic_fetch_min(volatile __global atomic_float *object,
|
||||
float operand);
|
||||
|
@ -13742,6 +13854,57 @@ double __ovld atomic_fetch_max_explicit(volatile atomic_double *object,
|
|||
#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max) && \
|
||||
defined(__opencl_c_ext_fp64_local_atomic_min_max)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_global_atomic_add)
|
||||
half __ovld atomic_fetch_add(volatile __global atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_sub(volatile __global atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_global_atomic_add)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_local_atomic_add)
|
||||
half __ovld atomic_fetch_add(volatile __local atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_sub(volatile __local atomic_half *object,
|
||||
half operand);
|
||||
half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_local_atomic_add)
|
||||
|
||||
#if defined(__opencl_c_ext_fp16_global_atomic_add) && \
|
||||
defined(__opencl_c_ext_fp16_local_atomic_add)
|
||||
half __ovld atomic_fetch_add(volatile atomic_half *object, half operand);
|
||||
half __ovld atomic_fetch_sub(volatile atomic_half *object, half operand);
|
||||
half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order);
|
||||
half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
|
||||
half operand, memory_order order,
|
||||
memory_scope scope);
|
||||
#endif // defined(__opencl_c_ext_fp16_global_atomic_add) && \
|
||||
defined(__opencl_c_ext_fp16_local_atomic_add)
|
||||
|
||||
#if defined(__opencl_c_ext_fp32_global_atomic_add)
|
||||
float __ovld atomic_fetch_add(volatile __global atomic_float *object,
|
||||
float operand);
|
||||
|
|
|
@ -85,16 +85,25 @@ def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sha
|
|||
|
||||
def FuncExtOpenCLCPipes : FunctionExtension<"__opencl_c_pipes">;
|
||||
def FuncExtOpenCLCWGCollectiveFunctions : FunctionExtension<"__opencl_c_work_group_collective_functions">;
|
||||
def FuncExtFloatAtomicsFp16GlobalLoadStore : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_load_store">;
|
||||
def FuncExtFloatAtomicsFp16LocalLoadStore : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_load_store">;
|
||||
def FuncExtFloatAtomicsFp16GenericLoadStore : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_load_store __opencl_c_ext_fp16_local_atomic_load_store">;
|
||||
def FuncExtFloatAtomicsFp16GlobalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp32GlobalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_global_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp64GlobalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_global_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp16LocalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp32LocalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp64LocalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp16GenericAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_add __opencl_c_ext_fp16_global_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp32GenericAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_add __opencl_c_ext_fp32_global_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp64GenericAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_add __opencl_c_ext_fp64_global_atomic_add">;
|
||||
def FuncExtFloatAtomicsFp16GlobalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp32GlobalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_global_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp64GlobalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_global_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp16LocalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp32LocalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp64LocalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp16GenericMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_min_max __opencl_c_ext_fp16_global_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp32GenericMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_min_max __opencl_c_ext_fp32_global_atomic_min_max">;
|
||||
def FuncExtFloatAtomicsFp64GenericMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_min_max __opencl_c_ext_fp64_global_atomic_min_max">;
|
||||
|
||||
|
@ -362,6 +371,7 @@ def AtomicLong : Type<"atomic_long", QualType<"Context.getAtomicType(
|
|||
def AtomicULong : Type<"atomic_ulong", QualType<"Context.getAtomicType(Context.UnsignedLongTy)">>;
|
||||
def AtomicFloat : Type<"atomic_float", QualType<"Context.getAtomicType(Context.FloatTy)">>;
|
||||
def AtomicDouble : Type<"atomic_double", QualType<"Context.getAtomicType(Context.DoubleTy)">>;
|
||||
def AtomicHalf : Type<"atomic_half", QualType<"Context.getAtomicType(Context.HalfTy)">>;
|
||||
def AtomicIntPtr : Type<"atomic_intptr_t", QualType<"Context.getAtomicType(Context.getIntPtrType())">>;
|
||||
def AtomicUIntPtr : Type<"atomic_uintptr_t", QualType<"Context.getAtomicType(Context.getUIntPtrType())">>;
|
||||
def AtomicSize : Type<"atomic_size_t", QualType<"Context.getAtomicType(Context.getSizeType())">>;
|
||||
|
@ -1106,7 +1116,75 @@ let MinVersion = CL20 in {
|
|||
|
||||
// The functionality added by cl_ext_float_atomics extension
|
||||
let MinVersion = CL20 in {
|
||||
let Extension = FuncExtFloatAtomicsFp16GlobalLoadStore in {
|
||||
def : Builtin<"atomic_store",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, GlobalAS>, AtomicHalf]>;
|
||||
def : Builtin<"atomic_store_explicit",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, GlobalAS>, AtomicHalf, MemoryOrder]>;
|
||||
def : Builtin<"atomic_store_explicit",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, GlobalAS>, AtomicHalf, MemoryOrder, MemoryScope]>;
|
||||
def : Builtin<"atomic_load",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>]>;
|
||||
def : Builtin<"atomic_load_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, MemoryOrder]>;
|
||||
def : Builtin<"atomic_load_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, MemoryOrder, MemoryScope]>;
|
||||
def : Builtin<"atomic_exchange",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, Half]>;
|
||||
def : Builtin<"atomic_exchange_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_exchange_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp16LocalLoadStore in {
|
||||
def : Builtin<"atomic_store",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, LocalAS>, AtomicHalf]>;
|
||||
def : Builtin<"atomic_store_explicit",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, LocalAS>, AtomicHalf, MemoryOrder]>;
|
||||
def : Builtin<"atomic_store_explicit",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, LocalAS>, AtomicHalf, MemoryOrder, MemoryScope]>;
|
||||
def : Builtin<"atomic_load",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>]>;
|
||||
def : Builtin<"atomic_load_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, MemoryOrder]>;
|
||||
def : Builtin<"atomic_load_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, MemoryOrder, MemoryScope]>;
|
||||
def : Builtin<"atomic_exchange",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, Half]>;
|
||||
def : Builtin<"atomic_exchange_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_exchange_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp16GenericLoadStore in {
|
||||
def : Builtin<"atomic_store",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, GenericAS>, AtomicHalf]>;
|
||||
def : Builtin<"atomic_store_explicit",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, GenericAS>, AtomicHalf, MemoryOrder]>;
|
||||
def : Builtin<"atomic_store_explicit",
|
||||
[Void, PointerType<VolatileType<AtomicHalf>, GenericAS>, AtomicHalf, MemoryOrder, MemoryScope]>;
|
||||
def : Builtin<"atomic_load",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>]>;
|
||||
def : Builtin<"atomic_load_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, MemoryOrder]>;
|
||||
def : Builtin<"atomic_load_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, MemoryOrder, MemoryScope]>;
|
||||
def : Builtin<"atomic_exchange",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, Half]>;
|
||||
def : Builtin<"atomic_exchange_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_exchange_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
foreach ModOp = ["add", "sub"] in {
|
||||
let Extension = FuncExtFloatAtomicsFp16GlobalAdd in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, GlobalAS>, Half]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, GlobalAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, GlobalAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp32GlobalAdd in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Float, PointerType<VolatileType<AtomicFloat>, GlobalAS>, Float]>;
|
||||
|
@ -1123,6 +1201,14 @@ let MinVersion = CL20 in {
|
|||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Double, PointerType<VolatileType<AtomicDouble>, GlobalAS>, Double, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp16LocalAdd in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, LocalAS>, Half]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, LocalAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, LocalAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp32LocalAdd in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Float, PointerType<VolatileType<AtomicFloat>, LocalAS>, Float]>;
|
||||
|
@ -1139,6 +1225,14 @@ let MinVersion = CL20 in {
|
|||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Double, PointerType<VolatileType<AtomicDouble>, LocalAS>, Double, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp16GenericAdd in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, GenericAS>, Half]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, GenericAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicFloat>, GenericAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp32GenericAdd in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Float, PointerType<VolatileType<AtomicFloat>, GenericAS>, Float]>;
|
||||
|
@ -1157,6 +1251,14 @@ let MinVersion = CL20 in {
|
|||
}
|
||||
}
|
||||
foreach ModOp = ["min", "max"] in {
|
||||
let Extension = FuncExtFloatAtomicsFp16GlobalMinMax in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, Half]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GlobalAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp32GlobalMinMax in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Float, PointerType<VolatileType<AtomicFloat>, GlobalAS>, Float]>;
|
||||
|
@ -1173,6 +1275,14 @@ let MinVersion = CL20 in {
|
|||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Double, PointerType<VolatileType<AtomicDouble>, GlobalAS>, Double, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp16LocalMinMax in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, Half]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, LocalAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp32LocalMinMax in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Float, PointerType<VolatileType<AtomicFloat>, LocalAS>, Float]>;
|
||||
|
@ -1189,6 +1299,14 @@ let MinVersion = CL20 in {
|
|||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Double, PointerType<VolatileType<AtomicDouble>, LocalAS>, Double, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp16GenericMinMax in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, Half]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, Half, MemoryOrder]>;
|
||||
def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
|
||||
[Half, PointerType<VolatileType<AtomicHalf>, GenericAS>, Half, MemoryOrder, MemoryScope]>;
|
||||
}
|
||||
let Extension = FuncExtFloatAtomicsFp32GenericMinMax in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[Float, PointerType<VolatileType<AtomicFloat>, GenericAS>, Float]>;
|
||||
|
|
|
@ -367,6 +367,11 @@ void Sema::Initialize() {
|
|||
AddPointerSizeDependentTypes();
|
||||
}
|
||||
|
||||
if (getOpenCLOptions().isSupported("cl_khr_fp16", getLangOpts())) {
|
||||
auto AtomicHalfT = Context.getAtomicType(Context.HalfTy);
|
||||
addImplicitTypedef("atomic_half", AtomicHalfT);
|
||||
}
|
||||
|
||||
std::vector<QualType> Atomic64BitTypes;
|
||||
if (getOpenCLOptions().isSupported("cl_khr_int64_base_atomics",
|
||||
getLangOpts()) &&
|
||||
|
|
|
@ -19,7 +19,7 @@ int8 i64;
|
|||
|
||||
atomic_int gn;
|
||||
void f(atomic_int *i, const atomic_int *ci,
|
||||
atomic_intptr_t *p, atomic_float *f, atomic_double *d, atomic_half *h, // expected-error {{unknown type name 'atomic_half'}}
|
||||
atomic_intptr_t *p, atomic_float *f, atomic_double *d, atomic_half *h,
|
||||
int *I, const int *CI,
|
||||
intptr_t *P, float *D, struct S *s1, struct S *s2,
|
||||
global atomic_int *i_g, local atomic_int *i_l, private atomic_int *i_p,
|
||||
|
|
Loading…
Reference in New Issue