Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/openmp/runtime/src/kmp_atomic.h
35258 views
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
1009
1010
// Below routines for atomic READ are listed
1011
char __kmpc_atomic_fixed1_rd(ident_t *id_ref, int gtid, char *loc);
1012
short __kmpc_atomic_fixed2_rd(ident_t *id_ref, int gtid, short *loc);
1013
kmp_int32 __kmpc_atomic_fixed4_rd(ident_t *id_ref, int gtid, kmp_int32 *loc);
1014
kmp_int64 __kmpc_atomic_fixed8_rd(ident_t *id_ref, int gtid, kmp_int64 *loc);
1015
kmp_real32 __kmpc_atomic_float4_rd(ident_t *id_ref, int gtid, kmp_real32 *loc);
1016
kmp_real64 __kmpc_atomic_float8_rd(ident_t *id_ref, int gtid, kmp_real64 *loc);
1017
long double __kmpc_atomic_float10_rd(ident_t *id_ref, int gtid,
1018
long double *loc);
1019
#if KMP_HAVE_QUAD
1020
QUAD_LEGACY __kmpc_atomic_float16_rd(ident_t *id_ref, int gtid,
1021
QUAD_LEGACY *loc);
1022
#endif
1023
// Fix for CQ220361: cmplx4 READ will return void on Windows* OS; read value
1024
// will be returned through an additional parameter
1025
#if (KMP_OS_WINDOWS)
1026
void __kmpc_atomic_cmplx4_rd(kmp_cmplx32 *out, ident_t *id_ref, int gtid,
1027
kmp_cmplx32 *loc);
1028
#else
1029
kmp_cmplx32 __kmpc_atomic_cmplx4_rd(ident_t *id_ref, int gtid,
1030
kmp_cmplx32 *loc);
1031
#endif
1032
kmp_cmplx64 __kmpc_atomic_cmplx8_rd(ident_t *id_ref, int gtid,
1033
kmp_cmplx64 *loc);
1034
kmp_cmplx80 __kmpc_atomic_cmplx10_rd(ident_t *id_ref, int gtid,
1035
kmp_cmplx80 *loc);
1036
#if KMP_HAVE_QUAD
1037
CPLX128_LEG __kmpc_atomic_cmplx16_rd(ident_t *id_ref, int gtid,
1038
CPLX128_LEG *loc);
1039
#if (KMP_ARCH_X86)
1040
// Routines with 16-byte arguments aligned to 16-byte boundary
1041
Quad_a16_t __kmpc_atomic_float16_a16_rd(ident_t *id_ref, int gtid,
1042
Quad_a16_t *loc);
1043
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_rd(ident_t *id_ref, int gtid,
1044
kmp_cmplx128_a16_t *loc);
1045
#endif
1046
#endif
1047
1048
// Below routines for atomic WRITE are listed
1049
void __kmpc_atomic_fixed1_wr(ident_t *id_ref, int gtid, char *lhs, char rhs);
1050
void __kmpc_atomic_fixed2_wr(ident_t *id_ref, int gtid, short *lhs, short rhs);
1051
void __kmpc_atomic_fixed4_wr(ident_t *id_ref, int gtid, kmp_int32 *lhs,
1052
kmp_int32 rhs);
1053
void __kmpc_atomic_fixed8_wr(ident_t *id_ref, int gtid, kmp_int64 *lhs,
1054
kmp_int64 rhs);
1055
void __kmpc_atomic_float4_wr(ident_t *id_ref, int gtid, kmp_real32 *lhs,
1056
kmp_real32 rhs);
1057
void __kmpc_atomic_float8_wr(ident_t *id_ref, int gtid, kmp_real64 *lhs,
1058
kmp_real64 rhs);
1059
void __kmpc_atomic_float10_wr(ident_t *id_ref, int gtid, long double *lhs,
1060
long double rhs);
1061
#if KMP_HAVE_QUAD
1062
void __kmpc_atomic_float16_wr(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,
1063
QUAD_LEGACY rhs);
1064
#endif
1065
void __kmpc_atomic_cmplx4_wr(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1066
kmp_cmplx32 rhs);
1067
void __kmpc_atomic_cmplx8_wr(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,
1068
kmp_cmplx64 rhs);
1069
void __kmpc_atomic_cmplx10_wr(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,
1070
kmp_cmplx80 rhs);
1071
#if KMP_HAVE_QUAD
1072
void __kmpc_atomic_cmplx16_wr(ident_t *id_ref, int gtid, CPLX128_LEG *lhs,
1073
CPLX128_LEG rhs);
1074
#if (KMP_ARCH_X86)
1075
// Routines with 16-byte arguments aligned to 16-byte boundary
1076
void __kmpc_atomic_float16_a16_wr(ident_t *id_ref, int gtid, Quad_a16_t *lhs,
1077
Quad_a16_t rhs);
1078
void __kmpc_atomic_cmplx16_a16_wr(ident_t *id_ref, int gtid,
1079
kmp_cmplx128_a16_t *lhs,
1080
kmp_cmplx128_a16_t rhs);
1081
#endif
1082
#endif
1083
1084
// Below routines for atomic CAPTURE are listed
1085
1086
// 1-byte
1087
char __kmpc_atomic_fixed1_add_cpt(ident_t *id_ref, int gtid, char *lhs,
1088
char rhs, int flag);
1089
char __kmpc_atomic_fixed1_andb_cpt(ident_t *id_ref, int gtid, char *lhs,
1090
char rhs, int flag);
1091
char __kmpc_atomic_fixed1_div_cpt(ident_t *id_ref, int gtid, char *lhs,
1092
char rhs, int flag);
1093
unsigned char __kmpc_atomic_fixed1u_div_cpt(ident_t *id_ref, int gtid,
1094
unsigned char *lhs,
1095
unsigned char rhs, int flag);
1096
char __kmpc_atomic_fixed1_mul_cpt(ident_t *id_ref, int gtid, char *lhs,
1097
char rhs, int flag);
1098
char __kmpc_atomic_fixed1_orb_cpt(ident_t *id_ref, int gtid, char *lhs,
1099
char rhs, int flag);
1100
char __kmpc_atomic_fixed1_shl_cpt(ident_t *id_ref, int gtid, char *lhs,
1101
char rhs, int flag);
1102
char __kmpc_atomic_fixed1_shr_cpt(ident_t *id_ref, int gtid, char *lhs,
1103
char rhs, int flag);
1104
unsigned char __kmpc_atomic_fixed1u_shr_cpt(ident_t *id_ref, int gtid,
1105
unsigned char *lhs,
1106
unsigned char rhs, int flag);
1107
char __kmpc_atomic_fixed1_sub_cpt(ident_t *id_ref, int gtid, char *lhs,
1108
char rhs, int flag);
1109
char __kmpc_atomic_fixed1_xor_cpt(ident_t *id_ref, int gtid, char *lhs,
1110
char rhs, int flag);
1111
// 2-byte
1112
short __kmpc_atomic_fixed2_add_cpt(ident_t *id_ref, int gtid, short *lhs,
1113
short rhs, int flag);
1114
short __kmpc_atomic_fixed2_andb_cpt(ident_t *id_ref, int gtid, short *lhs,
1115
short rhs, int flag);
1116
short __kmpc_atomic_fixed2_div_cpt(ident_t *id_ref, int gtid, short *lhs,
1117
short rhs, int flag);
1118
unsigned short __kmpc_atomic_fixed2u_div_cpt(ident_t *id_ref, int gtid,
1119
unsigned short *lhs,
1120
unsigned short rhs, int flag);
1121
short __kmpc_atomic_fixed2_mul_cpt(ident_t *id_ref, int gtid, short *lhs,
1122
short rhs, int flag);
1123
short __kmpc_atomic_fixed2_orb_cpt(ident_t *id_ref, int gtid, short *lhs,
1124
short rhs, int flag);
1125
short __kmpc_atomic_fixed2_shl_cpt(ident_t *id_ref, int gtid, short *lhs,
1126
short rhs, int flag);
1127
short __kmpc_atomic_fixed2_shr_cpt(ident_t *id_ref, int gtid, short *lhs,
1128
short rhs, int flag);
1129
unsigned short __kmpc_atomic_fixed2u_shr_cpt(ident_t *id_ref, int gtid,
1130
unsigned short *lhs,
1131
unsigned short rhs, int flag);
1132
short __kmpc_atomic_fixed2_sub_cpt(ident_t *id_ref, int gtid, short *lhs,
1133
short rhs, int flag);
1134
short __kmpc_atomic_fixed2_xor_cpt(ident_t *id_ref, int gtid, short *lhs,
1135
short rhs, int flag);
1136
// 4-byte add / sub fixed
1137
kmp_int32 __kmpc_atomic_fixed4_add_cpt(ident_t *id_ref, int gtid,
1138
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1139
kmp_int32 __kmpc_atomic_fixed4_sub_cpt(ident_t *id_ref, int gtid,
1140
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1141
// 4-byte add / sub float
1142
kmp_real32 __kmpc_atomic_float4_add_cpt(ident_t *id_ref, int gtid,
1143
kmp_real32 *lhs, kmp_real32 rhs,
1144
int flag);
1145
kmp_real32 __kmpc_atomic_float4_sub_cpt(ident_t *id_ref, int gtid,
1146
kmp_real32 *lhs, kmp_real32 rhs,
1147
int flag);
1148
// 8-byte add / sub fixed
1149
kmp_int64 __kmpc_atomic_fixed8_add_cpt(ident_t *id_ref, int gtid,
1150
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1151
kmp_int64 __kmpc_atomic_fixed8_sub_cpt(ident_t *id_ref, int gtid,
1152
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1153
// 8-byte add / sub float
1154
kmp_real64 __kmpc_atomic_float8_add_cpt(ident_t *id_ref, int gtid,
1155
kmp_real64 *lhs, kmp_real64 rhs,
1156
int flag);
1157
kmp_real64 __kmpc_atomic_float8_sub_cpt(ident_t *id_ref, int gtid,
1158
kmp_real64 *lhs, kmp_real64 rhs,
1159
int flag);
1160
// 4-byte fixed
1161
kmp_int32 __kmpc_atomic_fixed4_andb_cpt(ident_t *id_ref, int gtid,
1162
kmp_int32 *lhs, kmp_int32 rhs,
1163
int flag);
1164
kmp_int32 __kmpc_atomic_fixed4_div_cpt(ident_t *id_ref, int gtid,
1165
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1166
kmp_uint32 __kmpc_atomic_fixed4u_div_cpt(ident_t *id_ref, int gtid,
1167
kmp_uint32 *lhs, kmp_uint32 rhs,
1168
int flag);
1169
kmp_int32 __kmpc_atomic_fixed4_mul_cpt(ident_t *id_ref, int gtid,
1170
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1171
kmp_int32 __kmpc_atomic_fixed4_orb_cpt(ident_t *id_ref, int gtid,
1172
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1173
kmp_int32 __kmpc_atomic_fixed4_shl_cpt(ident_t *id_ref, int gtid,
1174
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1175
kmp_int32 __kmpc_atomic_fixed4_shr_cpt(ident_t *id_ref, int gtid,
1176
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1177
kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt(ident_t *id_ref, int gtid,
1178
kmp_uint32 *lhs, kmp_uint32 rhs,
1179
int flag);
1180
kmp_int32 __kmpc_atomic_fixed4_xor_cpt(ident_t *id_ref, int gtid,
1181
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1182
// 8-byte fixed
1183
kmp_int64 __kmpc_atomic_fixed8_andb_cpt(ident_t *id_ref, int gtid,
1184
kmp_int64 *lhs, kmp_int64 rhs,
1185
int flag);
1186
kmp_int64 __kmpc_atomic_fixed8_div_cpt(ident_t *id_ref, int gtid,
1187
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1188
kmp_uint64 __kmpc_atomic_fixed8u_div_cpt(ident_t *id_ref, int gtid,
1189
kmp_uint64 *lhs, kmp_uint64 rhs,
1190
int flag);
1191
kmp_int64 __kmpc_atomic_fixed8_mul_cpt(ident_t *id_ref, int gtid,
1192
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1193
kmp_int64 __kmpc_atomic_fixed8_orb_cpt(ident_t *id_ref, int gtid,
1194
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1195
kmp_int64 __kmpc_atomic_fixed8_shl_cpt(ident_t *id_ref, int gtid,
1196
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1197
kmp_int64 __kmpc_atomic_fixed8_shr_cpt(ident_t *id_ref, int gtid,
1198
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1199
kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt(ident_t *id_ref, int gtid,
1200
kmp_uint64 *lhs, kmp_uint64 rhs,
1201
int flag);
1202
kmp_int64 __kmpc_atomic_fixed8_xor_cpt(ident_t *id_ref, int gtid,
1203
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1204
// 4-byte float
1205
kmp_real32 __kmpc_atomic_float4_div_cpt(ident_t *id_ref, int gtid,
1206
kmp_real32 *lhs, kmp_real32 rhs,
1207
int flag);
1208
kmp_real32 __kmpc_atomic_float4_mul_cpt(ident_t *id_ref, int gtid,
1209
kmp_real32 *lhs, kmp_real32 rhs,
1210
int flag);
1211
// 8-byte float
1212
kmp_real64 __kmpc_atomic_float8_div_cpt(ident_t *id_ref, int gtid,
1213
kmp_real64 *lhs, kmp_real64 rhs,
1214
int flag);
1215
kmp_real64 __kmpc_atomic_float8_mul_cpt(ident_t *id_ref, int gtid,
1216
kmp_real64 *lhs, kmp_real64 rhs,
1217
int flag);
1218
// 1-, 2-, 4-, 8-byte logical (&&, ||)
1219
char __kmpc_atomic_fixed1_andl_cpt(ident_t *id_ref, int gtid, char *lhs,
1220
char rhs, int flag);
1221
char __kmpc_atomic_fixed1_orl_cpt(ident_t *id_ref, int gtid, char *lhs,
1222
char rhs, int flag);
1223
short __kmpc_atomic_fixed2_andl_cpt(ident_t *id_ref, int gtid, short *lhs,
1224
short rhs, int flag);
1225
short __kmpc_atomic_fixed2_orl_cpt(ident_t *id_ref, int gtid, short *lhs,
1226
short rhs, int flag);
1227
kmp_int32 __kmpc_atomic_fixed4_andl_cpt(ident_t *id_ref, int gtid,
1228
kmp_int32 *lhs, kmp_int32 rhs,
1229
int flag);
1230
kmp_int32 __kmpc_atomic_fixed4_orl_cpt(ident_t *id_ref, int gtid,
1231
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1232
kmp_int64 __kmpc_atomic_fixed8_andl_cpt(ident_t *id_ref, int gtid,
1233
kmp_int64 *lhs, kmp_int64 rhs,
1234
int flag);
1235
kmp_int64 __kmpc_atomic_fixed8_orl_cpt(ident_t *id_ref, int gtid,
1236
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1237
// MIN / MAX
1238
char __kmpc_atomic_fixed1_max_cpt(ident_t *id_ref, int gtid, char *lhs,
1239
char rhs, int flag);
1240
char __kmpc_atomic_fixed1_min_cpt(ident_t *id_ref, int gtid, char *lhs,
1241
char rhs, int flag);
1242
short __kmpc_atomic_fixed2_max_cpt(ident_t *id_ref, int gtid, short *lhs,
1243
short rhs, int flag);
1244
short __kmpc_atomic_fixed2_min_cpt(ident_t *id_ref, int gtid, short *lhs,
1245
short rhs, int flag);
1246
kmp_int32 __kmpc_atomic_fixed4_max_cpt(ident_t *id_ref, int gtid,
1247
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1248
kmp_int32 __kmpc_atomic_fixed4_min_cpt(ident_t *id_ref, int gtid,
1249
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1250
kmp_int64 __kmpc_atomic_fixed8_max_cpt(ident_t *id_ref, int gtid,
1251
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1252
kmp_int64 __kmpc_atomic_fixed8_min_cpt(ident_t *id_ref, int gtid,
1253
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1254
kmp_real32 __kmpc_atomic_float4_max_cpt(ident_t *id_ref, int gtid,
1255
kmp_real32 *lhs, kmp_real32 rhs,
1256
int flag);
1257
kmp_real32 __kmpc_atomic_float4_min_cpt(ident_t *id_ref, int gtid,
1258
kmp_real32 *lhs, kmp_real32 rhs,
1259
int flag);
1260
kmp_real64 __kmpc_atomic_float8_max_cpt(ident_t *id_ref, int gtid,
1261
kmp_real64 *lhs, kmp_real64 rhs,
1262
int flag);
1263
kmp_real64 __kmpc_atomic_float8_min_cpt(ident_t *id_ref, int gtid,
1264
kmp_real64 *lhs, kmp_real64 rhs,
1265
int flag);
1266
long double __kmpc_atomic_float10_max_cpt(ident_t *id_ref, int gtid,
1267
long double *lhs, long double rhs,
1268
int flag);
1269
long double __kmpc_atomic_float10_min_cpt(ident_t *id_ref, int gtid,
1270
long double *lhs, long double rhs,
1271
int flag);
1272
#if KMP_HAVE_QUAD
1273
QUAD_LEGACY __kmpc_atomic_float16_max_cpt(ident_t *id_ref, int gtid,
1274
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1275
int flag);
1276
QUAD_LEGACY __kmpc_atomic_float16_min_cpt(ident_t *id_ref, int gtid,
1277
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1278
int flag);
1279
#endif
1280
// .NEQV. (same as xor)
1281
char __kmpc_atomic_fixed1_neqv_cpt(ident_t *id_ref, int gtid, char *lhs,
1282
char rhs, int flag);
1283
short __kmpc_atomic_fixed2_neqv_cpt(ident_t *id_ref, int gtid, short *lhs,
1284
short rhs, int flag);
1285
kmp_int32 __kmpc_atomic_fixed4_neqv_cpt(ident_t *id_ref, int gtid,
1286
kmp_int32 *lhs, kmp_int32 rhs,
1287
int flag);
1288
kmp_int64 __kmpc_atomic_fixed8_neqv_cpt(ident_t *id_ref, int gtid,
1289
kmp_int64 *lhs, kmp_int64 rhs,
1290
int flag);
1291
// .EQV. (same as ~xor)
1292
char __kmpc_atomic_fixed1_eqv_cpt(ident_t *id_ref, int gtid, char *lhs,
1293
char rhs, int flag);
1294
short __kmpc_atomic_fixed2_eqv_cpt(ident_t *id_ref, int gtid, short *lhs,
1295
short rhs, int flag);
1296
kmp_int32 __kmpc_atomic_fixed4_eqv_cpt(ident_t *id_ref, int gtid,
1297
kmp_int32 *lhs, kmp_int32 rhs, int flag);
1298
kmp_int64 __kmpc_atomic_fixed8_eqv_cpt(ident_t *id_ref, int gtid,
1299
kmp_int64 *lhs, kmp_int64 rhs, int flag);
1300
// long double type
1301
long double __kmpc_atomic_float10_add_cpt(ident_t *id_ref, int gtid,
1302
long double *lhs, long double rhs,
1303
int flag);
1304
long double __kmpc_atomic_float10_sub_cpt(ident_t *id_ref, int gtid,
1305
long double *lhs, long double rhs,
1306
int flag);
1307
long double __kmpc_atomic_float10_mul_cpt(ident_t *id_ref, int gtid,
1308
long double *lhs, long double rhs,
1309
int flag);
1310
long double __kmpc_atomic_float10_div_cpt(ident_t *id_ref, int gtid,
1311
long double *lhs, long double rhs,
1312
int flag);
1313
#if KMP_HAVE_QUAD
1314
// _Quad type
1315
QUAD_LEGACY __kmpc_atomic_float16_add_cpt(ident_t *id_ref, int gtid,
1316
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1317
int flag);
1318
QUAD_LEGACY __kmpc_atomic_float16_sub_cpt(ident_t *id_ref, int gtid,
1319
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1320
int flag);
1321
QUAD_LEGACY __kmpc_atomic_float16_mul_cpt(ident_t *id_ref, int gtid,
1322
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1323
int flag);
1324
QUAD_LEGACY __kmpc_atomic_float16_div_cpt(ident_t *id_ref, int gtid,
1325
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1326
int flag);
1327
#endif
1328
// routines for complex types
1329
// Workaround for cmplx4 routines - return void; captured value is returned via
1330
// the argument
1331
void __kmpc_atomic_cmplx4_add_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1332
kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1333
void __kmpc_atomic_cmplx4_sub_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1334
kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1335
void __kmpc_atomic_cmplx4_mul_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1336
kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1337
void __kmpc_atomic_cmplx4_div_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1338
kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);
1339
kmp_cmplx64 __kmpc_atomic_cmplx8_add_cpt(ident_t *id_ref, int gtid,
1340
kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1341
int flag);
1342
kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt(ident_t *id_ref, int gtid,
1343
kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1344
int flag);
1345
kmp_cmplx64 __kmpc_atomic_cmplx8_mul_cpt(ident_t *id_ref, int gtid,
1346
kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1347
int flag);
1348
kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt(ident_t *id_ref, int gtid,
1349
kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1350
int flag);
1351
kmp_cmplx80 __kmpc_atomic_cmplx10_add_cpt(ident_t *id_ref, int gtid,
1352
kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1353
int flag);
1354
kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt(ident_t *id_ref, int gtid,
1355
kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1356
int flag);
1357
kmp_cmplx80 __kmpc_atomic_cmplx10_mul_cpt(ident_t *id_ref, int gtid,
1358
kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1359
int flag);
1360
kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt(ident_t *id_ref, int gtid,
1361
kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1362
int flag);
1363
#if KMP_HAVE_QUAD
1364
CPLX128_LEG __kmpc_atomic_cmplx16_add_cpt(ident_t *id_ref, int gtid,
1365
CPLX128_LEG *lhs, CPLX128_LEG rhs,
1366
int flag);
1367
CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt(ident_t *id_ref, int gtid,
1368
CPLX128_LEG *lhs, CPLX128_LEG rhs,
1369
int flag);
1370
CPLX128_LEG __kmpc_atomic_cmplx16_mul_cpt(ident_t *id_ref, int gtid,
1371
CPLX128_LEG *lhs, CPLX128_LEG rhs,
1372
int flag);
1373
CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt(ident_t *id_ref, int gtid,
1374
CPLX128_LEG *lhs, CPLX128_LEG rhs,
1375
int flag);
1376
#if (KMP_ARCH_X86)
1377
// Routines with 16-byte arguments aligned to 16-byte boundary
1378
Quad_a16_t __kmpc_atomic_float16_add_a16_cpt(ident_t *id_ref, int gtid,
1379
Quad_a16_t *lhs, Quad_a16_t rhs,
1380
int flag);
1381
Quad_a16_t __kmpc_atomic_float16_sub_a16_cpt(ident_t *id_ref, int gtid,
1382
Quad_a16_t *lhs, Quad_a16_t rhs,
1383
int flag);
1384
Quad_a16_t __kmpc_atomic_float16_mul_a16_cpt(ident_t *id_ref, int gtid,
1385
Quad_a16_t *lhs, Quad_a16_t rhs,
1386
int flag);
1387
Quad_a16_t __kmpc_atomic_float16_div_a16_cpt(ident_t *id_ref, int gtid,
1388
Quad_a16_t *lhs, Quad_a16_t rhs,
1389
int flag);
1390
Quad_a16_t __kmpc_atomic_float16_max_a16_cpt(ident_t *id_ref, int gtid,
1391
Quad_a16_t *lhs, Quad_a16_t rhs,
1392
int flag);
1393
Quad_a16_t __kmpc_atomic_float16_min_a16_cpt(ident_t *id_ref, int gtid,
1394
Quad_a16_t *lhs, Quad_a16_t rhs,
1395
int flag);
1396
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_add_a16_cpt(ident_t *id_ref, int gtid,
1397
kmp_cmplx128_a16_t *lhs,
1398
kmp_cmplx128_a16_t rhs,
1399
int flag);
1400
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_sub_a16_cpt(ident_t *id_ref, int gtid,
1401
kmp_cmplx128_a16_t *lhs,
1402
kmp_cmplx128_a16_t rhs,
1403
int flag);
1404
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_mul_a16_cpt(ident_t *id_ref, int gtid,
1405
kmp_cmplx128_a16_t *lhs,
1406
kmp_cmplx128_a16_t rhs,
1407
int flag);
1408
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_div_a16_cpt(ident_t *id_ref, int gtid,
1409
kmp_cmplx128_a16_t *lhs,
1410
kmp_cmplx128_a16_t rhs,
1411
int flag);
1412
#endif
1413
#endif
1414
1415
void __kmpc_atomic_start(void);
1416
void __kmpc_atomic_end(void);
1417
1418
// OpenMP 4.0: v = x = expr binop x; { v = x; x = expr binop x; } { x = expr
1419
// binop x; v = x; } for non-commutative operations.
1420
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
1421
char __kmpc_atomic_fixed1_sub_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1422
char rhs, int flag);
1423
char __kmpc_atomic_fixed1_div_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1424
char rhs, int flag);
1425
unsigned char __kmpc_atomic_fixed1u_div_cpt_rev(ident_t *id_ref, int gtid,
1426
unsigned char *lhs,
1427
unsigned char rhs, int flag);
1428
char __kmpc_atomic_fixed1_shl_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1429
char rhs, int flag);
1430
char __kmpc_atomic_fixed1_shr_cpt_rev(ident_t *id_ref, int gtid, char *lhs,
1431
char rhs, int flag);
1432
unsigned char __kmpc_atomic_fixed1u_shr_cpt_rev(ident_t *id_ref, int gtid,
1433
unsigned char *lhs,
1434
unsigned char rhs, int flag);
1435
short __kmpc_atomic_fixed2_sub_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1436
short rhs, int flag);
1437
short __kmpc_atomic_fixed2_div_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1438
short rhs, int flag);
1439
unsigned short __kmpc_atomic_fixed2u_div_cpt_rev(ident_t *id_ref, int gtid,
1440
unsigned short *lhs,
1441
unsigned short rhs, int flag);
1442
short __kmpc_atomic_fixed2_shl_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1443
short rhs, int flag);
1444
short __kmpc_atomic_fixed2_shr_cpt_rev(ident_t *id_ref, int gtid, short *lhs,
1445
short rhs, int flag);
1446
unsigned short __kmpc_atomic_fixed2u_shr_cpt_rev(ident_t *id_ref, int gtid,
1447
unsigned short *lhs,
1448
unsigned short rhs, int flag);
1449
kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev(ident_t *id_ref, int gtid,
1450
kmp_int32 *lhs, kmp_int32 rhs,
1451
int flag);
1452
kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev(ident_t *id_ref, int gtid,
1453
kmp_int32 *lhs, kmp_int32 rhs,
1454
int flag);
1455
kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev(ident_t *id_ref, int gtid,
1456
kmp_uint32 *lhs, kmp_uint32 rhs,
1457
int flag);
1458
kmp_int32 __kmpc_atomic_fixed4_shl_cpt_rev(ident_t *id_ref, int gtid,
1459
kmp_int32 *lhs, kmp_int32 rhs,
1460
int flag);
1461
kmp_int32 __kmpc_atomic_fixed4_shr_cpt_rev(ident_t *id_ref, int gtid,
1462
kmp_int32 *lhs, kmp_int32 rhs,
1463
int flag);
1464
kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt_rev(ident_t *id_ref, int gtid,
1465
kmp_uint32 *lhs, kmp_uint32 rhs,
1466
int flag);
1467
kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev(ident_t *id_ref, int gtid,
1468
kmp_int64 *lhs, kmp_int64 rhs,
1469
int flag);
1470
kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev(ident_t *id_ref, int gtid,
1471
kmp_int64 *lhs, kmp_int64 rhs,
1472
int flag);
1473
kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev(ident_t *id_ref, int gtid,
1474
kmp_uint64 *lhs, kmp_uint64 rhs,
1475
int flag);
1476
kmp_int64 __kmpc_atomic_fixed8_shl_cpt_rev(ident_t *id_ref, int gtid,
1477
kmp_int64 *lhs, kmp_int64 rhs,
1478
int flag);
1479
kmp_int64 __kmpc_atomic_fixed8_shr_cpt_rev(ident_t *id_ref, int gtid,
1480
kmp_int64 *lhs, kmp_int64 rhs,
1481
int flag);
1482
kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt_rev(ident_t *id_ref, int gtid,
1483
kmp_uint64 *lhs, kmp_uint64 rhs,
1484
int flag);
1485
float __kmpc_atomic_float4_sub_cpt_rev(ident_t *id_ref, int gtid, float *lhs,
1486
float rhs, int flag);
1487
float __kmpc_atomic_float4_div_cpt_rev(ident_t *id_ref, int gtid, float *lhs,
1488
float rhs, int flag);
1489
double __kmpc_atomic_float8_sub_cpt_rev(ident_t *id_ref, int gtid, double *lhs,
1490
double rhs, int flag);
1491
double __kmpc_atomic_float8_div_cpt_rev(ident_t *id_ref, int gtid, double *lhs,
1492
double rhs, int flag);
1493
long double __kmpc_atomic_float10_sub_cpt_rev(ident_t *id_ref, int gtid,
1494
long double *lhs, long double rhs,
1495
int flag);
1496
long double __kmpc_atomic_float10_div_cpt_rev(ident_t *id_ref, int gtid,
1497
long double *lhs, long double rhs,
1498
int flag);
1499
#if KMP_HAVE_QUAD
1500
QUAD_LEGACY __kmpc_atomic_float16_sub_cpt_rev(ident_t *id_ref, int gtid,
1501
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1502
int flag);
1503
QUAD_LEGACY __kmpc_atomic_float16_div_cpt_rev(ident_t *id_ref, int gtid,
1504
QUAD_LEGACY *lhs, QUAD_LEGACY rhs,
1505
int flag);
1506
#endif
1507
// Workaround for cmplx4 routines - return void; captured value is returned via
1508
// the argument
1509
void __kmpc_atomic_cmplx4_sub_cpt_rev(ident_t *id_ref, int gtid,
1510
kmp_cmplx32 *lhs, kmp_cmplx32 rhs,
1511
kmp_cmplx32 *out, int flag);
1512
void __kmpc_atomic_cmplx4_div_cpt_rev(ident_t *id_ref, int gtid,
1513
kmp_cmplx32 *lhs, kmp_cmplx32 rhs,
1514
kmp_cmplx32 *out, int flag);
1515
kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt_rev(ident_t *id_ref, int gtid,
1516
kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1517
int flag);
1518
kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt_rev(ident_t *id_ref, int gtid,
1519
kmp_cmplx64 *lhs, kmp_cmplx64 rhs,
1520
int flag);
1521
kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt_rev(ident_t *id_ref, int gtid,
1522
kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1523
int flag);
1524
kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt_rev(ident_t *id_ref, int gtid,
1525
kmp_cmplx80 *lhs, kmp_cmplx80 rhs,
1526
int flag);
1527
#if KMP_HAVE_QUAD
1528
CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt_rev(ident_t *id_ref, int gtid,
1529
CPLX128_LEG *lhs, CPLX128_LEG rhs,
1530
int flag);
1531
CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt_rev(ident_t *id_ref, int gtid,
1532
CPLX128_LEG *lhs, CPLX128_LEG rhs,
1533
int flag);
1534
#if (KMP_ARCH_X86)
1535
Quad_a16_t __kmpc_atomic_float16_sub_a16_cpt_rev(ident_t *id_ref, int gtid,
1536
Quad_a16_t *lhs,
1537
Quad_a16_t rhs, int flag);
1538
Quad_a16_t __kmpc_atomic_float16_div_a16_cpt_rev(ident_t *id_ref, int gtid,
1539
Quad_a16_t *lhs,
1540
Quad_a16_t rhs, int flag);
1541
kmp_cmplx128_a16_t
1542
__kmpc_atomic_cmplx16_sub_a16_cpt_rev(ident_t *id_ref, int gtid,
1543
kmp_cmplx128_a16_t *lhs,
1544
kmp_cmplx128_a16_t rhs, int flag);
1545
kmp_cmplx128_a16_t
1546
__kmpc_atomic_cmplx16_div_a16_cpt_rev(ident_t *id_ref, int gtid,
1547
kmp_cmplx128_a16_t *lhs,
1548
kmp_cmplx128_a16_t rhs, int flag);
1549
#endif
1550
#endif
1551
1552
// OpenMP 4.0 Capture-write (swap): {v = x; x = expr;}
1553
char __kmpc_atomic_fixed1_swp(ident_t *id_ref, int gtid, char *lhs, char rhs);
1554
short __kmpc_atomic_fixed2_swp(ident_t *id_ref, int gtid, short *lhs,
1555
short rhs);
1556
kmp_int32 __kmpc_atomic_fixed4_swp(ident_t *id_ref, int gtid, kmp_int32 *lhs,
1557
kmp_int32 rhs);
1558
kmp_int64 __kmpc_atomic_fixed8_swp(ident_t *id_ref, int gtid, kmp_int64 *lhs,
1559
kmp_int64 rhs);
1560
float __kmpc_atomic_float4_swp(ident_t *id_ref, int gtid, float *lhs,
1561
float rhs);
1562
double __kmpc_atomic_float8_swp(ident_t *id_ref, int gtid, double *lhs,
1563
double rhs);
1564
long double __kmpc_atomic_float10_swp(ident_t *id_ref, int gtid,
1565
long double *lhs, long double rhs);
1566
#if KMP_HAVE_QUAD
1567
QUAD_LEGACY __kmpc_atomic_float16_swp(ident_t *id_ref, int gtid,
1568
QUAD_LEGACY *lhs, QUAD_LEGACY rhs);
1569
#endif
1570
// !!! TODO: check if we need a workaround here
1571
void __kmpc_atomic_cmplx4_swp(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,
1572
kmp_cmplx32 rhs, kmp_cmplx32 *out);
1573
// kmp_cmplx32 __kmpc_atomic_cmplx4_swp( ident_t *id_ref, int gtid,
1574
// kmp_cmplx32 * lhs, kmp_cmplx32 rhs );
1575
1576
kmp_cmplx64 __kmpc_atomic_cmplx8_swp(ident_t *id_ref, int gtid,
1577
kmp_cmplx64 *lhs, kmp_cmplx64 rhs);
1578
kmp_cmplx80 __kmpc_atomic_cmplx10_swp(ident_t *id_ref, int gtid,
1579
kmp_cmplx80 *lhs, kmp_cmplx80 rhs);
1580
#if KMP_HAVE_QUAD
1581
CPLX128_LEG __kmpc_atomic_cmplx16_swp(ident_t *id_ref, int gtid,
1582
CPLX128_LEG *lhs, CPLX128_LEG rhs);
1583
#if (KMP_ARCH_X86)
1584
Quad_a16_t __kmpc_atomic_float16_a16_swp(ident_t *id_ref, int gtid,
1585
Quad_a16_t *lhs, Quad_a16_t rhs);
1586
kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_swp(ident_t *id_ref, int gtid,
1587
kmp_cmplx128_a16_t *lhs,
1588
kmp_cmplx128_a16_t rhs);
1589
#endif
1590
#endif
1591
1592
// Capture routines for mixed types (RHS=float16)
1593
#if KMP_HAVE_QUAD
1594
1595
char __kmpc_atomic_fixed1_add_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1596
_Quad rhs, int flag);
1597
char __kmpc_atomic_fixed1_sub_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1598
_Quad rhs, int flag);
1599
char __kmpc_atomic_fixed1_mul_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1600
_Quad rhs, int flag);
1601
char __kmpc_atomic_fixed1_div_cpt_fp(ident_t *id_ref, int gtid, char *lhs,
1602
_Quad rhs, int flag);
1603
unsigned char __kmpc_atomic_fixed1u_add_cpt_fp(ident_t *id_ref, int gtid,
1604
unsigned char *lhs, _Quad rhs,
1605
int flag);
1606
unsigned char __kmpc_atomic_fixed1u_sub_cpt_fp(ident_t *id_ref, int gtid,
1607
unsigned char *lhs, _Quad rhs,
1608
int flag);
1609
unsigned char __kmpc_atomic_fixed1u_mul_cpt_fp(ident_t *id_ref, int gtid,
1610
unsigned char *lhs, _Quad rhs,
1611
int flag);
1612
unsigned char __kmpc_atomic_fixed1u_div_cpt_fp(ident_t *id_ref, int gtid,
1613
unsigned char *lhs, _Quad rhs,
1614
int flag);
1615
1616
short __kmpc_atomic_fixed2_add_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1617
_Quad rhs, int flag);
1618
short __kmpc_atomic_fixed2_sub_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1619
_Quad rhs, int flag);
1620
short __kmpc_atomic_fixed2_mul_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1621
_Quad rhs, int flag);
1622
short __kmpc_atomic_fixed2_div_cpt_fp(ident_t *id_ref, int gtid, short *lhs,
1623
_Quad rhs, int flag);
1624
unsigned short __kmpc_atomic_fixed2u_add_cpt_fp(ident_t *id_ref, int gtid,
1625
unsigned short *lhs, _Quad rhs,
1626
int flag);
1627
unsigned short __kmpc_atomic_fixed2u_sub_cpt_fp(ident_t *id_ref, int gtid,
1628
unsigned short *lhs, _Quad rhs,
1629
int flag);
1630
unsigned short __kmpc_atomic_fixed2u_mul_cpt_fp(ident_t *id_ref, int gtid,
1631
unsigned short *lhs, _Quad rhs,
1632
int flag);
1633
unsigned short __kmpc_atomic_fixed2u_div_cpt_fp(ident_t *id_ref, int gtid,
1634
unsigned short *lhs, _Quad rhs,
1635
int flag);
1636
1637
kmp_int32 __kmpc_atomic_fixed4_add_cpt_fp(ident_t *id_ref, int gtid,
1638
kmp_int32 *lhs, _Quad rhs, int flag);
1639
kmp_int32 __kmpc_atomic_fixed4_sub_cpt_fp(ident_t *id_ref, int gtid,
1640
kmp_int32 *lhs, _Quad rhs, int flag);
1641
kmp_int32 __kmpc_atomic_fixed4_mul_cpt_fp(ident_t *id_ref, int gtid,
1642
kmp_int32 *lhs, _Quad rhs, int flag);
1643
kmp_int32 __kmpc_atomic_fixed4_div_cpt_fp(ident_t *id_ref, int gtid,
1644
kmp_int32 *lhs, _Quad rhs, int flag);
1645
kmp_uint32 __kmpc_atomic_fixed4u_add_cpt_fp(ident_t *id_ref, int gtid,
1646
kmp_uint32 *lhs, _Quad rhs,
1647
int flag);
1648
kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_fp(ident_t *id_ref, int gtid,
1649
kmp_uint32 *lhs, _Quad rhs,
1650
int flag);
1651
kmp_uint32 __kmpc_atomic_fixed4u_mul_cpt_fp(ident_t *id_ref, int gtid,
1652
kmp_uint32 *lhs, _Quad rhs,
1653
int flag);
1654
kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_fp(ident_t *id_ref, int gtid,
1655
kmp_uint32 *lhs, _Quad rhs,
1656
int flag);
1657
1658
kmp_int64 __kmpc_atomic_fixed8_add_cpt_fp(ident_t *id_ref, int gtid,
1659
kmp_int64 *lhs, _Quad rhs, int flag);
1660
kmp_int64 __kmpc_atomic_fixed8_sub_cpt_fp(ident_t *id_ref, int gtid,
1661
kmp_int64 *lhs, _Quad rhs, int flag);
1662
kmp_int64 __kmpc_atomic_fixed8_mul_cpt_fp(ident_t *id_ref, int gtid,
1663
kmp_int64 *lhs, _Quad rhs, int flag);
1664
kmp_int64 __kmpc_atomic_fixed8_div_cpt_fp(ident_t *id_ref, int gtid,
1665
kmp_int64 *lhs, _Quad rhs, int flag);
1666
kmp_uint64 __kmpc_atomic_fixed8u_add_cpt_fp(ident_t *id_ref, int gtid,
1667
kmp_uint64 *lhs, _Quad rhs,
1668
int flag);
1669
kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_fp(ident_t *id_ref, int gtid,
1670
kmp_uint64 *lhs, _Quad rhs,
1671
int flag);
1672
kmp_uint64 __kmpc_atomic_fixed8u_mul_cpt_fp(ident_t *id_ref, int gtid,
1673
kmp_uint64 *lhs, _Quad rhs,
1674
int flag);
1675
kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_fp(ident_t *id_ref, int gtid,
1676
kmp_uint64 *lhs, _Quad rhs,
1677
int flag);
1678
1679
float __kmpc_atomic_float4_add_cpt_fp(ident_t *id_ref, int gtid,
1680
kmp_real32 *lhs, _Quad rhs, int flag);
1681
float __kmpc_atomic_float4_sub_cpt_fp(ident_t *id_ref, int gtid,
1682
kmp_real32 *lhs, _Quad rhs, int flag);
1683
float __kmpc_atomic_float4_mul_cpt_fp(ident_t *id_ref, int gtid,
1684
kmp_real32 *lhs, _Quad rhs, int flag);
1685
float __kmpc_atomic_float4_div_cpt_fp(ident_t *id_ref, int gtid,
1686
kmp_real32 *lhs, _Quad rhs, int flag);
1687
1688
double __kmpc_atomic_float8_add_cpt_fp(ident_t *id_ref, int gtid,
1689
kmp_real64 *lhs, _Quad rhs, int flag);
1690
double __kmpc_atomic_float8_sub_cpt_fp(ident_t *id_ref, int gtid,
1691
kmp_real64 *lhs, _Quad rhs, int flag);
1692
double __kmpc_atomic_float8_mul_cpt_fp(ident_t *id_ref, int gtid,
1693
kmp_real64 *lhs, _Quad rhs, int flag);
1694
double __kmpc_atomic_float8_div_cpt_fp(ident_t *id_ref, int gtid,
1695
kmp_real64 *lhs, _Quad rhs, int flag);
1696
1697
long double __kmpc_atomic_float10_add_cpt_fp(ident_t *id_ref, int gtid,
1698
long double *lhs, _Quad rhs,
1699
int flag);
1700
long double __kmpc_atomic_float10_sub_cpt_fp(ident_t *id_ref, int gtid,
1701
long double *lhs, _Quad rhs,
1702
int flag);
1703
long double __kmpc_atomic_float10_mul_cpt_fp(ident_t *id_ref, int gtid,
1704
long double *lhs, _Quad rhs,
1705
int flag);
1706
long double __kmpc_atomic_float10_div_cpt_fp(ident_t *id_ref, int gtid,
1707
long double *lhs, _Quad rhs,
1708
int flag);
1709
1710
char __kmpc_atomic_fixed1_sub_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,
1711
_Quad rhs, int flag);
1712
unsigned char __kmpc_atomic_fixed1u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1713
unsigned char *lhs,
1714
_Quad rhs, int flag);
1715
char __kmpc_atomic_fixed1_div_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,
1716
_Quad rhs, int flag);
1717
unsigned char __kmpc_atomic_fixed1u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1718
unsigned char *lhs,
1719
_Quad rhs, int flag);
1720
short __kmpc_atomic_fixed2_sub_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,
1721
_Quad rhs, int flag);
1722
unsigned short __kmpc_atomic_fixed2u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1723
unsigned short *lhs,
1724
_Quad rhs, int flag);
1725
short __kmpc_atomic_fixed2_div_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,
1726
_Quad rhs, int flag);
1727
unsigned short __kmpc_atomic_fixed2u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1728
unsigned short *lhs,
1729
_Quad rhs, int flag);
1730
kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1731
kmp_int32 *lhs, _Quad rhs,
1732
int flag);
1733
kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1734
kmp_uint32 *lhs, _Quad rhs,
1735
int flag);
1736
kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1737
kmp_int32 *lhs, _Quad rhs,
1738
int flag);
1739
kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1740
kmp_uint32 *lhs, _Quad rhs,
1741
int flag);
1742
kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1743
kmp_int64 *lhs, _Quad rhs,
1744
int flag);
1745
kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1746
kmp_uint64 *lhs, _Quad rhs,
1747
int flag);
1748
kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1749
kmp_int64 *lhs, _Quad rhs,
1750
int flag);
1751
kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1752
kmp_uint64 *lhs, _Quad rhs,
1753
int flag);
1754
float __kmpc_atomic_float4_sub_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,
1755
_Quad rhs, int flag);
1756
float __kmpc_atomic_float4_div_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,
1757
_Quad rhs, int flag);
1758
double __kmpc_atomic_float8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1759
double *lhs, _Quad rhs, int flag);
1760
double __kmpc_atomic_float8_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1761
double *lhs, _Quad rhs, int flag);
1762
long double __kmpc_atomic_float10_sub_cpt_rev_fp(ident_t *id_ref, int gtid,
1763
long double *lhs, _Quad rhs,
1764
int flag);
1765
long double __kmpc_atomic_float10_div_cpt_rev_fp(ident_t *id_ref, int gtid,
1766
long double *lhs, _Quad rhs,
1767
int flag);
1768
1769
#endif // KMP_HAVE_QUAD
1770
1771
// End of OpenMP 4.0 capture
1772
1773
// OpenMP 5.1 compare and swap
1774
/*
1775
__kmpc_atomic_bool_1_cas
1776
__kmpc_atomic_bool_2_cas
1777
__kmpc_atomic_bool_4_cas
1778
__kmpc_atomic_bool_8_cas
1779
__kmpc_atomic_val_1_cas
1780
__kmpc_atomic_val_2_cas
1781
__kmpc_atomic_val_4_cas
1782
__kmpc_atomic_val_8_cas
1783
__kmpc_atomic_bool_1_cas_cpt
1784
__kmpc_atomic_bool_2_cas_cpt
1785
__kmpc_atomic_bool_4_cas_cpt
1786
__kmpc_atomic_bool_8_cas_cpt
1787
__kmpc_atomic_val_1_cas_cpt
1788
__kmpc_atomic_val_2_cas_cpt
1789
__kmpc_atomic_val_4_cas_cpt
1790
__kmpc_atomic_val_8_cas_cpt
1791
*/
1792
// In all interfaces of CAS (Compare And Swap):
1793
// r is the boolean result of comparison
1794
// x is memory location to operate on
1795
// e is expected (old) value
1796
// d is desired (new) value
1797
// pv is pointer to captured value v whose location may coincide with e
1798
1799
// { r = x == e; if(r) { x = d; } }
1800
// functions return result of comparison
1801
bool __kmpc_atomic_bool_1_cas(ident_t *loc, int gtid, char *x, char e, char d);
1802
bool __kmpc_atomic_bool_2_cas(ident_t *loc, int gtid, short *x, short e,
1803
short d);
1804
bool __kmpc_atomic_bool_4_cas(ident_t *loc, int gtid, kmp_int32 *x, kmp_int32 e,
1805
kmp_int32 d);
1806
bool __kmpc_atomic_bool_8_cas(ident_t *loc, int gtid, kmp_int64 *x, kmp_int64 e,
1807
kmp_int64 d);
1808
1809
// { v = x; if (x == e) { x = d; } }
1810
// functions return old value
1811
char __kmpc_atomic_val_1_cas(ident_t *loc, int gtid, char *x, char e, char d);
1812
short __kmpc_atomic_val_2_cas(ident_t *loc, int gtid, short *x, short e,
1813
short d);
1814
kmp_int32 __kmpc_atomic_val_4_cas(ident_t *loc, int gtid, kmp_int32 *x,
1815
kmp_int32 e, kmp_int32 d);
1816
kmp_int64 __kmpc_atomic_val_8_cas(ident_t *loc, int gtid, kmp_int64 *x,
1817
kmp_int64 e, kmp_int64 d);
1818
1819
// { r = x == e; if(r) { x = d; } else { v = x; } }
1820
// v gets old value if comparison failed, untouched otherwise
1821
// functions return result of comparison
1822
bool __kmpc_atomic_bool_1_cas_cpt(ident_t *loc, int gtid, char *x, char e,
1823
char d, char *pv);
1824
bool __kmpc_atomic_bool_2_cas_cpt(ident_t *loc, int gtid, short *x, short e,
1825
short d, short *pv);
1826
bool __kmpc_atomic_bool_4_cas_cpt(ident_t *loc, int gtid, kmp_int32 *x,
1827
kmp_int32 e, kmp_int32 d, kmp_int32 *pv);
1828
bool __kmpc_atomic_bool_8_cas_cpt(ident_t *loc, int gtid, kmp_int64 *x,
1829
kmp_int64 e, kmp_int64 d, kmp_int64 *pv);
1830
1831
// { if (x == e) { x = d; }; v = x; }
1832
// v gets old value if comparison failed, new value otherwise
1833
// functions return old value
1834
char __kmpc_atomic_val_1_cas_cpt(ident_t *loc, int gtid, char *x, char e,
1835
char d, char *pv);
1836
short __kmpc_atomic_val_2_cas_cpt(ident_t *loc, int gtid, short *x, short e,
1837
short d, short *pv);
1838
kmp_int32 __kmpc_atomic_val_4_cas_cpt(ident_t *loc, int gtid, kmp_int32 *x,
1839
kmp_int32 e, kmp_int32 d, kmp_int32 *pv);
1840
kmp_int64 __kmpc_atomic_val_8_cas_cpt(ident_t *loc, int gtid, kmp_int64 *x,
1841
kmp_int64 e, kmp_int64 d, kmp_int64 *pv);
1842
1843
// End OpenMP 5.1 compare + capture
1844
1845
#endif // KMP_ARCH_X86 || KMP_ARCH_X86_64
1846
1847
/* ------------------------------------------------------------------------ */
1848
1849
#ifdef __cplusplus
1850
} // extern "C"
1851
#endif
1852
1853
#endif /* KMP_ATOMIC_H */
1854
1855
// end of file
1856
1857