Lines 746-752
Link Here
|
746 |
// end of the first part of the workaround for C78287 |
746 |
// end of the first part of the workaround for C78287 |
747 |
#endif // USE_CMPXCHG_FIX |
747 |
#endif // USE_CMPXCHG_FIX |
748 |
|
748 |
|
749 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
749 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
750 |
|
750 |
|
751 |
// ------------------------------------------------------------------------ |
751 |
// ------------------------------------------------------------------------ |
752 |
// X86 or X86_64: no alignment problems ==================================== |
752 |
// X86 or X86_64: no alignment problems ==================================== |
Lines 813-819
Link Here
|
813 |
} |
813 |
} |
814 |
// end of the second part of the workaround for C78287 |
814 |
// end of the second part of the workaround for C78287 |
815 |
#endif // USE_CMPXCHG_FIX |
815 |
#endif // USE_CMPXCHG_FIX |
816 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ |
816 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 */ |
817 |
|
817 |
|
818 |
// Routines for ATOMIC 4-byte operands addition and subtraction |
818 |
// Routines for ATOMIC 4-byte operands addition and subtraction |
819 |
ATOMIC_FIXED_ADD( fixed4, add, kmp_int32, 32, +, 4i, 3, 0 ) // __kmpc_atomic_fixed4_add |
819 |
ATOMIC_FIXED_ADD( fixed4, add, kmp_int32, 32, +, 4i, 3, 0 ) // __kmpc_atomic_fixed4_add |
Lines 904-910
Link Here
|
904 |
OP_CRITICAL( = *lhs OP, LCK_ID ) \ |
904 |
OP_CRITICAL( = *lhs OP, LCK_ID ) \ |
905 |
} |
905 |
} |
906 |
|
906 |
|
907 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
907 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
908 |
|
908 |
|
909 |
// ------------------------------------------------------------------------ |
909 |
// ------------------------------------------------------------------------ |
910 |
// X86 or X86_64: no alignment problems =================================== |
910 |
// X86 or X86_64: no alignment problems =================================== |
Lines 927-933
Link Here
|
927 |
OP_CRITICAL(= *lhs OP,LCK_ID) /* unaligned - use critical */ \ |
927 |
OP_CRITICAL(= *lhs OP,LCK_ID) /* unaligned - use critical */ \ |
928 |
} \ |
928 |
} \ |
929 |
} |
929 |
} |
930 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ |
930 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 */ |
931 |
|
931 |
|
932 |
ATOMIC_CMPX_L( fixed1, andl, char, 8, &&, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_andl |
932 |
ATOMIC_CMPX_L( fixed1, andl, char, 8, &&, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_andl |
933 |
ATOMIC_CMPX_L( fixed1, orl, char, 8, ||, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_orl |
933 |
ATOMIC_CMPX_L( fixed1, orl, char, 8, ||, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_orl |
Lines 997-1003
Link Here
|
997 |
} \ |
997 |
} \ |
998 |
} |
998 |
} |
999 |
|
999 |
|
1000 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
1000 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
1001 |
|
1001 |
|
1002 |
// ------------------------------------------------------------------------- |
1002 |
// ------------------------------------------------------------------------- |
1003 |
// X86 or X86_64: no alignment problems ==================================== |
1003 |
// X86 or X86_64: no alignment problems ==================================== |
Lines 1024-1030
Link Here
|
1024 |
} \ |
1024 |
} \ |
1025 |
} \ |
1025 |
} \ |
1026 |
} |
1026 |
} |
1027 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ |
1027 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 */ |
1028 |
|
1028 |
|
1029 |
MIN_MAX_COMPXCHG( fixed1, max, char, 8, <, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_max |
1029 |
MIN_MAX_COMPXCHG( fixed1, max, char, 8, <, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_max |
1030 |
MIN_MAX_COMPXCHG( fixed1, min, char, 8, >, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_min |
1030 |
MIN_MAX_COMPXCHG( fixed1, min, char, 8, >, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_min |
Lines 1056-1062
Link Here
|
1056 |
} |
1056 |
} |
1057 |
|
1057 |
|
1058 |
// ------------------------------------------------------------------------ |
1058 |
// ------------------------------------------------------------------------ |
1059 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
1059 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
1060 |
// ------------------------------------------------------------------------ |
1060 |
// ------------------------------------------------------------------------ |
1061 |
// X86 or X86_64: no alignment problems =================================== |
1061 |
// X86 or X86_64: no alignment problems =================================== |
1062 |
#define ATOMIC_CMPX_EQV(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \ |
1062 |
#define ATOMIC_CMPX_EQV(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \ |
Lines 1078-1084
Link Here
|
1078 |
OP_CRITICAL(^=~,LCK_ID) /* unaligned address - use critical */ \ |
1078 |
OP_CRITICAL(^=~,LCK_ID) /* unaligned address - use critical */ \ |
1079 |
} \ |
1079 |
} \ |
1080 |
} |
1080 |
} |
1081 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ |
1081 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 */ |
1082 |
|
1082 |
|
1083 |
ATOMIC_CMPXCHG( fixed1, neqv, kmp_int8, 8, ^, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_neqv |
1083 |
ATOMIC_CMPXCHG( fixed1, neqv, kmp_int8, 8, ^, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_neqv |
1084 |
ATOMIC_CMPXCHG( fixed2, neqv, kmp_int16, 16, ^, 2i, 1, KMP_ARCH_X86 ) // __kmpc_atomic_fixed2_neqv |
1084 |
ATOMIC_CMPXCHG( fixed2, neqv, kmp_int16, 16, ^, 2i, 1, KMP_ARCH_X86 ) // __kmpc_atomic_fixed2_neqv |
Lines 1161-1167
Link Here
|
1161 |
|
1161 |
|
1162 |
// OpenMP 4.0: x = expr binop x for non-commutative operations. |
1162 |
// OpenMP 4.0: x = expr binop x for non-commutative operations. |
1163 |
// Supported only on IA-32 architecture and Intel(R) 64 |
1163 |
// Supported only on IA-32 architecture and Intel(R) 64 |
1164 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
1164 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
1165 |
|
1165 |
|
1166 |
// ------------------------------------------------------------------------ |
1166 |
// ------------------------------------------------------------------------ |
1167 |
// Operation on *lhs, rhs bound by critical section |
1167 |
// Operation on *lhs, rhs bound by critical section |
Lines 1322-1328
Link Here
|
1322 |
#endif |
1322 |
#endif |
1323 |
|
1323 |
|
1324 |
|
1324 |
|
1325 |
#endif //KMP_ARCH_X86 || KMP_ARCH_X86_64 |
1325 |
#endif //KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
1326 |
// End of OpenMP 4.0: x = expr binop x for non-commutative operations. |
1326 |
// End of OpenMP 4.0: x = expr binop x for non-commutative operations. |
1327 |
|
1327 |
|
1328 |
#endif //OMP_40_ENABLED |
1328 |
#endif //OMP_40_ENABLED |
Lines 1353-1359
Link Here
|
1353 |
} |
1353 |
} |
1354 |
|
1354 |
|
1355 |
// ------------------------------------------------------------------------- |
1355 |
// ------------------------------------------------------------------------- |
1356 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
1356 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
1357 |
// ------------------------------------------------------------------------- |
1357 |
// ------------------------------------------------------------------------- |
1358 |
// X86 or X86_64: no alignment problems ==================================== |
1358 |
// X86 or X86_64: no alignment problems ==================================== |
1359 |
#define ATOMIC_CMPXCHG_MIX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \ |
1359 |
#define ATOMIC_CMPXCHG_MIX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \ |
Lines 1375-1381
Link Here
|
1375 |
OP_CRITICAL(OP##=,LCK_ID) /* unaligned address - use critical */ \ |
1375 |
OP_CRITICAL(OP##=,LCK_ID) /* unaligned address - use critical */ \ |
1376 |
} \ |
1376 |
} \ |
1377 |
} |
1377 |
} |
1378 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ |
1378 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 */ |
1379 |
|
1379 |
|
1380 |
// RHS=float8 |
1380 |
// RHS=float8 |
1381 |
ATOMIC_CMPXCHG_MIX( fixed1, char, mul, 8, *, float8, kmp_real64, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_mul_float8 |
1381 |
ATOMIC_CMPXCHG_MIX( fixed1, char, mul, 8, *, float8, kmp_real64, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_mul_float8 |
Lines 1433-1439
Link Here
|
1433 |
ATOMIC_CRITICAL_FP( float10, long double, div, /, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_div_fp |
1433 |
ATOMIC_CRITICAL_FP( float10, long double, div, /, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_div_fp |
1434 |
#endif |
1434 |
#endif |
1435 |
|
1435 |
|
1436 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
1436 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
1437 |
// ------------------------------------------------------------------------ |
1437 |
// ------------------------------------------------------------------------ |
1438 |
// X86 or X86_64: no alignment problems ==================================== |
1438 |
// X86 or X86_64: no alignment problems ==================================== |
1439 |
#if USE_CMPXCHG_FIX |
1439 |
#if USE_CMPXCHG_FIX |
Lines 1464-1470
Link Here
|
1464 |
OP_CRITICAL(OP##=,LCK_ID) /* unaligned address - use critical */ \ |
1464 |
OP_CRITICAL(OP##=,LCK_ID) /* unaligned address - use critical */ \ |
1465 |
} \ |
1465 |
} \ |
1466 |
} |
1466 |
} |
1467 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ |
1467 |
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 */ |
1468 |
|
1468 |
|
1469 |
ATOMIC_CMPXCHG_CMPLX( cmplx4, kmp_cmplx32, add, 64, +, cmplx8, kmp_cmplx64, 8c, 7, KMP_ARCH_X86 ) // __kmpc_atomic_cmplx4_add_cmplx8 |
1469 |
ATOMIC_CMPXCHG_CMPLX( cmplx4, kmp_cmplx32, add, 64, +, cmplx8, kmp_cmplx64, 8c, 7, KMP_ARCH_X86 ) // __kmpc_atomic_cmplx4_add_cmplx8 |
1470 |
ATOMIC_CMPXCHG_CMPLX( cmplx4, kmp_cmplx32, sub, 64, -, cmplx8, kmp_cmplx64, 8c, 7, KMP_ARCH_X86 ) // __kmpc_atomic_cmplx4_sub_cmplx8 |
1470 |
ATOMIC_CMPXCHG_CMPLX( cmplx4, kmp_cmplx32, sub, 64, -, cmplx8, kmp_cmplx64, 8c, 7, KMP_ARCH_X86 ) // __kmpc_atomic_cmplx4_sub_cmplx8 |
Lines 1472-1478
Link Here
|
1472 |
ATOMIC_CMPXCHG_CMPLX( cmplx4, kmp_cmplx32, div, 64, /, cmplx8, kmp_cmplx64, 8c, 7, KMP_ARCH_X86 ) // __kmpc_atomic_cmplx4_div_cmplx8 |
1472 |
ATOMIC_CMPXCHG_CMPLX( cmplx4, kmp_cmplx32, div, 64, /, cmplx8, kmp_cmplx64, 8c, 7, KMP_ARCH_X86 ) // __kmpc_atomic_cmplx4_div_cmplx8 |
1473 |
|
1473 |
|
1474 |
// READ, WRITE, CAPTURE are supported only on IA-32 architecture and Intel(R) 64 |
1474 |
// READ, WRITE, CAPTURE are supported only on IA-32 architecture and Intel(R) 64 |
1475 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
1475 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
1476 |
|
1476 |
|
1477 |
////////////////////////////////////////////////////////////////////////////////////////////////////// |
1477 |
////////////////////////////////////////////////////////////////////////////////////////////////////// |
1478 |
// ------------------------------------------------------------------------ |
1478 |
// ------------------------------------------------------------------------ |
Lines 2546-2552
Link Here
|
2546 |
|
2546 |
|
2547 |
#endif //OMP_40_ENABLED |
2547 |
#endif //OMP_40_ENABLED |
2548 |
|
2548 |
|
2549 |
#endif //KMP_ARCH_X86 || KMP_ARCH_X86_64 |
2549 |
#endif //KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
2550 |
|
2550 |
|
2551 |
|
2551 |
|
2552 |
#undef OP_CRITICAL |
2552 |
#undef OP_CRITICAL |
Lines 2616-2622
Link Here
|
2616 |
if ( |
2616 |
if ( |
2617 |
#if KMP_ARCH_X86 && defined(KMP_GOMP_COMPAT) |
2617 |
#if KMP_ARCH_X86 && defined(KMP_GOMP_COMPAT) |
2618 |
FALSE /* must use lock */ |
2618 |
FALSE /* must use lock */ |
2619 |
#elif KMP_ARCH_X86 || KMP_ARCH_X86_64 |
2619 |
#elif KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
2620 |
TRUE /* no alignment problems */ |
2620 |
TRUE /* no alignment problems */ |
2621 |
#else |
2621 |
#else |
2622 |
! ( (kmp_uintptr_t) lhs & 0x1) /* make sure address is 2-byte aligned */ |
2622 |
! ( (kmp_uintptr_t) lhs & 0x1) /* make sure address is 2-byte aligned */ |
Lines 2675-2681
Link Here
|
2675 |
// FIXME: On IA-32 architecture, gcc uses cmpxchg only for 4-byte ints. |
2675 |
// FIXME: On IA-32 architecture, gcc uses cmpxchg only for 4-byte ints. |
2676 |
// Gomp compatibility is broken if this routine is called for floats. |
2676 |
// Gomp compatibility is broken if this routine is called for floats. |
2677 |
// |
2677 |
// |
2678 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 |
2678 |
#if KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
2679 |
TRUE /* no alignment problems */ |
2679 |
TRUE /* no alignment problems */ |
2680 |
#else |
2680 |
#else |
2681 |
! ( (kmp_uintptr_t) lhs & 0x3) /* make sure address is 4-byte aligned */ |
2681 |
! ( (kmp_uintptr_t) lhs & 0x3) /* make sure address is 4-byte aligned */ |
Lines 2733-2739
Link Here
|
2733 |
|
2733 |
|
2734 |
#if KMP_ARCH_X86 && defined(KMP_GOMP_COMPAT) |
2734 |
#if KMP_ARCH_X86 && defined(KMP_GOMP_COMPAT) |
2735 |
FALSE /* must use lock */ |
2735 |
FALSE /* must use lock */ |
2736 |
#elif KMP_ARCH_X86 || KMP_ARCH_X86_64 |
2736 |
#elif KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_X86_64_32 |
2737 |
TRUE /* no alignment problems */ |
2737 |
TRUE /* no alignment problems */ |
2738 |
#else |
2738 |
#else |
2739 |
! ( (kmp_uintptr_t) lhs & 0x7) /* make sure address is 8-byte aligned */ |
2739 |
! ( (kmp_uintptr_t) lhs & 0x7) /* make sure address is 8-byte aligned */ |