1856 lines · c
1/*2 * kmp_atomic.h - ATOMIC header file3 */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-exception10//11//===----------------------------------------------------------------------===//12 13#ifndef KMP_ATOMIC_H14#define KMP_ATOMIC_H15 16#include "kmp_lock.h"17#include "kmp_os.h"18 19#if OMPT_SUPPORT20#include "ompt-specific.h"21#endif22 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_3227// 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 types34 35// Visual Studio cannot have function parameters that have the36// align __declspec attribute, so we must remove it. (Compiler Error C2719)37#if KMP_COMPILER_MSVC38#undef KMP_DO_ALIGN39#define KMP_DO_ALIGN(alignment) /* Nothing */40#endif41 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 tests45// compiled with /MDd option (the library itself built with /MTd),46#undef _DEBUG47#define _DEBUG_TEMPORARILY_UNSET_48#endif49 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// complex867struct __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// complex486struct __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// complex10153struct 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// complex16173#if KMP_HAVE_QUAD174struct __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 now196#define _DEBUG 1197#endif198 199#else200// create shortcuts for c99 complex types201typedef float _Complex kmp_cmplx32;202typedef double _Complex kmp_cmplx64;203typedef long double _Complex kmp_cmplx80;204#if KMP_HAVE_QUAD205typedef _Quad _Complex kmp_cmplx128;206#endif207#endif208 209// Compiler 12.0 changed alignment of 16 and 32-byte arguments (like _Quad210// and kmp_cmplx128) on IA-32 architecture. The following aligned structures211// are implemented to support the old alignment in 10.1, 11.0, 11.1 and212// introduce the new alignment in 12.0. See CQ88405.213#if KMP_ARCH_X86 && KMP_HAVE_QUAD214 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#endif257 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#endif323 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#endif349 350#if (KMP_ARCH_X86)351#define QUAD_LEGACY Quad_a4_t352#define CPLX128_LEG kmp_cmplx128_a4_t353#else354#define QUAD_LEGACY _Quad355#define CPLX128_LEG kmp_cmplx128356#endif357 358#ifdef __cplusplus359extern "C" {360#endif361 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_OPTIONAL370 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#endif376 377 __kmp_acquire_queuing_lock(lck, gtid);378 379#if OMPT_SUPPORT && OMPT_OPTIONAL380 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#endif386}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_OPTIONAL397 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#endif403}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 Locks414extern kmp_atomic_lock_t __kmp_atomic_lock; /* Control access to all user coded415 atomics in Gnu compat mode */416extern kmp_atomic_lock_t __kmp_atomic_lock_1i; /* Control access to all user417 coded atomics for 1-byte fixed418 data types */419extern kmp_atomic_lock_t __kmp_atomic_lock_2i; /* Control access to all user420 coded atomics for 2-byte fixed421 data types */422extern kmp_atomic_lock_t __kmp_atomic_lock_4i; /* Control access to all user423 coded atomics for 4-byte fixed424 data types */425extern kmp_atomic_lock_t __kmp_atomic_lock_4r; /* Control access to all user426 coded atomics for kmp_real32427 data type */428extern kmp_atomic_lock_t __kmp_atomic_lock_8i; /* Control access to all user429 coded atomics for 8-byte fixed430 data types */431extern kmp_atomic_lock_t __kmp_atomic_lock_8r; /* Control access to all user432 coded atomics for kmp_real64433 data type */434extern kmp_atomic_lock_t435 __kmp_atomic_lock_8c; /* Control access to all user coded atomics for436 complex byte data type */437extern kmp_atomic_lock_t438 __kmp_atomic_lock_10r; /* Control access to all user coded atomics for long439 double data type */440extern kmp_atomic_lock_t __kmp_atomic_lock_16r; /* Control access to all user441 coded atomics for _Quad data442 type */443extern kmp_atomic_lock_t __kmp_atomic_lock_16c; /* Control access to all user444 coded atomics for double445 complex data type*/446extern kmp_atomic_lock_t447 __kmp_atomic_lock_20c; /* Control access to all user coded atomics for long448 double complex type*/449extern kmp_atomic_lock_t __kmp_atomic_lock_32c; /* Control access to all user450 coded atomics for _Quad451 complex data type */452 453// Below routines for atomic UPDATE are listed454 455// 1-byte456void __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-byte470void __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 fixed485void __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 float490void __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 fixed495void __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 float500void __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 fixed505void __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 fixed524void __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 float543void __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 float548void __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 / MAX567void __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_QUAD592void __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-32598// architecture only599void __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#endif604#endif605// .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 type621void __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 type630#if KMP_HAVE_QUAD631void __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 boundary641void __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#endif650#endif651// routines for complex types652void __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_QUAD677void __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 boundary687void __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#endif700#endif701 702// OpenMP 4.0: x = expr binop x for non-commutative operations.703// Supported only on IA-32 architecture and Intel(R) 64704#if KMP_ARCH_X86 || KMP_ARCH_X86_64705 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_QUAD767void __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#endif772void __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_QUAD785void __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 boundary791void __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#endif802#endif // KMP_HAVE_QUAD803 804#endif // KMP_ARCH_X86 || KMP_ARCH_X86_64805 806// routines for mixed types807 808// RHS=float8809void __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 not835// use them)836#if KMP_HAVE_QUAD837void __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 operations933void __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_QUAD979 980// RHS=cmplx8981void __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 routines991void __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, CAPTURE1009 1010// Below routines for atomic READ are listed1011char __kmpc_atomic_fixed1_rd(ident_t *id_ref, int gtid, char *loc);1012short __kmpc_atomic_fixed2_rd(ident_t *id_ref, int gtid, short *loc);1013kmp_int32 __kmpc_atomic_fixed4_rd(ident_t *id_ref, int gtid, kmp_int32 *loc);1014kmp_int64 __kmpc_atomic_fixed8_rd(ident_t *id_ref, int gtid, kmp_int64 *loc);1015kmp_real32 __kmpc_atomic_float4_rd(ident_t *id_ref, int gtid, kmp_real32 *loc);1016kmp_real64 __kmpc_atomic_float8_rd(ident_t *id_ref, int gtid, kmp_real64 *loc);1017long double __kmpc_atomic_float10_rd(ident_t *id_ref, int gtid,1018 long double *loc);1019#if KMP_HAVE_QUAD1020QUAD_LEGACY __kmpc_atomic_float16_rd(ident_t *id_ref, int gtid,1021 QUAD_LEGACY *loc);1022#endif1023// Fix for CQ220361: cmplx4 READ will return void on Windows* OS; read value1024// will be returned through an additional parameter1025#if (KMP_OS_WINDOWS)1026void __kmpc_atomic_cmplx4_rd(kmp_cmplx32 *out, ident_t *id_ref, int gtid,1027 kmp_cmplx32 *loc);1028#else1029kmp_cmplx32 __kmpc_atomic_cmplx4_rd(ident_t *id_ref, int gtid,1030 kmp_cmplx32 *loc);1031#endif1032kmp_cmplx64 __kmpc_atomic_cmplx8_rd(ident_t *id_ref, int gtid,1033 kmp_cmplx64 *loc);1034kmp_cmplx80 __kmpc_atomic_cmplx10_rd(ident_t *id_ref, int gtid,1035 kmp_cmplx80 *loc);1036#if KMP_HAVE_QUAD1037CPLX128_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 boundary1041Quad_a16_t __kmpc_atomic_float16_a16_rd(ident_t *id_ref, int gtid,1042 Quad_a16_t *loc);1043kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_rd(ident_t *id_ref, int gtid,1044 kmp_cmplx128_a16_t *loc);1045#endif1046#endif1047 1048// Below routines for atomic WRITE are listed1049void __kmpc_atomic_fixed1_wr(ident_t *id_ref, int gtid, char *lhs, char rhs);1050void __kmpc_atomic_fixed2_wr(ident_t *id_ref, int gtid, short *lhs, short rhs);1051void __kmpc_atomic_fixed4_wr(ident_t *id_ref, int gtid, kmp_int32 *lhs,1052 kmp_int32 rhs);1053void __kmpc_atomic_fixed8_wr(ident_t *id_ref, int gtid, kmp_int64 *lhs,1054 kmp_int64 rhs);1055void __kmpc_atomic_float4_wr(ident_t *id_ref, int gtid, kmp_real32 *lhs,1056 kmp_real32 rhs);1057void __kmpc_atomic_float8_wr(ident_t *id_ref, int gtid, kmp_real64 *lhs,1058 kmp_real64 rhs);1059void __kmpc_atomic_float10_wr(ident_t *id_ref, int gtid, long double *lhs,1060 long double rhs);1061#if KMP_HAVE_QUAD1062void __kmpc_atomic_float16_wr(ident_t *id_ref, int gtid, QUAD_LEGACY *lhs,1063 QUAD_LEGACY rhs);1064#endif1065void __kmpc_atomic_cmplx4_wr(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,1066 kmp_cmplx32 rhs);1067void __kmpc_atomic_cmplx8_wr(ident_t *id_ref, int gtid, kmp_cmplx64 *lhs,1068 kmp_cmplx64 rhs);1069void __kmpc_atomic_cmplx10_wr(ident_t *id_ref, int gtid, kmp_cmplx80 *lhs,1070 kmp_cmplx80 rhs);1071#if KMP_HAVE_QUAD1072void __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 boundary1076void __kmpc_atomic_float16_a16_wr(ident_t *id_ref, int gtid, Quad_a16_t *lhs,1077 Quad_a16_t rhs);1078void __kmpc_atomic_cmplx16_a16_wr(ident_t *id_ref, int gtid,1079 kmp_cmplx128_a16_t *lhs,1080 kmp_cmplx128_a16_t rhs);1081#endif1082#endif1083 1084// Below routines for atomic CAPTURE are listed1085 1086// 1-byte1087char __kmpc_atomic_fixed1_add_cpt(ident_t *id_ref, int gtid, char *lhs,1088 char rhs, int flag);1089char __kmpc_atomic_fixed1_andb_cpt(ident_t *id_ref, int gtid, char *lhs,1090 char rhs, int flag);1091char __kmpc_atomic_fixed1_div_cpt(ident_t *id_ref, int gtid, char *lhs,1092 char rhs, int flag);1093unsigned char __kmpc_atomic_fixed1u_div_cpt(ident_t *id_ref, int gtid,1094 unsigned char *lhs,1095 unsigned char rhs, int flag);1096char __kmpc_atomic_fixed1_mul_cpt(ident_t *id_ref, int gtid, char *lhs,1097 char rhs, int flag);1098char __kmpc_atomic_fixed1_orb_cpt(ident_t *id_ref, int gtid, char *lhs,1099 char rhs, int flag);1100char __kmpc_atomic_fixed1_shl_cpt(ident_t *id_ref, int gtid, char *lhs,1101 char rhs, int flag);1102char __kmpc_atomic_fixed1_shr_cpt(ident_t *id_ref, int gtid, char *lhs,1103 char rhs, int flag);1104unsigned char __kmpc_atomic_fixed1u_shr_cpt(ident_t *id_ref, int gtid,1105 unsigned char *lhs,1106 unsigned char rhs, int flag);1107char __kmpc_atomic_fixed1_sub_cpt(ident_t *id_ref, int gtid, char *lhs,1108 char rhs, int flag);1109char __kmpc_atomic_fixed1_xor_cpt(ident_t *id_ref, int gtid, char *lhs,1110 char rhs, int flag);1111// 2-byte1112short __kmpc_atomic_fixed2_add_cpt(ident_t *id_ref, int gtid, short *lhs,1113 short rhs, int flag);1114short __kmpc_atomic_fixed2_andb_cpt(ident_t *id_ref, int gtid, short *lhs,1115 short rhs, int flag);1116short __kmpc_atomic_fixed2_div_cpt(ident_t *id_ref, int gtid, short *lhs,1117 short rhs, int flag);1118unsigned short __kmpc_atomic_fixed2u_div_cpt(ident_t *id_ref, int gtid,1119 unsigned short *lhs,1120 unsigned short rhs, int flag);1121short __kmpc_atomic_fixed2_mul_cpt(ident_t *id_ref, int gtid, short *lhs,1122 short rhs, int flag);1123short __kmpc_atomic_fixed2_orb_cpt(ident_t *id_ref, int gtid, short *lhs,1124 short rhs, int flag);1125short __kmpc_atomic_fixed2_shl_cpt(ident_t *id_ref, int gtid, short *lhs,1126 short rhs, int flag);1127short __kmpc_atomic_fixed2_shr_cpt(ident_t *id_ref, int gtid, short *lhs,1128 short rhs, int flag);1129unsigned short __kmpc_atomic_fixed2u_shr_cpt(ident_t *id_ref, int gtid,1130 unsigned short *lhs,1131 unsigned short rhs, int flag);1132short __kmpc_atomic_fixed2_sub_cpt(ident_t *id_ref, int gtid, short *lhs,1133 short rhs, int flag);1134short __kmpc_atomic_fixed2_xor_cpt(ident_t *id_ref, int gtid, short *lhs,1135 short rhs, int flag);1136// 4-byte add / sub fixed1137kmp_int32 __kmpc_atomic_fixed4_add_cpt(ident_t *id_ref, int gtid,1138 kmp_int32 *lhs, kmp_int32 rhs, int flag);1139kmp_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 float1142kmp_real32 __kmpc_atomic_float4_add_cpt(ident_t *id_ref, int gtid,1143 kmp_real32 *lhs, kmp_real32 rhs,1144 int flag);1145kmp_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 fixed1149kmp_int64 __kmpc_atomic_fixed8_add_cpt(ident_t *id_ref, int gtid,1150 kmp_int64 *lhs, kmp_int64 rhs, int flag);1151kmp_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 float1154kmp_real64 __kmpc_atomic_float8_add_cpt(ident_t *id_ref, int gtid,1155 kmp_real64 *lhs, kmp_real64 rhs,1156 int flag);1157kmp_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 fixed1161kmp_int32 __kmpc_atomic_fixed4_andb_cpt(ident_t *id_ref, int gtid,1162 kmp_int32 *lhs, kmp_int32 rhs,1163 int flag);1164kmp_int32 __kmpc_atomic_fixed4_div_cpt(ident_t *id_ref, int gtid,1165 kmp_int32 *lhs, kmp_int32 rhs, int flag);1166kmp_uint32 __kmpc_atomic_fixed4u_div_cpt(ident_t *id_ref, int gtid,1167 kmp_uint32 *lhs, kmp_uint32 rhs,1168 int flag);1169kmp_int32 __kmpc_atomic_fixed4_mul_cpt(ident_t *id_ref, int gtid,1170 kmp_int32 *lhs, kmp_int32 rhs, int flag);1171kmp_int32 __kmpc_atomic_fixed4_orb_cpt(ident_t *id_ref, int gtid,1172 kmp_int32 *lhs, kmp_int32 rhs, int flag);1173kmp_int32 __kmpc_atomic_fixed4_shl_cpt(ident_t *id_ref, int gtid,1174 kmp_int32 *lhs, kmp_int32 rhs, int flag);1175kmp_int32 __kmpc_atomic_fixed4_shr_cpt(ident_t *id_ref, int gtid,1176 kmp_int32 *lhs, kmp_int32 rhs, int flag);1177kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt(ident_t *id_ref, int gtid,1178 kmp_uint32 *lhs, kmp_uint32 rhs,1179 int flag);1180kmp_int32 __kmpc_atomic_fixed4_xor_cpt(ident_t *id_ref, int gtid,1181 kmp_int32 *lhs, kmp_int32 rhs, int flag);1182// 8-byte fixed1183kmp_int64 __kmpc_atomic_fixed8_andb_cpt(ident_t *id_ref, int gtid,1184 kmp_int64 *lhs, kmp_int64 rhs,1185 int flag);1186kmp_int64 __kmpc_atomic_fixed8_div_cpt(ident_t *id_ref, int gtid,1187 kmp_int64 *lhs, kmp_int64 rhs, int flag);1188kmp_uint64 __kmpc_atomic_fixed8u_div_cpt(ident_t *id_ref, int gtid,1189 kmp_uint64 *lhs, kmp_uint64 rhs,1190 int flag);1191kmp_int64 __kmpc_atomic_fixed8_mul_cpt(ident_t *id_ref, int gtid,1192 kmp_int64 *lhs, kmp_int64 rhs, int flag);1193kmp_int64 __kmpc_atomic_fixed8_orb_cpt(ident_t *id_ref, int gtid,1194 kmp_int64 *lhs, kmp_int64 rhs, int flag);1195kmp_int64 __kmpc_atomic_fixed8_shl_cpt(ident_t *id_ref, int gtid,1196 kmp_int64 *lhs, kmp_int64 rhs, int flag);1197kmp_int64 __kmpc_atomic_fixed8_shr_cpt(ident_t *id_ref, int gtid,1198 kmp_int64 *lhs, kmp_int64 rhs, int flag);1199kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt(ident_t *id_ref, int gtid,1200 kmp_uint64 *lhs, kmp_uint64 rhs,1201 int flag);1202kmp_int64 __kmpc_atomic_fixed8_xor_cpt(ident_t *id_ref, int gtid,1203 kmp_int64 *lhs, kmp_int64 rhs, int flag);1204// 4-byte float1205kmp_real32 __kmpc_atomic_float4_div_cpt(ident_t *id_ref, int gtid,1206 kmp_real32 *lhs, kmp_real32 rhs,1207 int flag);1208kmp_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 float1212kmp_real64 __kmpc_atomic_float8_div_cpt(ident_t *id_ref, int gtid,1213 kmp_real64 *lhs, kmp_real64 rhs,1214 int flag);1215kmp_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 (&&, ||)1219char __kmpc_atomic_fixed1_andl_cpt(ident_t *id_ref, int gtid, char *lhs,1220 char rhs, int flag);1221char __kmpc_atomic_fixed1_orl_cpt(ident_t *id_ref, int gtid, char *lhs,1222 char rhs, int flag);1223short __kmpc_atomic_fixed2_andl_cpt(ident_t *id_ref, int gtid, short *lhs,1224 short rhs, int flag);1225short __kmpc_atomic_fixed2_orl_cpt(ident_t *id_ref, int gtid, short *lhs,1226 short rhs, int flag);1227kmp_int32 __kmpc_atomic_fixed4_andl_cpt(ident_t *id_ref, int gtid,1228 kmp_int32 *lhs, kmp_int32 rhs,1229 int flag);1230kmp_int32 __kmpc_atomic_fixed4_orl_cpt(ident_t *id_ref, int gtid,1231 kmp_int32 *lhs, kmp_int32 rhs, int flag);1232kmp_int64 __kmpc_atomic_fixed8_andl_cpt(ident_t *id_ref, int gtid,1233 kmp_int64 *lhs, kmp_int64 rhs,1234 int flag);1235kmp_int64 __kmpc_atomic_fixed8_orl_cpt(ident_t *id_ref, int gtid,1236 kmp_int64 *lhs, kmp_int64 rhs, int flag);1237// MIN / MAX1238char __kmpc_atomic_fixed1_max_cpt(ident_t *id_ref, int gtid, char *lhs,1239 char rhs, int flag);1240char __kmpc_atomic_fixed1_min_cpt(ident_t *id_ref, int gtid, char *lhs,1241 char rhs, int flag);1242short __kmpc_atomic_fixed2_max_cpt(ident_t *id_ref, int gtid, short *lhs,1243 short rhs, int flag);1244short __kmpc_atomic_fixed2_min_cpt(ident_t *id_ref, int gtid, short *lhs,1245 short rhs, int flag);1246kmp_int32 __kmpc_atomic_fixed4_max_cpt(ident_t *id_ref, int gtid,1247 kmp_int32 *lhs, kmp_int32 rhs, int flag);1248kmp_int32 __kmpc_atomic_fixed4_min_cpt(ident_t *id_ref, int gtid,1249 kmp_int32 *lhs, kmp_int32 rhs, int flag);1250kmp_int64 __kmpc_atomic_fixed8_max_cpt(ident_t *id_ref, int gtid,1251 kmp_int64 *lhs, kmp_int64 rhs, int flag);1252kmp_int64 __kmpc_atomic_fixed8_min_cpt(ident_t *id_ref, int gtid,1253 kmp_int64 *lhs, kmp_int64 rhs, int flag);1254kmp_real32 __kmpc_atomic_float4_max_cpt(ident_t *id_ref, int gtid,1255 kmp_real32 *lhs, kmp_real32 rhs,1256 int flag);1257kmp_real32 __kmpc_atomic_float4_min_cpt(ident_t *id_ref, int gtid,1258 kmp_real32 *lhs, kmp_real32 rhs,1259 int flag);1260kmp_real64 __kmpc_atomic_float8_max_cpt(ident_t *id_ref, int gtid,1261 kmp_real64 *lhs, kmp_real64 rhs,1262 int flag);1263kmp_real64 __kmpc_atomic_float8_min_cpt(ident_t *id_ref, int gtid,1264 kmp_real64 *lhs, kmp_real64 rhs,1265 int flag);1266long double __kmpc_atomic_float10_max_cpt(ident_t *id_ref, int gtid,1267 long double *lhs, long double rhs,1268 int flag);1269long 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_QUAD1273QUAD_LEGACY __kmpc_atomic_float16_max_cpt(ident_t *id_ref, int gtid,1274 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1275 int flag);1276QUAD_LEGACY __kmpc_atomic_float16_min_cpt(ident_t *id_ref, int gtid,1277 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1278 int flag);1279#endif1280// .NEQV. (same as xor)1281char __kmpc_atomic_fixed1_neqv_cpt(ident_t *id_ref, int gtid, char *lhs,1282 char rhs, int flag);1283short __kmpc_atomic_fixed2_neqv_cpt(ident_t *id_ref, int gtid, short *lhs,1284 short rhs, int flag);1285kmp_int32 __kmpc_atomic_fixed4_neqv_cpt(ident_t *id_ref, int gtid,1286 kmp_int32 *lhs, kmp_int32 rhs,1287 int flag);1288kmp_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)1292char __kmpc_atomic_fixed1_eqv_cpt(ident_t *id_ref, int gtid, char *lhs,1293 char rhs, int flag);1294short __kmpc_atomic_fixed2_eqv_cpt(ident_t *id_ref, int gtid, short *lhs,1295 short rhs, int flag);1296kmp_int32 __kmpc_atomic_fixed4_eqv_cpt(ident_t *id_ref, int gtid,1297 kmp_int32 *lhs, kmp_int32 rhs, int flag);1298kmp_int64 __kmpc_atomic_fixed8_eqv_cpt(ident_t *id_ref, int gtid,1299 kmp_int64 *lhs, kmp_int64 rhs, int flag);1300// long double type1301long double __kmpc_atomic_float10_add_cpt(ident_t *id_ref, int gtid,1302 long double *lhs, long double rhs,1303 int flag);1304long double __kmpc_atomic_float10_sub_cpt(ident_t *id_ref, int gtid,1305 long double *lhs, long double rhs,1306 int flag);1307long double __kmpc_atomic_float10_mul_cpt(ident_t *id_ref, int gtid,1308 long double *lhs, long double rhs,1309 int flag);1310long 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_QUAD1314// _Quad type1315QUAD_LEGACY __kmpc_atomic_float16_add_cpt(ident_t *id_ref, int gtid,1316 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1317 int flag);1318QUAD_LEGACY __kmpc_atomic_float16_sub_cpt(ident_t *id_ref, int gtid,1319 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1320 int flag);1321QUAD_LEGACY __kmpc_atomic_float16_mul_cpt(ident_t *id_ref, int gtid,1322 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1323 int flag);1324QUAD_LEGACY __kmpc_atomic_float16_div_cpt(ident_t *id_ref, int gtid,1325 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1326 int flag);1327#endif1328// routines for complex types1329// Workaround for cmplx4 routines - return void; captured value is returned via1330// the argument1331void __kmpc_atomic_cmplx4_add_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,1332 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);1333void __kmpc_atomic_cmplx4_sub_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,1334 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);1335void __kmpc_atomic_cmplx4_mul_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,1336 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);1337void __kmpc_atomic_cmplx4_div_cpt(ident_t *id_ref, int gtid, kmp_cmplx32 *lhs,1338 kmp_cmplx32 rhs, kmp_cmplx32 *out, int flag);1339kmp_cmplx64 __kmpc_atomic_cmplx8_add_cpt(ident_t *id_ref, int gtid,1340 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,1341 int flag);1342kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt(ident_t *id_ref, int gtid,1343 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,1344 int flag);1345kmp_cmplx64 __kmpc_atomic_cmplx8_mul_cpt(ident_t *id_ref, int gtid,1346 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,1347 int flag);1348kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt(ident_t *id_ref, int gtid,1349 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,1350 int flag);1351kmp_cmplx80 __kmpc_atomic_cmplx10_add_cpt(ident_t *id_ref, int gtid,1352 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,1353 int flag);1354kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt(ident_t *id_ref, int gtid,1355 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,1356 int flag);1357kmp_cmplx80 __kmpc_atomic_cmplx10_mul_cpt(ident_t *id_ref, int gtid,1358 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,1359 int flag);1360kmp_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_QUAD1364CPLX128_LEG __kmpc_atomic_cmplx16_add_cpt(ident_t *id_ref, int gtid,1365 CPLX128_LEG *lhs, CPLX128_LEG rhs,1366 int flag);1367CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt(ident_t *id_ref, int gtid,1368 CPLX128_LEG *lhs, CPLX128_LEG rhs,1369 int flag);1370CPLX128_LEG __kmpc_atomic_cmplx16_mul_cpt(ident_t *id_ref, int gtid,1371 CPLX128_LEG *lhs, CPLX128_LEG rhs,1372 int flag);1373CPLX128_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 boundary1378Quad_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);1381Quad_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);1384Quad_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);1387Quad_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);1390Quad_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);1393Quad_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);1396kmp_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);1400kmp_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);1404kmp_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);1408kmp_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#endif1413#endif1414 1415void __kmpc_atomic_start(void);1416void __kmpc_atomic_end(void);1417 1418// OpenMP 4.0: v = x = expr binop x; { v = x; x = expr binop x; } { x = expr1419// binop x; v = x; } for non-commutative operations.1420#if KMP_ARCH_X86 || KMP_ARCH_X86_641421char __kmpc_atomic_fixed1_sub_cpt_rev(ident_t *id_ref, int gtid, char *lhs,1422 char rhs, int flag);1423char __kmpc_atomic_fixed1_div_cpt_rev(ident_t *id_ref, int gtid, char *lhs,1424 char rhs, int flag);1425unsigned char __kmpc_atomic_fixed1u_div_cpt_rev(ident_t *id_ref, int gtid,1426 unsigned char *lhs,1427 unsigned char rhs, int flag);1428char __kmpc_atomic_fixed1_shl_cpt_rev(ident_t *id_ref, int gtid, char *lhs,1429 char rhs, int flag);1430char __kmpc_atomic_fixed1_shr_cpt_rev(ident_t *id_ref, int gtid, char *lhs,1431 char rhs, int flag);1432unsigned char __kmpc_atomic_fixed1u_shr_cpt_rev(ident_t *id_ref, int gtid,1433 unsigned char *lhs,1434 unsigned char rhs, int flag);1435short __kmpc_atomic_fixed2_sub_cpt_rev(ident_t *id_ref, int gtid, short *lhs,1436 short rhs, int flag);1437short __kmpc_atomic_fixed2_div_cpt_rev(ident_t *id_ref, int gtid, short *lhs,1438 short rhs, int flag);1439unsigned short __kmpc_atomic_fixed2u_div_cpt_rev(ident_t *id_ref, int gtid,1440 unsigned short *lhs,1441 unsigned short rhs, int flag);1442short __kmpc_atomic_fixed2_shl_cpt_rev(ident_t *id_ref, int gtid, short *lhs,1443 short rhs, int flag);1444short __kmpc_atomic_fixed2_shr_cpt_rev(ident_t *id_ref, int gtid, short *lhs,1445 short rhs, int flag);1446unsigned short __kmpc_atomic_fixed2u_shr_cpt_rev(ident_t *id_ref, int gtid,1447 unsigned short *lhs,1448 unsigned short rhs, int flag);1449kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev(ident_t *id_ref, int gtid,1450 kmp_int32 *lhs, kmp_int32 rhs,1451 int flag);1452kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev(ident_t *id_ref, int gtid,1453 kmp_int32 *lhs, kmp_int32 rhs,1454 int flag);1455kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev(ident_t *id_ref, int gtid,1456 kmp_uint32 *lhs, kmp_uint32 rhs,1457 int flag);1458kmp_int32 __kmpc_atomic_fixed4_shl_cpt_rev(ident_t *id_ref, int gtid,1459 kmp_int32 *lhs, kmp_int32 rhs,1460 int flag);1461kmp_int32 __kmpc_atomic_fixed4_shr_cpt_rev(ident_t *id_ref, int gtid,1462 kmp_int32 *lhs, kmp_int32 rhs,1463 int flag);1464kmp_uint32 __kmpc_atomic_fixed4u_shr_cpt_rev(ident_t *id_ref, int gtid,1465 kmp_uint32 *lhs, kmp_uint32 rhs,1466 int flag);1467kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev(ident_t *id_ref, int gtid,1468 kmp_int64 *lhs, kmp_int64 rhs,1469 int flag);1470kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev(ident_t *id_ref, int gtid,1471 kmp_int64 *lhs, kmp_int64 rhs,1472 int flag);1473kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev(ident_t *id_ref, int gtid,1474 kmp_uint64 *lhs, kmp_uint64 rhs,1475 int flag);1476kmp_int64 __kmpc_atomic_fixed8_shl_cpt_rev(ident_t *id_ref, int gtid,1477 kmp_int64 *lhs, kmp_int64 rhs,1478 int flag);1479kmp_int64 __kmpc_atomic_fixed8_shr_cpt_rev(ident_t *id_ref, int gtid,1480 kmp_int64 *lhs, kmp_int64 rhs,1481 int flag);1482kmp_uint64 __kmpc_atomic_fixed8u_shr_cpt_rev(ident_t *id_ref, int gtid,1483 kmp_uint64 *lhs, kmp_uint64 rhs,1484 int flag);1485float __kmpc_atomic_float4_sub_cpt_rev(ident_t *id_ref, int gtid, float *lhs,1486 float rhs, int flag);1487float __kmpc_atomic_float4_div_cpt_rev(ident_t *id_ref, int gtid, float *lhs,1488 float rhs, int flag);1489double __kmpc_atomic_float8_sub_cpt_rev(ident_t *id_ref, int gtid, double *lhs,1490 double rhs, int flag);1491double __kmpc_atomic_float8_div_cpt_rev(ident_t *id_ref, int gtid, double *lhs,1492 double rhs, int flag);1493long double __kmpc_atomic_float10_sub_cpt_rev(ident_t *id_ref, int gtid,1494 long double *lhs, long double rhs,1495 int flag);1496long 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_QUAD1500QUAD_LEGACY __kmpc_atomic_float16_sub_cpt_rev(ident_t *id_ref, int gtid,1501 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1502 int flag);1503QUAD_LEGACY __kmpc_atomic_float16_div_cpt_rev(ident_t *id_ref, int gtid,1504 QUAD_LEGACY *lhs, QUAD_LEGACY rhs,1505 int flag);1506#endif1507// Workaround for cmplx4 routines - return void; captured value is returned via1508// the argument1509void __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);1512void __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);1515kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt_rev(ident_t *id_ref, int gtid,1516 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,1517 int flag);1518kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt_rev(ident_t *id_ref, int gtid,1519 kmp_cmplx64 *lhs, kmp_cmplx64 rhs,1520 int flag);1521kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt_rev(ident_t *id_ref, int gtid,1522 kmp_cmplx80 *lhs, kmp_cmplx80 rhs,1523 int flag);1524kmp_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_QUAD1528CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt_rev(ident_t *id_ref, int gtid,1529 CPLX128_LEG *lhs, CPLX128_LEG rhs,1530 int flag);1531CPLX128_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)1535Quad_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);1538Quad_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);1541kmp_cmplx128_a16_t1542__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);1545kmp_cmplx128_a16_t1546__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#endif1550#endif1551 1552// OpenMP 4.0 Capture-write (swap): {v = x; x = expr;}1553char __kmpc_atomic_fixed1_swp(ident_t *id_ref, int gtid, char *lhs, char rhs);1554short __kmpc_atomic_fixed2_swp(ident_t *id_ref, int gtid, short *lhs,1555 short rhs);1556kmp_int32 __kmpc_atomic_fixed4_swp(ident_t *id_ref, int gtid, kmp_int32 *lhs,1557 kmp_int32 rhs);1558kmp_int64 __kmpc_atomic_fixed8_swp(ident_t *id_ref, int gtid, kmp_int64 *lhs,1559 kmp_int64 rhs);1560float __kmpc_atomic_float4_swp(ident_t *id_ref, int gtid, float *lhs,1561 float rhs);1562double __kmpc_atomic_float8_swp(ident_t *id_ref, int gtid, double *lhs,1563 double rhs);1564long double __kmpc_atomic_float10_swp(ident_t *id_ref, int gtid,1565 long double *lhs, long double rhs);1566#if KMP_HAVE_QUAD1567QUAD_LEGACY __kmpc_atomic_float16_swp(ident_t *id_ref, int gtid,1568 QUAD_LEGACY *lhs, QUAD_LEGACY rhs);1569#endif1570// !!! TODO: check if we need a workaround here1571void __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 1576kmp_cmplx64 __kmpc_atomic_cmplx8_swp(ident_t *id_ref, int gtid,1577 kmp_cmplx64 *lhs, kmp_cmplx64 rhs);1578kmp_cmplx80 __kmpc_atomic_cmplx10_swp(ident_t *id_ref, int gtid,1579 kmp_cmplx80 *lhs, kmp_cmplx80 rhs);1580#if KMP_HAVE_QUAD1581CPLX128_LEG __kmpc_atomic_cmplx16_swp(ident_t *id_ref, int gtid,1582 CPLX128_LEG *lhs, CPLX128_LEG rhs);1583#if (KMP_ARCH_X86)1584Quad_a16_t __kmpc_atomic_float16_a16_swp(ident_t *id_ref, int gtid,1585 Quad_a16_t *lhs, Quad_a16_t rhs);1586kmp_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#endif1590#endif1591 1592// Capture routines for mixed types (RHS=float16)1593#if KMP_HAVE_QUAD1594 1595char __kmpc_atomic_fixed1_add_cpt_fp(ident_t *id_ref, int gtid, char *lhs,1596 _Quad rhs, int flag);1597char __kmpc_atomic_fixed1_sub_cpt_fp(ident_t *id_ref, int gtid, char *lhs,1598 _Quad rhs, int flag);1599char __kmpc_atomic_fixed1_mul_cpt_fp(ident_t *id_ref, int gtid, char *lhs,1600 _Quad rhs, int flag);1601char __kmpc_atomic_fixed1_div_cpt_fp(ident_t *id_ref, int gtid, char *lhs,1602 _Quad rhs, int flag);1603unsigned char __kmpc_atomic_fixed1u_add_cpt_fp(ident_t *id_ref, int gtid,1604 unsigned char *lhs, _Quad rhs,1605 int flag);1606unsigned char __kmpc_atomic_fixed1u_sub_cpt_fp(ident_t *id_ref, int gtid,1607 unsigned char *lhs, _Quad rhs,1608 int flag);1609unsigned char __kmpc_atomic_fixed1u_mul_cpt_fp(ident_t *id_ref, int gtid,1610 unsigned char *lhs, _Quad rhs,1611 int flag);1612unsigned char __kmpc_atomic_fixed1u_div_cpt_fp(ident_t *id_ref, int gtid,1613 unsigned char *lhs, _Quad rhs,1614 int flag);1615 1616short __kmpc_atomic_fixed2_add_cpt_fp(ident_t *id_ref, int gtid, short *lhs,1617 _Quad rhs, int flag);1618short __kmpc_atomic_fixed2_sub_cpt_fp(ident_t *id_ref, int gtid, short *lhs,1619 _Quad rhs, int flag);1620short __kmpc_atomic_fixed2_mul_cpt_fp(ident_t *id_ref, int gtid, short *lhs,1621 _Quad rhs, int flag);1622short __kmpc_atomic_fixed2_div_cpt_fp(ident_t *id_ref, int gtid, short *lhs,1623 _Quad rhs, int flag);1624unsigned short __kmpc_atomic_fixed2u_add_cpt_fp(ident_t *id_ref, int gtid,1625 unsigned short *lhs, _Quad rhs,1626 int flag);1627unsigned short __kmpc_atomic_fixed2u_sub_cpt_fp(ident_t *id_ref, int gtid,1628 unsigned short *lhs, _Quad rhs,1629 int flag);1630unsigned short __kmpc_atomic_fixed2u_mul_cpt_fp(ident_t *id_ref, int gtid,1631 unsigned short *lhs, _Quad rhs,1632 int flag);1633unsigned short __kmpc_atomic_fixed2u_div_cpt_fp(ident_t *id_ref, int gtid,1634 unsigned short *lhs, _Quad rhs,1635 int flag);1636 1637kmp_int32 __kmpc_atomic_fixed4_add_cpt_fp(ident_t *id_ref, int gtid,1638 kmp_int32 *lhs, _Quad rhs, int flag);1639kmp_int32 __kmpc_atomic_fixed4_sub_cpt_fp(ident_t *id_ref, int gtid,1640 kmp_int32 *lhs, _Quad rhs, int flag);1641kmp_int32 __kmpc_atomic_fixed4_mul_cpt_fp(ident_t *id_ref, int gtid,1642 kmp_int32 *lhs, _Quad rhs, int flag);1643kmp_int32 __kmpc_atomic_fixed4_div_cpt_fp(ident_t *id_ref, int gtid,1644 kmp_int32 *lhs, _Quad rhs, int flag);1645kmp_uint32 __kmpc_atomic_fixed4u_add_cpt_fp(ident_t *id_ref, int gtid,1646 kmp_uint32 *lhs, _Quad rhs,1647 int flag);1648kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_fp(ident_t *id_ref, int gtid,1649 kmp_uint32 *lhs, _Quad rhs,1650 int flag);1651kmp_uint32 __kmpc_atomic_fixed4u_mul_cpt_fp(ident_t *id_ref, int gtid,1652 kmp_uint32 *lhs, _Quad rhs,1653 int flag);1654kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_fp(ident_t *id_ref, int gtid,1655 kmp_uint32 *lhs, _Quad rhs,1656 int flag);1657 1658kmp_int64 __kmpc_atomic_fixed8_add_cpt_fp(ident_t *id_ref, int gtid,1659 kmp_int64 *lhs, _Quad rhs, int flag);1660kmp_int64 __kmpc_atomic_fixed8_sub_cpt_fp(ident_t *id_ref, int gtid,1661 kmp_int64 *lhs, _Quad rhs, int flag);1662kmp_int64 __kmpc_atomic_fixed8_mul_cpt_fp(ident_t *id_ref, int gtid,1663 kmp_int64 *lhs, _Quad rhs, int flag);1664kmp_int64 __kmpc_atomic_fixed8_div_cpt_fp(ident_t *id_ref, int gtid,1665 kmp_int64 *lhs, _Quad rhs, int flag);1666kmp_uint64 __kmpc_atomic_fixed8u_add_cpt_fp(ident_t *id_ref, int gtid,1667 kmp_uint64 *lhs, _Quad rhs,1668 int flag);1669kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_fp(ident_t *id_ref, int gtid,1670 kmp_uint64 *lhs, _Quad rhs,1671 int flag);1672kmp_uint64 __kmpc_atomic_fixed8u_mul_cpt_fp(ident_t *id_ref, int gtid,1673 kmp_uint64 *lhs, _Quad rhs,1674 int flag);1675kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_fp(ident_t *id_ref, int gtid,1676 kmp_uint64 *lhs, _Quad rhs,1677 int flag);1678 1679float __kmpc_atomic_float4_add_cpt_fp(ident_t *id_ref, int gtid,1680 kmp_real32 *lhs, _Quad rhs, int flag);1681float __kmpc_atomic_float4_sub_cpt_fp(ident_t *id_ref, int gtid,1682 kmp_real32 *lhs, _Quad rhs, int flag);1683float __kmpc_atomic_float4_mul_cpt_fp(ident_t *id_ref, int gtid,1684 kmp_real32 *lhs, _Quad rhs, int flag);1685float __kmpc_atomic_float4_div_cpt_fp(ident_t *id_ref, int gtid,1686 kmp_real32 *lhs, _Quad rhs, int flag);1687 1688double __kmpc_atomic_float8_add_cpt_fp(ident_t *id_ref, int gtid,1689 kmp_real64 *lhs, _Quad rhs, int flag);1690double __kmpc_atomic_float8_sub_cpt_fp(ident_t *id_ref, int gtid,1691 kmp_real64 *lhs, _Quad rhs, int flag);1692double __kmpc_atomic_float8_mul_cpt_fp(ident_t *id_ref, int gtid,1693 kmp_real64 *lhs, _Quad rhs, int flag);1694double __kmpc_atomic_float8_div_cpt_fp(ident_t *id_ref, int gtid,1695 kmp_real64 *lhs, _Quad rhs, int flag);1696 1697long double __kmpc_atomic_float10_add_cpt_fp(ident_t *id_ref, int gtid,1698 long double *lhs, _Quad rhs,1699 int flag);1700long double __kmpc_atomic_float10_sub_cpt_fp(ident_t *id_ref, int gtid,1701 long double *lhs, _Quad rhs,1702 int flag);1703long double __kmpc_atomic_float10_mul_cpt_fp(ident_t *id_ref, int gtid,1704 long double *lhs, _Quad rhs,1705 int flag);1706long double __kmpc_atomic_float10_div_cpt_fp(ident_t *id_ref, int gtid,1707 long double *lhs, _Quad rhs,1708 int flag);1709 1710char __kmpc_atomic_fixed1_sub_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,1711 _Quad rhs, int flag);1712unsigned char __kmpc_atomic_fixed1u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1713 unsigned char *lhs,1714 _Quad rhs, int flag);1715char __kmpc_atomic_fixed1_div_cpt_rev_fp(ident_t *id_ref, int gtid, char *lhs,1716 _Quad rhs, int flag);1717unsigned char __kmpc_atomic_fixed1u_div_cpt_rev_fp(ident_t *id_ref, int gtid,1718 unsigned char *lhs,1719 _Quad rhs, int flag);1720short __kmpc_atomic_fixed2_sub_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,1721 _Quad rhs, int flag);1722unsigned short __kmpc_atomic_fixed2u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1723 unsigned short *lhs,1724 _Quad rhs, int flag);1725short __kmpc_atomic_fixed2_div_cpt_rev_fp(ident_t *id_ref, int gtid, short *lhs,1726 _Quad rhs, int flag);1727unsigned short __kmpc_atomic_fixed2u_div_cpt_rev_fp(ident_t *id_ref, int gtid,1728 unsigned short *lhs,1729 _Quad rhs, int flag);1730kmp_int32 __kmpc_atomic_fixed4_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1731 kmp_int32 *lhs, _Quad rhs,1732 int flag);1733kmp_uint32 __kmpc_atomic_fixed4u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1734 kmp_uint32 *lhs, _Quad rhs,1735 int flag);1736kmp_int32 __kmpc_atomic_fixed4_div_cpt_rev_fp(ident_t *id_ref, int gtid,1737 kmp_int32 *lhs, _Quad rhs,1738 int flag);1739kmp_uint32 __kmpc_atomic_fixed4u_div_cpt_rev_fp(ident_t *id_ref, int gtid,1740 kmp_uint32 *lhs, _Quad rhs,1741 int flag);1742kmp_int64 __kmpc_atomic_fixed8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1743 kmp_int64 *lhs, _Quad rhs,1744 int flag);1745kmp_uint64 __kmpc_atomic_fixed8u_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1746 kmp_uint64 *lhs, _Quad rhs,1747 int flag);1748kmp_int64 __kmpc_atomic_fixed8_div_cpt_rev_fp(ident_t *id_ref, int gtid,1749 kmp_int64 *lhs, _Quad rhs,1750 int flag);1751kmp_uint64 __kmpc_atomic_fixed8u_div_cpt_rev_fp(ident_t *id_ref, int gtid,1752 kmp_uint64 *lhs, _Quad rhs,1753 int flag);1754float __kmpc_atomic_float4_sub_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,1755 _Quad rhs, int flag);1756float __kmpc_atomic_float4_div_cpt_rev_fp(ident_t *id_ref, int gtid, float *lhs,1757 _Quad rhs, int flag);1758double __kmpc_atomic_float8_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1759 double *lhs, _Quad rhs, int flag);1760double __kmpc_atomic_float8_div_cpt_rev_fp(ident_t *id_ref, int gtid,1761 double *lhs, _Quad rhs, int flag);1762long double __kmpc_atomic_float10_sub_cpt_rev_fp(ident_t *id_ref, int gtid,1763 long double *lhs, _Quad rhs,1764 int flag);1765long 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_QUAD1770 1771// End of OpenMP 4.0 capture1772 1773// OpenMP 5.1 compare and swap1774/*1775 __kmpc_atomic_bool_1_cas1776 __kmpc_atomic_bool_2_cas1777 __kmpc_atomic_bool_4_cas1778 __kmpc_atomic_bool_8_cas1779 __kmpc_atomic_val_1_cas1780 __kmpc_atomic_val_2_cas1781 __kmpc_atomic_val_4_cas1782 __kmpc_atomic_val_8_cas1783 __kmpc_atomic_bool_1_cas_cpt1784 __kmpc_atomic_bool_2_cas_cpt1785 __kmpc_atomic_bool_4_cas_cpt1786 __kmpc_atomic_bool_8_cas_cpt1787 __kmpc_atomic_val_1_cas_cpt1788 __kmpc_atomic_val_2_cas_cpt1789 __kmpc_atomic_val_4_cas_cpt1790 __kmpc_atomic_val_8_cas_cpt1791*/1792// In all interfaces of CAS (Compare And Swap):1793// r is the boolean result of comparison1794// x is memory location to operate on1795// e is expected (old) value1796// d is desired (new) value1797// pv is pointer to captured value v whose location may coincide with e1798 1799// { r = x == e; if(r) { x = d; } }1800// functions return result of comparison1801bool __kmpc_atomic_bool_1_cas(ident_t *loc, int gtid, char *x, char e, char d);1802bool __kmpc_atomic_bool_2_cas(ident_t *loc, int gtid, short *x, short e,1803 short d);1804bool __kmpc_atomic_bool_4_cas(ident_t *loc, int gtid, kmp_int32 *x, kmp_int32 e,1805 kmp_int32 d);1806bool __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 value1811char __kmpc_atomic_val_1_cas(ident_t *loc, int gtid, char *x, char e, char d);1812short __kmpc_atomic_val_2_cas(ident_t *loc, int gtid, short *x, short e,1813 short d);1814kmp_int32 __kmpc_atomic_val_4_cas(ident_t *loc, int gtid, kmp_int32 *x,1815 kmp_int32 e, kmp_int32 d);1816kmp_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 otherwise1821// functions return result of comparison1822bool __kmpc_atomic_bool_1_cas_cpt(ident_t *loc, int gtid, char *x, char e,1823 char d, char *pv);1824bool __kmpc_atomic_bool_2_cas_cpt(ident_t *loc, int gtid, short *x, short e,1825 short d, short *pv);1826bool __kmpc_atomic_bool_4_cas_cpt(ident_t *loc, int gtid, kmp_int32 *x,1827 kmp_int32 e, kmp_int32 d, kmp_int32 *pv);1828bool __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 otherwise1833// functions return old value1834char __kmpc_atomic_val_1_cas_cpt(ident_t *loc, int gtid, char *x, char e,1835 char d, char *pv);1836short __kmpc_atomic_val_2_cas_cpt(ident_t *loc, int gtid, short *x, short e,1837 short d, short *pv);1838kmp_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);1840kmp_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 + capture1844 1845#endif // KMP_ARCH_X86 || KMP_ARCH_X86_641846 1847/* ------------------------------------------------------------------------ */1848 1849#ifdef __cplusplus1850} // extern "C"1851#endif1852 1853#endif /* KMP_ATOMIC_H */1854 1855// end of file1856