14 #include "kmp_atomic.h" 17 typedef unsigned char uchar;
18 typedef unsigned short ushort;
566 #ifndef KMP_GOMP_COMPAT 567 int __kmp_atomic_mode = 1;
569 int __kmp_atomic_mode = 2;
575 kmp_atomic_lock_t __kmp_atomic_lock;
577 kmp_atomic_lock_t __kmp_atomic_lock_1i;
579 kmp_atomic_lock_t __kmp_atomic_lock_2i;
581 kmp_atomic_lock_t __kmp_atomic_lock_4i;
583 kmp_atomic_lock_t __kmp_atomic_lock_4r;
585 kmp_atomic_lock_t __kmp_atomic_lock_8i;
587 kmp_atomic_lock_t __kmp_atomic_lock_8r;
589 kmp_atomic_lock_t __kmp_atomic_lock_8c;
591 kmp_atomic_lock_t __kmp_atomic_lock_10r;
593 kmp_atomic_lock_t __kmp_atomic_lock_16r;
595 kmp_atomic_lock_t __kmp_atomic_lock_16c;
597 kmp_atomic_lock_t __kmp_atomic_lock_20c;
599 kmp_atomic_lock_t __kmp_atomic_lock_32c;
606 #define KMP_ATOMIC_VOLATILE volatile 608 #if (KMP_ARCH_X86) && KMP_HAVE_QUAD 610 static inline void operator+=(Quad_a4_t &lhs, Quad_a4_t &rhs) {
613 static inline void operator-=(Quad_a4_t &lhs, Quad_a4_t &rhs) {
616 static inline void operator*=(Quad_a4_t &lhs, Quad_a4_t &rhs) {
619 static inline void operator/=(Quad_a4_t &lhs, Quad_a4_t &rhs) {
622 static inline bool operator<(Quad_a4_t &lhs, Quad_a4_t &rhs) {
623 return lhs.q < rhs.q;
625 static inline bool operator>(Quad_a4_t &lhs, Quad_a4_t &rhs) {
626 return lhs.q > rhs.q;
629 static inline void operator+=(Quad_a16_t &lhs, Quad_a16_t &rhs) {
632 static inline void operator-=(Quad_a16_t &lhs, Quad_a16_t &rhs) {
635 static inline void operator*=(Quad_a16_t &lhs, Quad_a16_t &rhs) {
638 static inline void operator/=(Quad_a16_t &lhs, Quad_a16_t &rhs) {
641 static inline bool operator<(Quad_a16_t &lhs, Quad_a16_t &rhs) {
642 return lhs.q < rhs.q;
644 static inline bool operator>(Quad_a16_t &lhs, Quad_a16_t &rhs) {
645 return lhs.q > rhs.q;
648 static inline void operator+=(kmp_cmplx128_a4_t &lhs, kmp_cmplx128_a4_t &rhs) {
651 static inline void operator-=(kmp_cmplx128_a4_t &lhs, kmp_cmplx128_a4_t &rhs) {
654 static inline void operator*=(kmp_cmplx128_a4_t &lhs, kmp_cmplx128_a4_t &rhs) {
657 static inline void operator/=(kmp_cmplx128_a4_t &lhs, kmp_cmplx128_a4_t &rhs) {
661 static inline void operator+=(kmp_cmplx128_a16_t &lhs,
662 kmp_cmplx128_a16_t &rhs) {
665 static inline void operator-=(kmp_cmplx128_a16_t &lhs,
666 kmp_cmplx128_a16_t &rhs) {
669 static inline void operator*=(kmp_cmplx128_a16_t &lhs,
670 kmp_cmplx128_a16_t &rhs) {
673 static inline void operator/=(kmp_cmplx128_a16_t &lhs,
674 kmp_cmplx128_a16_t &rhs) {
685 #define KMP_CHECK_GTID \ 686 if (gtid == KMP_GTID_UNKNOWN) { \ 687 gtid = __kmp_entry_gtid(); \ 688 } // check and get gtid when needed 695 #define ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, RET_TYPE) \ 696 RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID(ident_t *id_ref, int gtid, \ 697 TYPE *lhs, TYPE rhs) { \ 698 KMP_DEBUG_ASSERT(__kmp_init_serial); \ 699 KA_TRACE(100, ("__kmpc_atomic_" #TYPE_ID "_" #OP_ID ": T#%d\n", gtid)); 703 #define ATOMIC_LOCK0 __kmp_atomic_lock // all types, for Gnu compat 704 #define ATOMIC_LOCK1i __kmp_atomic_lock_1i // char 705 #define ATOMIC_LOCK2i __kmp_atomic_lock_2i // short 706 #define ATOMIC_LOCK4i __kmp_atomic_lock_4i // long int 707 #define ATOMIC_LOCK4r __kmp_atomic_lock_4r // float 708 #define ATOMIC_LOCK8i __kmp_atomic_lock_8i // long long int 709 #define ATOMIC_LOCK8r __kmp_atomic_lock_8r // double 710 #define ATOMIC_LOCK8c __kmp_atomic_lock_8c // float complex 711 #define ATOMIC_LOCK10r __kmp_atomic_lock_10r // long double 712 #define ATOMIC_LOCK16r __kmp_atomic_lock_16r // _Quad 713 #define ATOMIC_LOCK16c __kmp_atomic_lock_16c // double complex 714 #define ATOMIC_LOCK20c __kmp_atomic_lock_20c // long double complex 715 #define ATOMIC_LOCK32c __kmp_atomic_lock_32c // _Quad complex 723 #define OP_CRITICAL(OP, LCK_ID) \ 724 __kmp_acquire_atomic_lock(&ATOMIC_LOCK##LCK_ID, gtid); \ 728 __kmp_release_atomic_lock(&ATOMIC_LOCK##LCK_ID, gtid); 752 #ifdef KMP_GOMP_COMPAT 753 #define OP_GOMP_CRITICAL(OP, FLAG) \ 754 if ((FLAG) && (__kmp_atomic_mode == 2)) { \ 756 OP_CRITICAL(OP, 0); \ 760 #define OP_GOMP_CRITICAL(OP, FLAG) 764 #define KMP_DO_PAUSE _mm_delay_32(1) 766 #define KMP_DO_PAUSE KMP_CPU_PAUSE() 774 #define OP_CMPXCHG(TYPE, BITS, OP) \ 776 TYPE old_value, new_value; \ 777 old_value = *(TYPE volatile *)lhs; \ 778 new_value = old_value OP rhs; \ 779 while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \ 780 (kmp_int##BITS *)lhs, *VOLATILE_CAST(kmp_int##BITS *) & old_value, \ 781 *VOLATILE_CAST(kmp_int##BITS *) & new_value)) { \ 784 old_value = *(TYPE volatile *)lhs; \ 785 new_value = old_value OP rhs; \ 796 #define OP_CMPXCHG_WORKAROUND(TYPE, BITS, OP) \ 800 kmp_int##BITS *vvv; \ 802 struct _sss old_value, new_value; \ 803 old_value.vvv = (kmp_int##BITS *)&old_value.cmp; \ 804 new_value.vvv = (kmp_int##BITS *)&new_value.cmp; \ 805 *old_value.vvv = *(volatile kmp_int##BITS *)lhs; \ 806 new_value.cmp = old_value.cmp OP rhs; \ 807 while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \ 808 (kmp_int##BITS *)lhs, *VOLATILE_CAST(kmp_int##BITS *) old_value.vvv, \ 809 *VOLATILE_CAST(kmp_int##BITS *) new_value.vvv)) { \ 812 *old_value.vvv = *(volatile kmp_int##BITS *)lhs; \ 813 new_value.cmp = old_value.cmp OP rhs; \ 817 #endif // USE_CMPXCHG_FIX 819 #if KMP_ARCH_X86 || KMP_ARCH_X86_64 823 #define ATOMIC_FIXED_ADD(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 825 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 826 OP_GOMP_CRITICAL(OP## =, GOMP_FLAG) \ 828 KMP_TEST_THEN_ADD##BITS(lhs, OP rhs); \ 831 #define ATOMIC_CMPXCHG(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 833 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 834 OP_GOMP_CRITICAL(OP## =, GOMP_FLAG) \ 835 OP_CMPXCHG(TYPE, BITS, OP) \ 840 #define ATOMIC_CMPXCHG_WORKAROUND(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, \ 842 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 843 OP_GOMP_CRITICAL(OP## =, GOMP_FLAG) \ 844 OP_CMPXCHG_WORKAROUND(TYPE, BITS, OP) \ 852 #define ATOMIC_FIXED_ADD(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 854 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 855 OP_GOMP_CRITICAL(OP## =, GOMP_FLAG) \ 856 if (!((kmp_uintptr_t)lhs & 0x##MASK)) { \ 858 KMP_TEST_THEN_ADD##BITS(lhs, OP rhs); \ 861 OP_CRITICAL(OP## =, LCK_ID) \ 865 #define ATOMIC_CMPXCHG(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 867 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 868 OP_GOMP_CRITICAL(OP## =, GOMP_FLAG) \ 869 if (!((kmp_uintptr_t)lhs & 0x##MASK)) { \ 870 OP_CMPXCHG(TYPE, BITS, OP) \ 873 OP_CRITICAL(OP## =, LCK_ID) \ 879 #define ATOMIC_CMPXCHG_WORKAROUND(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, \ 881 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 882 OP_GOMP_CRITICAL(OP## =, GOMP_FLAG) \ 883 if (!((kmp_uintptr_t)lhs & 0x##MASK)) { \ 884 OP_CMPXCHG(TYPE, BITS, OP) \ 887 OP_CRITICAL(OP## =, LCK_ID) \ 891 #endif // USE_CMPXCHG_FIX 895 ATOMIC_FIXED_ADD(fixed4, add, kmp_int32, 32, +, 4i, 3,
897 ATOMIC_FIXED_ADD(fixed4, sub, kmp_int32, 32, -, 4i, 3,
900 ATOMIC_CMPXCHG(float4, add, kmp_real32, 32, +, 4r, 3,
902 ATOMIC_CMPXCHG(float4, sub, kmp_real32, 32, -, 4r, 3,
906 ATOMIC_FIXED_ADD(fixed8, add, kmp_int64, 64, +, 8i, 7,
908 ATOMIC_FIXED_ADD(fixed8, sub, kmp_int64, 64, -, 8i, 7,
911 ATOMIC_CMPXCHG(float8, add, kmp_real64, 64, +, 8r, 7,
913 ATOMIC_CMPXCHG(float8, sub, kmp_real64, 64, -, 8r, 7,
931 ATOMIC_CMPXCHG(fixed1, add, kmp_int8, 8, +, 1i, 0,
933 ATOMIC_CMPXCHG(fixed1, andb, kmp_int8, 8, &, 1i, 0,
935 ATOMIC_CMPXCHG(fixed1, div, kmp_int8, 8, /, 1i, 0,
937 ATOMIC_CMPXCHG(fixed1u, div, kmp_uint8, 8, /, 1i, 0,
939 ATOMIC_CMPXCHG(fixed1, mul, kmp_int8, 8, *, 1i, 0,
941 ATOMIC_CMPXCHG(fixed1, orb, kmp_int8, 8, |, 1i, 0,
943 ATOMIC_CMPXCHG(fixed1, shl, kmp_int8, 8, <<, 1i, 0,
945 ATOMIC_CMPXCHG(fixed1, shr, kmp_int8, 8, >>, 1i, 0,
947 ATOMIC_CMPXCHG(fixed1u, shr, kmp_uint8, 8, >>, 1i, 0,
949 ATOMIC_CMPXCHG(fixed1, sub, kmp_int8, 8, -, 1i, 0,
951 ATOMIC_CMPXCHG(fixed1, xor, kmp_int8, 8, ^, 1i, 0,
953 ATOMIC_CMPXCHG(fixed2, add, kmp_int16, 16, +, 2i, 1,
955 ATOMIC_CMPXCHG(fixed2, andb, kmp_int16, 16, &, 2i, 1,
957 ATOMIC_CMPXCHG(fixed2, div, kmp_int16, 16, /, 2i, 1,
959 ATOMIC_CMPXCHG(fixed2u, div, kmp_uint16, 16, /, 2i, 1,
961 ATOMIC_CMPXCHG(fixed2, mul, kmp_int16, 16, *, 2i, 1,
963 ATOMIC_CMPXCHG(fixed2, orb, kmp_int16, 16, |, 2i, 1,
965 ATOMIC_CMPXCHG(fixed2, shl, kmp_int16, 16, <<, 2i, 1,
967 ATOMIC_CMPXCHG(fixed2, shr, kmp_int16, 16, >>, 2i, 1,
969 ATOMIC_CMPXCHG(fixed2u, shr, kmp_uint16, 16, >>, 2i, 1,
971 ATOMIC_CMPXCHG(fixed2, sub, kmp_int16, 16, -, 2i, 1,
973 ATOMIC_CMPXCHG(fixed2, xor, kmp_int16, 16, ^, 2i, 1,
975 ATOMIC_CMPXCHG(fixed4, andb, kmp_int32, 32, &, 4i, 3,
977 ATOMIC_CMPXCHG(fixed4, div, kmp_int32, 32, /, 4i, 3,
979 ATOMIC_CMPXCHG(fixed4u, div, kmp_uint32, 32, /, 4i, 3,
981 ATOMIC_CMPXCHG(fixed4, mul, kmp_int32, 32, *, 4i, 3,
983 ATOMIC_CMPXCHG(fixed4, orb, kmp_int32, 32, |, 4i, 3,
985 ATOMIC_CMPXCHG(fixed4, shl, kmp_int32, 32, <<, 4i, 3,
987 ATOMIC_CMPXCHG(fixed4, shr, kmp_int32, 32, >>, 4i, 3,
989 ATOMIC_CMPXCHG(fixed4u, shr, kmp_uint32, 32, >>, 4i, 3,
991 ATOMIC_CMPXCHG(fixed4, xor, kmp_int32, 32, ^, 4i, 3,
993 ATOMIC_CMPXCHG(fixed8, andb, kmp_int64, 64, &, 8i, 7,
995 ATOMIC_CMPXCHG(fixed8, div, kmp_int64, 64, /, 8i, 7,
997 ATOMIC_CMPXCHG(fixed8u, div, kmp_uint64, 64, /, 8i, 7,
999 ATOMIC_CMPXCHG(fixed8, mul, kmp_int64, 64, *, 8i, 7,
1001 ATOMIC_CMPXCHG(fixed8, orb, kmp_int64, 64, |, 8i, 7,
1003 ATOMIC_CMPXCHG(fixed8, shl, kmp_int64, 64, <<, 8i, 7,
1005 ATOMIC_CMPXCHG(fixed8, shr, kmp_int64, 64, >>, 8i, 7,
1007 ATOMIC_CMPXCHG(fixed8u, shr, kmp_uint64, 64, >>, 8i, 7,
1009 ATOMIC_CMPXCHG(fixed8, xor, kmp_int64, 64, ^, 8i, 7,
1011 ATOMIC_CMPXCHG(float4, div, kmp_real32, 32, /, 4r, 3,
1013 ATOMIC_CMPXCHG(float4, mul, kmp_real32, 32, *, 4r, 3,
1015 ATOMIC_CMPXCHG(float8, div, kmp_real64, 64, /, 8r, 7,
1017 ATOMIC_CMPXCHG(float8, mul, kmp_real64, 64, *, 8r, 7,
1027 #define ATOMIC_CRIT_L(TYPE_ID, OP_ID, TYPE, OP, LCK_ID, GOMP_FLAG) \ 1028 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1029 OP_GOMP_CRITICAL(= *lhs OP, GOMP_FLAG) \ 1030 OP_CRITICAL(= *lhs OP, LCK_ID) \ 1033 #if KMP_ARCH_X86 || KMP_ARCH_X86_64 1037 #define ATOMIC_CMPX_L(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, GOMP_FLAG) \ 1038 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1039 OP_GOMP_CRITICAL(= *lhs OP, GOMP_FLAG) \ 1040 OP_CMPXCHG(TYPE, BITS, OP) \ 1046 #define ATOMIC_CMPX_L(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, GOMP_FLAG) \ 1047 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1048 OP_GOMP_CRITICAL(= *lhs OP, GOMP_FLAG) \ 1049 if (!((kmp_uintptr_t)lhs & 0x##MASK)) { \ 1050 OP_CMPXCHG(TYPE, BITS, OP) \ 1053 OP_CRITICAL(= *lhs OP, LCK_ID) \ 1058 ATOMIC_CMPX_L(fixed1, andl,
char, 8, &&, 1i, 0,
1060 ATOMIC_CMPX_L(fixed1, orl,
char, 8, ||, 1i, 0,
1062 ATOMIC_CMPX_L(fixed2, andl,
short, 16, &&, 2i, 1,
1064 ATOMIC_CMPX_L(fixed2, orl,
short, 16, ||, 2i, 1,
1066 ATOMIC_CMPX_L(fixed4, andl, kmp_int32, 32, &&, 4i, 3,
1068 ATOMIC_CMPX_L(fixed4, orl, kmp_int32, 32, ||, 4i, 3,
1070 ATOMIC_CMPX_L(fixed8, andl, kmp_int64, 64, &&, 8i, 7,
1072 ATOMIC_CMPX_L(fixed8, orl, kmp_int64, 64, ||, 8i, 7,
1084 #define MIN_MAX_CRITSECT(OP, LCK_ID) \ 1085 __kmp_acquire_atomic_lock(&ATOMIC_LOCK##LCK_ID, gtid); \ 1087 if (*lhs OP rhs) { \ 1090 __kmp_release_atomic_lock(&ATOMIC_LOCK##LCK_ID, gtid); 1093 #ifdef KMP_GOMP_COMPAT 1094 #define GOMP_MIN_MAX_CRITSECT(OP, FLAG) \ 1095 if ((FLAG) && (__kmp_atomic_mode == 2)) { \ 1097 MIN_MAX_CRITSECT(OP, 0); \ 1101 #define GOMP_MIN_MAX_CRITSECT(OP, FLAG) 1105 #define MIN_MAX_CMPXCHG(TYPE, BITS, OP) \ 1107 TYPE KMP_ATOMIC_VOLATILE temp_val; \ 1110 old_value = temp_val; \ 1111 while (old_value OP rhs && \ 1112 !KMP_COMPARE_AND_STORE_ACQ##BITS( \ 1113 (kmp_int##BITS *)lhs, \ 1114 *VOLATILE_CAST(kmp_int##BITS *) & old_value, \ 1115 *VOLATILE_CAST(kmp_int##BITS *) & rhs)) { \ 1118 old_value = temp_val; \ 1124 #define MIN_MAX_CRITICAL(TYPE_ID, OP_ID, TYPE, OP, LCK_ID, GOMP_FLAG) \ 1125 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1126 if (*lhs OP rhs) { \ 1127 GOMP_MIN_MAX_CRITSECT(OP, GOMP_FLAG) \ 1128 MIN_MAX_CRITSECT(OP, LCK_ID) \ 1132 #if KMP_ARCH_X86 || KMP_ARCH_X86_64 1136 #define MIN_MAX_COMPXCHG(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 1138 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1139 if (*lhs OP rhs) { \ 1140 GOMP_MIN_MAX_CRITSECT(OP, GOMP_FLAG) \ 1141 MIN_MAX_CMPXCHG(TYPE, BITS, OP) \ 1148 #define MIN_MAX_COMPXCHG(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 1150 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1151 if (*lhs OP rhs) { \ 1152 GOMP_MIN_MAX_CRITSECT(OP, GOMP_FLAG) \ 1153 if (!((kmp_uintptr_t)lhs & 0x##MASK)) { \ 1154 MIN_MAX_CMPXCHG(TYPE, BITS, OP) \ 1157 MIN_MAX_CRITSECT(OP, LCK_ID) \ 1163 MIN_MAX_COMPXCHG(fixed1, max,
char, 8, <, 1i, 0,
1165 MIN_MAX_COMPXCHG(fixed1, min,
char, 8, >, 1i, 0,
1167 MIN_MAX_COMPXCHG(fixed2, max,
short, 16, <, 2i, 1,
1169 MIN_MAX_COMPXCHG(fixed2, min,
short, 16, >, 2i, 1,
1171 MIN_MAX_COMPXCHG(fixed4, max, kmp_int32, 32, <, 4i, 3,
1173 MIN_MAX_COMPXCHG(fixed4, min, kmp_int32, 32, >, 4i, 3,
1175 MIN_MAX_COMPXCHG(fixed8, max, kmp_int64, 64, <, 8i, 7,
1177 MIN_MAX_COMPXCHG(fixed8, min, kmp_int64, 64, >, 8i, 7,
1179 MIN_MAX_COMPXCHG(float4, max, kmp_real32, 32, <, 4r, 3,
1181 MIN_MAX_COMPXCHG(float4, min, kmp_real32, 32, >, 4r, 3,
1183 MIN_MAX_COMPXCHG(float8, max, kmp_real64, 64, <, 8r, 7,
1185 MIN_MAX_COMPXCHG(float8, min, kmp_real64, 64, >, 8r, 7,
1188 MIN_MAX_CRITICAL(float16, max, QUAD_LEGACY, <, 16r,
1190 MIN_MAX_CRITICAL(float16, min, QUAD_LEGACY, >, 16r,
1193 MIN_MAX_CRITICAL(float16, max_a16, Quad_a16_t, <, 16r,
1195 MIN_MAX_CRITICAL(float16, min_a16, Quad_a16_t, >, 16r,
1202 #define ATOMIC_CRIT_EQV(TYPE_ID, OP_ID, TYPE, OP, LCK_ID, GOMP_FLAG) \ 1203 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1204 OP_GOMP_CRITICAL(^= ~, GOMP_FLAG) \ 1205 OP_CRITICAL(^= ~, LCK_ID) \ 1209 #if KMP_ARCH_X86 || KMP_ARCH_X86_64 1212 #define ATOMIC_CMPX_EQV(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 1214 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1215 OP_GOMP_CRITICAL(^= ~, GOMP_FLAG) \ 1216 OP_CMPXCHG(TYPE, BITS, OP) \ 1222 #define ATOMIC_CMPX_EQV(TYPE_ID, OP_ID, TYPE, BITS, OP, LCK_ID, MASK, \ 1224 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1225 OP_GOMP_CRITICAL(^= ~, GOMP_FLAG) \ 1226 if (!((kmp_uintptr_t)lhs & 0x##MASK)) { \ 1227 OP_CMPXCHG(TYPE, BITS, OP) \ 1230 OP_CRITICAL(^= ~, LCK_ID) \ 1235 ATOMIC_CMPXCHG(fixed1, neqv, kmp_int8, 8, ^, 1i, 0,
1237 ATOMIC_CMPXCHG(fixed2, neqv, kmp_int16, 16, ^, 2i, 1,
1239 ATOMIC_CMPXCHG(fixed4, neqv, kmp_int32, 32, ^, 4i, 3,
1241 ATOMIC_CMPXCHG(fixed8, neqv, kmp_int64, 64, ^, 8i, 7,
1243 ATOMIC_CMPX_EQV(fixed1, eqv, kmp_int8, 8, ^~, 1i, 0,
1245 ATOMIC_CMPX_EQV(fixed2, eqv, kmp_int16, 16, ^~, 2i, 1,
1247 ATOMIC_CMPX_EQV(fixed4, eqv, kmp_int32, 32, ^~, 4i, 3,
1249 ATOMIC_CMPX_EQV(fixed8, eqv, kmp_int64, 64, ^~, 8i, 7,
1258 #define ATOMIC_CRITICAL(TYPE_ID, OP_ID, TYPE, OP, LCK_ID, GOMP_FLAG) \ 1259 ATOMIC_BEGIN(TYPE_ID, OP_ID, TYPE, void) \ 1260 OP_GOMP_CRITICAL(OP## =, GOMP_FLAG) \ 1261 OP_CRITICAL(OP## =, LCK_ID) \ 1266 ATOMIC_CRITICAL(float10, add,
long double, +, 10r,
1268 ATOMIC_CRITICAL(float10, sub,
long double, -, 10r,
1270 ATOMIC_CRITICAL(float10, mul,
long double, *, 10r,
1272 ATOMIC_CRITICAL(float10, div,
long double, /, 10r,
1276 ATOMIC_CRITICAL(float16, add, QUAD_LEGACY, +, 16r,
1278 ATOMIC_CRITICAL(float16, sub, QUAD_LEGACY, -, 16r,
1280 ATOMIC_CRITICAL(float16, mul, QUAD_LEGACY, *, 16r,
1282 ATOMIC_CRITICAL(float16, div, QUAD_LEGACY, /, 16r,
1285 ATOMIC_CRITICAL(float16, add_a16, Quad_a16_t, +, 16r,
1287 ATOMIC_CRITICAL(float16, sub_a16, Quad_a16_t, -, 16r,
1289 ATOMIC_CRITICAL(float16, mul_a16, Quad_a16_t, *, 16r,
1291 ATOMIC_CRITICAL(float16, div_a16, Quad_a16_t, /, 16r,
1299 ATOMIC_CMPXCHG_WORKAROUND(cmplx4, add, kmp_cmplx32, 64, +, 8c, 7,
1301 ATOMIC_CMPXCHG_WORKAROUND(cmplx4, sub, kmp_cmplx32, 64, -, 8c, 7,
1303 ATOMIC_CMPXCHG_WORKAROUND(cmplx4, mul, kmp_cmplx32, 64, *, 8c, 7,
1305 ATOMIC_CMPXCHG_WORKAROUND(cmplx4, div, kmp_cmplx32, 64, /, 8c, 7,
1309 ATOMIC_CRITICAL(cmplx4, add, kmp_cmplx32, +, 8c, 1)
1310 ATOMIC_CRITICAL(cmplx4, sub, kmp_cmplx32, -, 8c, 1)
1311 ATOMIC_CRITICAL(cmplx4, mul, kmp_cmplx32, *, 8c, 1)
1312 ATOMIC_CRITICAL(cmplx4, div, kmp_cmplx32, /, 8c, 1)
1313 #endif // USE_CMPXCHG_FIX 1315 ATOMIC_CRITICAL(cmplx8, add, kmp_cmplx64, +, 16c, 1)
1316 ATOMIC_CRITICAL(cmplx8, sub, kmp_cmplx64, -, 16c, 1)
1317 ATOMIC_CRITICAL(cmplx8, mul, kmp_cmplx64, *, 16c, 1)
1318 ATOMIC_CRITICAL(cmplx8, div, kmp_cmplx64, /, 16c, 1)
1319 ATOMIC_CRITICAL(cmplx10, add, kmp_cmplx80, +, 20c,