2 * z_Windows_NT-586_util.cpp -- platform specific routines.
5 //===----------------------------------------------------------------------===//
7 // The LLVM Compiler Infrastructure
9 // This file is dual licensed under the MIT and the University of Illinois Open
10 // Source Licenses. See LICENSE.txt for details.
12 //===----------------------------------------------------------------------===//
16 #if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
17 /* Only 32-bit "add-exchange" instruction on IA-32 architecture causes us to
18 use compare_and_store for these routines */
20 kmp_int8 __kmp_test_then_or8(volatile kmp_int8 *p, kmp_int8 d) {
21 kmp_int8 old_value, new_value;
23 old_value = TCR_1(*p);
24 new_value = old_value | d;
26 while (!__kmp_compare_and_store8(p, old_value, new_value)) {
28 old_value = TCR_1(*p);
29 new_value = old_value | d;
34 kmp_int8 __kmp_test_then_and8(volatile kmp_int8 *p, kmp_int8 d) {
35 kmp_int8 old_value, new_value;
37 old_value = TCR_1(*p);
38 new_value = old_value & d;
40 while (!__kmp_compare_and_store8(p, old_value, new_value)) {
42 old_value = TCR_1(*p);
43 new_value = old_value & d;
48 kmp_uint32 __kmp_test_then_or32(volatile kmp_uint32 *p, kmp_uint32 d) {
49 kmp_uint32 old_value, new_value;
51 old_value = TCR_4(*p);
52 new_value = old_value | d;
54 while (!__kmp_compare_and_store32((volatile kmp_int32 *)p, old_value,
57 old_value = TCR_4(*p);
58 new_value = old_value | d;
63 kmp_uint32 __kmp_test_then_and32(volatile kmp_uint32 *p, kmp_uint32 d) {
64 kmp_uint32 old_value, new_value;
66 old_value = TCR_4(*p);
67 new_value = old_value & d;
69 while (!__kmp_compare_and_store32((volatile kmp_int32 *)p, old_value,
72 old_value = TCR_4(*p);
73 new_value = old_value & d;
78 kmp_int8 __kmp_test_then_add8(volatile kmp_int8 *p, kmp_int8 d) {
79 kmp_int64 old_value, new_value;
81 old_value = TCR_1(*p);
82 new_value = old_value + d;
83 while (!__kmp_compare_and_store8(p, old_value, new_value)) {
85 old_value = TCR_1(*p);
86 new_value = old_value + d;
92 kmp_int64 __kmp_test_then_add64(volatile kmp_int64 *p, kmp_int64 d) {
93 kmp_int64 old_value, new_value;
95 old_value = TCR_8(*p);
96 new_value = old_value + d;
97 while (!__kmp_compare_and_store64(p, old_value, new_value)) {
99 old_value = TCR_8(*p);
100 new_value = old_value + d;
104 #endif /* KMP_ARCH_X86 */
106 kmp_uint64 __kmp_test_then_or64(volatile kmp_uint64 *p, kmp_uint64 d) {
107 kmp_uint64 old_value, new_value;
109 old_value = TCR_8(*p);
110 new_value = old_value | d;
111 while (!__kmp_compare_and_store64((volatile kmp_int64 *)p, old_value,
114 old_value = TCR_8(*p);
115 new_value = old_value | d;
121 kmp_uint64 __kmp_test_then_and64(volatile kmp_uint64 *p, kmp_uint64 d) {
122 kmp_uint64 old_value, new_value;
124 old_value = TCR_8(*p);
125 new_value = old_value & d;
126 while (!__kmp_compare_and_store64((volatile kmp_int64 *)p, old_value,
129 old_value = TCR_8(*p);
130 new_value = old_value & d;
136 #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */