Skip to content

Commit 544d89e

Browse files
committed
[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
1 parent d4717b9 commit 544d89e

File tree

4 files changed

+287
-1
lines changed

4 files changed

+287
-1
lines changed

clang/lib/Headers/opencl-c.h

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13640,6 +13640,118 @@ uintptr_t __ovld atomic_fetch_sub_explicit(volatile __local atomic_uintptr_t *ob
1364013640
// The functionality added by cl_ext_float_atomics extension
1364113641
#if defined(cl_ext_float_atomics)
1364213642

13643+
#if defined(__opencl_c_ext_fp16_global_atomic_load_store)
13644+
void __ovld atomic_store(volatile __global atomic_half *object, half operand);
13645+
void __ovld atomic_store_explicit(volatile __global atomic_half *object,
13646+
half operand, memory_order order);
13647+
void __ovld atomic_store_explicit(volatile __global atomic_half *object,
13648+
half operand, memory_order order,
13649+
memory_scope scope);
13650+
half __ovld atomic_load(volatile __global atomic_half *object);
13651+
half __ovld atomic_load_explicit(volatile __global atomic_half *object,
13652+
memory_order order);
13653+
half __ovld atomic_load_explicit(volatile __global atomic_half *object,
13654+
memory_order order, memory_scope scope);
13655+
half __ovld atomic_exchange(volatile __global atomic_half *object,
13656+
half operand);
13657+
half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
13658+
half operand, memory_order order);
13659+
half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
13660+
half operand, memory_order order,
13661+
memory_scope scope);
13662+
#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store)
13663+
13664+
#if defined(__opencl_c_ext_fp16_local_atomic_load_store)
13665+
void __ovld atomic_store(volatile __local atomic_half *object, half operand);
13666+
void __ovld atomic_store_explicit(volatile __local atomic_half *object,
13667+
half operand, memory_order order);
13668+
void __ovld atomic_store_explicit(volatile __local atomic_half *object,
13669+
half operand, memory_order order,
13670+
memory_scope scope);
13671+
half __ovld atomic_load(volatile __local atomic_half *object);
13672+
half __ovld atomic_load_explicit(volatile __local atomic_half *object,
13673+
memory_order order);
13674+
half __ovld atomic_load_explicit(volatile __local atomic_half *object,
13675+
memory_order order, memory_scope scope);
13676+
half __ovld atomic_exchange(volatile __local atomic_half *object, half operand);
13677+
half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
13678+
half operand, memory_order order);
13679+
half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
13680+
half operand, memory_order order,
13681+
memory_scope scope);
13682+
#endif // defined(__opencl_c_ext_fp16_local_atomic_load_store)
13683+
13684+
#if defined(__opencl_c_ext_fp16_global_atomic_load_store) && \
13685+
defined(__opencl_c_ext_fp16_local_atomic_load_store)
13686+
void __ovld atomic_store(volatile atomic_half *object, half operand);
13687+
void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
13688+
memory_order order);
13689+
void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
13690+
memory_order order, memory_scope scope);
13691+
half __ovld atomic_load(volatile atomic_half *object);
13692+
half __ovld atomic_load_explicit(volatile atomic_half *object,
13693+
memory_order order);
13694+
half __ovld atomic_load_explicit(volatile atomic_half *object,
13695+
memory_order order, memory_scope scope);
13696+
half __ovld atomic_exchange(volatile atomic_half *object, half operand);
13697+
half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
13698+
memory_order order);
13699+
half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
13700+
memory_order order, memory_scope scope);
13701+
#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) &&
13702+
// defined(__opencl_c_ext_fp16_local_atomic_load_store)
13703+
13704+
#if defined(__opencl_c_ext_fp16_global_atomic_min_max)
13705+
half __ovld atomic_fetch_min(volatile __global atomic_half *object,
13706+
half operand);
13707+
half __ovld atomic_fetch_max(volatile __global atomic_half *object,
13708+
half operand);
13709+
half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
13710+
half operand, memory_order order);
13711+
half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
13712+
half operand, memory_order order);
13713+
half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
13714+
half operand, memory_order order,
13715+
memory_scope scope);
13716+
half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
13717+
half operand, memory_order order,
13718+
memory_scope scope);
13719+
#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max)
13720+
13721+
#if defined(__opencl_c_ext_fp16_local_atomic_min_max)
13722+
half __ovld atomic_fetch_min(volatile __local atomic_half *object,
13723+
half operand);
13724+
half __ovld atomic_fetch_max(volatile __local atomic_half *object,
13725+
half operand);
13726+
half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
13727+
half operand, memory_order order);
13728+
half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
13729+
half operand, memory_order order);
13730+
half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
13731+
half operand, memory_order order,
13732+
memory_scope scope);
13733+
half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
13734+
half operand, memory_order order,
13735+
memory_scope scope);
13736+
#endif // defined(__opencl_c_ext_fp16_local_atomic_min_max)
13737+
13738+
#if defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
13739+
defined(__opencl_c_ext_fp16_local_atomic_min_max)
13740+
half __ovld atomic_fetch_min(volatile atomic_half *object, half operand);
13741+
half __ovld atomic_fetch_max(volatile atomic_half *object, half operand);
13742+
half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
13743+
half operand, memory_order order);
13744+
half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
13745+
half operand, memory_order order);
13746+
half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
13747+
half operand, memory_order order,
13748+
memory_scope scope);
13749+
half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
13750+
half operand, memory_order order,
13751+
memory_scope scope);
13752+
#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
13753+
defined(__opencl_c_ext_fp16_local_atomic_min_max)
13754+
1364313755
#if defined(__opencl_c_ext_fp32_global_atomic_min_max)
1364413756
float __ovld atomic_fetch_min(volatile __global atomic_float *object,
1364513757
float operand);
@@ -13742,6 +13854,57 @@ double __ovld atomic_fetch_max_explicit(volatile atomic_double *object,
1374213854
#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max) && \
1374313855
defined(__opencl_c_ext_fp64_local_atomic_min_max)
1374413856

13857+
#if defined(__opencl_c_ext_fp16_global_atomic_add)
13858+
half __ovld atomic_fetch_add(volatile __global atomic_half *object,
13859+
half operand);
13860+
half __ovld atomic_fetch_sub(volatile __global atomic_half *object,
13861+
half operand);
13862+
half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
13863+
half operand, memory_order order);
13864+
half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
13865+
half operand, memory_order order);
13866+
half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
13867+
half operand, memory_order order,
13868+
memory_scope scope);
13869+
half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
13870+
half operand, memory_order order,
13871+
memory_scope scope);
13872+
#endif // defined(__opencl_c_ext_fp16_global_atomic_add)
13873+
13874+
#if defined(__opencl_c_ext_fp16_local_atomic_add)
13875+
half __ovld atomic_fetch_add(volatile __local atomic_half *object,
13876+
half operand);
13877+
half __ovld atomic_fetch_sub(volatile __local atomic_half *object,
13878+
half operand);
13879+
half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
13880+
half operand, memory_order order);
13881+
half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
13882+
half operand, memory_order order);
13883+
half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
13884+
half operand, memory_order order,
13885+
memory_scope scope);
13886+
half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
13887+
half operand, memory_order order,
13888+
memory_scope scope);
13889+
#endif // defined(__opencl_c_ext_fp16_local_atomic_add)
13890+
13891+
#if defined(__opencl_c_ext_fp16_global_atomic_add) && \
13892+
defined(__opencl_c_ext_fp16_local_atomic_add)
13893+
half __ovld atomic_fetch_add(volatile atomic_half *object, half operand);
13894+
half __ovld atomic_fetch_sub(volatile atomic_half *object, half operand);
13895+
half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
13896+
half operand, memory_order order);
13897+
half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
13898+
half operand, memory_order order);
13899+
half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
13900+
half operand, memory_order order,
13901+
memory_scope scope);
13902+
half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
13903+
half operand, memory_order order,
13904+
memory_scope scope);
13905+
#endif // defined(__opencl_c_ext_fp16_global_atomic_add) && \
13906+
defined(__opencl_c_ext_fp16_local_atomic_add)
13907+
1374513908
#if defined(__opencl_c_ext_fp32_global_atomic_add)
1374613909
float __ovld atomic_fetch_add(volatile __global atomic_float *object,
1374713910
float operand);

0 commit comments

Comments
 (0)