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