summaryrefslogtreecommitdiffstats
path: root/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch')
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch561
1 files changed, 0 insertions, 561 deletions
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch
deleted file mode 100644
index c609b08b..00000000
--- a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch
+++ /dev/null
@@ -1,561 +0,0 @@
1From 85505bdb386a426310c1fb0a845780beeeec4353 Mon Sep 17 00:00:00 2001
2From: haonanya <haonan.yang@intel.com>
3Date: Wed, 9 Feb 2022 09:16:35 +0800
4Subject: [PATCH] Support cl_ext_float_atomics
5
6This backports https://reviews.llvm.org/D106343 and https://reviews.llvm.org/D109740
7
8Signed-off-by: haonanya <haonan.yang@intel.com>
9
10Upstream-Status: Backport
11
12https://github.com/llvm/llvm-project/commit/d353d1c50112a1cb315eccdab18ce7bd1563cd06
13https://github.com/llvm/llvm-project/commit/544d89e847d42ce8856296752b0fb279aa89aace
14
15Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
16
17---
18 clang/lib/Headers/opencl-c-base.h | 19 ++
19 clang/lib/Headers/opencl-c.h | 378 ++++++++++++++++++++++++++
20 clang/lib/Sema/Sema.cpp | 3 +
21 clang/test/Headers/opencl-c-header.cl | 84 ++++++
22 4 files changed, 484 insertions(+)
23
24diff --git a/clang/lib/Headers/opencl-c-base.h b/clang/lib/Headers/opencl-c-base.h
25index e8dcd70377e5..d94d64372dbb 100644
26--- a/clang/lib/Headers/opencl-c-base.h
27+++ b/clang/lib/Headers/opencl-c-base.h
28@@ -21,6 +21,25 @@
29 #define cl_khr_subgroup_shuffle 1
30 #define cl_khr_subgroup_shuffle_relative 1
31 #define cl_khr_subgroup_clustered_reduce 1
32+#define cl_ext_float_atomics
33+#ifdef cl_khr_fp16
34+#define __opencl_c_ext_fp16_global_atomic_load_store 1
35+#define __opencl_c_ext_fp16_local_atomic_load_store 1
36+#define __opencl_c_ext_fp16_global_atomic_add 1
37+#define __opencl_c_ext_fp16_local_atomic_add 1
38+#define __opencl_c_ext_fp16_global_atomic_min_max 1
39+#define __opencl_c_ext_fp16_local_atomic_min_max 1
40+#endif
41+#ifdef cl_khr_fp64
42+#define __opencl_c_ext_fp64_global_atomic_add 1
43+#define __opencl_c_ext_fp64_local_atomic_add 1
44+#define __opencl_c_ext_fp64_global_atomic_min_max 1
45+#define __opencl_c_ext_fp64_local_atomic_min_max 1
46+#endif
47+#define __opencl_c_ext_fp32_global_atomic_add 1
48+#define __opencl_c_ext_fp32_local_atomic_add 1
49+#define __opencl_c_ext_fp32_global_atomic_min_max 1
50+#define __opencl_c_ext_fp32_local_atomic_min_max 1
51 #endif // defined(__SPIR__)
52 #endif // (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
53
54diff --git a/clang/lib/Headers/opencl-c.h b/clang/lib/Headers/opencl-c.h
55index ab665628c8e1..584db7e81e04 100644
56--- a/clang/lib/Headers/opencl-c.h
57+++ b/clang/lib/Headers/opencl-c.h
58@@ -13531,6 +13531,384 @@ intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uint
59 intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uintptr_t opermax, memory_order minder, memory_scope scope);
60 #endif
61
62+// The functionality added by cl_ext_float_atomics extension
63+#if defined(cl_ext_float_atomics)
64+
65+#if defined(__opencl_c_ext_fp16_global_atomic_load_store)
66+void __ovld atomic_store(volatile __global atomic_half *object, half operand);
67+void __ovld atomic_store_explicit(volatile __global atomic_half *object,
68+ half operand, memory_order order);
69+void __ovld atomic_store_explicit(volatile __global atomic_half *object,
70+ half operand, memory_order order,
71+ memory_scope scope);
72+half __ovld atomic_load(volatile __global atomic_half *object);
73+half __ovld atomic_load_explicit(volatile __global atomic_half *object,
74+ memory_order order);
75+half __ovld atomic_load_explicit(volatile __global atomic_half *object,
76+ memory_order order, memory_scope scope);
77+half __ovld atomic_exchange(volatile __global atomic_half *object,
78+ half operand);
79+half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
80+ half operand, memory_order order);
81+half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
82+ half operand, memory_order order,
83+ memory_scope scope);
84+#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store)
85+
86+#if defined(__opencl_c_ext_fp16_local_atomic_load_store)
87+void __ovld atomic_store(volatile __local atomic_half *object, half operand);
88+void __ovld atomic_store_explicit(volatile __local atomic_half *object,
89+ half operand, memory_order order);
90+void __ovld atomic_store_explicit(volatile __local atomic_half *object,
91+ half operand, memory_order order,
92+ memory_scope scope);
93+half __ovld atomic_load(volatile __local atomic_half *object);
94+half __ovld atomic_load_explicit(volatile __local atomic_half *object,
95+ memory_order order);
96+half __ovld atomic_load_explicit(volatile __local atomic_half *object,
97+ memory_order order, memory_scope scope);
98+half __ovld atomic_exchange(volatile __local atomic_half *object, half operand);
99+half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
100+ half operand, memory_order order);
101+half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
102+ half operand, memory_order order,
103+ memory_scope scope);
104+#endif // defined(__opencl_c_ext_fp16_local_atomic_load_store)
105+
106+#if defined(__opencl_c_ext_fp16_global_atomic_load_store) && \
107+ defined(__opencl_c_ext_fp16_local_atomic_load_store)
108+void __ovld atomic_store(volatile atomic_half *object, half operand);
109+void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
110+ memory_order order);
111+void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
112+ memory_order order, memory_scope scope);
113+half __ovld atomic_load(volatile atomic_half *object);
114+half __ovld atomic_load_explicit(volatile atomic_half *object,
115+ memory_order order);
116+half __ovld atomic_load_explicit(volatile atomic_half *object,
117+ memory_order order, memory_scope scope);
118+half __ovld atomic_exchange(volatile atomic_half *object, half operand);
119+half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
120+ memory_order order);
121+half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
122+ memory_order order, memory_scope scope);
123+#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) &&
124+ // defined(__opencl_c_ext_fp16_local_atomic_load_store)
125+
126+#if defined(__opencl_c_ext_fp16_global_atomic_min_max)
127+half __ovld atomic_fetch_min(volatile __global atomic_half *object,
128+ half operand);
129+half __ovld atomic_fetch_max(volatile __global atomic_half *object,
130+ half operand);
131+half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
132+ half operand, memory_order order);
133+half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
134+ half operand, memory_order order);
135+half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
136+ half operand, memory_order order,
137+ memory_scope scope);
138+half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
139+ half operand, memory_order order,
140+ memory_scope scope);
141+#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max)
142+
143+#if defined(__opencl_c_ext_fp16_local_atomic_min_max)
144+half __ovld atomic_fetch_min(volatile __local atomic_half *object,
145+ half operand);
146+half __ovld atomic_fetch_max(volatile __local atomic_half *object,
147+ half operand);
148+half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
149+ half operand, memory_order order);
150+half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
151+ half operand, memory_order order);
152+half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
153+ half operand, memory_order order,
154+ memory_scope scope);
155+half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
156+ half operand, memory_order order,
157+ memory_scope scope);
158+#endif // defined(__opencl_c_ext_fp16_local_atomic_min_max)
159+
160+#if defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
161+ defined(__opencl_c_ext_fp16_local_atomic_min_max)
162+half __ovld atomic_fetch_min(volatile atomic_half *object, half operand);
163+half __ovld atomic_fetch_max(volatile atomic_half *object, half operand);
164+half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
165+ half operand, memory_order order);
166+half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
167+ half operand, memory_order order);
168+half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
169+ half operand, memory_order order,
170+ memory_scope scope);
171+half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
172+ half operand, memory_order order,
173+ memory_scope scope);
174+#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
175+ defined(__opencl_c_ext_fp16_local_atomic_min_max)
176+
177+#if defined(__opencl_c_ext_fp32_global_atomic_min_max)
178+float __ovld atomic_fetch_min(volatile __global atomic_float *object,
179+ float operand);
180+float __ovld atomic_fetch_max(volatile __global atomic_float *object,
181+ float operand);
182+float __ovld atomic_fetch_min_explicit(volatile __global atomic_float *object,
183+ float operand, memory_order order);
184+float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object,
185+ float operand, memory_order order);
186+float __ovld atomic_fetch_min_explicit(volatile __global atomic_float *object,
187+ float operand, memory_order order,
188+ memory_scope scope);
189+float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object,
190+ float operand, memory_order order,
191+ memory_scope scope);
192+#endif // defined(__opencl_c_ext_fp32_global_atomic_min_max)
193+
194+#if defined(__opencl_c_ext_fp32_local_atomic_min_max)
195+float __ovld atomic_fetch_min(volatile __local atomic_float *object,
196+ float operand);
197+float __ovld atomic_fetch_max(volatile __local atomic_float *object,
198+ float operand);
199+float __ovld atomic_fetch_min_explicit(volatile __local atomic_float *object,
200+ float operand, memory_order order);
201+float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object,
202+ float operand, memory_order order);
203+float __ovld atomic_fetch_min_explicit(volatile __local atomic_float *object,
204+ float operand, memory_order order,
205+ memory_scope scope);
206+float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object,
207+ float operand, memory_order order,
208+ memory_scope scope);
209+#endif // defined(__opencl_c_ext_fp32_local_atomic_min_max)
210+
211+#if defined(__opencl_c_ext_fp32_global_atomic_min_max) && \
212+ defined(__opencl_c_ext_fp32_local_atomic_min_max)
213+float __ovld atomic_fetch_min(volatile atomic_float *object, float operand);
214+float __ovld atomic_fetch_max(volatile atomic_float *object, float operand);
215+float __ovld atomic_fetch_min_explicit(volatile atomic_float *object,
216+ float operand, memory_order order);
217+float __ovld atomic_fetch_max_explicit(volatile atomic_float *object,
218+ float operand, memory_order order);
219+float __ovld atomic_fetch_min_explicit(volatile atomic_float *object,
220+ float operand, memory_order order,
221+ memory_scope scope);
222+float __ovld atomic_fetch_max_explicit(volatile atomic_float *object,
223+ float operand, memory_order order,
224+ memory_scope scope);
225+#endif // defined(__opencl_c_ext_fp32_global_atomic_min_max) && \
226+ defined(__opencl_c_ext_fp32_local_atomic_min_max)
227+
228+#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
229+#if defined(__opencl_c_ext_fp64_global_atomic_min_max)
230+double __ovld atomic_fetch_min(volatile __global atomic_double *object,
231+ double operand);
232+double __ovld atomic_fetch_max(volatile __global atomic_double *object,
233+ double operand);
234+double __ovld atomic_fetch_min_explicit(volatile __global atomic_double *object,
235+ double operand, memory_order order);
236+double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object,
237+ double operand, memory_order order);
238+double __ovld atomic_fetch_min_explicit(volatile __global atomic_double *object,
239+ double operand, memory_order order,
240+ memory_scope scope);
241+double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object,
242+ double operand, memory_order order,
243+ memory_scope scope);
244+#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max)
245+
246+#if defined(__opencl_c_ext_fp64_local_atomic_min_max)
247+double __ovld atomic_fetch_min(volatile __local atomic_double *object,
248+ double operand);
249+double __ovld atomic_fetch_max(volatile __local atomic_double *object,
250+ double operand);
251+double __ovld atomic_fetch_min_explicit(volatile __local atomic_double *object,
252+ double operand, memory_order order);
253+double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object,
254+ double operand, memory_order order);
255+double __ovld atomic_fetch_min_explicit(volatile __local atomic_double *object,
256+ double operand, memory_order order,
257+ memory_scope scope);
258+double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object,
259+ double operand, memory_order order,
260+ memory_scope scope);
261+#endif // defined(__opencl_c_ext_fp64_local_atomic_min_max)
262+
263+#if defined(__opencl_c_ext_fp64_global_atomic_min_max) && \
264+ defined(__opencl_c_ext_fp64_local_atomic_min_max)
265+double __ovld atomic_fetch_min(volatile atomic_double *object, double operand);
266+double __ovld atomic_fetch_max(volatile atomic_double *object, double operand);
267+double __ovld atomic_fetch_min_explicit(volatile atomic_double *object,
268+ double operand, memory_order order);
269+double __ovld atomic_fetch_max_explicit(volatile atomic_double *object,
270+ double operand, memory_order order);
271+double __ovld atomic_fetch_min_explicit(volatile atomic_double *object,
272+ double operand, memory_order order,
273+ memory_scope scope);
274+double __ovld atomic_fetch_max_explicit(volatile atomic_double *object,
275+ double operand, memory_order order,
276+ memory_scope scope);
277+#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max) && \
278+ defined(__opencl_c_ext_fp64_local_atomic_min_max)
279+#endif // defined(cl_khr_int64_base_atomics) &&
280+ // defined(cl_khr_int64_extended_atomics)
281+
282+#if defined(__opencl_c_ext_fp16_global_atomic_add)
283+half __ovld atomic_fetch_add(volatile __global atomic_half *object,
284+ half operand);
285+half __ovld atomic_fetch_sub(volatile __global atomic_half *object,
286+ half operand);
287+half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
288+ half operand, memory_order order);
289+half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
290+ half operand, memory_order order);
291+half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
292+ half operand, memory_order order,
293+ memory_scope scope);
294+half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
295+ half operand, memory_order order,
296+ memory_scope scope);
297+#endif // defined(__opencl_c_ext_fp16_global_atomic_add)
298+
299+#if defined(__opencl_c_ext_fp16_local_atomic_add)
300+half __ovld atomic_fetch_add(volatile __local atomic_half *object,
301+ half operand);
302+half __ovld atomic_fetch_sub(volatile __local atomic_half *object,
303+ half operand);
304+half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
305+ half operand, memory_order order);
306+half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
307+ half operand, memory_order order);
308+half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
309+ half operand, memory_order order,
310+ memory_scope scope);
311+half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
312+ half operand, memory_order order,
313+ memory_scope scope);
314+#endif // defined(__opencl_c_ext_fp16_local_atomic_add)
315+
316+#if defined(__opencl_c_ext_fp16_global_atomic_add) && \
317+ defined(__opencl_c_ext_fp16_local_atomic_add)
318+half __ovld atomic_fetch_add(volatile atomic_half *object, half operand);
319+half __ovld atomic_fetch_sub(volatile atomic_half *object, half operand);
320+half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
321+ half operand, memory_order order);
322+half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
323+ half operand, memory_order order);
324+half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
325+ half operand, memory_order order,
326+ memory_scope scope);
327+half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
328+ half operand, memory_order order,
329+ memory_scope scope);
330+#endif // defined(__opencl_c_ext_fp16_global_atomic_add) && \
331+ defined(__opencl_c_ext_fp16_local_atomic_add)
332+
333+#if defined(__opencl_c_ext_fp32_global_atomic_add)
334+float __ovld atomic_fetch_add(volatile __global atomic_float *object,
335+ float operand);
336+float __ovld atomic_fetch_sub(volatile __global atomic_float *object,
337+ float operand);
338+float __ovld atomic_fetch_add_explicit(volatile __global atomic_float *object,
339+ float operand, memory_order order);
340+float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object,
341+ float operand, memory_order order);
342+float __ovld atomic_fetch_add_explicit(volatile __global atomic_float *object,
343+ float operand, memory_order order,
344+ memory_scope scope);
345+float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object,
346+ float operand, memory_order order,
347+ memory_scope scope);
348+#endif // defined(__opencl_c_ext_fp32_global_atomic_add)
349+
350+#if defined(__opencl_c_ext_fp32_local_atomic_add)
351+float __ovld atomic_fetch_add(volatile __local atomic_float *object,
352+ float operand);
353+float __ovld atomic_fetch_sub(volatile __local atomic_float *object,
354+ float operand);
355+float __ovld atomic_fetch_add_explicit(volatile __local atomic_float *object,
356+ float operand, memory_order order);
357+float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object,
358+ float operand, memory_order order);
359+float __ovld atomic_fetch_add_explicit(volatile __local atomic_float *object,
360+ float operand, memory_order order,
361+ memory_scope scope);
362+float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object,
363+ float operand, memory_order order,
364+ memory_scope scope);
365+#endif // defined(__opencl_c_ext_fp32_local_atomic_add)
366+
367+#if defined(__opencl_c_ext_fp32_global_atomic_add) && \
368+ defined(__opencl_c_ext_fp32_local_atomic_add)
369+float __ovld atomic_fetch_add(volatile atomic_float *object, float operand);
370+float __ovld atomic_fetch_sub(volatile atomic_float *object, float operand);
371+float __ovld atomic_fetch_add_explicit(volatile atomic_float *object,
372+ float operand, memory_order order);
373+float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object,
374+ float operand, memory_order order);
375+float __ovld atomic_fetch_add_explicit(volatile atomic_float *object,
376+ float operand, memory_order order,
377+ memory_scope scope);
378+float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object,
379+ float operand, memory_order order,
380+ memory_scope scope);
381+#endif // defined(__opencl_c_ext_fp32_global_atomic_add) && \
382+ defined(__opencl_c_ext_fp32_local_atomic_add)
383+
384+#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
385+#if defined(__opencl_c_ext_fp64_global_atomic_add)
386+double __ovld atomic_fetch_add(volatile __global atomic_double *object,
387+ double operand);
388+double __ovld atomic_fetch_sub(volatile __global atomic_double *object,
389+ double operand);
390+double __ovld atomic_fetch_add_explicit(volatile __global atomic_double *object,
391+ double operand, memory_order order);
392+double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object,
393+ double operand, memory_order order);
394+double __ovld atomic_fetch_add_explicit(volatile __global atomic_double *object,
395+ double operand, memory_order order,
396+ memory_scope scope);
397+double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object,
398+ double operand, memory_order order,
399+ memory_scope scope);
400+#endif // defined(__opencl_c_ext_fp64_global_atomic_add)
401+
402+#if defined(__opencl_c_ext_fp64_local_atomic_add)
403+double __ovld atomic_fetch_add(volatile __local atomic_double *object,
404+ double operand);
405+double __ovld atomic_fetch_sub(volatile __local atomic_double *object,
406+ double operand);
407+double __ovld atomic_fetch_add_explicit(volatile __local atomic_double *object,
408+ double operand, memory_order order);
409+double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object,
410+ double operand, memory_order order);
411+double __ovld atomic_fetch_add_explicit(volatile __local atomic_double *object,
412+ double operand, memory_order order,
413+ memory_scope scope);
414+double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object,
415+ double operand, memory_order order,
416+ memory_scope scope);
417+#endif // defined(__opencl_c_ext_fp64_local_atomic_add)
418+
419+#if defined(__opencl_c_ext_fp64_global_atomic_add) && \
420+ defined(__opencl_c_ext_fp64_local_atomic_add)
421+double __ovld atomic_fetch_add(volatile atomic_double *object, double operand);
422+double __ovld atomic_fetch_sub(volatile atomic_double *object, double operand);
423+double __ovld atomic_fetch_add_explicit(volatile atomic_double *object,
424+ double operand, memory_order order);
425+double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object,
426+ double operand, memory_order order);
427+double __ovld atomic_fetch_add_explicit(volatile atomic_double *object,
428+ double operand, memory_order order,
429+ memory_scope scope);
430+double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object,
431+ double operand, memory_order order,
432+ memory_scope scope);
433+#endif // defined(__opencl_c_ext_fp64_global_atomic_add) && \
434+ defined(__opencl_c_ext_fp64_local_atomic_add)
435+#endif // defined(cl_khr_int64_base_atomics) &&
436+ // defined(cl_khr_int64_extended_atomics)
437+
438+#endif // cl_ext_float_atomics
439+
440 // atomic_store()
441
442 void __ovld atomic_store(volatile atomic_int *object, int desired);
443diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
444index 450f9c020f7f..a91291c7af38 100644
445--- a/clang/lib/Sema/Sema.cpp
446+++ b/clang/lib/Sema/Sema.cpp
447@@ -313,6 +313,9 @@ void Sema::Initialize() {
448 addImplicitTypedef("atomic_long", AtomicLongT);
449 auto AtomicULongT = Context.getAtomicType(Context.UnsignedLongTy);
450 addImplicitTypedef("atomic_ulong", AtomicULongT);
451+ auto AtomicHalfT = Context.getAtomicType(Context.HalfTy);
452+ addImplicitTypedef("atomic_half", AtomicHalfT);
453+ setOpenCLExtensionForType(AtomicHalfT, "cl_khr_fp16");
454 addImplicitTypedef("atomic_float",
455 Context.getAtomicType(Context.FloatTy));
456 auto AtomicDoubleT = Context.getAtomicType(Context.DoubleTy);
457diff --git a/clang/test/Headers/opencl-c-header.cl b/clang/test/Headers/opencl-c-header.cl
458index 13a3b62481ec..443f682c711a 100644
459--- a/clang/test/Headers/opencl-c-header.cl
460+++ b/clang/test/Headers/opencl-c-header.cl
461@@ -124,6 +124,48 @@ global atomic_int z = ATOMIC_VAR_INIT(99);
462 #if cl_khr_subgroup_clustered_reduce != 1
463 #error "Incorrectly defined cl_khr_subgroup_clustered_reduce"
464 #endif
465+#if __opencl_c_ext_fp16_global_atomic_load_store != 1
466+#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_load_store"
467+#endif
468+#if __opencl_c_ext_fp16_local_atomic_load_store != 1
469+#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_load_store"
470+#endif
471+#if __opencl_c_ext_fp16_global_atomic_add != 1
472+#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_add"
473+#endif
474+#if __opencl_c_ext_fp32_global_atomic_add != 1
475+#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_add"
476+#endif
477+#if __opencl_c_ext_fp64_global_atomic_add != 1
478+#error "Incorrectly defined __opencl_c_ext_fp64_global_atomic_add"
479+#endif
480+#if __opencl_c_ext_fp16_local_atomic_add != 1
481+#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_add"
482+#endif
483+#if __opencl_c_ext_fp32_local_atomic_add != 1
484+#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_add"
485+#endif
486+#if __opencl_c_ext_fp64_local_atomic_add != 1
487+#error "Incorrectly defined __opencl_c_ext_fp64_local_atomic_add"
488+#endif
489+#if __opencl_c_ext_fp16_global_atomic_min_max != 1
490+#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_min_max"
491+#endif
492+#if __opencl_c_ext_fp32_global_atomic_min_max != 1
493+#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_min_max"
494+#endif
495+#if __opencl_c_ext_fp64_global_atomic_min_max != 1
496+#error "Incorrectly defined __opencl_c_ext_fp64_global_atomic_min_max"
497+#endif
498+#if __opencl_c_ext_fp16_local_atomic_min_max != 1
499+#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_min_max"
500+#endif
501+#if __opencl_c_ext_fp32_local_atomic_min_max != 1
502+#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_min_max"
503+#endif
504+#if __opencl_c_ext_fp64_local_atomic_min_max != 1
505+#error "Incorrectly defined __opencl_c_ext_fp64_local_atomic_min_max"
506+#endif
507
508 #else
509
510@@ -148,6 +190,48 @@ global atomic_int z = ATOMIC_VAR_INIT(99);
511 #ifdef cl_khr_subgroup_clustered_reduce
512 #error "Incorrect cl_khr_subgroup_clustered_reduce define"
513 #endif
514+#ifdef __opencl_c_ext_fp16_global_atomic_load_store
515+#error "Incorrectly __opencl_c_ext_fp16_global_atomic_load_store defined"
516+#endif
517+#ifdef __opencl_c_ext_fp16_local_atomic_load_store
518+#error "Incorrectly __opencl_c_ext_fp16_local_atomic_load_store defined"
519+#endif
520+#ifdef __opencl_c_ext_fp16_global_atomic_add
521+#error "Incorrectly __opencl_c_ext_fp16_global_atomic_add defined"
522+#endif
523+#ifdef __opencl_c_ext_fp32_global_atomic_add
524+#error "Incorrectly __opencl_c_ext_fp32_global_atomic_add defined"
525+#endif
526+#ifdef __opencl_c_ext_fp64_global_atomic_add
527+#error "Incorrectly __opencl_c_ext_fp64_global_atomic_add defined"
528+#endif
529+#ifdef __opencl_c_ext_fp16_local_atomic_add
530+#error "Incorrectly __opencl_c_ext_fp16_local_atomic_add defined"
531+#endif
532+#ifdef __opencl_c_ext_fp32_local_atomic_add
533+#error "Incorrectly __opencl_c_ext_fp32_local_atomic_add defined"
534+#endif
535+#ifdef __opencl_c_ext_fp64_local_atomic_add
536+#error "Incorrectly __opencl_c_ext_fp64_local_atomic_add defined"
537+#endif
538+#ifdef __opencl_c_ext_fp16_global_atomic_min_max
539+#error "Incorrectly __opencl_c_ext_fp16_global_atomic_min_max defined"
540+#endif
541+#ifdef __opencl_c_ext_fp32_global_atomic_min_max
542+#error "Incorrectly __opencl_c_ext_fp32_global_atomic_min_max defined"
543+#endif
544+#ifdef __opencl_c_ext_fp64_global_atomic_min_max
545+#error "Incorrectly __opencl_c_ext_fp64_global_atomic_min_max defined"
546+#endif
547+#ifdef __opencl_c_ext_fp16_local_atomic_min_max
548+#error "Incorrectly __opencl_c_ext_fp16_local_atomic_min_max defined"
549+#endif
550+#ifdef __opencl_c_ext_fp32_local_atomic_min_max
551+#error "Incorrectly __opencl_c_ext_fp32_local_atomic_min_max defined"
552+#endif
553+#ifdef __opencl_c_ext_fp64_local_atomic_min_max
554+#error "Incorrectly __opencl_c_ext_fp64_local_atomic_min_max defined"
555+#endif
556
557 #endif //(defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
558
559--
5602.29.2
561