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
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#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.
285struct 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
315struct 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
359extern "C" {
360#endif
361
362extern int __kmp_atomic_mode;
363
364// Atomic locks can easily become contended, so we use queuing locks for them.
365typedef kmp_queuing_lock_t kmp_atomic_lock_t;
366
367static 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
388static 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
393static 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
405static inline void __kmp_init_atomic_lock(kmp_atomic_lock_t *lck) {
406 __kmp_init_queuing_lock(lck);
407}
408
409static inline void __kmp_destroy_atomic_lock(kmp_atomic_lock_t *lck) {
410 __kmp_destroy_queuing_lock(lck);
411}
412
413// Global Locks
414extern kmp_atomic_lock_t __kmp_atomic_lock; /* Control access to all user coded
415 atomics in Gnu compat mode */
416extern kmp_atomic_lock_t __kmp_atomic_lock_1i; /* Control access to all user
417 coded atomics for 1-byte fixed
418 data types */
419extern kmp_atomic_lock_t __kmp_atomic_lock_2i; /* Control access to all user
420 coded atomics for 2-byte fixed
421 data types */
422extern kmp_atomic_lock_t __kmp_atomic_lock_4i; /* Control access to all user
423 coded atomics for 4-byte fixed
424 data types */
425extern kmp_atomic_lock_t __kmp_atomic_lock_4r; /* Control access to all user
426 coded atomics for kmp_real32
427 data type */
428extern kmp_atomic_lock_t __kmp_atomic_lock_8i; /* Control access to all user
429 coded atomics for 8-byte fixed
430 data types */
431extern kmp_atomic_lock_t __kmp_atomic_lock_8r; /* Control access to all user
432 coded atomics for kmp_real64
433 data type */
434extern kmp_atomic_lock_t
435 __kmp_atomic_lock_8c; /* Control access to all user coded atomics for
436 complex byte data type */
437extern kmp_atomic_lock_t
438 __kmp_atomic_lock_10r; /* Control access to all user coded atomics for long
439 double data type */
440extern kmp_atomic_lock_t __kmp_atomic_lock_16r; /* Control access to all user
441 coded atomics for _Quad data
442 type */
443extern kmp_atomic_lock_t __kmp_atomic_lock_16c; /* Control access to all user
444 coded atomics for double
445 complex data type*/
446extern kmp_atomic_lock_t
447 __kmp_atomic_lock_20c; /* Control access to all user coded atomics for long
448 double complex type*/
449extern 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
456void __kmpc_atomic_fixed1_add(ident_t *id_ref, int gtid, char *lhs, char rhs);
457void __kmpc_atomic_fixed1_andb(ident_t *id_ref, int gtid, char *lhs, char rhs);
458void __kmpc_atomic_fixed1_div(ident_t *id_ref, int gtid, char *lhs, char rhs);
459void __kmpc_atomic_fixed1u_div(ident_t *id_ref, int gtid, unsigned char *lhs,
460 unsigned char rhs);
461void __kmpc_atomic_fixed1_mul(ident_t *id_ref, int gtid, char *lhs, char rhs);
462void __kmpc_atomic_fixed1_orb(ident_t *id_ref, int gtid, char *lhs, char rhs);
463void __kmpc_atomic_fixed1_shl(ident_t *id_ref, int gtid, char *lhs, char rhs);
464void __kmpc_atomic_fixed1_shr(ident_t *id_ref, int gtid, char *lhs, char rhs);
465void __kmpc_atomic_fixed1u_shr(ident_t *id_ref, int gtid, unsigned char *lhs,
466 unsigned char rhs);
467void __kmpc_atomic_fixed1_sub(ident_t *id_ref, int gtid, char *lhs, char rhs);
468void __kmpc_atomic_fixed1_xor(ident_t *id_ref, int gtid, char *lhs, char rhs);
469// 2-byte
470void __kmpc_atomic_fixed2_add(ident_t *id_ref, int gtid, short *lhs, short rhs);
471void __kmpc_atomic_fixed2_andb(ident_t *id_ref, int gtid, short *lhs,
472 short rhs);
473void __kmpc_atomic_fixed2_div(ident_t *id_ref, int gtid, short *lhs, short rhs);
474void __kmpc_atomic_fixed2u_div(ident_t *id_ref, int gtid, unsigned short *lhs,
475 unsigned short rhs);
476void __kmpc_atomic_fixed2_mul(ident_t *id_ref, int gtid, short *lhs, short rhs);
477void __kmpc_atomic_fixed2_orb(ident_t *id_ref, int gtid, short *lhs, short rhs);
478void __kmpc_atomic_fixed2_shl(ident_t *id_ref, int gtid, short *lhs, short rhs);
479void __kmpc_atomic_fixed2_shr(ident_t *id_ref, int gtid, short *lhs, short rhs);
480void __kmpc_atomic_fixed2u_shr(ident_t *id_ref, int gtid, unsigned short *lhs,
481 unsigned short rhs);
482void __kmpc_atomic_fixed2_sub(ident_t *id_ref, int gtid, short *lhs, short rhs);
483void __kmpc_atomic_fixed2_xor(ident_t *id_ref, int gtid, short *lhs, short rhs);
484// 4-byte add / sub fixed
485void __kmpc_atomic_fixed4_add(ident_t *id_ref, int gtid, kmp_int32 *lhs,
486 kmp_int32 rhs);
487void __kmpc_atomic_fixed4_sub(ident_t *id_ref, int gtid, kmp_int32 *lhs,
488 kmp_int32 rhs);
489// 4-byte add / sub float
490void __kmpc_atomic_float4_add(ident_t *id_ref, int gtid, kmp_real32 *lhs,
491 kmp_real32 rhs);
492void __kmpc_atomic_float4_sub(ident_t *id_ref, int gtid, kmp_real32 *lhs,
493 kmp_real32 rhs);
494// 8-byte add / sub fixed
495void __kmpc_atomic_fixed8_add(ident_t *id_ref, int gtid, kmp_int64 *lhs,
496 kmp_int64 rhs);
497void __kmpc_atomic_fixed8_sub(ident_t *id_ref, int gtid, kmp_int64 *lhs,
498 kmp_int64 rhs);
499// 8-byte add / sub float
500void __kmpc_atomic_float8_add(ident_t *id_ref, int gtid, kmp_real64 *lhs,
501 kmp_real64 rhs);
502void __kmpc_atomic_float8_sub(ident_t *id_ref, int gtid, kmp_real64 *lhs,
503 kmp_real64 rhs);
504// 4-byte fixed
505void __kmpc_atomic_fixed4_andb(ident_t *id_ref, int gtid, kmp_int32 *lhs,
506 kmp_int32 rhs);
507void __kmpc_atomic_fixed4_div(ident_t *id_ref, int gtid, kmp_int32 *lhs,
508 kmp_int32 rhs);
509void __kmpc_atomic_fixed4u_div(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
510 kmp_uint32 rhs);
511void __kmpc_atomic_fixed4_mul(ident_t *id_ref, int gtid, kmp_int32 *lhs,
512 kmp_int32 rhs);
513void __kmpc_atomic_fixed4_orb(ident_t *id_ref, int gtid, kmp_int32 *lhs,
514 kmp_int32 rhs);
515void __kmpc_atomic_fixed4_shl(ident_t *id_ref, int gtid, kmp_int32 *lhs,
516 kmp_int32 rhs);
517void __kmpc_atomic_fixed4_shr(ident_t *id_ref, int gtid, kmp_int32 *lhs,
518 kmp_int32 rhs);
519void __kmpc_atomic_fixed4u_shr(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
520 kmp_uint32 rhs);
521void __kmpc_atomic_fixed4_xor(ident_t *id_ref, int gtid, kmp_int32 *lhs,
522 kmp_int32 rhs);
523// 8-byte fixed
524void __kmpc_atomic_fixed8_andb(ident_t *id_ref, int gtid, kmp_int64 *lhs,
525 kmp_int64 rhs);
526void __kmpc_atomic_fixed8_div(ident_t *id_ref, int gtid, kmp_int64 *lhs,
527 kmp_int64 rhs);
528void __kmpc_atomic_fixed8u_div(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
529 kmp_uint64 rhs);
530void __kmpc_atomic_fixed8_mul(ident_t *id_ref, int gtid, kmp_int64 *lhs,
531 kmp_int64 rhs);
532void __kmpc_atomic_fixed8_orb(ident_t *id_ref, int gtid, kmp_int64 *lhs,
533 kmp_int64 rhs);
534void __kmpc_atomic_fixed8_shl(ident_t *id_ref, int gtid, kmp_int64 *lhs,
535 kmp_int64 rhs);
536void __kmpc_atomic_fixed8_shr(ident_t *id_ref, int gtid, kmp_int64 *lhs,
537 kmp_int64 rhs);
538void __kmpc_atomic_fixed8u_shr(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
539 kmp_uint64 rhs);
540void __kmpc_atomic_fixed8_xor(ident_t *id_ref, int gtid, kmp_int64 *lhs,
541 kmp_int64 rhs);
542// 4-byte float
543void __kmpc_atomic_float4_div(ident_t *id_ref, int gtid, kmp_real32 *lhs,
544 kmp_real32 rhs);
545void __kmpc_atomic_float4_mul(ident_t *id_ref, int gtid, kmp_real32 *lhs,
546 kmp_real32 rhs);
547// 8-byte float
548void __kmpc_atomic_float8_div(ident_t *id_ref, int gtid, kmp_real64 *lhs,
549 kmp_real64 rhs);
550void __kmpc_atomic_float8_mul(ident_t *id_ref, int gtid, kmp_real64 *lhs,
551 kmp_real64 rhs);
552// 1-, 2-, 4-, 8-byte logical (&&, ||)
553void __kmpc_atomic_fixed1_andl(ident_t *id_ref, int gtid, char *lhs, char rhs);
554void __kmpc_atomic_fixed1_orl(ident_t *id_ref, int gtid, char *lhs, char rhs);
555void __kmpc_atomic_fixed2_andl(ident_t *id_ref, int gtid, short *lhs,
556 short rhs);
557void __kmpc_atomic_fixed2_orl(ident_t *id_ref, int gtid, short *lhs, short rhs);
558void __kmpc_atomic_fixed4_andl(ident_t *id_ref, int gtid, kmp_int32 *lhs,
559 kmp_int32 rhs);
560void __kmpc_atomic_fixed4_orl(ident_t *id_ref, int gtid, kmp_int32 *lhs,
561 kmp_int32 rhs);
562void __kmpc_atomic_fixed8_andl(ident_t *id_ref, int gtid, kmp_int64 *lhs,
563 kmp_int64 rhs);
564void __kmpc_atomic_fixed8_orl(ident_t *id_ref, int gtid, kmp_int64 *lhs,
565 kmp_int64 rhs);
566// MIN / MAX
567void __kmpc_atomic_fixed1_max(ident_t *id_ref, int gtid, char *lhs, char rhs);
568void __kmpc_atomic_fixed1_min(ident_t *id_ref, int gtid, char *lhs, char rhs);
569void __kmpc_atomic_fixed2_max(ident_t *id_ref, int gtid, short *lhs, short rhs);
570void __kmpc_atomic_fixed2_min(ident_t *id_ref, int gtid, short *lhs, short rhs);
571void __kmpc_atomic_fixed4_max(ident_t *id_ref, int gtid, kmp_int32 *lhs,
572 kmp_int32 rhs);
573void __kmpc_atomic_fixed4_min(ident_t *id_ref, int gtid, kmp_int32 *lhs,
574 kmp_int32 rhs);
575void __kmpc_atomic_fixed8_max(ident_t *id_ref, int gtid, kmp_int64 *lhs,
576 kmp_int64 rhs);
577void __kmpc_atomic_fixed8_min(ident_t *id_ref, int gtid, kmp_int64 *lhs,
578 kmp_int64 rhs);
579void __kmpc_atomic_float4_max(ident_t *id_ref, int gtid, kmp_real32 *lhs,
580 kmp_real32 rhs);
581void __kmpc_atomic_float4_min(ident_t *id_ref, int gtid, kmp_real32 *lhs,
582 kmp_real32 rhs);
583void __kmpc_atomic_float8_max(ident_t *id_ref, int gtid, kmp_real64 *lhs,
584 kmp_real64 rhs);
585void __kmpc_atomic_float8_min(ident_t *id_ref, int gtid, kmp_real64 *lhs,
586 kmp_real64 rhs);
587void __kmpc_atomic_float10_max(ident_t *id_ref, int gtid, long double *lhs,
588 long double rhs);
589void __kmpc_atomic_float10_min(ident_t *id_ref, int gtid, long double *lhs,
590 long double rhs);
591#if KMP_HAVE_QUAD
592void __kmpc_atomic_float16_max(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
593 QUAD_LEGACY rhs);
594void __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
599void __kmpc_atomic_float16_max_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
600 Quad_a16_t rhs);
601void __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)
606void __kmpc_atomic_fixed1_neqv(ident_t *id_ref, int gtid, char *lhs, char rhs);
607void __kmpc_atomic_fixed2_neqv(ident_t *id_ref, int gtid, short *lhs,
608 short rhs);
609void __kmpc_atomic_fixed4_neqv(ident_t *id_ref, int gtid, kmp_int32 *lhs,
610 kmp_int32 rhs);
611void __kmpc_atomic_fixed8_neqv(ident_t *id_ref, int gtid, kmp_int64 *lhs,
612 kmp_int64 rhs);
613// .EQV. (same as ~xor)
614void __kmpc_atomic_fixed1_eqv(ident_t *id_ref, int gtid, char *lhs, char rhs);
615void __kmpc_atomic_fixed2_eqv(ident_t *id_ref, int gtid, short *lhs, short rhs);
616void __kmpc_atomic_fixed4_eqv(ident_t *id_ref, int gtid, kmp_int32 *lhs,
617 kmp_int32 rhs);
618void __kmpc_atomic_fixed8_eqv(ident_t *id_ref, int gtid, kmp_int64 *lhs,
619 kmp_int64 rhs);
620// long double type
621void __kmpc_atomic_float10_add(ident_t *id_ref, int gtid, long double *lhs,
622 long double rhs);
623void __kmpc_atomic_float10_sub(ident_t *id_ref, int gtid, long double *lhs,
624 long double rhs);
625void __kmpc_atomic_float10_mul(ident_t *id_ref, int gtid, long double *lhs,
626 long double rhs);
627void __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
631void __kmpc_atomic_float16_add(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
632 QUAD_LEGACY rhs);
633void __kmpc_atomic_float16_sub(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
634 QUAD_LEGACY rhs);
635void __kmpc_atomic_float16_mul(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
636 QUAD_LEGACY rhs);
637void __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
641void __kmpc_atomic_float16_add_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
642 Quad_a16_t rhs);
643void __kmpc_atomic_float16_sub_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
644 Quad_a16_t rhs);
645void __kmpc_atomic_float16_mul_a16(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
646 Quad_a16_t rhs);
647void __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
652void __kmpc_atomic_cmplx4_add(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
653 kmp_cmplx32 rhs);
654void __kmpc_atomic_cmplx4_sub(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
655 kmp_cmplx32 rhs);
656void __kmpc_atomic_cmplx4_mul(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
657 kmp_cmplx32 rhs);
658void __kmpc_atomic_cmplx4_div(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
659 kmp_cmplx32 rhs);
660void __kmpc_atomic_cmplx8_add(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
661 kmp_cmplx64 rhs);
662void __kmpc_atomic_cmplx8_sub(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
663 kmp_cmplx64 rhs);
664void __kmpc_atomic_cmplx8_mul(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
665 kmp_cmplx64 rhs);
666void __kmpc_atomic_cmplx8_div(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
667 kmp_cmplx64 rhs);
668void __kmpc_atomic_cmplx10_add(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
669 kmp_cmplx80 rhs);
670void __kmpc_atomic_cmplx10_sub(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
671 kmp_cmplx80 rhs);
672void __kmpc_atomic_cmplx10_mul(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
673 kmp_cmplx80 rhs);
674void __kmpc_atomic_cmplx10_div(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
675 kmp_cmplx80 rhs);
676#if KMP_HAVE_QUAD
677void __kmpc_atomic_cmplx16_add(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
678 CPLX128_LEG rhs);
679void __kmpc_atomic_cmplx16_sub(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
680 CPLX128_LEG rhs);
681void __kmpc_atomic_cmplx16_mul(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
682 CPLX128_LEG rhs);
683void __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
687void __kmpc_atomic_cmplx16_add_a16(ident_t *id_ref, int gtid,
688 kmp_cmplx128_a16_t *lhs,
689 kmp_cmplx128_a16_t rhs);
690void __kmpc_atomic_cmplx16_sub_a16(ident_t *id_ref, int gtid,
691 kmp_cmplx128_a16_t *lhs,
692 kmp_cmplx128_a16_t rhs);
693void __kmpc_atomic_cmplx16_mul_a16(ident_t *id_ref, int gtid,
694 kmp_cmplx128_a16_t *lhs,
695 kmp_cmplx128_a16_t rhs);
696void __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
706void __kmpc_atomic_fixed1_sub_rev(ident_t *id_ref, int gtid, char *lhs,
707 char rhs);
708void __kmpc_atomic_fixed1_div_rev(ident_t *id_ref, int gtid, char *lhs,
709 char rhs);
710void __kmpc_atomic_fixed1u_div_rev(ident_t *id_ref, int gtid,
711 unsigned char *lhs, unsigned char rhs);
712void __kmpc_atomic_fixed1_shl_rev(ident_t *id_ref, int gtid, char *lhs,
713 char rhs);
714void __kmpc_atomic_fixed1_shr_rev(ident_t *id_ref, int gtid, char *lhs,
715 char rhs);
716void __kmpc_atomic_fixed1u_shr_rev(ident_t *id_ref, int gtid,
717 unsigned char *lhs, unsigned char rhs);
718void __kmpc_atomic_fixed2_sub_rev(ident_t *id_ref, int gtid, short *lhs,
719 short rhs);
720void __kmpc_atomic_fixed2_div_rev(ident_t *id_ref, int gtid, short *lhs,
721 short rhs);
722void __kmpc_atomic_fixed2u_div_rev(ident_t *id_ref, int gtid,
723 unsigned short *lhs, unsigned short rhs);
724void __kmpc_atomic_fixed2_shl_rev(ident_t *id_ref, int gtid, short *lhs,
725 short rhs);
726void __kmpc_atomic_fixed2_shr_rev(ident_t *id_ref, int gtid, short *lhs,
727 short rhs);
728void __kmpc_atomic_fixed2u_shr_rev(ident_t *id_ref, int gtid,
729 unsigned short *lhs, unsigned short rhs);
730void __kmpc_atomic_fixed4_sub_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
731 kmp_int32 rhs);
732void __kmpc_atomic_fixed4_div_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
733 kmp_int32 rhs);
734void __kmpc_atomic_fixed4u_div_rev(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
735 kmp_uint32 rhs);
736void __kmpc_atomic_fixed4_shl_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
737 kmp_int32 rhs);
738void __kmpc_atomic_fixed4_shr_rev(ident_t *id_ref, int gtid, kmp_int32 *lhs,
739 kmp_int32 rhs);
740void __kmpc_atomic_fixed4u_shr_rev(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
741 kmp_uint32 rhs);
742void __kmpc_atomic_fixed8_sub_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
743 kmp_int64 rhs);
744void __kmpc_atomic_fixed8_div_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
745 kmp_int64 rhs);
746void __kmpc_atomic_fixed8u_div_rev(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
747 kmp_uint64 rhs);
748void __kmpc_atomic_fixed8_shl_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
749 kmp_int64 rhs);
750void __kmpc_atomic_fixed8_shr_rev(ident_t *id_ref, int gtid, kmp_int64 *lhs,
751 kmp_int64 rhs);
752void __kmpc_atomic_fixed8u_shr_rev(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
753 kmp_uint64 rhs);
754void __kmpc_atomic_float4_sub_rev(ident_t *id_ref, int gtid, float *lhs,
755 float rhs);
756void __kmpc_atomic_float4_div_rev(ident_t *id_ref, int gtid, float *lhs,
757 float rhs);
758void __kmpc_atomic_float8_sub_rev(ident_t *id_ref, int gtid, double *lhs,
759 double rhs);
760void __kmpc_atomic_float8_div_rev(ident_t *id_ref, int gtid, double *lhs,
761 double rhs);
762void __kmpc_atomic_float10_sub_rev(ident_t *id_ref, int gtid, long double *lhs,
763 long double rhs);
764void __kmpc_atomic_float10_div_rev(ident_t *id_ref, int gtid, long double *lhs,
765 long double rhs);
766#if KMP_HAVE_QUAD
767void __kmpc_atomic_float16_sub_rev(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
768 QUAD_LEGACY rhs);
769void __kmpc_atomic_float16_div_rev(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
770 QUAD_LEGACY rhs);
771#endif
772void __kmpc_atomic_cmplx4_sub_rev(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
773 kmp_cmplx32 rhs);
774void __kmpc_atomic_cmplx4_div_rev(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
775 kmp_cmplx32 rhs);
776void __kmpc_atomic_cmplx8_sub_rev(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
777 kmp_cmplx64 rhs);
778void __kmpc_atomic_cmplx8_div_rev(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
779 kmp_cmplx64 rhs);
780void __kmpc_atomic_cmplx10_sub_rev(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
781 kmp_cmplx80 rhs);
782void __kmpc_atomic_cmplx10_div_rev(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
783 kmp_cmplx80 rhs);
784#if KMP_HAVE_QUAD
785void __kmpc_atomic_cmplx16_sub_rev(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
786 CPLX128_LEG rhs);
787void __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
791void __kmpc_atomic_float16_sub_a16_rev(ident_t *id_ref, int gtid,
792 Quad_a16_t *lhs, Quad_a16_t rhs);
793void __kmpc_atomic_float16_div_a16_rev(ident_t *id_ref, int gtid,
794 Quad_a16_t *lhs, Quad_a16_t rhs);
795void __kmpc_atomic_cmplx16_sub_a16_rev(ident_t *id_ref, int gtid,
796 kmp_cmplx128_a16_t *lhs,
797 kmp_cmplx128_a16_t rhs);
798void __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
809void __kmpc_atomic_fixed1_mul_float8(ident_t *id_ref, int gtid, char *lhs,
810 kmp_real64 rhs);
811void __kmpc_atomic_fixed1_div_float8(ident_t *id_ref, int gtid, char *lhs,
812 kmp_real64 rhs);
813void __kmpc_atomic_fixed2_mul_float8(ident_t *id_ref, int gtid, short *lhs,
814 kmp_real64 rhs);
815void __kmpc_atomic_fixed2_div_float8(ident_t *id_ref, int gtid, short *lhs,
816 kmp_real64 rhs);
817void __kmpc_atomic_fixed4_mul_float8(ident_t *id_ref, int gtid, kmp_int32 *lhs,
818 kmp_real64 rhs);
819void __kmpc_atomic_fixed4_div_float8(ident_t *id_ref, int gtid, kmp_int32 *lhs,
820 kmp_real64 rhs);
821void __kmpc_atomic_fixed8_mul_float8(ident_t *id_ref, int gtid, kmp_int64 *lhs,
822 kmp_real64 rhs);
823void __kmpc_atomic_fixed8_div_float8(ident_t *id_ref, int gtid, kmp_int64 *lhs,
824 kmp_real64 rhs);
825void __kmpc_atomic_float4_add_float8(ident_t *id_ref, int gtid, kmp_real32 *lhs,
826 kmp_real64 rhs);
827void __kmpc_atomic_float4_sub_float8(ident_t *id_ref, int gtid, kmp_real32 *lhs,
828 kmp_real64 rhs);
829void __kmpc_atomic_float4_mul_float8(ident_t *id_ref, int gtid, kmp_real32 *lhs,
830 kmp_real64 rhs);
831void __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
837void __kmpc_atomic_fixed1_add_fp(ident_t *id_ref, int gtid, char *lhs,
838 _Quad rhs);
839void __kmpc_atomic_fixed1u_add_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
840 _Quad rhs);
841void __kmpc_atomic_fixed1_sub_fp(ident_t *id_ref, int gtid, char *lhs,
842 _Quad rhs);
843void __kmpc_atomic_fixed1u_sub_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
844 _Quad rhs);
845void __kmpc_atomic_fixed1_mul_fp(ident_t *id_ref, int gtid, char *lhs,
846 _Quad rhs);
847void __kmpc_atomic_fixed1u_mul_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
848 _Quad rhs);
849void __kmpc_atomic_fixed1_div_fp(ident_t *id_ref, int gtid, char *lhs,
850 _Quad rhs);
851void __kmpc_atomic_fixed1u_div_fp(ident_t *id_ref, int gtid, unsigned char *lhs,
852 _Quad rhs);
853
854void __kmpc_atomic_fixed2_add_fp(ident_t *id_ref, int gtid, short *lhs,
855 _Quad rhs);
856void __kmpc_atomic_fixed2u_add_fp(ident_t *id_ref, int gtid,
857 unsigned short *lhs, _Quad rhs);
858void __kmpc_atomic_fixed2_sub_fp(ident_t *id_ref, int gtid, short *lhs,
859 _Quad rhs);
860void __kmpc_atomic_fixed2u_sub_fp(ident_t *id_ref, int gtid,
861 unsigned short *lhs, _Quad rhs);
862void __kmpc_atomic_fixed2_mul_fp(ident_t *id_ref, int gtid, short *lhs,
863 _Quad rhs);
864void __kmpc_atomic_fixed2u_mul_fp(ident_t *id_ref, int gtid,
865 unsigned short *lhs, _Quad rhs);
866void __kmpc_atomic_fixed2_div_fp(ident_t *id_ref, int gtid, short *lhs,
867 _Quad rhs);
868void __kmpc_atomic_fixed2u_div_fp(ident_t *id_ref, int gtid,
869 unsigned short *lhs, _Quad rhs);
870
871void __kmpc_atomic_fixed4_add_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
872 _Quad rhs);
873void __kmpc_atomic_fixed4u_add_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
874 _Quad rhs);
875void __kmpc_atomic_fixed4_sub_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
876 _Quad rhs);
877void __kmpc_atomic_fixed4u_sub_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
878 _Quad rhs);
879void __kmpc_atomic_fixed4_mul_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
880 _Quad rhs);
881void __kmpc_atomic_fixed4u_mul_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
882 _Quad rhs);
883void __kmpc_atomic_fixed4_div_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
884 _Quad rhs);
885void __kmpc_atomic_fixed4u_div_fp(ident_t *id_ref, int gtid, kmp_uint32 *lhs,
886 _Quad rhs);
887
888void __kmpc_atomic_fixed8_add_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
889 _Quad rhs);
890void __kmpc_atomic_fixed8u_add_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
891 _Quad rhs);
892void __kmpc_atomic_fixed8_sub_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
893 _Quad rhs);
894void __kmpc_atomic_fixed8u_sub_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
895 _Quad rhs);
896void __kmpc_atomic_fixed8_mul_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
897 _Quad rhs);
898void __kmpc_atomic_fixed8u_mul_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
899 _Quad rhs);
900void __kmpc_atomic_fixed8_div_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
901 _Quad rhs);
902void __kmpc_atomic_fixed8u_div_fp(ident_t *id_ref, int gtid, kmp_uint64 *lhs,
903 _Quad rhs);
904
905void __kmpc_atomic_float4_add_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
906 _Quad rhs);
907void __kmpc_atomic_float4_sub_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
908 _Quad rhs);
909void __kmpc_atomic_float4_mul_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
910 _Quad rhs);
911void __kmpc_atomic_float4_div_fp(ident_t *id_ref, int gtid, kmp_real32 *lhs,
912 _Quad rhs);
913
914void __kmpc_atomic_float8_add_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
915 _Quad rhs);
916void __kmpc_atomic_float8_sub_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
917 _Quad rhs);
918void __kmpc_atomic_float8_mul_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
919 _Quad rhs);
920void __kmpc_atomic_float8_div_fp(ident_t *id_ref, int gtid, kmp_real64 *lhs,
921 _Quad rhs);
922
923void __kmpc_atomic_float10_add_fp(ident_t *id_ref, int gtid, long double *lhs,
924 _Quad rhs);
925void __kmpc_atomic_float10_sub_fp(ident_t *id_ref, int gtid, long double *lhs,
926 _Quad rhs);
927void __kmpc_atomic_float10_mul_fp(ident_t *id_ref, int gtid, long double *lhs,
928 _Quad rhs);
929void __kmpc_atomic_float10_div_fp(ident_t *id_ref, int gtid, long double *lhs,
930 _Quad rhs);
931
932// Reverse operations
933void __kmpc_atomic_fixed1_sub_rev_fp(ident_t *id_ref, int gtid, char *lhs,
934 _Quad rhs);
935void __kmpc_atomic_fixed1u_sub_rev_fp(ident_t *id_ref, int gtid,
936 unsigned char *lhs, _Quad rhs);
937void __kmpc_atomic_fixed1_div_rev_fp(ident_t *id_ref, int gtid, char *lhs,
938 _Quad rhs);
939void __kmpc_atomic_fixed1u_div_rev_fp(ident_t *id_ref, int gtid,
940 unsigned char *lhs, _Quad rhs);
941void __kmpc_atomic_fixed2_sub_rev_fp(ident_t *id_ref, int gtid, short *lhs,
942 _Quad rhs);
943void __kmpc_atomic_fixed2u_sub_rev_fp(ident_t *id_ref, int gtid,
944 unsigned short *lhs, _Quad rhs);
945void __kmpc_atomic_fixed2_div_rev_fp(ident_t *id_ref, int gtid, short *lhs,
946 _Quad rhs);
947void __kmpc_atomic_fixed2u_div_rev_fp(ident_t *id_ref, int gtid,
948 unsigned short *lhs, _Quad rhs);
949void __kmpc_atomic_fixed4_sub_rev_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
950 _Quad rhs);
951void __kmpc_atomic_fixed4u_sub_rev_fp(ident_t *id_ref, int gtid,
952 kmp_uint32 *lhs, _Quad rhs);
953void __kmpc_atomic_fixed4_div_rev_fp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
954 _Quad rhs);
955void __kmpc_atomic_fixed4u_div_rev_fp(ident_t *id_ref, int gtid,
956 kmp_uint32 *lhs, _Quad rhs);
957void __kmpc_atomic_fixed8_sub_rev_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
958 _Quad rhs);
959void __kmpc_atomic_fixed8u_sub_rev_fp(ident_t *id_ref, int gtid,
960 kmp_uint64 *lhs, _Quad rhs);
961void __kmpc_atomic_fixed8_div_rev_fp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
962 _Quad rhs);
963void __kmpc_atomic_fixed8u_div_rev_fp(ident_t *id_ref, int gtid,
964 kmp_uint64 *lhs, _Quad rhs);
965void __kmpc_atomic_float4_sub_rev_fp(ident_t *id_ref, int gtid, float *lhs,
966 _Quad rhs);
967void __kmpc_atomic_float4_div_rev_fp(ident_t *id_ref, int gtid, float *lhs,
968 _Quad rhs);
969void __kmpc_atomic_float8_sub_rev_fp(ident_t *id_ref, int gtid, double *lhs,
970 _Quad rhs);
971void __kmpc_atomic_float8_div_rev_fp(ident_t *id_ref, int gtid, double *lhs,
972 _Quad rhs);
973void __kmpc_atomic_float10_sub_rev_fp(ident_t *id_ref, int gtid,
974 long double *lhs, _Quad rhs);
975void __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
981void __kmpc_atomic_cmplx4_add_cmplx8(ident_t *id_ref, int gtid,
982 kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
983void __kmpc_atomic_cmplx4_sub_cmplx8(ident_t *id_ref, int gtid,
984 kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
985void __kmpc_atomic_cmplx4_mul_cmplx8(ident_t *id_ref, int gtid,
986 kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
987void __kmpc_atomic_cmplx4_div_cmplx8(ident_t *id_ref, int gtid,
988 kmp_cmplx32 *lhs, kmp_cmplx64 rhs);
989
990// generic atomic routines
991void __kmpc_atomic_1(ident_t *id_ref, int gtid, void *lhs, void *rhs,
992 void (*f)(void *, void *, void *));
993void __kmpc_atomic_2(ident_t *id_ref, int gtid, void *lhs, void *rhs,
994 void (*f)(void *, void *, void *));
995void __kmpc_atomic_4(ident_t *id_ref, int gtid, void *lhs, void *rhs,
996 void (*f)(void *, void *, void *));
997void __kmpc_atomic_8(ident_t *id_ref, int gtid, void *lhs, void *rhs,
998 void (*f)(void *, void *, void *));
999void __kmpc_atomic_10(ident_t *id_ref, int gtid, void *lhs, void *rhs,
1000 void (*f)(void *, void *, void *));
1001void __kmpc_atomic_16(ident_t *id_ref, int gtid, void *lhs, void *rhs,
1002 void (*f)(void *, void *, void *));
1003void __kmpc_atomic_20(ident_t *id_ref, int gtid, void *lhs, void *rhs,
1004 void (*f)(void *, void *, void *));
1005void __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
1012char __kmpc_atomic_fixed1_rd(ident_t *id_ref, int gtid, char *loc);
1013short __kmpc_atomic_fixed2_rd(ident_t *id_ref, int gtid, short *loc);
1014kmp_int32 __kmpc_atomic_fixed4_rd(ident_t *id_ref, int gtid, kmp_int32 *loc);
1015kmp_int64 __kmpc_atomic_fixed8_rd(ident_t *id_ref, int gtid, kmp_int64 *loc);
1016kmp_real32 __kmpc_atomic_float4_rd(ident_t *id_ref, int gtid, kmp_real32 *loc);
1017kmp_real64 __kmpc_atomic_float8_rd(ident_t *id_ref, int gtid, kmp_real64 *loc);
1018long double __kmpc_atomic_float10_rd(ident_t *id_ref, int gtid,
1019 long double *loc);
1020#if KMP_HAVE_QUAD
1021QUAD_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)
1027void __kmpc_atomic_cmplx4_rd(kmp_cmplx32 *out, ident_t *id_ref, int gtid,
1028 kmp_cmplx32 *loc);
1029#else
1030kmp_cmplx32 __kmpc_atomic_cmplx4_rd(ident_t *id_ref, int gtid,
1031 kmp_cmplx32 *loc);
1032#endif
1033kmp_cmplx64 __kmpc_atomic_cmplx8_rd(ident_t *id_ref, int gtid,
1034 kmp_cmplx64 *loc);
1035kmp_cmplx80 __kmpc_atomic_cmplx10_rd(ident_t *id_ref, int gtid,
1036 kmp_cmplx80 *loc);
1037#if KMP_HAVE_QUAD
1038CPLX128_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
1042Quad_a16_t __kmpc_atomic_float16_a16_rd(ident_t *id_ref, int gtid,
1043 Quad_a16_t *loc);
1044kmp_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
1050void __kmpc_atomic_fixed1_wr(ident_t *id_ref, int gtid, char *lhs, char rhs);
1051void __kmpc_atomic_fixed2_wr(ident_t *id_ref, int gtid, short *lhs, short rhs);
1052void __kmpc_atomic_fixed4_wr(ident_t *id_ref, int gtid, kmp_int32 *lhs,
1053 kmp_int32 rhs);
1054void __kmpc_atomic_fixed8_wr(ident_t *id_ref, int gtid, kmp_int64 *lhs,
1055 kmp_int64 rhs);
1056void __kmpc_atomic_float4_wr(ident_t *id_ref, int gtid, kmp_real32 *lhs,
1057 kmp_real32 rhs);
1058void __kmpc_atomic_float8_wr(ident_t *id_ref, int gtid, kmp_real64 *lhs,
1059 kmp_real64 rhs);
1060void __kmpc_atomic_float10_wr(ident_t *id_ref, int gtid, long double *lhs,
1061 long double rhs);
1062#if KMP_HAVE_QUAD
1063void __kmpc_atomic_float16_wr(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
1064 QUAD_LEGACY rhs);
1065#endif
1066void __kmpc_atomic_cmplx4_wr(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1067 kmp_cmplx32 rhs);
1068void __kmpc_atomic_cmplx8_wr(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
1069 kmp_cmplx64 rhs);
1070void __kmpc_atomic_cmplx10_wr(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
1071 kmp_cmplx80 rhs);
1072#if KMP_HAVE_QUAD
1073void __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
1077void __kmpc_atomic_float16_a16_wr(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
1078 Quad_a16_t rhs);
1079void __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
1088char __kmpc_atomic_fixed1_add_cpt(ident_t *id_ref, int gtid, char *lhs,
1089 char rhs, int flag);
1090char __kmpc_atomic_fixed1_andb_cpt(ident_t *id_ref, int gtid, char *lhs,
1091 char rhs, int flag);
1092char __kmpc_atomic_fixed1_div_cpt(ident_t *id_ref, int gtid, char *lhs,
1093 char rhs, int flag);
1094unsigned char __kmpc_atomic_fixed1u_div_cpt(ident_t *id_ref, int gtid,
1095 unsigned char *lhs,
1096 unsigned char rhs, int flag);
1097char __kmpc_atomic_fixed1_mul_cpt(ident_t *id_ref, int gtid, char *lhs,
1098 char rhs, int flag);
1099char __kmpc_atomic_fixed1_orb_cpt(ident_t *id_ref, int gtid, char *lhs,
1100 char rhs, int flag);
1101char __kmpc_atomic_fixed1_shl_cpt(ident_t *id_ref, int gtid, char *lhs,
1102 char rhs, int flag);
1103char __kmpc_atomic_fixed1_shr_cpt(ident_t *id_ref, int gtid, char *lhs,
1104 char rhs, int flag);
1105unsigned char __kmpc_atomic_fixed1u_shr_cpt(ident_t *id_ref, int gtid,
1106 unsigned char *lhs,
1107 unsigned char rhs, int flag);
1108char __kmpc_atomic_fixed1_sub_cpt(ident_t *id_ref, int gtid, char *lhs,
1109 char rhs, int flag);
1110char __kmpc_atomic_fixed1_xor_cpt(ident_t *id_ref, int gtid, char *lhs,
1111 char rhs, int flag);
1112// 2-byte
1113short __kmpc_atomic_fixed2_add_cpt(ident_t *id_ref, int gtid, short *lhs,
1114 short rhs, int flag);
1115short __kmpc_atomic_fixed2_andb_cpt(ident_t *id_ref, int gtid, short *lhs,
1116 short rhs, int flag);
1117short __kmpc_atomic_fixed2_div_cpt(ident_t *id_ref, int gtid, short *lhs,
1118 short rhs, int flag);
1119unsigned short __kmpc_atomic_fixed2u_div_cpt(ident_t *id_ref, int gtid,
1120 unsigned short *lhs,
1121 unsigned short rhs, int flag);
1122short __kmpc_atomic_fixed2_mul_cpt(ident_t *id_ref, int gtid, short *lhs,
1123 short rhs, int flag);
1124short __kmpc_atomic_fixed2_orb_cpt(ident_t *id_ref, int gtid, short *lhs,
1125 short rhs, int flag);
1126short __kmpc_atomic_fixed2_shl_cpt(ident_t *id_ref, int gtid, short *lhs,
1127 short rhs, int flag);
1128short __kmpc_atomic_fixed2_shr_cpt(ident_t *id_ref, int gtid, short *lhs,
1129 short rhs, int flag);
1130unsigned short __kmpc_atomic_fixed2u_shr_cpt(ident_t *id_ref, int gtid,
1131 unsigned short *lhs,
1132 unsigned short rhs, int flag);
1133short __kmpc_atomic_fixed2_sub_cpt(ident_t *id_ref, int gtid, short *lhs,
1134 short rhs, int flag);
1135short __kmpc_atomic_fixed2_xor_cpt(ident_t *id_ref, int gtid, short *lhs,
1136 short rhs, int flag);
1137// 4-byte add / sub fixed
1138kmp_int32 __kmpc_atomic_fixed4_add_cpt(ident_t *id_ref, int gtid,
1139 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1140kmp_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
1143kmp_real32 __kmpc_atomic_float4_add_cpt(ident_t *id_ref, int gtid,
1144 kmp_real32 *lhs, kmp_real32 rhs,
1145 int flag);
1146kmp_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
1150kmp_int64 __kmpc_atomic_fixed8_add_cpt(ident_t *id_ref, int gtid,
1151 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1152kmp_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
1155kmp_real64 __kmpc_atomic_float8_add_cpt(ident_t *id_ref, int gtid,
1156 kmp_real64 *lhs, kmp_real64 rhs,
1157 int flag);
1158kmp_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
1162kmp_int32 __kmpc_atomic_fixed4_andb_cpt(ident_t *id_ref, int gtid,
1163 kmp_int32 *lhs, kmp_int32 rhs,
1164 int flag);
1165kmp_int32 __kmpc_atomic_fixed4_div_cpt(ident_t *id_ref, int gtid,
1166 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1167kmp_uint32 __kmpc_atomic_fixed4u_div_cpt(ident_t *id_ref, int gtid,
1168 kmp_uint32 *lhs, kmp_uint32 rhs,
1169 int flag);
1170kmp_int32 __kmpc_atomic_fixed4_mul_cpt(ident_t *id_ref, int gtid,
1171 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1172kmp_int32 __kmpc_atomic_fixed4_orb_cpt(ident_t *id_ref, int gtid,
1173 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1174kmp_int32 __kmpc_atomic_fixed4_shl_cpt(ident_t *id_ref, int gtid,
1175 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1176kmp_int32 __kmpc_atomic_fixed4_shr_cpt(ident_t *id_ref, int gtid,
1177 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1178kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt(ident_t *id_ref, int gtid,
1179 kmp_uint32 *lhs, kmp_uint32 rhs,
1180 int flag);
1181kmp_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
1184kmp_int64 __kmpc_atomic_fixed8_andb_cpt(ident_t *id_ref, int gtid,
1185 kmp_int64 *lhs, kmp_int64 rhs,
1186 int flag);
1187kmp_int64 __kmpc_atomic_fixed8_div_cpt(ident_t *id_ref, int gtid,
1188 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1189kmp_uint64 __kmpc_atomic_fixed8u_div_cpt(ident_t *id_ref, int gtid,
1190 kmp_uint64 *lhs, kmp_uint64 rhs,
1191 int flag);
1192kmp_int64 __kmpc_atomic_fixed8_mul_cpt(ident_t *id_ref, int gtid,
1193 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1194kmp_int64 __kmpc_atomic_fixed8_orb_cpt(ident_t *id_ref, int gtid,
1195 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1196kmp_int64 __kmpc_atomic_fixed8_shl_cpt(ident_t *id_ref, int gtid,
1197 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1198kmp_int64 __kmpc_atomic_fixed8_shr_cpt(ident_t *id_ref, int gtid,
1199 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1200kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt(ident_t *id_ref, int gtid,
1201 kmp_uint64 *lhs, kmp_uint64 rhs,
1202 int flag);
1203kmp_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
1206kmp_real32 __kmpc_atomic_float4_div_cpt(ident_t *id_ref, int gtid,
1207 kmp_real32 *lhs, kmp_real32 rhs,
1208 int flag);
1209kmp_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
1213kmp_real64 __kmpc_atomic_float8_div_cpt(ident_t *id_ref, int gtid,
1214 kmp_real64 *lhs, kmp_real64 rhs,
1215 int flag);
1216kmp_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 (&&, ||)
1220char __kmpc_atomic_fixed1_andl_cpt(ident_t *id_ref, int gtid, char *lhs,
1221 char rhs, int flag);
1222char __kmpc_atomic_fixed1_orl_cpt(ident_t *id_ref, int gtid, char *lhs,
1223 char rhs, int flag);
1224short __kmpc_atomic_fixed2_andl_cpt(ident_t *id_ref, int gtid, short *lhs,
1225 short rhs, int flag);
1226short __kmpc_atomic_fixed2_orl_cpt(ident_t *id_ref, int gtid, short *lhs,
1227 short rhs, int flag);
1228kmp_int32 __kmpc_atomic_fixed4_andl_cpt(ident_t *id_ref, int gtid,
1229 kmp_int32 *lhs, kmp_int32 rhs,
1230 int flag);
1231kmp_int32 __kmpc_atomic_fixed4_orl_cpt(ident_t *id_ref, int gtid,
1232 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1233kmp_int64 __kmpc_atomic_fixed8_andl_cpt(ident_t *id_ref, int gtid,
1234 kmp_int64 *lhs, kmp_int64 rhs,
1235 int flag);
1236kmp_int64 __kmpc_atomic_fixed8_orl_cpt(ident_t *id_ref, int gtid,
1237 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1238// MIN / MAX
1239char __kmpc_atomic_fixed1_max_cpt(ident_t *id_ref, int gtid, char *lhs,
1240 char rhs, int flag);
1241char __kmpc_atomic_fixed1_min_cpt(ident_t *id_ref, int gtid, char *lhs,
1242 char rhs, int flag);
1243short __kmpc_atomic_fixed2_max_cpt(ident_t *id_ref, int gtid, short *lhs,
1244 short rhs, int flag);
1245short __kmpc_atomic_fixed2_min_cpt(ident_t *id_ref, int gtid, short *lhs,
1246 short rhs, int flag);
1247kmp_int32 __kmpc_atomic_fixed4_max_cpt(ident_t *id_ref, int gtid,
1248 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1249kmp_int32 __kmpc_atomic_fixed4_min_cpt(ident_t *id_ref, int gtid,
1250 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1251kmp_int64 __kmpc_atomic_fixed8_max_cpt(ident_t *id_ref, int gtid,
1252 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1253kmp_int64 __kmpc_atomic_fixed8_min_cpt(ident_t *id_ref, int gtid,
1254 kmp_int64 *lhs, kmp_int64 rhs, int flag);
1255kmp_real32 __kmpc_atomic_float4_max_cpt(ident_t *id_ref, int gtid,
1256 kmp_real32 *lhs, kmp_real32 rhs,
1257 int flag);
1258kmp_real32 __kmpc_atomic_float4_min_cpt(ident_t *id_ref, int gtid,
1259 kmp_real32 *lhs, kmp_real32 rhs,
1260 int flag);
1261kmp_real64 __kmpc_atomic_float8_max_cpt(ident_t *id_ref, int gtid,
1262 kmp_real64 *lhs, kmp_real64 rhs,
1263 int flag);
1264kmp_real64 __kmpc_atomic_float8_min_cpt(ident_t *id_ref, int gtid,
1265 kmp_real64 *lhs, kmp_real64 rhs,
1266 int flag);
1267long double __kmpc_atomic_float10_max_cpt(ident_t *id_ref, int gtid,
1268 long double *lhs, long double rhs,
1269 int flag);
1270long 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
1274QUAD_LEGACY __kmpc_atomic_float16_max_cpt(ident_t *id_ref, int gtid,
1275 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1276 int flag);
1277QUAD_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)
1282char __kmpc_atomic_fixed1_neqv_cpt(ident_t *id_ref, int gtid, char *lhs,
1283 char rhs, int flag);
1284short __kmpc_atomic_fixed2_neqv_cpt(ident_t *id_ref, int gtid, short *lhs,
1285 short rhs, int flag);
1286kmp_int32 __kmpc_atomic_fixed4_neqv_cpt(ident_t *id_ref, int gtid,
1287 kmp_int32 *lhs, kmp_int32 rhs,
1288 int flag);
1289kmp_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)
1293char __kmpc_atomic_fixed1_eqv_cpt(ident_t *id_ref, int gtid, char *lhs,
1294 char rhs, int flag);
1295short __kmpc_atomic_fixed2_eqv_cpt(ident_t *id_ref, int gtid, short *lhs,
1296 short rhs, int flag);
1297kmp_int32 __kmpc_atomic_fixed4_eqv_cpt(ident_t *id_ref, int gtid,
1298 kmp_int32 *lhs, kmp_int32 rhs, int flag);
1299kmp_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
1302long double __kmpc_atomic_float10_add_cpt(ident_t *id_ref, int gtid,
1303 long double *lhs, long double rhs,
1304 int flag);
1305long double __kmpc_atomic_float10_sub_cpt(ident_t *id_ref, int gtid,
1306 long double *lhs, long double rhs,
1307 int flag);
1308long double __kmpc_atomic_float10_mul_cpt(ident_t *id_ref, int gtid,
1309 long double *lhs, long double rhs,
1310 int flag);
1311long 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
1316QUAD_LEGACY __kmpc_atomic_float16_add_cpt(ident_t *id_ref, int gtid,
1317 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1318 int flag);
1319QUAD_LEGACY __kmpc_atomic_float16_sub_cpt(ident_t *id_ref, int gtid,
1320 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1321 int flag);
1322QUAD_LEGACY __kmpc_atomic_float16_mul_cpt(ident_t *id_ref, int gtid,
1323 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1324 int flag);
1325QUAD_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
1332void __kmpc_atomic_cmplx4_add_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1333 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1334void __kmpc_atomic_cmplx4_sub_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1335 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1336void __kmpc_atomic_cmplx4_mul_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1337 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1338void __kmpc_atomic_cmplx4_div_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1339 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1340
1341kmp_cmplx64 __kmpc_atomic_cmplx8_add_cpt(ident_t *id_ref, int gtid,
1342 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1343 int flag);
1344kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt(ident_t *id_ref, int gtid,
1345 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1346 int flag);
1347kmp_cmplx64 __kmpc_atomic_cmplx8_mul_cpt(ident_t *id_ref, int gtid,
1348 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1349 int flag);
1350kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt(ident_t *id_ref, int gtid,
1351 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1352 int flag);
1353kmp_cmplx80 __kmpc_atomic_cmplx10_add_cpt(ident_t *id_ref, int gtid,
1354 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1355 int flag);
1356kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt(ident_t *id_ref, int gtid,
1357 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1358 int flag);
1359kmp_cmplx80 __kmpc_atomic_cmplx10_mul_cpt(ident_t *id_ref, int gtid,
1360 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1361 int flag);
1362kmp_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
1366CPLX128_LEG __kmpc_atomic_cmplx16_add_cpt(ident_t *id_ref, int gtid,
1367 CPLX128_LEG *lhs, CPLX128_LEG rhs,
1368 int flag);
1369CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt(ident_t *id_ref, int gtid,
1370 CPLX128_LEG *lhs, CPLX128_LEG rhs,
1371 int flag);
1372CPLX128_LEG __kmpc_atomic_cmplx16_mul_cpt(ident_t *id_ref, int gtid,
1373 CPLX128_LEG *lhs, CPLX128_LEG rhs,
1374 int flag);
1375CPLX128_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
1380Quad_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);
1383Quad_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);
1386Quad_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);
1389Quad_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);
1392Quad_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);
1395Quad_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);
1398kmp_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);
1402kmp_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);
1406kmp_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);
1410kmp_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
1417void __kmpc_atomic_start(void);
1418void __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
1423char __kmpc_atomic_fixed1_sub_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1424 char rhs, int flag);
1425char __kmpc_atomic_fixed1_div_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1426 char rhs, int flag);
1427unsigned char __kmpc_atomic_fixed1u_div_cpt_rev(ident_t *id_ref, int gtid,
1428 unsigned char *lhs,
1429 unsigned char rhs, int flag);
1430char __kmpc_atomic_fixed1_shl_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1431 char rhs, int flag);
1432char __kmpc_atomic_fixed1_shr_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1433 char rhs, int flag);
1434unsigned char __kmpc_atomic_fixed1u_shr_cpt_rev(ident_t *id_ref, int gtid,
1435 unsigned char *lhs,
1436 unsigned char rhs, int flag);
1437short __kmpc_atomic_fixed2_sub_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1438 short rhs, int flag);
1439short __kmpc_atomic_fixed2_div_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1440 short rhs, int flag);
1441unsigned short __kmpc_atomic_fixed2u_div_cpt_rev(ident_t *id_ref, int gtid,
1442 unsigned short *lhs,
1443 unsigned short rhs, int flag);
1444short __kmpc_atomic_fixed2_shl_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1445 short rhs, int flag);
1446short __kmpc_atomic_fixed2_shr_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1447 short rhs, int flag);
1448unsigned short __kmpc_atomic_fixed2u_shr_cpt_rev(ident_t *id_ref, int gtid,
1449 unsigned short *lhs,
1450 unsigned short rhs, int flag);
1451kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev(ident_t *id_ref, int gtid,
1452 kmp_int32 *lhs, kmp_int32 rhs,
1453 int flag);
1454kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev(ident_t *id_ref, int gtid,
1455 kmp_int32 *lhs, kmp_int32 rhs,
1456 int flag);
1457kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev(ident_t *id_ref, int gtid,
1458 kmp_uint32 *lhs, kmp_uint32 rhs,
1459 int flag);
1460kmp_int32 __kmpc_atomic_fixed4_shl_cpt_rev(ident_t *id_ref, int gtid,
1461 kmp_int32 *lhs, kmp_int32 rhs,
1462 int flag);
1463kmp_int32 __kmpc_atomic_fixed4_shr_cpt_rev(ident_t *id_ref, int gtid,
1464 kmp_int32 *lhs, kmp_int32 rhs,
1465 int flag);
1466kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt_rev(ident_t *id_ref, int gtid,
1467 kmp_uint32 *lhs, kmp_uint32 rhs,
1468 int flag);
1469kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev(ident_t *id_ref, int gtid,
1470 kmp_int64 *lhs, kmp_int64 rhs,
1471 int flag);
1472kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev(ident_t *id_ref, int gtid,
1473 kmp_int64 *lhs, kmp_int64 rhs,
1474 int flag);
1475kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev(ident_t *id_ref, int gtid,
1476 kmp_uint64 *lhs, kmp_uint64 rhs,
1477 int flag);
1478kmp_int64 __kmpc_atomic_fixed8_shl_cpt_rev(ident_t *id_ref, int gtid,
1479 kmp_int64 *lhs, kmp_int64 rhs,
1480 int flag);
1481kmp_int64 __kmpc_atomic_fixed8_shr_cpt_rev(ident_t *id_ref, int gtid,
1482 kmp_int64 *lhs, kmp_int64 rhs,
1483 int flag);
1484kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt_rev(ident_t *id_ref, int gtid,
1485 kmp_uint64 *lhs, kmp_uint64 rhs,
1486 int flag);
1487float __kmpc_atomic_float4_sub_cpt_rev(ident_t *id_ref, int gtid, float *lhs,
1488 float rhs, int flag);
1489float __kmpc_atomic_float4_div_cpt_rev(ident_t *id_ref, int gtid, float *lhs,
1490 float rhs, int flag);
1491double __kmpc_atomic_float8_sub_cpt_rev(ident_t *id_ref, int gtid, double *lhs,
1492 double rhs, int flag);
1493double __kmpc_atomic_float8_div_cpt_rev(ident_t *id_ref, int gtid, double *lhs,
1494 double rhs, int flag);
1495long double __kmpc_atomic_float10_sub_cpt_rev(ident_t *id_ref, int gtid,
1496 long double *lhs, long double rhs,
1497 int flag);
1498long 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
1502QUAD_LEGACY __kmpc_atomic_float16_sub_cpt_rev(ident_t *id_ref, int gtid,
1503 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1504 int flag);
1505QUAD_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
1511void __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);
1514void __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);
1517kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt_rev(ident_t *id_ref, int gtid,
1518 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1519 int flag);
1520kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt_rev(ident_t *id_ref, int gtid,
1521 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1522 int flag);
1523kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt_rev(ident_t *id_ref, int gtid,
1524 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1525 int flag);
1526kmp_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
1530CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt_rev(ident_t *id_ref, int gtid,
1531 CPLX128_LEG *lhs, CPLX128_LEG rhs,
1532 int flag);
1533CPLX128_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)
1537Quad_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);
1540Quad_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);
1543kmp_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);
1547kmp_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;}
1555char __kmpc_atomic_fixed1_swp(ident_t *id_ref, int gtid, char *lhs, char rhs);
1556short __kmpc_atomic_fixed2_swp(ident_t *id_ref, int gtid, short *lhs,
1557 short rhs);
1558kmp_int32 __kmpc_atomic_fixed4_swp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
1559 kmp_int32 rhs);
1560kmp_int64 __kmpc_atomic_fixed8_swp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
1561 kmp_int64 rhs);
1562float __kmpc_atomic_float4_swp(ident_t *id_ref, int gtid, float *lhs,
1563 float rhs);
1564double __kmpc_atomic_float8_swp(ident_t *id_ref, int gtid, double *lhs,
1565 double rhs);
1566long double __kmpc_atomic_float10_swp(ident_t *id_ref, int gtid,
1567 long double *lhs, long double rhs);
1568#if KMP_HAVE_QUAD
1569QUAD_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
1573void __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
1578kmp_cmplx64 __kmpc_atomic_cmplx8_swp(ident_t *id_ref, int gtid,
1579 kmp_cmplx64 *lhs, kmp_cmplx64 rhs);
1580kmp_cmplx80 __kmpc_atomic_cmplx10_swp(ident_t *id_ref, int gtid,
1581 kmp_cmplx80 *lhs, kmp_cmplx80 rhs);
1582#if KMP_HAVE_QUAD
1583CPLX128_LEG __kmpc_atomic_cmplx16_swp(ident_t *id_ref, int gtid,
1584 CPLX128_LEG *lhs, CPLX128_LEG rhs);
1585#if (KMP_ARCH_X86)
1586Quad_a16_t __kmpc_atomic_float16_a16_swp(ident_t *id_ref, int gtid,
1587 Quad_a16_t *lhs, Quad_a16_t rhs);
1588kmp_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
1597char __kmpc_atomic_fixed1_add_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1598 _Quad rhs, int flag);
1599char __kmpc_atomic_fixed1_sub_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1600 _Quad rhs, int flag);
1601char __kmpc_atomic_fixed1_mul_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1602 _Quad rhs, int flag);
1603char __kmpc_atomic_fixed1_div_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1604 _Quad rhs, int flag);
1605unsigned char __kmpc_atomic_fixed1u_add_cpt_fp(ident_t *id_ref, int gtid,
1606 unsigned char *lhs, _Quad rhs,
1607 int flag);
1608unsigned char __kmpc_atomic_fixed1u_sub_cpt_fp(ident_t *id_ref, int gtid,
1609 unsigned char *lhs, _Quad rhs,
1610 int flag);
1611unsigned char __kmpc_atomic_fixed1u_mul_cpt_fp(ident_t *id_ref, int gtid,
1612 unsigned char *lhs, _Quad rhs,
1613 int flag);
1614unsigned char __kmpc_atomic_fixed1u_div_cpt_fp(ident_t *id_ref, int gtid,
1615 unsigned char *lhs, _Quad rhs,
1616 int flag);
1617
1618short __kmpc_atomic_fixed2_add_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1619 _Quad rhs, int flag);
1620short __kmpc_atomic_fixed2_sub_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1621 _Quad rhs, int flag);
1622short __kmpc_atomic_fixed2_mul_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1623 _Quad rhs, int flag);
1624short __kmpc_atomic_fixed2_div_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1625 _Quad rhs, int flag);
1626unsigned short __kmpc_atomic_fixed2u_add_cpt_fp(ident_t *id_ref, int gtid,
1627 unsigned short *lhs, _Quad rhs,
1628 int flag);
1629unsigned short __kmpc_atomic_fixed2u_sub_cpt_fp(ident_t *id_ref, int gtid,
1630 unsigned short *lhs, _Quad rhs,
1631 int flag);
1632unsigned short __kmpc_atomic_fixed2u_mul_cpt_fp(ident_t *id_ref, int gtid,
1633 unsigned short *lhs, _Quad rhs,
1634 int flag);
1635unsigned short __kmpc_atomic_fixed2u_div_cpt_fp(ident_t *id_ref, int gtid,
1636 unsigned short *lhs, _Quad rhs,
1637 int flag);
1638
1639kmp_int32 __kmpc_atomic_fixed4_add_cpt_fp(ident_t *id_ref, int gtid,
1640 kmp_int32 *lhs, _Quad rhs, int flag);
1641kmp_int32 __kmpc_atomic_fixed4_sub_cpt_fp(ident_t *id_ref, int gtid,
1642 kmp_int32 *lhs, _Quad rhs, int flag);
1643kmp_int32 __kmpc_atomic_fixed4_mul_cpt_fp(ident_t *id_ref, int gtid,
1644 kmp_int32 *lhs, _Quad rhs, int flag);
1645kmp_int32 __kmpc_atomic_fixed4_div_cpt_fp(ident_t *id_ref, int gtid,
1646 kmp_int32 *lhs, _Quad rhs, int flag);
1647kmp_uint32 __kmpc_atomic_fixed4u_add_cpt_fp(ident_t *id_ref, int gtid,
1648 kmp_uint32 *lhs, _Quad rhs,
1649 int flag);
1650kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_fp(ident_t *id_ref, int gtid,
1651 kmp_uint32 *lhs, _Quad rhs,
1652 int flag);
1653kmp_uint32 __kmpc_atomic_fixed4u_mul_cpt_fp(ident_t *id_ref, int gtid,
1654 kmp_uint32 *lhs, _Quad rhs,
1655 int flag);
1656kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_fp(ident_t *id_ref, int gtid,
1657 kmp_uint32 *lhs, _Quad rhs,
1658 int flag);
1659
1660kmp_int64 __kmpc_atomic_fixed8_add_cpt_fp(ident_t *id_ref, int gtid,
1661 kmp_int64 *lhs, _Quad rhs, int flag);
1662kmp_int64 __kmpc_atomic_fixed8_sub_cpt_fp(ident_t *id_ref, int gtid,
1663 kmp_int64 *lhs, _Quad rhs, int flag);
1664kmp_int64 __kmpc_atomic_fixed8_mul_cpt_fp(ident_t *id_ref, int gtid,
1665 kmp_int64 *lhs, _Quad rhs, int flag);
1666kmp_int64 __kmpc_atomic_fixed8_div_cpt_fp(ident_t *id_ref, int gtid,
1667 kmp_int64 *lhs, _Quad rhs, int flag);
1668kmp_uint64 __kmpc_atomic_fixed8u_add_cpt_fp(ident_t *id_ref, int gtid,
1669 kmp_uint64 *lhs, _Quad rhs,
1670 int flag);
1671kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_fp(ident_t *id_ref, int gtid,
1672 kmp_uint64 *lhs, _Quad rhs,
1673 int flag);
1674kmp_uint64 __kmpc_atomic_fixed8u_mul_cpt_fp(ident_t *id_ref, int gtid,
1675 kmp_uint64 *lhs, _Quad rhs,
1676 int flag);
1677kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_fp(ident_t *id_ref, int gtid,
1678 kmp_uint64 *lhs, _Quad rhs,
1679 int flag);
1680
1681float __kmpc_atomic_float4_add_cpt_fp(ident_t *id_ref, int gtid,
1682 kmp_real32 *lhs, _Quad rhs, int flag);
1683float __kmpc_atomic_float4_sub_cpt_fp(ident_t *id_ref, int gtid,
1684 kmp_real32 *lhs, _Quad rhs, int flag);
1685float __kmpc_atomic_float4_mul_cpt_fp(ident_t *id_ref, int gtid,
1686 kmp_real32 *lhs, _Quad rhs, int flag);
1687float __kmpc_atomic_float4_div_cpt_fp(ident_t *id_ref, int gtid,
1688 kmp_real32 *lhs, _Quad rhs, int flag);
1689
1690double __kmpc_atomic_float8_add_cpt_fp(ident_t *id_ref, int gtid,
1691 kmp_real64 *lhs, _Quad rhs, int flag);
1692double __kmpc_atomic_float8_sub_cpt_fp(ident_t *id_ref, int gtid,
1693 kmp_real64 *lhs, _Quad rhs, int flag);
1694double __kmpc_atomic_float8_mul_cpt_fp(ident_t *id_ref, int gtid,
1695 kmp_real64 *lhs, _Quad rhs, int flag);
1696double __kmpc_atomic_float8_div_cpt_fp(ident_t *id_ref, int gtid,
1697 kmp_real64 *lhs, _Quad rhs, int flag);
1698
1699long double __kmpc_atomic_float10_add_cpt_fp(ident_t *id_ref, int gtid,
1700 long double *lhs, _Quad rhs,
1701 int flag);
1702long double __kmpc_atomic_float10_sub_cpt_fp(ident_t *id_ref, int gtid,
1703 long double *lhs, _Quad rhs,
1704 int flag);
1705long double __kmpc_atomic_float10_mul_cpt_fp(ident_t *id_ref, int gtid,
1706 long double *lhs, _Quad rhs,
1707 int flag);
1708long double __kmpc_atomic_float10_div_cpt_fp(ident_t *id_ref, int gtid,
1709 long double *lhs, _Quad rhs,
1710 int flag);
1711
1712char __kmpc_atomic_fixed1_sub_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,
1713 _Quad rhs, int flag);
1714unsigned char __kmpc_atomic_fixed1u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1715 unsigned char *lhs,
1716 _Quad rhs, int flag);
1717char __kmpc_atomic_fixed1_div_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,
1718 _Quad rhs, int flag);
1719unsigned char __kmpc_atomic_fixed1u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1720 unsigned char *lhs,
1721 _Quad rhs, int flag);
1722short __kmpc_atomic_fixed2_sub_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,
1723 _Quad rhs, int flag);
1724unsigned short __kmpc_atomic_fixed2u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1725 unsigned short *lhs,
1726 _Quad rhs, int flag);
1727short __kmpc_atomic_fixed2_div_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,
1728 _Quad rhs, int flag);
1729unsigned short __kmpc_atomic_fixed2u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1730 unsigned short *lhs,
1731 _Quad rhs, int flag);
1732kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1733 kmp_int32 *lhs, _Quad rhs,
1734 int flag);
1735kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1736 kmp_uint32 *lhs, _Quad rhs,
1737 int flag);
1738kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1739 kmp_int32 *lhs, _Quad rhs,
1740 int flag);
1741kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1742 kmp_uint32 *lhs, _Quad rhs,
1743 int flag);
1744kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1745 kmp_int64 *lhs, _Quad rhs,
1746 int flag);
1747kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1748 kmp_uint64 *lhs, _Quad rhs,
1749 int flag);
1750kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1751 kmp_int64 *lhs, _Quad rhs,
1752 int flag);
1753kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1754 kmp_uint64 *lhs, _Quad rhs,
1755 int flag);
1756float __kmpc_atomic_float4_sub_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,
1757 _Quad rhs, int flag);
1758float __kmpc_atomic_float4_div_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,
1759 _Quad rhs, int flag);
1760double __kmpc_atomic_float8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1761 double *lhs, _Quad rhs, int flag);
1762double __kmpc_atomic_float8_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1763 double *lhs, _Quad rhs, int flag);
1764long double __kmpc_atomic_float10_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1765 long double *lhs, _Quad rhs,
1766 int flag);
1767long 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
1803bool __kmpc_atomic_bool_1_cas(ident_t *loc, int gtid, char *x, char e, char d);
1804bool __kmpc_atomic_bool_2_cas(ident_t *loc, int gtid, short *x, short e,
1805 short d);
1806bool __kmpc_atomic_bool_4_cas(ident_t *loc, int gtid, kmp_int32 *x, kmp_int32 e,
1807 kmp_int32 d);
1808bool __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
1813char __kmpc_atomic_val_1_cas(ident_t *loc, int gtid, char *x, char e, char d);
1814short __kmpc_atomic_val_2_cas(ident_t *loc, int gtid, short *x, short e,
1815 short d);
1816kmp_int32 __kmpc_atomic_val_4_cas(ident_t *loc, int gtid, kmp_int32 *x,
1817 kmp_int32 e, kmp_int32 d);
1818kmp_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
1824bool __kmpc_atomic_bool_1_cas_cpt(ident_t *loc, int gtid, char *x, char e,
1825 char d, char *pv);
1826bool __kmpc_atomic_bool_2_cas_cpt(ident_t *loc, int gtid, short *x, short e,
1827 short d, short *pv);
1828bool __kmpc_atomic_bool_4_cas_cpt(ident_t *loc, int gtid, kmp_int32 *x,
1829 kmp_int32 e, kmp_int32 d, kmp_int32 *pv);
1830bool __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
1836char __kmpc_atomic_val_1_cas_cpt(ident_t *loc, int gtid, char *x, char e,
1837 char d, char *pv);
1838short __kmpc_atomic_val_2_cas_cpt(ident_t *loc, int gtid, short *x, short e,
1839 short d, short *pv);
1840kmp_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);
1842kmp_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:234