1/*
2 * kmp_atomic.h - ATOMIC header file
3 */
4
5//===----------------------------------------------------------------------===//
6//
7// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8// See https://llvm.org/LICENSE.txt for license information.
9// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef KMP_ATOMIC_H
14#define KMP_ATOMIC_H
15
16#include "kmp_lock.h"
17#include "kmp_os.h"
18
19#if OMPT_SUPPORT
20#include "ompt-specific.h"
21#endif
22
23// C++ build port.
24// Intel compiler does not support _Complex datatype on win.
25// Intel compiler supports _Complex datatype on lin and mac.
26// On the other side, there is a problem of stack alignment on lin_32 and mac_32
27// if the rhs is cmplx80 or cmplx128 typedef'ed datatype.
28// The decision is: to use compiler supported _Complex type on lin and mac,
29//                  to use typedef'ed types on win.
30// Condition for WIN64 was modified in anticipation of 10.1 build compiler.
31
32#if defined(__cplusplus) && (KMP_OS_WINDOWS)
33// create shortcuts for c99 complex types
34
35// Visual Studio cannot have function parameters that have the
36// align __declspec attribute, so we must remove it. (Compiler Error C2719)
37#if KMP_COMPILER_MSVC
38#undef KMP_DO_ALIGN
39#define KMP_DO_ALIGN(alignment) /* Nothing */
40#endif
41
42#if (_MSC_VER < 1600) && defined(_DEBUG)
43// Workaround for the problem of _DebugHeapTag unresolved external.
44// This problem prevented to use our static debug library for C tests
45// compiled with /MDd option (the library itself built with /MTd),
46#undef _DEBUG
47#define _DEBUG_TEMPORARILY_UNSET_
48#endif
49
50#include <complex>
51
52template <typename type_lhs, typename type_rhs>
53std::complex<type_lhs> __kmp_lhs_div_rhs(const std::complex<type_lhs> &lhs,
54                                         const std::complex<type_rhs> &rhs) {
55  type_lhs a = lhs.real();
56  type_lhs b = lhs.imag();
57  type_rhs c = rhs.real();
58  type_rhs d = rhs.imag();
59  type_rhs den = c * c + d * d;
60  type_rhs r = (a * c + b * d);
61  type_rhs i = (b * c - a * d);
62  std::complex<type_lhs> ret(r / den, i / den);
63  return ret;
64}
65
66// complex8
67struct __kmp_cmplx64_t : std::complex<double> {
68
69  __kmp_cmplx64_t() : std::complex<double>() {}
70
71  __kmp_cmplx64_t(const std::complex<double> &cd) : std::complex<double>(cd) {}
72
73  void operator/=(const __kmp_cmplx64_t &rhs) {
74    std::complex<double> lhs = *this;
75    *this = __kmp_lhs_div_rhs(lhs, rhs);
76  }
77
78  __kmp_cmplx64_t operator/(const __kmp_cmplx64_t &rhs) {
79    std::complex<double> lhs = *this;
80    return __kmp_lhs_div_rhs(lhs, rhs);
81  }
82};
83typedef struct __kmp_cmplx64_t kmp_cmplx64;
84
85// complex4
86struct __kmp_cmplx32_t : std::complex<float> {
87
88  __kmp_cmplx32_t() : std::complex<float>() {}
89
90  __kmp_cmplx32_t(const std::complex<float> &cf) : std::complex<float>(cf) {}
91
92  __kmp_cmplx32_t operator+(const __kmp_cmplx32_t &b) {
93    std::complex<float> lhs = *this;
94    std::complex<float> rhs = b;
95    return (lhs + rhs);
96  }
97  __kmp_cmplx32_t operator-(const __kmp_cmplx32_t &b) {
98    std::complex<float> lhs = *this;
99    std::complex<float> rhs = b;
100    return (lhs - rhs);
101  }
102  __kmp_cmplx32_t operator*(const __kmp_cmplx32_t &b) {
103    std::complex<float> lhs = *this;
104    std::complex<float> rhs = b;
105    return (lhs * rhs);
106  }
107
108  __kmp_cmplx32_t operator+(const kmp_cmplx64 &b) {
109    kmp_cmplx64 t = kmp_cmplx64(*this) + b;
110    std::complex<double> d(t);
111    std::complex<float> f(d);
112    __kmp_cmplx32_t r(f);
113    return r;
114  }
115  __kmp_cmplx32_t operator-(const kmp_cmplx64 &b) {
116    kmp_cmplx64 t = kmp_cmplx64(*this) - b;
117    std::complex<double> d(t);
118    std::complex<float> f(d);
119    __kmp_cmplx32_t r(f);
120    return r;
121  }
122  __kmp_cmplx32_t operator*(const kmp_cmplx64 &b) {
123    kmp_cmplx64 t = kmp_cmplx64(*this) * b;
124    std::complex<double> d(t);
125    std::complex<float> f(d);
126    __kmp_cmplx32_t r(f);
127    return r;
128  }
129
130  void operator/=(const __kmp_cmplx32_t &rhs) {
131    std::complex<float> lhs = *this;
132    *this = __kmp_lhs_div_rhs(lhs, rhs);
133  }
134
135  __kmp_cmplx32_t operator/(const __kmp_cmplx32_t &rhs) {
136    std::complex<float> lhs = *this;
137    return __kmp_lhs_div_rhs(lhs, rhs);
138  }
139
140  void operator/=(const kmp_cmplx64 &rhs) {
141    std::complex<float> lhs = *this;
142    *this = __kmp_lhs_div_rhs(lhs, rhs);
143  }
144
145  __kmp_cmplx32_t operator/(const kmp_cmplx64 &rhs) {
146    std::complex<float> lhs = *this;
147    return __kmp_lhs_div_rhs(lhs, rhs);
148  }
149};
150typedef struct __kmp_cmplx32_t kmp_cmplx32;
151
152// complex10
153struct KMP_DO_ALIGN(16) __kmp_cmplx80_t : std::complex<long double> {
154
155  __kmp_cmplx80_t() : std::complex<long double>() {}
156
157  __kmp_cmplx80_t(const std::complex<long double> &cld)
158      : std::complex<long double>(cld) {}
159
160  void operator/=(const __kmp_cmplx80_t &rhs) {
161    std::complex<long double> lhs = *this;
162    *this = __kmp_lhs_div_rhs(lhs, rhs);
163  }
164
165  __kmp_cmplx80_t operator/(const __kmp_cmplx80_t &rhs) {
166    std::complex<long double> lhs = *this;
167    return __kmp_lhs_div_rhs(lhs, rhs);
168  }
169};
170typedef KMP_DO_ALIGN(16) struct __kmp_cmplx80_t kmp_cmplx80;
171
172// complex16
173#if KMP_HAVE_QUAD
174struct __kmp_cmplx128_t : std::complex<_Quad> {
175
176  __kmp_cmplx128_t() : std::complex<_Quad>() {}
177
178  __kmp_cmplx128_t(const std::complex<_Quad> &cq) : std::complex<_Quad>(cq) {}
179
180  void operator/=(const __kmp_cmplx128_t &rhs) {
181    std::complex<_Quad> lhs = *this;
182    *this = __kmp_lhs_div_rhs(lhs, rhs);
183  }
184
185  __kmp_cmplx128_t operator/(const __kmp_cmplx128_t &rhs) {
186    std::complex<_Quad> lhs = *this;
187    return __kmp_lhs_div_rhs(lhs, rhs);
188  }
189};
190typedef struct __kmp_cmplx128_t kmp_cmplx128;
191#endif /* KMP_HAVE_QUAD */
192
193#ifdef _DEBUG_TEMPORARILY_UNSET_
194#undef _DEBUG_TEMPORARILY_UNSET_
195// Set it back now
196#define _DEBUG 1
197#endif
198
199#else
200// create shortcuts for c99 complex types
201typedef float _Complex kmp_cmplx32;
202typedef double _Complex kmp_cmplx64;
203typedef long double _Complex kmp_cmplx80;
204#if KMP_HAVE_QUAD
205typedef _Quad _Complex kmp_cmplx128;
206#endif
207#endif
208
209// Compiler 12.0 changed alignment of 16 and 32-byte arguments (like _Quad
210// and kmp_cmplx128) on IA-32 architecture. The following aligned structures
211// are implemented to support the old alignment in 10.1, 11.0, 11.1 and
212// introduce the new alignment in 12.0. See CQ88405.
213#if KMP_ARCH_X86 && KMP_HAVE_QUAD
214
215// 4-byte aligned structures for backward compatibility.
216
217#pragma pack(push, 4)
218
219struct KMP_DO_ALIGN(4) Quad_a4_t {
220  _Quad q;
221
222  Quad_a4_t() : q() {}
223  Quad_a4_t(const _Quad &cq) : q(cq) {}
224
225  Quad_a4_t operator+(const Quad_a4_t &b) {
226    _Quad lhs = (*this).q;
227    _Quad rhs = b.q;
228    return (Quad_a4_t)(lhs + rhs);
229  }
230
231  Quad_a4_t operator-(const Quad_a4_t &b) {
232    _Quad lhs = (*this).q;
233    _Quad rhs = b.q;
234    return (Quad_a4_t)(lhs - rhs);
235  }
236  Quad_a4_t operator*(const Quad_a4_t &b) {
237    _Quad lhs = (*this).q;
238    _Quad rhs = b.q;
239    return (Quad_a4_t)(lhs * rhs);
240  }
241
242  Quad_a4_t operator/(const Quad_a4_t &b) {
243    _Quad lhs = (*this).q;
244    _Quad rhs = b.q;
245    return (Quad_a4_t)(lhs / rhs);
246  }
247};
248
249struct KMP_DO_ALIGN(4) kmp_cmplx128_a4_t {
250  kmp_cmplx128 q;
251
252  kmp_cmplx128_a4_t() : q() {}
253
254  kmp_cmplx128_a4_t(const kmp_cmplx128 &c128) : q(c128) {}
255
256  kmp_cmplx128_a4_t operator+(const kmp_cmplx128_a4_t &b) {
257    kmp_cmplx128 lhs = (*this).q;
258    kmp_cmplx128 rhs = b.q;
259    return (kmp_cmplx128_a4_t)(lhs + rhs);
260  }
261  kmp_cmplx128_a4_t operator-(const kmp_cmplx128_a4_t &b) {
262    kmp_cmplx128 lhs = (*this).q;
263    kmp_cmplx128 rhs = b.q;
264    return (kmp_cmplx128_a4_t)(lhs - rhs);
265  }
266  kmp_cmplx128_a4_t operator*(const kmp_cmplx128_a4_t &b) {
267    kmp_cmplx128 lhs = (*this).q;
268    kmp_cmplx128 rhs = b.q;
269    return (kmp_cmplx128_a4_t)(lhs * rhs);
270  }
271
272  kmp_cmplx128_a4_t operator/(const kmp_cmplx128_a4_t &b) {
273    kmp_cmplx128 lhs = (*this).q;
274    kmp_cmplx128 rhs = b.q;
275    return (kmp_cmplx128_a4_t)(lhs / rhs);
276  }
277};
278
279#pragma pack(pop)
280
281// New 16-byte aligned structures for 12.0 compiler.
282struct KMP_DO_ALIGN(16) Quad_a16_t {
283  _Quad q;
284
285  Quad_a16_t() : q() {}
286  Quad_a16_t(const _Quad &cq) : q(cq) {}
287
288  Quad_a16_t operator+(const Quad_a16_t &b) {
289    _Quad lhs = (*this).q;
290    _Quad rhs = b.q;
291    return (Quad_a16_t)(lhs + rhs);
292  }
293
294  Quad_a16_t operator-(const Quad_a16_t &b) {
295    _Quad lhs = (*this).q;
296    _Quad rhs = b.q;
297    return (Quad_a16_t)(lhs - rhs);
298  }
299  Quad_a16_t operator*(const Quad_a16_t &b) {
300    _Quad lhs = (*this).q;
301    _Quad rhs = b.q;
302    return (Quad_a16_t)(lhs * rhs);
303  }
304
305  Quad_a16_t operator/(const Quad_a16_t &b) {
306    _Quad lhs = (*this).q;
307    _Quad rhs = b.q;
308    return (Quad_a16_t)(lhs / rhs);
309  }
310};
311
312struct KMP_DO_ALIGN(16) kmp_cmplx128_a16_t {
313  kmp_cmplx128 q;
314
315  kmp_cmplx128_a16_t() : q() {}
316
317  kmp_cmplx128_a16_t(const kmp_cmplx128 &c128) : q(c128) {}
318
319  kmp_cmplx128_a16_t operator+(const kmp_cmplx128_a16_t &b) {
320    kmp_cmplx128 lhs = (*this).q;
321    kmp_cmplx128 rhs = b.q;
322    return (kmp_cmplx128_a16_t)(lhs + rhs);
323  }
324  kmp_cmplx128_a16_t operator-(const kmp_cmplx128_a16_t &b) {
325    kmp_cmplx128 lhs = (*this).q;
326    kmp_cmplx128 rhs = b.q;
327    return (kmp_cmplx128_a16_t)(lhs - rhs);
328  }
329  kmp_cmplx128_a16_t operator*(const kmp_cmplx128_a16_t &b) {
330    kmp_cmplx128 lhs = (*this).q;
331    kmp_cmplx128 rhs = b.q;
332    return (kmp_cmplx128_a16_t)(lhs * rhs);
333  }
334
335  kmp_cmplx128_a16_t operator/(const kmp_cmplx128_a16_t &b) {
336    kmp_cmplx128 lhs = (*this).q;
337    kmp_cmplx128 rhs = b.q;
338    return (kmp_cmplx128_a16_t)(lhs / rhs);
339  }
340};
341
342#endif
343
344#if (KMP_ARCH_X86)
345#define QUAD_LEGACY Quad_a4_t
346#define CPLX128_LEG kmp_cmplx128_a4_t
347#else
348#define QUAD_LEGACY _Quad
349#define CPLX128_LEG kmp_cmplx128
350#endif
351
352#ifdef __cplusplus
353extern "C" {
354#endif
355
356extern int __kmp_atomic_mode;
357
358// Atomic locks can easily become contended, so we use queuing locks for them.
359typedef kmp_queuing_lock_t kmp_atomic_lock_t;
360
361static inline void __kmp_acquire_atomic_lock(kmp_atomic_lock_t *lck,
362                                             kmp_int32 gtid) {
363#if OMPT_SUPPORT && OMPT_OPTIONAL
364  if (ompt_enabled.ompt_callback_mutex_acquire) {
365    ompt_callbacks.ompt_callback(ompt_callback_mutex_acquire)(
366        ompt_mutex_atomic, 0, kmp_mutex_impl_queuing, (ompt_wait_id_t)(uintptr_t)lck,
367        OMPT_GET_RETURN_ADDRESS(0));
368  }
369#endif
370
371  __kmp_acquire_queuing_lock(lck, gtid);
372
373#if OMPT_SUPPORT && OMPT_OPTIONAL
374  if (ompt_enabled.ompt_callback_mutex_acquired) {
375    ompt_callbacks.ompt_callback(ompt_callback_mutex_acquired)(
376        ompt_mutex_atomic, (ompt_wait_id_t)(uintptr_t)lck, OMPT_GET_RETURN_ADDRESS(0));
377  }
378#endif
379}
380
381static inline int __kmp_test_atomic_lock(kmp_atomic_lock_t *lck,
382                                         kmp_int32 gtid) {
383  return __kmp_test_queuing_lock(lck, gtid);
384}
385
386static inline void __kmp_release_atomic_lock(kmp_atomic_lock_t *lck,
387                                             kmp_int32 gtid) {
388  __kmp_release_queuing_lock(lck, gtid);
389#if OMPT_SUPPORT && OMPT_OPTIONAL
390  if (ompt_enabled.ompt_callback_mutex_released) {
391    ompt_callbacks.ompt_callback(ompt_callback_mutex_released)(
392        ompt_mutex_atomic, (ompt_wait_id_t)(uintptr_t)lck, OMPT_GET_RETURN_ADDRESS(0));
393  }
394#endif
395}
396
397static inline void __kmp_init_atomic_lock(kmp_atomic_lock_t *lck) {
398  __kmp_init_queuing_lock(lck);
399}
400
401static inline void __kmp_destroy_atomic_lock(kmp_atomic_lock_t *lck) {
402  __kmp_destroy_queuing_lock(lck);
403}
404
405// Global Locks
406extern kmp_atomic_lock_t __kmp_atomic_lock; /* Control access to all user coded
407                                               atomics in Gnu compat mode   */
408extern kmp_atomic_lock_t __kmp_atomic_lock_1i; /* Control access to all user
409                                                  coded atomics for 1-byte fixed
410                                                  data types */
411extern kmp_atomic_lock_t __kmp_atomic_lock_2i; /* Control access to all user
412                                                  coded atomics for 2-byte fixed
413                                                  data types */
414extern kmp_atomic_lock_t __kmp_atomic_lock_4i; /* Control access to all user
415                                                  coded atomics for 4-byte fixed
416                                                  data types */
417extern kmp_atomic_lock_t __kmp_atomic_lock_4r; /* Control access to all user
418                                                  coded atomics for kmp_real32
419                                                  data type    */
420extern kmp_atomic_lock_t __kmp_atomic_lock_8i; /* Control access to all user
421                                                  coded atomics for 8-byte fixed
422                                                  data types */
423extern kmp_atomic_lock_t __kmp_atomic_lock_8r; /* Control access to all user
424                                                  coded atomics for kmp_real64
425                                                  data type    */
426extern kmp_atomic_lock_t
427    __kmp_atomic_lock_8c; /* Control access to all user coded atomics for
428                             complex byte data type  */
429extern kmp_atomic_lock_t
430    __kmp_atomic_lock_10r; /* Control access to all user coded atomics for long
431                              double data type   */
432extern kmp_atomic_lock_t __kmp_atomic_lock_16r; /* Control access to all user
433                                                   coded atomics for _Quad data
434                                                   type         */
435extern kmp_atomic_lock_t __kmp_atomic_lock_16c; /* Control access to all user
436                                                   coded atomics for double
437                                                   complex data type*/
438extern kmp_atomic_lock_t
439    __kmp_atomic_lock_20c; /* Control access to all user coded atomics for long
440                              double complex type*/
441extern kmp_atomic_lock_t __kmp_atomic_lock_32c; /* Control access to all user
442                                                   coded atomics for _Quad
443                                                   complex data type */
444
445//  Below routines for atomic UPDATE are listed
446
447// 1-byte
448void __kmpc_atomic_fixed1_add(ident_t *id_ref, int gtid, char *lhs, char rhs);
449void __kmpc_atomic_fixed1_andb(ident_t *id_ref, int gtid, char *lhs, char rhs);
450void __kmpc_atomic_fixed1_div(ident_t *id_ref, int gtid, char *lhs, char rhs);
451void __kmpc_atomic_fixed1u_div(ident_t *id_ref, int gtid, unsigned char *lhs,
452                               unsigned char rhs);
453void __kmpc_atomic_fixed1_mul(ident_t *id_ref, int gtid, char *lhs, char rhs);
454void __kmpc_atomic_fixed1_orb(ident_t *id_ref, int gtid, char *lhs, char rhs);
455void __kmpc_atomic_fixed1_shl(ident_t *id_ref, int gtid, char *lhs, char rhs);
456void __kmpc_atomic_fixed1_shr(ident_t *id_ref, int gtid, char *lhs, char rhs);
457void __kmpc_atomic_fixed1u_shr(ident_t *id_ref, int gtid, unsigned char *lhs,
458                               unsigned char rhs);
459void __kmpc_atomic_fixed1_sub(ident_t *id_ref, int gtid, char *lhs, char rhs);
460void __kmpc_atomic_fixed1_xor(ident_t *id_ref, int gtid, char *lhs, char rhs);
461// 2-byte
462void __kmpc_atomic_fixed2_add(ident_t *id_ref, int gtid, short *lhs, short rhs);
463void __kmpc_atomic_fixed2_andb(ident_t *id_ref, int gtid, short *lhs,
464                               short rhs);
465void __kmpc_atomic_fixed2_div(ident_t *id_ref, int gtid, short *lhs, short rhs);
466void __kmpc_atomic_fixed2u_div(ident_t *id_ref, int gtid, unsigned short *lhs,
467                               unsigned short rhs);
468void __kmpc_atomic_fixed2_mul(ident_t *id_ref, int gtid, short *lhs, short rhs);
469void __kmpc_atomic_fixed2_orb(ident_t *id_ref, int gtid, short *lhs, short rhs);
470void __kmpc_atomic_fixed2_shl(ident_t *id_ref, int gtid, short *lhs, short rhs);
471void __kmpc_atomic_fixed2_shr(ident_t *id_ref, int gtid, short *lhs, short rhs);
472void __kmpc_atomic_fixed2u_shr(ident_t *id_ref, int gtid, unsigned short *lhs,
473                               unsigned short rhs);
474void __kmpc_atomic_fixed2_sub(ident_t *id_ref, int gtid, short *lhs, short rhs);
475void __kmpc_atomic_fixed2_xor(ident_t *id_ref, int gtid, short *lhs, short rhs);
476// 4-byte add / sub fixed
477void __kmpc_atomic_fixed4_add(ident_t *id_ref, int gtid, kmp_int32 *lhs,
478                              kmp_int32 rhs);
479void __kmpc_atomic_fixed4_sub(ident_t *id_ref, int gtid, kmp_int32 *lhs,
480                              kmp_int32 rhs);
481// 4-byte add / sub float
482void __kmpc_atomic_float4_add(ident_t *id_ref, int gtid, kmp_real32 *lhs,
483                              kmp_real32 rhs);
484void __kmpc_atomic_float4_sub(ident_t *id_ref, int gtid, kmp_real32 *lhs,
485                              kmp_real32 rhs);
486// 8-byte add / sub fixed
487void __kmpc_atomic_fixed8_add(ident_t *id_ref, int gtid, kmp_int64 *lhs,
488                              kmp_int64 rhs);
489void __kmpc_atomic_fixed8_sub(ident_t *id_ref, int gtid, kmp_int64 *lhs,
490                              kmp_int64 rhs);
491// 8-byte add / sub float
492void __kmpc_atomic_float8_add(ident_t *id_ref, int gtid, kmp_real64 *lhs,
493                              kmp_real64 rhs);
494void __kmpc_atomic_float8_sub(ident_t *id_ref, int gtid, kmp_real64 *lhs,
495                              kmp_real64 rhs);
496// 4-byte fixed
497void __kmpc_atomic_fixed4_andb(ident_t *id_ref, int gtid, kmp_int32 *lhs,
498                               kmp_int32 rhs);
499void __kmpc_atomic_fixed4_div(ident_t *id_ref, int gtid, kmp_int32 *lhs,
500                              kmp_int32 rhs);
501void __kmpc_atomic_fixed4u_div(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
502                               kmp_uint32 rhs);
503void __kmpc_atomic_fixed4_mul(ident_t *id_ref, int gtid, kmp_int32 *lhs,
504                              kmp_int32 rhs);
505void __kmpc_atomic_fixed4_orb(ident_t *id_ref, int gtid, kmp_int32 *lhs,
506                              kmp_int32 rhs);
507void __kmpc_atomic_fixed4_shl(ident_t *id_ref, int gtid, kmp_int32 *lhs,
508                              kmp_int32 rhs);
509void __kmpc_atomic_fixed4_shr(ident_t *id_ref, int gtid, kmp_int32 *lhs,
510                              kmp_int32 rhs);
511void __kmpc_atomic_fixed4u_shr(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
512                               kmp_uint32 rhs);
513void __kmpc_atomic_fixed4_xor(ident_t *id_ref, int gtid, kmp_int32 *lhs,
514                              kmp_int32 rhs);
515// 8-byte fixed
516void __kmpc_atomic_fixed8_andb(ident_t *id_ref, int gtid, kmp_int64 *lhs,
517                               kmp_int64 rhs);
518void __kmpc_atomic_fixed8_div(ident_t *id_ref, int gtid, kmp_int64 *lhs,
519                              kmp_int64 rhs);
520void __kmpc_atomic_fixed8u_div(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
521                               kmp_uint64 rhs);
522void __kmpc_atomic_fixed8_mul(ident_t *id_ref, int gtid, kmp_int64 *lhs,
523                              kmp_int64 rhs);
524void __kmpc_atomic_fixed8_orb(ident_t *id_ref, int gtid, kmp_int64 *lhs,
525                              kmp_int64 rhs);
526void __kmpc_atomic_fixed8_shl(ident_t *id_ref, int gtid, kmp_int64 *lhs,
527                              kmp_int64 rhs);
528void __kmpc_atomic_fixed8_shr(ident_t *id_ref, int gtid, kmp_int64 *lhs,
529                              kmp_int64 rhs);
530void __kmpc_atomic_fixed8u_shr(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
531                               kmp_uint64 rhs);
532void __kmpc_atomic_fixed8_xor(ident_t *id_ref, int gtid, kmp_int64 *lhs,
533                              kmp_int64 rhs);
534// 4-byte float
535void __kmpc_atomic_float4_div(ident_t *id_ref, int gtid, kmp_real32 *lhs,
536                              kmp_real32 rhs);
537void __kmpc_atomic_float4_mul(ident_t *id_ref, int gtid, kmp_real32 *lhs,
538                              kmp_real32 rhs);
539// 8-byte float
540void __kmpc_atomic_float8_div(ident_t *id_ref, int gtid, kmp_real64 *lhs,
541                              kmp_real64 rhs);
542void __kmpc_atomic_float8_mul(ident_t *id_ref, int gtid, kmp_real64 *lhs,
543                              kmp_real64 rhs);
544// 1-, 2-, 4-, 8-byte logical (&&, ||)
545void __kmpc_atomic_fixed1_andl(ident_t *id_ref, int gtid, char *lhs, char rhs);
546void __kmpc_atomic_fixed1_orl(ident_t *id_ref, int gtid, char *lhs, char rhs);
547void __kmpc_atomic_fixed2_andl(ident_t *id_ref, int gtid, short *lhs,
548                               short rhs);
549void __kmpc_atomic_fixed2_orl(ident_t *id_ref, int gtid, short *lhs, short rhs);
550void __kmpc_atomic_fixed4_andl(ident_t *id_ref, int gtid, kmp_int32 *lhs,
551                               kmp_int32 rhs);
552void __kmpc_atomic_fixed4_orl(ident_t *id_ref, int gtid, kmp_int32 *lhs,
553                              kmp_int32 rhs);
554void __kmpc_atomic_fixed8_andl(ident_t *id_ref, int gtid, kmp_int64 *lhs,
555                               kmp_int64 rhs);
556void __kmpc_atomic_fixed8_orl(ident_t *id_ref, int gtid, kmp_int64 *lhs,
557                              kmp_int64 rhs);
558// MIN / MAX
559void __kmpc_atomic_fixed1_max(ident_t *id_ref, int gtid, char *lhs, char rhs);
560void __kmpc_atomic_fixed1_min(ident_t *id_ref, int gtid, char *lhs, char rhs);
561void __kmpc_atomic_fixed2_max(ident_t *id_ref, int gtid, short *lhs, short rhs);
562void __kmpc_atomic_fixed2_min(ident_t *id_ref, int gtid, short *lhs, short rhs);
563void __kmpc_atomic_fixed4_max(ident_t *id_ref, int gtid, kmp_int32 *lhs,
564                              kmp_int32 rhs);
565void __kmpc_atomic_fixed4_min(ident_t *id_ref, int gtid, kmp_int32 *lhs,
566                              kmp_int32 rhs);
567void __kmpc_atomic_fixed8_max(ident_t *id_ref, int gtid, kmp_int64 *lhs,
568                              kmp_int64 rhs);
569void __kmpc_atomic_fixed8_min(ident_t *id_ref, int gtid, kmp_int64 *lhs,
570                              kmp_int64 rhs);
571void __kmpc_atomic_float4_max(ident_t *id_ref, int gtid, kmp_real32 *lhs,
572                              kmp_real32 rhs);
573void __kmpc_atomic_float4_min(ident_t *id_ref, int gtid, kmp_real32 *lhs,
574                              kmp_real32 rhs);
575void __kmpc_atomic_float8_max(ident_t *id_ref, int gtid, kmp_real64 *lhs,
576                              kmp_real64 rhs);
577void __kmpc_atomic_float8_min(ident_t *id_ref, int gtid, kmp_real64 *lhs,
578                              kmp_real64 rhs);
579#if KMP_HAVE_QUAD
580void __kmpc_atomic_float16_max(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
581                               QUAD_LEGACY rhs);
582void __kmpc_atomic_float16_min(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
583                               QUAD_LEGACY rhs);
584#if (KMP_ARCH_X86)
585// Routines with 16-byte arguments aligned to 16-byte boundary; IA-32
586// architecture only
587void __kmpc_atomic_float16_max_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
588                                   Quad_a16_t rhs);
589void __kmpc_atomic_float16_min_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
590                                   Quad_a16_t rhs);
591#endif
592#endif
593// .NEQV. (same as xor)
594void __kmpc_atomic_fixed1_neqv(ident_t *id_ref, int gtid, char *lhs, char rhs);
595void __kmpc_atomic_fixed2_neqv(ident_t *id_ref, int gtid, short *lhs,
596                               short rhs);
597void __kmpc_atomic_fixed4_neqv(ident_t *id_ref, int gtid, kmp_int32 *lhs,
598                               kmp_int32 rhs);
599void __kmpc_atomic_fixed8_neqv(ident_t *id_ref, int gtid, kmp_int64 *lhs,
600                               kmp_int64 rhs);
601// .EQV. (same as ~xor)
602void __kmpc_atomic_fixed1_eqv(ident_t *id_ref, int gtid, char *lhs, char rhs);
603void __kmpc_atomic_fixed2_eqv(ident_t *id_ref, int gtid, short *lhs, short rhs);
604void __kmpc_atomic_fixed4_eqv(ident_t *id_ref, int gtid, kmp_int32 *lhs,
605                              kmp_int32 rhs);
606void __kmpc_atomic_fixed8_eqv(ident_t *id_ref, int gtid, kmp_int64 *lhs,
607                              kmp_int64 rhs);
608// long double type
609void __kmpc_atomic_float10_add(ident_t *id_ref, int gtid, long double *lhs,
610                               long double rhs);
611void __kmpc_atomic_float10_sub(ident_t *id_ref, int gtid, long double *lhs,
612                               long double rhs);
613void __kmpc_atomic_float10_mul(ident_t *id_ref, int gtid, long double *lhs,
614                               long double rhs);
615void __kmpc_atomic_float10_div(ident_t *id_ref, int gtid, long double *lhs,
616                               long double rhs);
617// _Quad type
618#if KMP_HAVE_QUAD
619void __kmpc_atomic_float16_add(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
620                               QUAD_LEGACY rhs);
621void __kmpc_atomic_float16_sub(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
622                               QUAD_LEGACY rhs);
623void __kmpc_atomic_float16_mul(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
624                               QUAD_LEGACY rhs);
625void __kmpc_atomic_float16_div(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
626                               QUAD_LEGACY rhs);
627#if (KMP_ARCH_X86)
628// Routines with 16-byte arguments aligned to 16-byte boundary
629void __kmpc_atomic_float16_add_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
630                                   Quad_a16_t rhs);
631void __kmpc_atomic_float16_sub_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
632                                   Quad_a16_t rhs);
633void __kmpc_atomic_float16_mul_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
634                                   Quad_a16_t rhs);
635void __kmpc_atomic_float16_div_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
636                                   Quad_a16_t rhs);
637#endif
638#endif
639// routines for complex types
640void __kmpc_atomic_cmplx4_add(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
641                              kmp_cmplx32 rhs);
642void __kmpc_atomic_cmplx4_sub(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
643                              kmp_cmplx32 rhs);
644void __kmpc_atomic_cmplx4_mul(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
645                              kmp_cmplx32 rhs);
646void __kmpc_atomic_cmplx4_div(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
647                              kmp_cmplx32 rhs);
648void __kmpc_atomic_cmplx8_add(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
649                              kmp_cmplx64 rhs);
650void __kmpc_atomic_cmplx8_sub(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
651                              kmp_cmplx64 rhs);
652void __kmpc_atomic_cmplx8_mul(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
653                              kmp_cmplx64 rhs);
654void __kmpc_atomic_cmplx8_div(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
655                              kmp_cmplx64 rhs);
656void __kmpc_atomic_cmplx10_add(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
657                               kmp_cmplx80 rhs);
658void __kmpc_atomic_cmplx10_sub(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
659                               kmp_cmplx80 rhs);
660void __kmpc_atomic_cmplx10_mul(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
661                               kmp_cmplx80 rhs);
662void __kmpc_atomic_cmplx10_div(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
663                               kmp_cmplx80 rhs);
664#if KMP_HAVE_QUAD
665void __kmpc_atomic_cmplx16_add(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
666                               CPLX128_LEG rhs);
667void __kmpc_atomic_cmplx16_sub(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
668                               CPLX128_LEG rhs);
669void __kmpc_atomic_cmplx16_mul(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
670                               CPLX128_LEG rhs);
671void __kmpc_atomic_cmplx16_div(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
672                               CPLX128_LEG rhs);
673#if (KMP_ARCH_X86)
674// Routines with 16-byte arguments aligned to 16-byte boundary
675void __kmpc_atomic_cmplx16_add_a16(ident_t *id_ref, int gtid,
676                                   kmp_cmplx128_a16_t *lhs,
677                                   kmp_cmplx128_a16_t rhs);
678void __kmpc_atomic_cmplx16_sub_a16(ident_t *id_ref, int gtid,
679                                   kmp_cmplx128_a16_t *lhs,
680                                   kmp_cmplx128_a16_t rhs);
681void __kmpc_atomic_cmplx16_mul_a16(ident_t *id_ref, int gtid,
682                                   kmp_cmplx128_a16_t *lhs,
683                                   kmp_cmplx128_a16_t rhs);
684void __kmpc_atomic_cmplx16_div_a16(ident_t *id_ref, int gtid,
685                                   kmp_cmplx128_a16_t *lhs,
686                                   kmp_cmplx128_a16_t rhs);
687#endif
688#endif
689
690// OpenMP 4.0: x = expr binop x for non-commutative operations.
691// Supported only on IA-32 architecture and Intel(R) 64
692#if KMP_ARCH_X86 || KMP_ARCH_X86_64
693
694void __kmpc_atomic_fixed1_sub_rev(ident_t *id_ref, int gtid, char *lhs,
695                                  char rhs);
696void __kmpc_atomic_fixed1_div_rev(ident_t *id_ref, int gtid, char *lhs,
697                                  char rhs);
698void __kmpc_atomic_fixed1u_div_rev(ident_t *id_ref, int gtid,
699                                   unsigned char *lhs, unsigned char rhs);
700void __kmpc_atomic_fixed1_shl_rev(ident_t *id_ref, int gtid, char *lhs,
701                                  char rhs);
702void __kmpc_atomic_fixed1_shr_rev(ident_t *id_ref, int gtid, char *lhs,
703                                  char rhs);
704void __kmpc_atomic_fixed1u_shr_rev(ident_t *id_ref, int gtid,
705                                   unsigned char *lhs, unsigned char rhs);
706void __kmpc_atomic_fixed2_sub_rev(ident_t *id_ref, int gtid, short *lhs,
707                                  short rhs);
708void __kmpc_atomic_fixed2_div_rev(ident_t *id_ref, int gtid, short *lhs,
709                                  short rhs);
710void __kmpc_atomic_fixed2u_div_rev(ident_t *id_ref, int gtid,
711                                   unsigned short *lhs, unsigned short rhs);
712void __kmpc_atomic_fixed2_shl_rev(ident_t *id_ref, int gtid, short *lhs,
713                                  short rhs);
714void __kmpc_atomic_fixed2_shr_rev(ident_t *id_ref, int gtid, short *lhs,
715                                  short rhs);
716void __kmpc_atomic_fixed2u_shr_rev(ident_t *id_ref, int gtid,
717                                   unsigned short *lhs, unsigned short rhs);
718void __kmpc_atomic_fixed4_sub_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
719                                  kmp_int32 rhs);
720void __kmpc_atomic_fixed4_div_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
721                                  kmp_int32 rhs);
722void __kmpc_atomic_fixed4u_div_rev(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
723                                   kmp_uint32 rhs);
724void __kmpc_atomic_fixed4_shl_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
725                                  kmp_int32 rhs);
726void __kmpc_atomic_fixed4_shr_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
727                                  kmp_int32 rhs);
728void __kmpc_atomic_fixed4u_shr_rev(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
729                                   kmp_uint32 rhs);
730void __kmpc_atomic_fixed8_sub_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
731                                  kmp_int64 rhs);
732void __kmpc_atomic_fixed8_div_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
733                                  kmp_int64 rhs);
734void __kmpc_atomic_fixed8u_div_rev(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
735                                   kmp_uint64 rhs);
736void __kmpc_atomic_fixed8_shl_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
737                                  kmp_int64 rhs);
738void __kmpc_atomic_fixed8_shr_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
739                                  kmp_int64 rhs);
740void __kmpc_atomic_fixed8u_shr_rev(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
741                                   kmp_uint64 rhs);
742void __kmpc_atomic_float4_sub_rev(ident_t *id_ref, int gtid, float *lhs,
743                                  float rhs);
744void __kmpc_atomic_float4_div_rev(ident_t *id_ref, int gtid, float *lhs,
745                                  float rhs);
746void __kmpc_atomic_float8_sub_rev(ident_t *id_ref, int gtid, double *lhs,
747                                  double rhs);
748void __kmpc_atomic_float8_div_rev(ident_t *id_ref, int gtid, double *lhs,
749                                  double rhs);
750void __kmpc_atomic_float10_sub_rev(ident_t *id_ref, int gtid, long double *lhs,
751                                   long double rhs);
752void __kmpc_atomic_float10_div_rev(ident_t *id_ref, int gtid, long double *lhs,
753                                   long double rhs);
754#if KMP_HAVE_QUAD
755void __kmpc_atomic_float16_sub_rev(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
756                                   QUAD_LEGACY rhs);
757void __kmpc_atomic_float16_div_rev(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
758                                   QUAD_LEGACY rhs);
759#endif
760void __kmpc_atomic_cmplx4_sub_rev(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
761                                  kmp_cmplx32 rhs);
762void __kmpc_atomic_cmplx4_div_rev(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
763                                  kmp_cmplx32 rhs);
764void __kmpc_atomic_cmplx8_sub_rev(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
765                                  kmp_cmplx64 rhs);
766void __kmpc_atomic_cmplx8_div_rev(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
767                                  kmp_cmplx64 rhs);
768void __kmpc_atomic_cmplx10_sub_rev(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
769                                   kmp_cmplx80 rhs);
770void __kmpc_atomic_cmplx10_div_rev(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
771                                   kmp_cmplx80 rhs);
772#if KMP_HAVE_QUAD
773void __kmpc_atomic_cmplx16_sub_rev(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
774                                   CPLX128_LEG rhs);
775void __kmpc_atomic_cmplx16_div_rev(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
776                                   CPLX128_LEG rhs);
777#if (KMP_ARCH_X86)
778// Routines with 16-byte arguments aligned to 16-byte boundary
779void __kmpc_atomic_float16_sub_a16_rev(ident_t *id_ref, int gtid,
780                                       Quad_a16_t *lhs, Quad_a16_t rhs);
781void __kmpc_atomic_float16_div_a16_rev(ident_t *id_ref, int gtid,
782                                       Quad_a16_t *lhs, Quad_a16_t rhs);
783void __kmpc_atomic_cmplx16_sub_a16_rev(ident_t *id_ref, int gtid,
784                                       kmp_cmplx128_a16_t *lhs,
785                                       kmp_cmplx128_a16_t rhs);
786void __kmpc_atomic_cmplx16_div_a16_rev(ident_t *id_ref, int gtid,
787                                       kmp_cmplx128_a16_t *lhs,
788                                       kmp_cmplx128_a16_t rhs);
789#endif
790#endif // KMP_HAVE_QUAD
791
792#endif // KMP_ARCH_X86 || KMP_ARCH_X86_64
793
794// routines for mixed types
795
796// RHS=float8
797void __kmpc_atomic_fixed1_mul_float8(ident_t *id_ref, int gtid, char *lhs,
798                                     kmp_real64 rhs);
799void __kmpc_atomic_fixed1_div_float8(ident_t *id_ref, int gtid, char *lhs,
800                                     kmp_real64 rhs);
801void __kmpc_atomic_fixed2_mul_float8(ident_t *id_ref, int gtid, short *lhs,
802                                     kmp_real64 rhs);
803void __kmpc_atomic_fixed2_div_float8(ident_t *id_ref, int gtid, short *lhs,
804                                     kmp_real64 rhs);
805void __kmpc_atomic_fixed4_mul_float8(ident_t *id_ref, int gtid, kmp_int32 *lhs,
806                                     kmp_real64 rhs);
807void __kmpc_atomic_fixed4_div_float8(ident_t *id_ref, int gtid, kmp_int32 *lhs,
808                                     kmp_real64 rhs);
809void __kmpc_atomic_fixed8_mul_float8(ident_t *id_ref, int gtid, kmp_int64 *lhs,
810                                     kmp_real64 rhs);
811void __kmpc_atomic_fixed8_div_float8(ident_t *id_ref, int gtid, kmp_int64 *lhs,
812                                     kmp_real64 rhs);
813void __kmpc_atomic_float4_add_float8(ident_t *id_ref, int gtid, kmp_real32 *lhs,
814                                     kmp_real64 rhs);
815void __kmpc_atomic_float4_sub_float8(ident_t *id_ref, int gtid, kmp_real32 *lhs,
816                                     kmp_real64 rhs);
817void __kmpc_atomic_float4_mul_float8(ident_t *id_ref, int gtid, kmp_real32 *lhs,
818                                     kmp_real64 rhs);
819void __kmpc_atomic_float4_div_float8(ident_t *id_ref, int gtid, kmp_real32 *lhs,
820                                     kmp_real64 rhs);
821
822// RHS=float16 (deprecated, to be removed when we are sure the compiler does not
823// use them)
824#if KMP_HAVE_QUAD
825void __kmpc_atomic_fixed1_add_fp(ident_t *id_ref, int gtid, char *lhs,
826                                 _Quad rhs);
827void __kmpc_atomic_fixed1u_add_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
828                                  _Quad rhs);
829void __kmpc_atomic_fixed1_sub_fp(ident_t *id_ref, int gtid, char *lhs,
830                                 _Quad rhs);
831void __kmpc_atomic_fixed1u_sub_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
832                                  _Quad rhs);
833void __kmpc_atomic_fixed1_mul_fp(ident_t *id_ref, int gtid, char *lhs,
834                                 _Quad rhs);
835void __kmpc_atomic_fixed1u_mul_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
836                                  _Quad rhs);
837void __kmpc_atomic_fixed1_div_fp(ident_t *id_ref, int gtid, char *lhs,
838                                 _Quad rhs);
839void __kmpc_atomic_fixed1u_div_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
840                                  _Quad rhs);
841
842void __kmpc_atomic_fixed2_add_fp(ident_t *id_ref, int gtid, short *lhs,
843                                 _Quad rhs);
844void __kmpc_atomic_fixed2u_add_fp(ident_t *id_ref, int gtid,
845                                  unsigned short *lhs, _Quad rhs);
846void __kmpc_atomic_fixed2_sub_fp(ident_t *id_ref, int gtid, short *lhs,
847                                 _Quad rhs);
848void __kmpc_atomic_fixed2u_sub_fp(ident_t *id_ref, int gtid,
849                                  unsigned short *lhs, _Quad rhs);
850void __kmpc_atomic_fixed2_mul_fp(ident_t *id_ref, int gtid, short *lhs,
851                                 _Quad rhs);
852void __kmpc_atomic_fixed2u_mul_fp(ident_t *id_ref, int gtid,
853                                  unsigned short *lhs, _Quad rhs);
854void __kmpc_atomic_fixed2_div_fp(ident_t *id_ref, int gtid, short *lhs,
855                                 _Quad rhs);
856void __kmpc_atomic_fixed2u_div_fp(ident_t *id_ref, int gtid,
857                                  unsigned short *lhs, _Quad rhs);
858
859void __kmpc_atomic_fixed4_add_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
860                                 _Quad rhs);
861void __kmpc_atomic_fixed4u_add_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
862                                  _Quad rhs);
863void __kmpc_atomic_fixed4_sub_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
864                                 _Quad rhs);
865void __kmpc_atomic_fixed4u_sub_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
866                                  _Quad rhs);
867void __kmpc_atomic_fixed4_mul_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
868                                 _Quad rhs);
869void __kmpc_atomic_fixed4u_mul_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
870                                  _Quad rhs);
871void __kmpc_atomic_fixed4_div_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
872                                 _Quad rhs);
873void __kmpc_atomic_fixed4u_div_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
874                                  _Quad rhs);
875
876void __kmpc_atomic_fixed8_add_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
877                                 _Quad rhs);
878void __kmpc_atomic_fixed8u_add_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
879                                  _Quad rhs);
880void __kmpc_atomic_fixed8_sub_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
881                                 _Quad rhs);
882void __kmpc_atomic_fixed8u_sub_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
883                                  _Quad rhs);
884void __kmpc_atomic_fixed8_mul_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
885                                 _Quad rhs);
886void __kmpc_atomic_fixed8u_mul_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
887                                  _Quad rhs);
888void __kmpc_atomic_fixed8_div_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
889                                 _Quad rhs);
890void __kmpc_atomic_fixed8u_div_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
891                                  _Quad rhs);
892
893void __kmpc_atomic_float4_add_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
894                                 _Quad rhs);
895void __kmpc_atomic_float4_sub_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
896                                 _Quad rhs);
897void __kmpc_atomic_float4_mul_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
898                                 _Quad rhs);
899void __kmpc_atomic_float4_div_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
900                                 _Quad rhs);
901
902void __kmpc_atomic_float8_add_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
903                                 _Quad rhs);
904void __kmpc_atomic_float8_sub_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
905                                 _Quad rhs);
906void __kmpc_atomic_float8_mul_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
907                                 _Quad rhs);
908void __kmpc_atomic_float8_div_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
909                                 _Quad rhs);
910
911void __kmpc_atomic_float10_add_fp(ident_t *id_ref, int gtid, long double *lhs,
912                                  _Quad rhs);
913void __kmpc_atomic_float10_sub_fp(ident_t *id_ref, int gtid, long double *lhs,
914                                  _Quad rhs);
915void __kmpc_atomic_float10_mul_fp(ident_t *id_ref, int gtid, long double *lhs,
916                                  _Quad rhs);
917void __kmpc_atomic_float10_div_fp(ident_t *id_ref, int gtid, long double *lhs,
918                                  _Quad rhs);
919
920// Reverse operations
921void __kmpc_atomic_fixed1_sub_rev_fp(ident_t *id_ref, int gtid, char *lhs,
922                                     _Quad rhs);
923void __kmpc_atomic_fixed1u_sub_rev_fp(ident_t *id_ref, int gtid,
924                                      unsigned char *lhs, _Quad rhs);
925void __kmpc_atomic_fixed1_div_rev_fp(ident_t *id_ref, int gtid, char *lhs,
926                                     _Quad rhs);
927void __kmpc_atomic_fixed1u_div_rev_fp(ident_t *id_ref, int gtid,
928                                      unsigned char *lhs, _Quad rhs);
929void __kmpc_atomic_fixed2_sub_rev_fp(ident_t *id_ref, int gtid, short *lhs,
930                                     _Quad rhs);
931void __kmpc_atomic_fixed2u_sub_rev_fp(ident_t *id_ref, int gtid,
932                                      unsigned short *lhs, _Quad rhs);
933void __kmpc_atomic_fixed2_div_rev_fp(ident_t *id_ref, int gtid, short *lhs,
934                                     _Quad rhs);
935void __kmpc_atomic_fixed2u_div_rev_fp(ident_t *id_ref, int gtid,
936                                      unsigned short *lhs, _Quad rhs);
937void __kmpc_atomic_fixed4_sub_rev_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
938                                     _Quad rhs);
939void __kmpc_atomic_fixed4u_sub_rev_fp(ident_t *id_ref, int gtid,
940                                      kmp_uint32 *lhs, _Quad rhs);
941void __kmpc_atomic_fixed4_div_rev_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
942                                     _Quad rhs);
943void __kmpc_atomic_fixed4u_div_rev_fp(ident_t *id_ref, int gtid,
944                                      kmp_uint32 *lhs, _Quad rhs);
945void __kmpc_atomic_fixed8_sub_rev_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
946                                     _Quad rhs);
947void __kmpc_atomic_fixed8u_sub_rev_fp(ident_t *id_ref, int gtid,
948                                      kmp_uint64 *lhs, _Quad rhs);
949void __kmpc_atomic_fixed8_div_rev_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
950                                     _Quad rhs);
951void __kmpc_atomic_fixed8u_div_rev_fp(ident_t *id_ref, int gtid,
952                                      kmp_uint64 *lhs, _Quad rhs);
953void __kmpc_atomic_float4_sub_rev_fp(ident_t *id_ref, int gtid, float *lhs,
954                                     _Quad rhs);
955void __kmpc_atomic_float4_div_rev_fp(ident_t *id_ref, int gtid, float *lhs,
956                                     _Quad rhs);
957void __kmpc_atomic_float8_sub_rev_fp(ident_t *id_ref, int gtid, double *lhs,
958                                     _Quad rhs);
959void __kmpc_atomic_float8_div_rev_fp(ident_t *id_ref, int gtid, double *lhs,
960                                     _Quad rhs);
961void __kmpc_atomic_float10_sub_rev_fp(ident_t *id_ref, int gtid,
962                                      long double *lhs, _Quad rhs);
963void __kmpc_atomic_float10_div_rev_fp(ident_t *id_ref, int gtid,
964                                      long double *lhs, _Quad rhs);
965
966#endif // KMP_HAVE_QUAD
967
968// RHS=cmplx8
969void __kmpc_atomic_cmplx4_add_cmplx8(ident_t *id_ref, int gtid,
970                                     kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
971void __kmpc_atomic_cmplx4_sub_cmplx8(ident_t *id_ref, int gtid,
972                                     kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
973void __kmpc_atomic_cmplx4_mul_cmplx8(ident_t *id_ref, int gtid,
974                                     kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
975void __kmpc_atomic_cmplx4_div_cmplx8(ident_t *id_ref, int gtid,
976                                     kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
977
978// generic atomic routines
979void __kmpc_atomic_1(ident_t *id_ref, int gtid, void *lhs, void *rhs,
980                     void (*f)(void *, void *, void *));
981void __kmpc_atomic_2(ident_t *id_ref, int gtid, void *lhs, void *rhs,
982                     void (*f)(void *, void *, void *));
983void __kmpc_atomic_4(ident_t *id_ref, int gtid, void *lhs, void *rhs,
984                     void (*f)(void *, void *, void *));
985void __kmpc_atomic_8(ident_t *id_ref, int gtid, void *lhs, void *rhs,
986                     void (*f)(void *, void *, void *));
987void __kmpc_atomic_10(ident_t *id_ref, int gtid, void *lhs, void *rhs,
988                      void (*f)(void *, void *, void *));
989void __kmpc_atomic_16(ident_t *id_ref, int gtid, void *lhs, void *rhs,
990                      void (*f)(void *, void *, void *));
991void __kmpc_atomic_20(ident_t *id_ref, int gtid, void *lhs, void *rhs,
992                      void (*f)(void *, void *, void *));
993void __kmpc_atomic_32(ident_t *id_ref, int gtid, void *lhs, void *rhs,
994                      void (*f)(void *, void *, void *));
995
996// READ, WRITE, CAPTURE are supported only on IA-32 architecture and Intel(R) 64
997#if KMP_ARCH_X86 || KMP_ARCH_X86_64
998
999//  Below routines for atomic READ are listed
1000char __kmpc_atomic_fixed1_rd(ident_t *id_ref, int gtid, char *loc);
1001short __kmpc_atomic_fixed2_rd(ident_t *id_ref, int gtid, short *loc);
1002kmp_int32 __kmpc_atomic_fixed4_rd(ident_t *id_ref, int gtid, kmp_int32 *loc);
1003kmp_int64 __kmpc_atomic_fixed8_rd(ident_t *id_ref, int gtid, kmp_int64 *loc);
1004kmp_real32 __kmpc_atomic_float4_rd(ident_t *id_ref, int gtid, kmp_real32 *loc);
1005kmp_real64 __kmpc_atomic_float8_rd(ident_t *id_ref, int gtid, kmp_real64 *loc);
1006long double __kmpc_atomic_float10_rd(ident_t *id_ref, int gtid,
1007                                     long double *loc);
1008#if KMP_HAVE_QUAD
1009QUAD_LEGACY __kmpc_atomic_float16_rd(ident_t *id_ref, int gtid,
1010                                     QUAD_LEGACY *loc);
1011#endif
1012// Fix for CQ220361: cmplx4 READ will return void on Windows* OS; read value
1013// will be returned through an additional parameter
1014#if (KMP_OS_WINDOWS)
1015void __kmpc_atomic_cmplx4_rd(kmp_cmplx32 *out, ident_t *id_ref, int gtid,
1016                             kmp_cmplx32 *loc);
1017#else
1018kmp_cmplx32 __kmpc_atomic_cmplx4_rd(ident_t *id_ref, int gtid,
1019                                    kmp_cmplx32 *loc);
1020#endif
1021kmp_cmplx64 __kmpc_atomic_cmplx8_rd(ident_t *id_ref, int gtid,
1022                                    kmp_cmplx64 *loc);
1023kmp_cmplx80 __kmpc_atomic_cmplx10_rd(ident_t *id_ref, int gtid,
1024                                     kmp_cmplx80 *loc);
1025#if KMP_HAVE_QUAD
1026CPLX128_LEG __kmpc_atomic_cmplx16_rd(ident_t *id_ref, int gtid,
1027                                     CPLX128_LEG *loc);
1028#if (KMP_ARCH_X86)
1029// Routines with 16-byte arguments aligned to 16-byte boundary
1030Quad_a16_t __kmpc_atomic_float16_a16_rd(ident_t *id_ref, int gtid,
1031                                        Quad_a16_t *loc);
1032kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_rd(ident_t *id_ref, int gtid,
1033                                                kmp_cmplx128_a16_t *loc);
1034#endif
1035#endif
1036
1037//  Below routines for atomic WRITE are listed
1038void __kmpc_atomic_fixed1_wr(ident_t *id_ref, int gtid, char *lhs, char rhs);
1039void __kmpc_atomic_fixed2_wr(ident_t *id_ref, int gtid, short *lhs, short rhs);
1040void __kmpc_atomic_fixed4_wr(ident_t *id_ref, int gtid, kmp_int32 *lhs,
1041                             kmp_int32 rhs);
1042void __kmpc_atomic_fixed8_wr(ident_t *id_ref, int gtid, kmp_int64 *lhs,
1043                             kmp_int64 rhs);
1044void __kmpc_atomic_float4_wr(ident_t *id_ref, int gtid, kmp_real32 *lhs,
1045                             kmp_real32 rhs);
1046void __kmpc_atomic_float8_wr(ident_t *id_ref, int gtid, kmp_real64 *lhs,
1047                             kmp_real64 rhs);
1048void __kmpc_atomic_float10_wr(ident_t *id_ref, int gtid, long double *lhs,
1049                              long double rhs);
1050#if KMP_HAVE_QUAD
1051void __kmpc_atomic_float16_wr(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
1052                              QUAD_LEGACY rhs);
1053#endif
1054void __kmpc_atomic_cmplx4_wr(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1055                             kmp_cmplx32 rhs);
1056void __kmpc_atomic_cmplx8_wr(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
1057                             kmp_cmplx64 rhs);
1058void __kmpc_atomic_cmplx10_wr(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
1059                              kmp_cmplx80 rhs);
1060#if KMP_HAVE_QUAD
1061void __kmpc_atomic_cmplx16_wr(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
1062                              CPLX128_LEG rhs);
1063#if (KMP_ARCH_X86)
1064// Routines with 16-byte arguments aligned to 16-byte boundary
1065void __kmpc_atomic_float16_a16_wr(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
1066                                  Quad_a16_t rhs);
1067void __kmpc_atomic_cmplx16_a16_wr(ident_t *id_ref, int gtid,
1068                                  kmp_cmplx128_a16_t *lhs,
1069                                  kmp_cmplx128_a16_t rhs);
1070#endif
1071#endif
1072
1073//  Below routines for atomic CAPTURE are listed
1074
1075// 1-byte
1076char __kmpc_atomic_fixed1_add_cpt(ident_t *id_ref, int gtid, char *lhs,
1077                                  char rhs, int flag);
1078char __kmpc_atomic_fixed1_andb_cpt(ident_t *id_ref, int gtid, char *lhs,
1079                                   char rhs, int flag);
1080char __kmpc_atomic_fixed1_div_cpt(ident_t *id_ref, int gtid, char *lhs,
1081                                  char rhs, int flag);
1082unsigned char __kmpc_atomic_fixed1u_div_cpt(ident_t *id_ref, int gtid,
1083                                            unsigned char *lhs,
1084                                            unsigned char rhs, int flag);
1085char __kmpc_atomic_fixed1_mul_cpt(ident_t *id_ref, int gtid, char *lhs,
1086                                  char rhs, int flag);
1087char __kmpc_atomic_fixed1_orb_cpt(ident_t *id_ref, int gtid, char *lhs,
1088                                  char rhs, int flag);
1089char __kmpc_atomic_fixed1_shl_cpt(ident_t *id_ref, int gtid, char *lhs,
1090                                  char rhs, int flag);
1091char __kmpc_atomic_fixed1_shr_cpt(ident_t *id_ref, int gtid, char *lhs,
1092                                  char rhs, int flag);
1093unsigned char __kmpc_atomic_fixed1u_shr_cpt(ident_t *id_ref, int gtid,
1094                                            unsigned char *lhs,
1095                                            unsigned char rhs, int flag);
1096char __kmpc_atomic_fixed1_sub_cpt(ident_t *id_ref, int gtid, char *lhs,
1097                                  char rhs, int flag);
1098char __kmpc_atomic_fixed1_xor_cpt(ident_t *id_ref, int gtid, char *lhs,
1099                                  char rhs, int flag);
1100// 2-byte
1101short __kmpc_atomic_fixed2_add_cpt(ident_t *id_ref, int gtid, short *lhs,
1102                                   short rhs, int flag);
1103short __kmpc_atomic_fixed2_andb_cpt(ident_t *id_ref, int gtid, short *lhs,
1104                                    short rhs, int flag);
1105short __kmpc_atomic_fixed2_div_cpt(ident_t *id_ref, int gtid, short *lhs,
1106                                   short rhs, int flag);
1107unsigned short __kmpc_atomic_fixed2u_div_cpt(ident_t *id_ref, int gtid,
1108                                             unsigned short *lhs,
1109                                             unsigned short rhs, int flag);
1110short __kmpc_atomic_fixed2_mul_cpt(ident_t *id_ref, int gtid, short *lhs,
1111                                   short rhs, int flag);
1112short __kmpc_atomic_fixed2_orb_cpt(ident_t *id_ref, int gtid, short *lhs,
1113                                   short rhs, int flag);
1114short __kmpc_atomic_fixed2_shl_cpt(ident_t *id_ref, int gtid, short *lhs,
1115                                   short rhs, int flag);
1116short __kmpc_atomic_fixed2_shr_cpt(ident_t *id_ref, int gtid, short *lhs,
1117                                   short rhs, int flag);
1118unsigned short __kmpc_atomic_fixed2u_shr_cpt(ident_t *id_ref, int gtid,
1119                                             unsigned short *lhs,
1120                                             unsigned short rhs, int flag);
1121short __kmpc_atomic_fixed2_sub_cpt(ident_t *id_ref, int gtid, short *lhs,
1122                                   short rhs, int flag);
1123short __kmpc_atomic_fixed2_xor_cpt(ident_t *id_ref, int gtid, short *lhs,
1124                                   short rhs, int flag);
1125// 4-byte add / sub fixed
1126kmp_int32 __kmpc_atomic_fixed4_add_cpt(ident_t *id_ref, int gtid,
1127                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1128kmp_int32 __kmpc_atomic_fixed4_sub_cpt(ident_t *id_ref, int gtid,
1129                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1130// 4-byte add / sub float
1131kmp_real32 __kmpc_atomic_float4_add_cpt(ident_t *id_ref, int gtid,
1132                                        kmp_real32 *lhs, kmp_real32 rhs,
1133                                        int flag);
1134kmp_real32 __kmpc_atomic_float4_sub_cpt(ident_t *id_ref, int gtid,
1135                                        kmp_real32 *lhs, kmp_real32 rhs,
1136                                        int flag);
1137// 8-byte add / sub fixed
1138kmp_int64 __kmpc_atomic_fixed8_add_cpt(ident_t *id_ref, int gtid,
1139                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1140kmp_int64 __kmpc_atomic_fixed8_sub_cpt(ident_t *id_ref, int gtid,
1141                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1142// 8-byte add / sub float
1143kmp_real64 __kmpc_atomic_float8_add_cpt(ident_t *id_ref, int gtid,
1144                                        kmp_real64 *lhs, kmp_real64 rhs,
1145                                        int flag);
1146kmp_real64 __kmpc_atomic_float8_sub_cpt(ident_t *id_ref, int gtid,
1147                                        kmp_real64 *lhs, kmp_real64 rhs,
1148                                        int flag);
1149// 4-byte fixed
1150kmp_int32 __kmpc_atomic_fixed4_andb_cpt(ident_t *id_ref, int gtid,
1151                                        kmp_int32 *lhs, kmp_int32 rhs,
1152                                        int flag);
1153kmp_int32 __kmpc_atomic_fixed4_div_cpt(ident_t *id_ref, int gtid,
1154                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1155kmp_uint32 __kmpc_atomic_fixed4u_div_cpt(ident_t *id_ref, int gtid,
1156                                         kmp_uint32 *lhs, kmp_uint32 rhs,
1157                                         int flag);
1158kmp_int32 __kmpc_atomic_fixed4_mul_cpt(ident_t *id_ref, int gtid,
1159                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1160kmp_int32 __kmpc_atomic_fixed4_orb_cpt(ident_t *id_ref, int gtid,
1161                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1162kmp_int32 __kmpc_atomic_fixed4_shl_cpt(ident_t *id_ref, int gtid,
1163                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1164kmp_int32 __kmpc_atomic_fixed4_shr_cpt(ident_t *id_ref, int gtid,
1165                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1166kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt(ident_t *id_ref, int gtid,
1167                                         kmp_uint32 *lhs, kmp_uint32 rhs,
1168                                         int flag);
1169kmp_int32 __kmpc_atomic_fixed4_xor_cpt(ident_t *id_ref, int gtid,
1170                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1171// 8-byte fixed
1172kmp_int64 __kmpc_atomic_fixed8_andb_cpt(ident_t *id_ref, int gtid,
1173                                        kmp_int64 *lhs, kmp_int64 rhs,
1174                                        int flag);
1175kmp_int64 __kmpc_atomic_fixed8_div_cpt(ident_t *id_ref, int gtid,
1176                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1177kmp_uint64 __kmpc_atomic_fixed8u_div_cpt(ident_t *id_ref, int gtid,
1178                                         kmp_uint64 *lhs, kmp_uint64 rhs,
1179                                         int flag);
1180kmp_int64 __kmpc_atomic_fixed8_mul_cpt(ident_t *id_ref, int gtid,
1181                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1182kmp_int64 __kmpc_atomic_fixed8_orb_cpt(ident_t *id_ref, int gtid,
1183                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1184kmp_int64 __kmpc_atomic_fixed8_shl_cpt(ident_t *id_ref, int gtid,
1185                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1186kmp_int64 __kmpc_atomic_fixed8_shr_cpt(ident_t *id_ref, int gtid,
1187                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1188kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt(ident_t *id_ref, int gtid,
1189                                         kmp_uint64 *lhs, kmp_uint64 rhs,
1190                                         int flag);
1191kmp_int64 __kmpc_atomic_fixed8_xor_cpt(ident_t *id_ref, int gtid,
1192                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1193// 4-byte float
1194kmp_real32 __kmpc_atomic_float4_div_cpt(ident_t *id_ref, int gtid,
1195                                        kmp_real32 *lhs, kmp_real32 rhs,
1196                                        int flag);
1197kmp_real32 __kmpc_atomic_float4_mul_cpt(ident_t *id_ref, int gtid,
1198                                        kmp_real32 *lhs, kmp_real32 rhs,
1199                                        int flag);
1200// 8-byte float
1201kmp_real64 __kmpc_atomic_float8_div_cpt(ident_t *id_ref, int gtid,
1202                                        kmp_real64 *lhs, kmp_real64 rhs,
1203                                        int flag);
1204kmp_real64 __kmpc_atomic_float8_mul_cpt(ident_t *id_ref, int gtid,
1205                                        kmp_real64 *lhs, kmp_real64 rhs,
1206                                        int flag);
1207// 1-, 2-, 4-, 8-byte logical (&&, ||)
1208char __kmpc_atomic_fixed1_andl_cpt(ident_t *id_ref, int gtid, char *lhs,
1209                                   char rhs, int flag);
1210char __kmpc_atomic_fixed1_orl_cpt(ident_t *id_ref, int gtid, char *lhs,
1211                                  char rhs, int flag);
1212short __kmpc_atomic_fixed2_andl_cpt(ident_t *id_ref, int gtid, short *lhs,
1213                                    short rhs, int flag);
1214short __kmpc_atomic_fixed2_orl_cpt(ident_t *id_ref, int gtid, short *lhs,
1215                                   short rhs, int flag);
1216kmp_int32 __kmpc_atomic_fixed4_andl_cpt(ident_t *id_ref, int gtid,
1217                                        kmp_int32 *lhs, kmp_int32 rhs,
1218                                        int flag);
1219kmp_int32 __kmpc_atomic_fixed4_orl_cpt(ident_t *id_ref, int gtid,
1220                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1221kmp_int64 __kmpc_atomic_fixed8_andl_cpt(ident_t *id_ref, int gtid,
1222                                        kmp_int64 *lhs, kmp_int64 rhs,
1223                                        int flag);
1224kmp_int64 __kmpc_atomic_fixed8_orl_cpt(ident_t *id_ref, int gtid,
1225                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1226// MIN / MAX
1227char __kmpc_atomic_fixed1_max_cpt(ident_t *id_ref, int gtid, char *lhs,
1228                                  char rhs, int flag);
1229char __kmpc_atomic_fixed1_min_cpt(ident_t *id_ref, int gtid, char *lhs,
1230                                  char rhs, int flag);
1231short __kmpc_atomic_fixed2_max_cpt(ident_t *id_ref, int gtid, short *lhs,
1232                                   short rhs, int flag);
1233short __kmpc_atomic_fixed2_min_cpt(ident_t *id_ref, int gtid, short *lhs,
1234                                   short rhs, int flag);
1235kmp_int32 __kmpc_atomic_fixed4_max_cpt(ident_t *id_ref, int gtid,
1236                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1237kmp_int32 __kmpc_atomic_fixed4_min_cpt(ident_t *id_ref, int gtid,
1238                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1239kmp_int64 __kmpc_atomic_fixed8_max_cpt(ident_t *id_ref, int gtid,
1240                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1241kmp_int64 __kmpc_atomic_fixed8_min_cpt(ident_t *id_ref, int gtid,
1242                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1243kmp_real32 __kmpc_atomic_float4_max_cpt(ident_t *id_ref, int gtid,
1244                                        kmp_real32 *lhs, kmp_real32 rhs,
1245                                        int flag);
1246kmp_real32 __kmpc_atomic_float4_min_cpt(ident_t *id_ref, int gtid,
1247                                        kmp_real32 *lhs, kmp_real32 rhs,
1248                                        int flag);
1249kmp_real64 __kmpc_atomic_float8_max_cpt(ident_t *id_ref, int gtid,
1250                                        kmp_real64 *lhs, kmp_real64 rhs,
1251                                        int flag);
1252kmp_real64 __kmpc_atomic_float8_min_cpt(ident_t *id_ref, int gtid,
1253                                        kmp_real64 *lhs, kmp_real64 rhs,
1254                                        int flag);
1255#if KMP_HAVE_QUAD
1256QUAD_LEGACY __kmpc_atomic_float16_max_cpt(ident_t *id_ref, int gtid,
1257                                          QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1258                                          int flag);
1259QUAD_LEGACY __kmpc_atomic_float16_min_cpt(ident_t *id_ref, int gtid,
1260                                          QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1261                                          int flag);
1262#endif
1263// .NEQV. (same as xor)
1264char __kmpc_atomic_fixed1_neqv_cpt(ident_t *id_ref, int gtid, char *lhs,
1265                                   char rhs, int flag);
1266short __kmpc_atomic_fixed2_neqv_cpt(ident_t *id_ref, int gtid, short *lhs,
1267                                    short rhs, int flag);
1268kmp_int32 __kmpc_atomic_fixed4_neqv_cpt(ident_t *id_ref, int gtid,
1269                                        kmp_int32 *lhs, kmp_int32 rhs,
1270                                        int flag);
1271kmp_int64 __kmpc_atomic_fixed8_neqv_cpt(ident_t *id_ref, int gtid,
1272                                        kmp_int64 *lhs, kmp_int64 rhs,
1273                                        int flag);
1274// .EQV. (same as ~xor)
1275char __kmpc_atomic_fixed1_eqv_cpt(ident_t *id_ref, int gtid, char *lhs,
1276                                  char rhs, int flag);
1277short __kmpc_atomic_fixed2_eqv_cpt(ident_t *id_ref, int gtid, short *lhs,
1278                                   short rhs, int flag);
1279kmp_int32 __kmpc_atomic_fixed4_eqv_cpt(ident_t *id_ref, int gtid,
1280                                       kmp_int32 *lhs, kmp_int32 rhs, int flag);
1281kmp_int64 __kmpc_atomic_fixed8_eqv_cpt(ident_t *id_ref, int gtid,
1282                                       kmp_int64 *lhs, kmp_int64 rhs, int flag);
1283// long double type
1284long double __kmpc_atomic_float10_add_cpt(ident_t *id_ref, int gtid,
1285                                          long double *lhs, long double rhs,
1286                                          int flag);
1287long double __kmpc_atomic_float10_sub_cpt(ident_t *id_ref, int gtid,
1288                                          long double *lhs, long double rhs,
1289                                          int flag);
1290long double __kmpc_atomic_float10_mul_cpt(ident_t *id_ref, int gtid,
1291                                          long double *lhs, long double rhs,
1292                                          int flag);
1293long double __kmpc_atomic_float10_div_cpt(ident_t *id_ref, int gtid,
1294                                          long double *lhs, long double rhs,
1295                                          int flag);
1296#if KMP_HAVE_QUAD
1297// _Quad type
1298QUAD_LEGACY __kmpc_atomic_float16_add_cpt(ident_t *id_ref, int gtid,
1299                                          QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1300                                          int flag);
1301QUAD_LEGACY __kmpc_atomic_float16_sub_cpt(ident_t *id_ref, int gtid,
1302                                          QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1303                                          int flag);
1304QUAD_LEGACY __kmpc_atomic_float16_mul_cpt(ident_t *id_ref, int gtid,
1305                                          QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1306                                          int flag);
1307QUAD_LEGACY __kmpc_atomic_float16_div_cpt(ident_t *id_ref, int gtid,
1308                                          QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1309                                          int flag);
1310#endif
1311// routines for complex types
1312// Workaround for cmplx4 routines - return void; captured value is returned via
1313// the argument
1314void __kmpc_atomic_cmplx4_add_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1315                                  kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1316void __kmpc_atomic_cmplx4_sub_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1317                                  kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1318void __kmpc_atomic_cmplx4_mul_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1319                                  kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1320void __kmpc_atomic_cmplx4_div_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1321                                  kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1322
1323kmp_cmplx64 __kmpc_atomic_cmplx8_add_cpt(ident_t *id_ref, int gtid,
1324                                         kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1325                                         int flag);
1326kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt(ident_t *id_ref, int gtid,
1327                                         kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1328                                         int flag);
1329kmp_cmplx64 __kmpc_atomic_cmplx8_mul_cpt(ident_t *id_ref, int gtid,
1330                                         kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1331                                         int flag);
1332kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt(ident_t *id_ref, int gtid,
1333                                         kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1334                                         int flag);
1335kmp_cmplx80 __kmpc_atomic_cmplx10_add_cpt(ident_t *id_ref, int gtid,
1336                                          kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1337                                          int flag);
1338kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt(ident_t *id_ref, int gtid,
1339                                          kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1340                                          int flag);
1341kmp_cmplx80 __kmpc_atomic_cmplx10_mul_cpt(ident_t *id_ref, int gtid,
1342                                          kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1343                                          int flag);
1344kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt(ident_t *id_ref, int gtid,
1345                                          kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1346                                          int flag);
1347#if KMP_HAVE_QUAD
1348CPLX128_LEG __kmpc_atomic_cmplx16_add_cpt(ident_t *id_ref, int gtid,
1349                                          CPLX128_LEG *lhs, CPLX128_LEG rhs,
1350                                          int flag);
1351CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt(ident_t *id_ref, int gtid,
1352                                          CPLX128_LEG *lhs, CPLX128_LEG rhs,
1353                                          int flag);
1354CPLX128_LEG __kmpc_atomic_cmplx16_mul_cpt(ident_t *id_ref, int gtid,
1355                                          CPLX128_LEG *lhs, CPLX128_LEG rhs,
1356                                          int flag);
1357CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt(ident_t *id_ref, int gtid,
1358                                          CPLX128_LEG *lhs, CPLX128_LEG rhs,
1359                                          int flag);
1360#if (KMP_ARCH_X86)
1361// Routines with 16-byte arguments aligned to 16-byte boundary
1362Quad_a16_t __kmpc_atomic_float16_add_a16_cpt(ident_t *id_ref, int gtid,
1363                                             Quad_a16_t *lhs, Quad_a16_t rhs,
1364                                             int flag);
1365Quad_a16_t __kmpc_atomic_float16_sub_a16_cpt(ident_t *id_ref, int gtid,
1366                                             Quad_a16_t *lhs, Quad_a16_t rhs,
1367                                             int flag);
1368Quad_a16_t __kmpc_atomic_float16_mul_a16_cpt(ident_t *id_ref, int gtid,
1369                                             Quad_a16_t *lhs, Quad_a16_t rhs,
1370                                             int flag);
1371Quad_a16_t __kmpc_atomic_float16_div_a16_cpt(ident_t *id_ref, int gtid,
1372                                             Quad_a16_t *lhs, Quad_a16_t rhs,
1373                                             int flag);
1374Quad_a16_t __kmpc_atomic_float16_max_a16_cpt(ident_t *id_ref, int gtid,
1375                                             Quad_a16_t *lhs, Quad_a16_t rhs,
1376                                             int flag);
1377Quad_a16_t __kmpc_atomic_float16_min_a16_cpt(ident_t *id_ref, int gtid,
1378                                             Quad_a16_t *lhs, Quad_a16_t rhs,
1379                                             int flag);
1380kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_add_a16_cpt(ident_t *id_ref, int gtid,
1381                                                     kmp_cmplx128_a16_t *lhs,
1382                                                     kmp_cmplx128_a16_t rhs,
1383                                                     int flag);
1384kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_sub_a16_cpt(ident_t *id_ref, int gtid,
1385                                                     kmp_cmplx128_a16_t *lhs,
1386                                                     kmp_cmplx128_a16_t rhs,
1387                                                     int flag);
1388kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_mul_a16_cpt(ident_t *id_ref, int gtid,
1389                                                     kmp_cmplx128_a16_t *lhs,
1390                                                     kmp_cmplx128_a16_t rhs,
1391                                                     int flag);
1392kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_div_a16_cpt(ident_t *id_ref, int gtid,
1393                                                     kmp_cmplx128_a16_t *lhs,
1394                                                     kmp_cmplx128_a16_t rhs,
1395                                                     int flag);
1396#endif
1397#endif
1398
1399void __kmpc_atomic_start(void);
1400void __kmpc_atomic_end(void);
1401
1402// OpenMP 4.0: v = x = expr binop x; { v = x; x = expr binop x; } { x = expr
1403// binop x; v = x; }  for non-commutative operations.
1404
1405char __kmpc_atomic_fixed1_sub_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1406                                      char rhs, int flag);
1407char __kmpc_atomic_fixed1_div_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1408                                      char rhs, int flag);
1409unsigned char __kmpc_atomic_fixed1u_div_cpt_rev(ident_t *id_ref, int gtid,
1410                                                unsigned char *lhs,
1411                                                unsigned char rhs, int flag);
1412char __kmpc_atomic_fixed1_shl_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1413                                      char rhs, int flag);
1414char __kmpc_atomic_fixed1_shr_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1415                                      char rhs, int flag);
1416unsigned char __kmpc_atomic_fixed1u_shr_cpt_rev(ident_t *id_ref, int gtid,
1417                                                unsigned char *lhs,
1418                                                unsigned char rhs, int flag);
1419short __kmpc_atomic_fixed2_sub_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1420                                       short rhs, int flag);
1421short __kmpc_atomic_fixed2_div_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1422                                       short rhs, int flag);
1423unsigned short __kmpc_atomic_fixed2u_div_cpt_rev(ident_t *id_ref, int gtid,
1424                                                 unsigned short *lhs,
1425                                                 unsigned short rhs, int flag);
1426short __kmpc_atomic_fixed2_shl_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1427                                       short rhs, int flag);
1428short __kmpc_atomic_fixed2_shr_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1429                                       short rhs, int flag);
1430unsigned short __kmpc_atomic_fixed2u_shr_cpt_rev(ident_t *id_ref, int gtid,
1431                                                 unsigned short *lhs,
1432                                                 unsigned short rhs, int flag);
1433kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev(ident_t *id_ref, int gtid,
1434                                           kmp_int32 *lhs, kmp_int32 rhs,
1435                                           int flag);
1436kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev(ident_t *id_ref, int gtid,
1437                                           kmp_int32 *lhs, kmp_int32 rhs,
1438                                           int flag);
1439kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev(ident_t *id_ref, int gtid,
1440                                             kmp_uint32 *lhs, kmp_uint32 rhs,
1441                                             int flag);
1442kmp_int32 __kmpc_atomic_fixed4_shl_cpt_rev(ident_t *id_ref, int gtid,
1443                                           kmp_int32 *lhs, kmp_int32 rhs,
1444                                           int flag);
1445kmp_int32 __kmpc_atomic_fixed4_shr_cpt_rev(ident_t *id_ref, int gtid,
1446                                           kmp_int32 *lhs, kmp_int32 rhs,
1447                                           int flag);
1448kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt_rev(ident_t *id_ref, int gtid,
1449                                             kmp_uint32 *lhs, kmp_uint32 rhs,
1450                                             int flag);
1451kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev(ident_t *id_ref, int gtid,
1452                                           kmp_int64 *lhs, kmp_int64 rhs,
1453                                           int flag);
1454kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev(ident_t *id_ref, int gtid,
1455                                           kmp_int64 *lhs, kmp_int64 rhs,
1456                                           int flag);
1457kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev(ident_t *id_ref, int gtid,
1458                                             kmp_uint64 *lhs, kmp_uint64 rhs,
1459                                             int flag);
1460kmp_int64 __kmpc_atomic_fixed8_shl_cpt_rev(ident_t *id_ref, int gtid,
1461                                           kmp_int64 *lhs, kmp_int64 rhs,
1462                                           int flag);
1463kmp_int64 __kmpc_atomic_fixed8_shr_cpt_rev(ident_t *id_ref, int gtid,
1464                                           kmp_int64 *lhs, kmp_int64 rhs,
1465                                           int flag);
1466kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt_rev(ident_t *id_ref, int gtid,
1467                                             kmp_uint64 *lhs, kmp_uint64 rhs,
1468                                             int flag);
1469float __kmpc_atomic_float4_sub_cpt_rev(ident_t *id_ref, int gtid, float *lhs,
1470                                       float rhs, int flag);
1471float __kmpc_atomic_float4_div_cpt_rev(ident_t *id_ref, int gtid, float *lhs,
1472                                       float rhs, int flag);
1473double __kmpc_atomic_float8_sub_cpt_rev(ident_t *id_ref, int gtid, double *lhs,
1474                                        double rhs, int flag);
1475double __kmpc_atomic_float8_div_cpt_rev(ident_t *id_ref, int gtid, double *lhs,
1476                                        double rhs, int flag);
1477long double __kmpc_atomic_float10_sub_cpt_rev(ident_t *id_ref, int gtid,
1478                                              long double *lhs, long double rhs,
1479                                              int flag);
1480long double __kmpc_atomic_float10_div_cpt_rev(ident_t *id_ref, int gtid,
1481                                              long double *lhs, long double rhs,
1482                                              int flag);
1483#if KMP_HAVE_QUAD
1484QUAD_LEGACY __kmpc_atomic_float16_sub_cpt_rev(ident_t *id_ref, int gtid,
1485                                              QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1486                                              int flag);
1487QUAD_LEGACY __kmpc_atomic_float16_div_cpt_rev(ident_t *id_ref, int gtid,
1488                                              QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1489                                              int flag);
1490#endif
1491// Workaround for cmplx4 routines - return void; captured value is returned via
1492// the argument
1493void __kmpc_atomic_cmplx4_sub_cpt_rev(ident_t *id_ref, int gtid,
1494                                      kmp_cmplx32 *lhs, kmp_cmplx32 rhs,
1495                                      kmp_cmplx32 *out, int flag);
1496void __kmpc_atomic_cmplx4_div_cpt_rev(ident_t *id_ref, int gtid,
1497                                      kmp_cmplx32 *lhs, kmp_cmplx32 rhs,
1498                                      kmp_cmplx32 *out, int flag);
1499kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt_rev(ident_t *id_ref, int gtid,
1500                                             kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1501                                             int flag);
1502kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt_rev(ident_t *id_ref, int gtid,
1503                                             kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1504                                             int flag);
1505kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt_rev(ident_t *id_ref, int gtid,
1506                                              kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1507                                              int flag);
1508kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt_rev(ident_t *id_ref, int gtid,
1509                                              kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1510                                              int flag);
1511#if KMP_HAVE_QUAD
1512CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt_rev(ident_t *id_ref, int gtid,
1513                                              CPLX128_LEG *lhs, CPLX128_LEG rhs,
1514                                              int flag);
1515CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt_rev(ident_t *id_ref, int gtid,
1516                                              CPLX128_LEG *lhs, CPLX128_LEG rhs,
1517                                              int flag);
1518#if (KMP_ARCH_X86)
1519Quad_a16_t __kmpc_atomic_float16_sub_a16_cpt_rev(ident_t *id_ref, int gtid,
1520                                                 Quad_a16_t *lhs,
1521                                                 Quad_a16_t rhs, int flag);
1522Quad_a16_t __kmpc_atomic_float16_div_a16_cpt_rev(ident_t *id_ref, int gtid,
1523                                                 Quad_a16_t *lhs,
1524                                                 Quad_a16_t rhs, int flag);
1525kmp_cmplx128_a16_t
1526__kmpc_atomic_cmplx16_sub_a16_cpt_rev(ident_t *id_ref, int gtid,
1527                                      kmp_cmplx128_a16_t *lhs,
1528                                      kmp_cmplx128_a16_t rhs, int flag);
1529kmp_cmplx128_a16_t
1530__kmpc_atomic_cmplx16_div_a16_cpt_rev(ident_t *id_ref, int gtid,
1531                                      kmp_cmplx128_a16_t *lhs,
1532                                      kmp_cmplx128_a16_t rhs, int flag);
1533#endif
1534#endif
1535
1536//   OpenMP 4.0 Capture-write (swap): {v = x; x = expr;}
1537char __kmpc_atomic_fixed1_swp(ident_t *id_ref, int gtid, char *lhs, char rhs);
1538short __kmpc_atomic_fixed2_swp(ident_t *id_ref, int gtid, short *lhs,
1539                               short rhs);
1540kmp_int32 __kmpc_atomic_fixed4_swp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
1541                                   kmp_int32 rhs);
1542kmp_int64 __kmpc_atomic_fixed8_swp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
1543                                   kmp_int64 rhs);
1544float __kmpc_atomic_float4_swp(ident_t *id_ref, int gtid, float *lhs,
1545                               float rhs);
1546double __kmpc_atomic_float8_swp(ident_t *id_ref, int gtid, double *lhs,
1547                                double rhs);
1548long double __kmpc_atomic_float10_swp(ident_t *id_ref, int gtid,
1549                                      long double *lhs, long double rhs);
1550#if KMP_HAVE_QUAD
1551QUAD_LEGACY __kmpc_atomic_float16_swp(ident_t *id_ref, int gtid,
1552                                      QUAD_LEGACY *lhs, QUAD_LEGACY rhs);
1553#endif
1554// !!! TODO: check if we need a workaround here
1555void __kmpc_atomic_cmplx4_swp(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1556                              kmp_cmplx32 rhs, kmp_cmplx32 *out);
1557// kmp_cmplx32   	__kmpc_atomic_cmplx4_swp(  ident_t *id_ref, int gtid,
1558// kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
1559
1560kmp_cmplx64 __kmpc_atomic_cmplx8_swp(ident_t *id_ref, int gtid,
1561                                     kmp_cmplx64 *lhs, kmp_cmplx64 rhs);
1562kmp_cmplx80 __kmpc_atomic_cmplx10_swp(ident_t *id_ref, int gtid,
1563                                      kmp_cmplx80 *lhs, kmp_cmplx80 rhs);
1564#if KMP_HAVE_QUAD
1565CPLX128_LEG __kmpc_atomic_cmplx16_swp(ident_t *id_ref, int gtid,
1566                                      CPLX128_LEG *lhs, CPLX128_LEG rhs);
1567#if (KMP_ARCH_X86)
1568Quad_a16_t __kmpc_atomic_float16_a16_swp(ident_t *id_ref, int gtid,
1569                                         Quad_a16_t *lhs, Quad_a16_t rhs);
1570kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_swp(ident_t *id_ref, int gtid,
1571                                                 kmp_cmplx128_a16_t *lhs,
1572                                                 kmp_cmplx128_a16_t rhs);
1573#endif
1574#endif
1575
1576// Capture routines for mixed types (RHS=float16)
1577#if KMP_HAVE_QUAD
1578
1579char __kmpc_atomic_fixed1_add_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1580                                     _Quad rhs, int flag);
1581char __kmpc_atomic_fixed1_sub_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1582                                     _Quad rhs, int flag);
1583char __kmpc_atomic_fixed1_mul_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1584                                     _Quad rhs, int flag);
1585char __kmpc_atomic_fixed1_div_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1586                                     _Quad rhs, int flag);
1587unsigned char __kmpc_atomic_fixed1u_add_cpt_fp(ident_t *id_ref, int gtid,
1588                                               unsigned char *lhs, _Quad rhs,
1589                                               int flag);
1590unsigned char __kmpc_atomic_fixed1u_sub_cpt_fp(ident_t *id_ref, int gtid,
1591                                               unsigned char *lhs, _Quad rhs,
1592                                               int flag);
1593unsigned char __kmpc_atomic_fixed1u_mul_cpt_fp(ident_t *id_ref, int gtid,
1594                                               unsigned char *lhs, _Quad rhs,
1595                                               int flag);
1596unsigned char __kmpc_atomic_fixed1u_div_cpt_fp(ident_t *id_ref, int gtid,
1597                                               unsigned char *lhs, _Quad rhs,
1598                                               int flag);
1599
1600short __kmpc_atomic_fixed2_add_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1601                                      _Quad rhs, int flag);
1602short __kmpc_atomic_fixed2_sub_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1603                                      _Quad rhs, int flag);
1604short __kmpc_atomic_fixed2_mul_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1605                                      _Quad rhs, int flag);
1606short __kmpc_atomic_fixed2_div_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1607                                      _Quad rhs, int flag);
1608unsigned short __kmpc_atomic_fixed2u_add_cpt_fp(ident_t *id_ref, int gtid,
1609                                                unsigned short *lhs, _Quad rhs,
1610                                                int flag);
1611unsigned short __kmpc_atomic_fixed2u_sub_cpt_fp(ident_t *id_ref, int gtid,
1612                                                unsigned short *lhs, _Quad rhs,
1613                                                int flag);
1614unsigned short __kmpc_atomic_fixed2u_mul_cpt_fp(ident_t *id_ref, int gtid,
1615                                                unsigned short *lhs, _Quad rhs,
1616                                                int flag);
1617unsigned short __kmpc_atomic_fixed2u_div_cpt_fp(ident_t *id_ref, int gtid,
1618                                                unsigned short *lhs, _Quad rhs,
1619                                                int flag);
1620
1621kmp_int32 __kmpc_atomic_fixed4_add_cpt_fp(ident_t *id_ref, int gtid,
1622                                          kmp_int32 *lhs, _Quad rhs, int flag);
1623kmp_int32 __kmpc_atomic_fixed4_sub_cpt_fp(ident_t *id_ref, int gtid,
1624                                          kmp_int32 *lhs, _Quad rhs, int flag);
1625kmp_int32 __kmpc_atomic_fixed4_mul_cpt_fp(ident_t *id_ref, int gtid,
1626                                          kmp_int32 *lhs, _Quad rhs, int flag);
1627kmp_int32 __kmpc_atomic_fixed4_div_cpt_fp(ident_t *id_ref, int gtid,
1628                                          kmp_int32 *lhs, _Quad rhs, int flag);
1629kmp_uint32 __kmpc_atomic_fixed4u_add_cpt_fp(ident_t *id_ref, int gtid,
1630                                            kmp_uint32 *lhs, _Quad rhs,
1631                                            int flag);
1632kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_fp(ident_t *id_ref, int gtid,
1633                                            kmp_uint32 *lhs, _Quad rhs,
1634                                            int flag);
1635kmp_uint32 __kmpc_atomic_fixed4u_mul_cpt_fp(ident_t *id_ref, int gtid,
1636                                            kmp_uint32 *lhs, _Quad rhs,
1637                                            int flag);
1638kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_fp(ident_t *id_ref, int gtid,
1639                                            kmp_uint32 *lhs, _Quad rhs,
1640                                            int flag);
1641
1642kmp_int64 __kmpc_atomic_fixed8_add_cpt_fp(ident_t *id_ref, int gtid,
1643                                          kmp_int64 *lhs, _Quad rhs, int flag);
1644kmp_int64 __kmpc_atomic_fixed8_sub_cpt_fp(ident_t *id_ref, int gtid,
1645                                          kmp_int64 *lhs, _Quad rhs, int flag);
1646kmp_int64 __kmpc_atomic_fixed8_mul_cpt_fp(ident_t *id_ref, int gtid,
1647                                          kmp_int64 *lhs, _Quad rhs, int flag);
1648kmp_int64 __kmpc_atomic_fixed8_div_cpt_fp(ident_t *id_ref, int gtid,
1649                                          kmp_int64 *lhs, _Quad rhs, int flag);
1650kmp_uint64 __kmpc_atomic_fixed8u_add_cpt_fp(ident_t *id_ref, int gtid,
1651                                            kmp_uint64 *lhs, _Quad rhs,
1652                                            int flag);
1653kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_fp(ident_t *id_ref, int gtid,
1654                                            kmp_uint64 *lhs, _Quad rhs,
1655                                            int flag);
1656kmp_uint64 __kmpc_atomic_fixed8u_mul_cpt_fp(ident_t *id_ref, int gtid,
1657                                            kmp_uint64 *lhs, _Quad rhs,
1658                                            int flag);
1659kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_fp(ident_t *id_ref, int gtid,
1660                                            kmp_uint64 *lhs, _Quad rhs,
1661                                            int flag);
1662
1663float __kmpc_atomic_float4_add_cpt_fp(ident_t *id_ref, int gtid,
1664                                      kmp_real32 *lhs, _Quad rhs, int flag);
1665float __kmpc_atomic_float4_sub_cpt_fp(ident_t *id_ref, int gtid,
1666                                      kmp_real32 *lhs, _Quad rhs, int flag);
1667float __kmpc_atomic_float4_mul_cpt_fp(ident_t *id_ref, int gtid,
1668                                      kmp_real32 *lhs, _Quad rhs, int flag);
1669float __kmpc_atomic_float4_div_cpt_fp(ident_t *id_ref, int gtid,
1670                                      kmp_real32 *lhs, _Quad rhs, int flag);
1671
1672double __kmpc_atomic_float8_add_cpt_fp(ident_t *id_ref, int gtid,
1673                                       kmp_real64 *lhs, _Quad rhs, int flag);
1674double __kmpc_atomic_float8_sub_cpt_fp(ident_t *id_ref, int gtid,
1675                                       kmp_real64 *lhs, _Quad rhs, int flag);
1676double __kmpc_atomic_float8_mul_cpt_fp(ident_t *id_ref, int gtid,
1677                                       kmp_real64 *lhs, _Quad rhs, int flag);
1678double __kmpc_atomic_float8_div_cpt_fp(ident_t *id_ref, int gtid,
1679                                       kmp_real64 *lhs, _Quad rhs, int flag);
1680
1681long double __kmpc_atomic_float10_add_cpt_fp(ident_t *id_ref, int gtid,
1682                                             long double *lhs, _Quad rhs,
1683                                             int flag);
1684long double __kmpc_atomic_float10_sub_cpt_fp(ident_t *id_ref, int gtid,
1685                                             long double *lhs, _Quad rhs,
1686                                             int flag);
1687long double __kmpc_atomic_float10_mul_cpt_fp(ident_t *id_ref, int gtid,
1688                                             long double *lhs, _Quad rhs,
1689                                             int flag);
1690long double __kmpc_atomic_float10_div_cpt_fp(ident_t *id_ref, int gtid,
1691                                             long double *lhs, _Quad rhs,
1692                                             int flag);
1693
1694char __kmpc_atomic_fixed1_sub_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,
1695                                         _Quad rhs, int flag);
1696unsigned char __kmpc_atomic_fixed1u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1697                                                   unsigned char *lhs,
1698                                                   _Quad rhs, int flag);
1699char __kmpc_atomic_fixed1_div_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,
1700                                         _Quad rhs, int flag);
1701unsigned char __kmpc_atomic_fixed1u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1702                                                   unsigned char *lhs,
1703                                                   _Quad rhs, int flag);
1704short __kmpc_atomic_fixed2_sub_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,
1705                                          _Quad rhs, int flag);
1706unsigned short __kmpc_atomic_fixed2u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1707                                                    unsigned short *lhs,
1708                                                    _Quad rhs, int flag);
1709short __kmpc_atomic_fixed2_div_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,
1710                                          _Quad rhs, int flag);
1711unsigned short __kmpc_atomic_fixed2u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1712                                                    unsigned short *lhs,
1713                                                    _Quad rhs, int flag);
1714kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1715                                              kmp_int32 *lhs, _Quad rhs,
1716                                              int flag);
1717kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1718                                                kmp_uint32 *lhs, _Quad rhs,
1719                                                int flag);
1720kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1721                                              kmp_int32 *lhs, _Quad rhs,
1722                                              int flag);
1723kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1724                                                kmp_uint32 *lhs, _Quad rhs,
1725                                                int flag);
1726kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1727                                              kmp_int64 *lhs, _Quad rhs,
1728                                              int flag);
1729kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1730                                                kmp_uint64 *lhs, _Quad rhs,
1731                                                int flag);
1732kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1733                                              kmp_int64 *lhs, _Quad rhs,
1734                                              int flag);
1735kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1736                                                kmp_uint64 *lhs, _Quad rhs,
1737                                                int flag);
1738float __kmpc_atomic_float4_sub_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,
1739                                          _Quad rhs, int flag);
1740float __kmpc_atomic_float4_div_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,
1741                                          _Quad rhs, int flag);
1742double __kmpc_atomic_float8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1743                                           double *lhs, _Quad rhs, int flag);
1744double __kmpc_atomic_float8_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1745                                           double *lhs, _Quad rhs, int flag);
1746long double __kmpc_atomic_float10_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1747                                                 long double *lhs, _Quad rhs,
1748                                                 int flag);
1749long double __kmpc_atomic_float10_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1750                                                 long double *lhs, _Quad rhs,
1751                                                 int flag);
1752
1753#endif // KMP_HAVE_QUAD
1754
1755// End of OpenMP 4.0 capture
1756
1757#endif // KMP_ARCH_X86 || KMP_ARCH_X86_64
1758
1759/* ------------------------------------------------------------------------ */
1760
1761#ifdef __cplusplus
1762} // extern "C"
1763#endif
1764
1765#endif /* KMP_ATOMIC_H */
1766
1767// end of file
1768