Index: clang/include/clang/Basic/OpenCLExtensions.def =================================================================== --- clang/include/clang/Basic/OpenCLExtensions.def +++ clang/include/clang/Basic/OpenCLExtensions.def @@ -82,6 +82,7 @@ OPENCL_EXTENSION(cl_khr_mipmap_image_writes, true, 200) OPENCL_EXTENSION(cl_khr_srgb_image_writes, true, 200) OPENCL_EXTENSION(cl_khr_subgroups, true, 200) +OPENCL_EXTENSION(cl_ext_float_atomics, true, 200) // Clang Extensions. OPENCL_EXTENSION(cl_clang_storage_class_specifiers, true, 100) @@ -117,6 +118,20 @@ OPENCL_OPTIONALCOREFEATURE(__opencl_c_program_scope_global_variables, false, 300, OCL_C_30) OPENCL_OPTIONALCOREFEATURE(__opencl_c_fp64, false, 300, OCL_C_30) OPENCL_OPTIONALCOREFEATURE(__opencl_c_images, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_global_atomic_load_store, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_local_atomic_load_store, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_global_atomic_add, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_global_atomic_add, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_global_atomic_add, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_local_atomic_add, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_local_atomic_add, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_local_atomic_add, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_global_atomic_min_max, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_global_atomic_min_max, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_global_atomic_min_max, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_local_atomic_min_max, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_local_atomic_min_max, false, 300, OCL_C_30) +OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_local_atomic_min_max, false, 300, OCL_C_30) #undef OPENCL_OPTIONALCOREFEATURE #undef OPENCL_COREFEATURE Index: clang/lib/Headers/opencl-c-base.h =================================================================== --- clang/lib/Headers/opencl-c-base.h +++ clang/lib/Headers/opencl-c-base.h @@ -37,6 +37,20 @@ #define __opencl_c_read_write_images 1 #define __opencl_c_program_scope_global_variables 1 #define __opencl_c_images 1 +#define __opencl_c_ext_fp16_global_atomic_load_store 1 +#define __opencl_c_ext_fp16_local_atomic_load_store 1 +#define __opencl_c_ext_fp16_global_atomic_add 1 +#define __opencl_c_ext_fp32_global_atomic_add 1 +#define __opencl_c_ext_fp64_global_atomic_add 1 +#define __opencl_c_ext_fp16_local_atomic_add 1 +#define __opencl_c_ext_fp32_local_atomic_add 1 +#define __opencl_c_ext_fp64_local_atomic_add 1 +#define __opencl_c_ext_fp16_global_atomic_min_max 1 +#define __opencl_c_ext_fp32_global_atomic_min_max 1 +#define __opencl_c_ext_fp64_global_atomic_min_max 1 +#define __opencl_c_ext_fp16_local_atomic_min_max 1 +#define __opencl_c_ext_fp32_local_atomic_min_max 1 +#define __opencl_c_ext_fp64_local_atomic_min_max 1 #endif // Define header-only feature macros for OpenCL C 3.0. Index: clang/lib/Headers/opencl-c.h =================================================================== --- clang/lib/Headers/opencl-c.h +++ clang/lib/Headers/opencl-c.h @@ -13415,6 +13415,96 @@ uintptr_t __ovld atomic_fetch_sub_explicit(volatile atomic_uintptr_t *object, ptrdiff_t operand, memory_order order, memory_scope scope); #endif +#if defined(cl_ext_float_atomics) +float __ovld atomic_fetch_min(volatile __global atomic_float *object, float operand); +float __ovld atomic_fetch_max(volatile __global atomic_float *object, float operand); +float __ovld atomic_fetch_min_explicit(volatile __global atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_min_explicit(volatile __global atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_min(volatile __local atomic_float *object, float operand); +float __ovld atomic_fetch_max(volatile __local atomic_float *object, float operand); +float __ovld atomic_fetch_min_explicit(volatile __local atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_min_explicit(volatile __local atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_min(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_max(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_min_explicit(volatile atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_max_explicit(volatile atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_min_explicit(volatile atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_max_explicit(volatile atomic_float *object, float operand, memory_order order, memory_scope scope); + +#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics) +#ifdef cl_khr_fp64 +double __ovld atomic_fetch_min(volatile __global atomic_double *object, double operand); +double __ovld atomic_fetch_max(volatile __global atomic_double *object, double operand); +double __ovld atomic_fetch_min_explicit(volatile __global atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_min_explicit(volatile __global atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_min(volatile __local atomic_double *object, double operand); +double __ovld atomic_fetch_max(volatile __local atomic_double *object, double operand); +double __ovld atomic_fetch_min_explicit(volatile __local atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_min_explicit(volatile __local atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_min(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_max(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_min_explicit(volatile atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_max_explicit(volatile atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_min_explicit(volatile atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_max_explicit(volatile atomic_double *object, double operand, memory_order order, memory_scope scope); +#endif //cl_khr_fp64 +#endif + +#endif //cl_ext_float_atomics + +#if defined(cl_ext_float_atomics) +float __ovld atomic_fetch_add(volatile __global atomic_float *object, float operand); +float __ovld atomic_fetch_sub(volatile __global atomic_float *object, float operand); +float __ovld atomic_fetch_add_explicit(volatile __global atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_add_explicit(volatile __global atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_add(volatile __local atomic_float *object, float operand); +float __ovld atomic_fetch_sub(volatile __local atomic_float *object, float operand); +float __ovld atomic_fetch_add_explicit(volatile __local atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_add_explicit(volatile __local atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_add(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_sub(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_add_explicit(volatile atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object, float operand, memory_order order); +float __ovld atomic_fetch_add_explicit(volatile atomic_float *object, float operand, memory_order order, memory_scope scope); +float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object, float operand, memory_order order, memory_scope scope); + +#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics) +#ifdef cl_khr_fp64 +double __ovld atomic_fetch_add(volatile __global atomic_double *object, double operand); +double __ovld atomic_fetch_sub(volatile __global atomic_double *object, double operand); +double __ovld atomic_fetch_add_explicit(volatile __global atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_add_explicit(volatile __global atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_add(volatile __local atomic_double *object, double operand); +double __ovld atomic_fetch_sub(volatile __local atomic_double *object, double operand); +double __ovld atomic_fetch_add_explicit(volatile __local atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_add_explicit(volatile __local atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_add(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_sub(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_add_explicit(volatile atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object, double operand, memory_order order); +double __ovld atomic_fetch_add_explicit(volatile atomic_double *object, double operand, memory_order order, memory_scope scope); +double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object, double operand, memory_order order, memory_scope scope); +#endif //cl_khr_fp64 +#endif + +#endif //cl_ext_float_atomics + // atomic_store() void __ovld atomic_store(volatile atomic_int *object, int desired); Index: clang/test/Headers/opencl-c-header.cl =================================================================== --- clang/test/Headers/opencl-c-header.cl +++ clang/test/Headers/opencl-c-header.cl @@ -192,6 +192,48 @@ #ifndef __opencl_c_images #error "Feature macro __opencl_c_images should be defined" #endif +#ifndef __opencl_c_ext_fp16_global_atomic_load_store +#error "Feature macro __opencl_c_ext_fp16_global_atomic_load_store should be defined" +#endif +#ifndef __opencl_c_ext_fp16_local_atomic_load_store +#error "Feature macro __opencl_c_ext_fp16_local_atomic_load_store should be defined" +#endif +#ifndef __opencl_c_ext_fp16_global_atomic_add +#error "Feature macro __opencl_c_ext_fp16_global_atomic_add should be defined" +#endif +#ifndef __opencl_c_ext_fp32_global_atomic_add +#error "Feature macro __opencl_c_ext_fp32_global_atomic_add should be defined" +#endif +#ifndef __opencl_c_ext_fp64_global_atomic_add +#error "Feature macro __opencl_c_ext_fp64_global_atomic_add should be defined" +#endif +#ifndef __opencl_c_ext_fp16_local_atomic_add +#error "Feature macro __opencl_c_ext_fp16_local_atomic_add should be defined" +#endif +#ifndef __opencl_c_ext_fp32_local_atomic_add +#error "Feature macro __opencl_c_ext_fp32_local_atomic_add should be defined" +#endif +#ifndef __opencl_c_ext_fp64_local_atomic_add +#error "Feature macro __opencl_c_ext_fp64_local_atomic_add should be defined" +#endif +#ifndef __opencl_c_ext_fp16_global_atomic_min_max +#error "Feature macro __opencl_c_ext_fp16_global_atomic_min_max should be defined" +#endif +#ifndef __opencl_c_ext_fp32_global_atomic_min_max +#error "Feature macro __opencl_c_ext_fp32_global_atomic_min_max should be defined" +#endif +#ifndef __opencl_c_ext_fp64_global_atomic_min_max +#error "Feature macro __opencl_c_ext_fp64_global_atomic_min_max should be defined" +#endif +#ifndef __opencl_c_ext_fp16_local_atomic_min_max +#error "Feature macro __opencl_c_ext_fp16_local_atomic_min_max should be defined" +#endif +#ifndef __opencl_c_ext_fp32_local_atomic_min_max +#error "Feature macro __opencl_c_ext_fp32_local_atomic_min_max should be defined" +#endif +#ifndef __opencl_c_ext_fp64_local_atomic_min_max +#error "Feature macro __opencl_c_ext_fp64_local_atomic_min_max should be defined" +#endif #elif (__OPENCL_C_VERSION__ < 200) @@ -237,7 +279,48 @@ #ifdef __opencl_c_subgroups #error "Incorrect feature macro __opencl_c_subgroups define" #endif - +#ifdef __opencl_c_ext_fp16_global_atomic_load_store +#error "Incorrect feature macro __opencl_c_ext_fp16_global_atomic_load_store define" +#endif +#ifdef __opencl_c_ext_fp16_local_atomic_load_store +#error "Incorrect feature macro __opencl_c_ext_fp16_local_atomic_load_store define" +#endif +#ifdef __opencl_c_ext_fp16_global_atomic_add +#error "Incorrect feature macro __opencl_c_ext_fp16_global_atomic_add define" +#endif +#ifdef __opencl_c_ext_fp32_global_atomic_add +#error "Incorrect feature macro __opencl_c_ext_fp32_global_atomic_add define" +#endif +#ifdef __opencl_c_ext_fp64_global_atomic_add +#error "Incorrect feature macro __opencl_c_ext_fp64_global_atomic_add define" +#endif +#ifdef __opencl_c_ext_fp16_local_atomic_add +#error "Incorrect feature macro __opencl_c_ext_fp16_local_atomic_add define" +#endif +#ifdef __opencl_c_ext_fp32_local_atomic_add +#error "Incorrect feature macro __opencl_c_ext_fp32_local_atomic_add define" +#endif +#ifdef __opencl_c_ext_fp64_local_atomic_add +#error "Incorrect feature macro __opencl_c_ext_fp64_local_atomic_add define" +#endif +#ifdef __opencl_c_ext_fp16_global_atomic_min_max +#error "Incorrect feature macro __opencl_c_ext_fp16_global_atomic_min_max define" +#endif +#ifdef __opencl_c_ext_fp32_global_atomic_min_max +#error "Incorrect feature macro __opencl_c_ext_fp32_global_atomic_min_max define" +#endif +#ifdef __opencl_c_ext_fp64_global_atomic_min_max +#error "Incorrect feature macro __opencl_c_ext_fp64_global_atomic_min_max define" +#endif +#ifdef __opencl_c_ext_fp16_local_atomic_min_max +#error "Incorrect feature macro __opencl_c_ext_fp16_local_atomic_min_max define" +#endif +#ifdef __opencl_c_ext_fp32_local_atomic_min_max +#error "Incorrect feature macro __opencl_c_ext_fp32_local_atomic_min_max define" +#endif +#ifdef __opencl_c_ext_fp64_local_atomic_min_max +#error "Incorrect feature macro __opencl_c_ext_fp64_local_atomic_min_max define" +#endif #endif //(defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ == 200) #endif // defined(__SPIR__) Index: clang/test/SemaOpenCL/features.cl =================================================================== --- clang/test/SemaOpenCL/features.cl +++ clang/test/SemaOpenCL/features.cl @@ -25,6 +25,20 @@ // FEATURES: #define __opencl_c_atomic_order_acq_rel 1 // FEATURES: #define __opencl_c_atomic_order_seq_cst 1 // FEATURES: #define __opencl_c_device_enqueue 1 +// FEATURES: #define __opencl_c_ext_fp16_global_atomic_add 1 +// FEATURES: #define __opencl_c_ext_fp16_global_atomic_load_store 1 +// FEATURES: #define __opencl_c_ext_fp16_global_atomic_min_max 1 +// FEATURES: #define __opencl_c_ext_fp16_local_atomic_add 1 +// FEATURES: #define __opencl_c_ext_fp16_local_atomic_load_store 1 +// FEATURES: #define __opencl_c_ext_fp16_local_atomic_min_max 1 +// FEATURES: #define __opencl_c_ext_fp32_global_atomic_add 1 +// FEATURES: #define __opencl_c_ext_fp32_global_atomic_min_max 1 +// FEATURES: #define __opencl_c_ext_fp32_local_atomic_add 1 +// FEATURES: #define __opencl_c_ext_fp32_local_atomic_min_max 1 +// FEATURES: #define __opencl_c_ext_fp64_global_atomic_add 1 +// FEATURES: #define __opencl_c_ext_fp64_global_atomic_min_max 1 +// FEATURES: #define __opencl_c_ext_fp64_local_atomic_add 1 +// FEATURES: #define __opencl_c_ext_fp64_local_atomic_min_max 1 // FEATURES: #define __opencl_c_fp64 1 // FEATURES: #define __opencl_c_generic_address_space 1 // FEATURES: #define __opencl_c_images 1 @@ -39,6 +53,20 @@ // NO-FEATURES-NOT: __opencl_c_atomic_order_acq_rel // NO-FEATURES-NOT: __opencl_c_atomic_order_seq_cst // NO-FEATURES-NOT: __opencl_c_device_enqueue +// NO-FEATURES-NOT: __opencl_c_ext_fp16_global_atomic_add +// NO-FEATURES-NOT: __opencl_c_ext_fp16_global_atomic_load_store +// NO-FEATURES-NOT: __opencl_c_ext_fp16_global_atomic_min_max +// NO-FEATURES-NOT: __opencl_c_ext_fp16_local_atomic_add +// NO-FEATURES-NOT: __opencl_c_ext_fp16_local_atomic_load_store +// NO-FEATURES-NOT: __opencl_c_ext_fp16_local_atomic_min_max +// NO-FEATURES-NOT: __opencl_c_ext_fp32_global_atomic_add +// NO-FEATURES-NOT: __opencl_c_ext_fp32_global_atomic_min_max +// NO-FEATURES-NOT: __opencl_c_ext_fp32_local_atomic_add +// NO-FEATURES-NOT: __opencl_c_ext_fp32_local_atomic_min_max +// NO-FEATURES-NOT: __opencl_c_ext_fp64_global_atomic_add +// NO-FEATURES-NOT: __opencl_c_ext_fp64_global_atomic_min_max +// NO-FEATURES-NOT: __opencl_c_ext_fp64_local_atomic_add +// NO-FEATURES-NOT: __opencl_c_ext_fp64_local_atomic_min_max // NO-FEATURES-NOT: __opencl_c_fp64 // NO-FEATURES-NOT: __opencl_c_generic_address_space // NO-FEATURES-NOT: __opencl_c_images